From a040d251fb80f832f7cede20baf24d99e3079cb5 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:34:51 -0800 Subject: [PATCH 01/25] lnrpc: remove receipt field from invoice --- cmd/lncli/commands.go | 11 - lnrpc/invoicesrpc/addinvoice.go | 9 - lnrpc/invoicesrpc/utils.go | 1 - lnrpc/rpc.pb.go | 1105 +++++++++++++++---------------- lnrpc/rpc.proto | 5 +- lnrpc/rpc.swagger.json | 5 - rpcserver.go | 1 - 7 files changed, 548 insertions(+), 589 deletions(-) diff --git a/cmd/lncli/commands.go b/cmd/lncli/commands.go index 48de53ce3bd1..76fe6be44b12 100644 --- a/cmd/lncli/commands.go +++ b/cmd/lncli/commands.go @@ -2580,10 +2580,6 @@ var addInvoiceCommand = cli.Command{ Usage: "a description of the payment to attach along " + "with the invoice (default=\"\")", }, - cli.StringFlag{ - Name: "receipt", - Usage: "an optional cryptographic receipt of payment", - }, cli.StringFlag{ Name: "preimage", Usage: "the hex-encoded preimage (32 byte) which will " + @@ -2628,7 +2624,6 @@ func addInvoice(ctx *cli.Context) error { var ( preimage []byte descHash []byte - receipt []byte amt int64 err error ) @@ -2665,14 +2660,8 @@ func addInvoice(ctx *cli.Context) error { return fmt.Errorf("unable to parse description_hash: %v", err) } - receipt, err = hex.DecodeString(ctx.String("receipt")) - if err != nil { - return fmt.Errorf("unable to parse receipt: %v", err) - } - invoice := &lnrpc.Invoice{ Memo: ctx.String("memo"), - Receipt: receipt, RPreimage: preimage, Value: amt, DescriptionHash: descHash, diff --git a/lnrpc/invoicesrpc/addinvoice.go b/lnrpc/invoicesrpc/addinvoice.go index e983ad875706..da613808387d 100644 --- a/lnrpc/invoicesrpc/addinvoice.go +++ b/lnrpc/invoicesrpc/addinvoice.go @@ -57,10 +57,6 @@ type AddInvoiceData struct { // description_hash field is not being used. Memo string - // Deprecated. An optional cryptographic receipt of payment which is not - // implemented. - Receipt []byte - // The preimage which will allow settling an incoming HTLC payable to // this preimage. If Preimage is set, Hash should be nil. If both // Preimage and Hash are nil, a random preimage is generated. @@ -154,10 +150,6 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, return nil, nil, fmt.Errorf("memo too large: %v bytes "+ "(maxsize=%v)", len(invoice.Memo), channeldb.MaxMemoSize) } - if len(invoice.Receipt) > channeldb.MaxReceiptSize { - return nil, nil, fmt.Errorf("receipt too large: %v bytes "+ - "(maxsize=%v)", len(invoice.Receipt), channeldb.MaxReceiptSize) - } if len(invoice.DescriptionHash) > 0 && len(invoice.DescriptionHash) != 32 { return nil, nil, fmt.Errorf("description hash is %v bytes, must be 32", len(invoice.DescriptionHash)) @@ -392,7 +384,6 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, newInvoice := &channeldb.Invoice{ CreationDate: creationDate, Memo: []byte(invoice.Memo), - Receipt: invoice.Receipt, PaymentRequest: []byte(payReqString), FinalCltvDelta: int32(payReq.MinFinalCLTVExpiry()), Expiry: payReq.Expiry(), diff --git a/lnrpc/invoicesrpc/utils.go b/lnrpc/invoicesrpc/utils.go index 0d0c074a78f1..a12cc8589ada 100644 --- a/lnrpc/invoicesrpc/utils.go +++ b/lnrpc/invoicesrpc/utils.go @@ -94,7 +94,6 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, rpcInvoice := &lnrpc.Invoice{ Memo: string(invoice.Memo[:]), - Receipt: invoice.Receipt[:], RHash: decoded.PaymentHash[:], Value: int64(satAmt), ValueMsat: int64(invoice.Terms.Value), diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 9582a27440fe..ece77c69e7d5 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -6956,9 +6956,6 @@ type Invoice struct { //field of the encoded payment request if the description_hash field is not //being used. Memo string `protobuf:"bytes,1,opt,name=memo,proto3" json:"memo,omitempty"` - //* Deprecated. An optional cryptographic receipt of payment which is not - //implemented. - Receipt []byte `protobuf:"bytes,2,opt,name=receipt,proto3" json:"receipt,omitempty"` // Deprecated: Do not use. //* //The hex-encoded preimage (32 byte) which will allow settling an incoming //HTLC payable to this preimage. When using REST, this field must be encoded @@ -7079,14 +7076,6 @@ func (m *Invoice) GetMemo() string { return "" } -// Deprecated: Do not use. -func (m *Invoice) GetReceipt() []byte { - if m != nil { - return m.Receipt - } - return nil -} - func (m *Invoice) GetRPreimage() []byte { if m != nil { return m.RPreimage @@ -9516,553 +9505,553 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 8735 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0x5b, - 0xb6, 0x56, 0xaa, 0x7f, 0xec, 0xee, 0xd5, 0x6d, 0xbb, 0xbd, 0xed, 0xd8, 0x9d, 0x3e, 0x39, 0x39, - 0x39, 0x35, 0xb9, 0x49, 0x26, 0x73, 0x26, 0xc9, 0xf1, 0xcc, 0x1c, 0xce, 0x3d, 0xe1, 0x72, 0x71, - 0x6c, 0x27, 0xce, 0x1c, 0xc7, 0xf1, 0x94, 0x93, 0x09, 0x33, 0x73, 0xaf, 0x7a, 0xca, 0xdd, 0xdb, - 0x76, 0x4d, 0xba, 0xab, 0x7a, 0xaa, 0xaa, 0x9d, 0x78, 0x0e, 0x07, 0x09, 0x84, 0x10, 0xe2, 0x05, - 0x0d, 0x08, 0x09, 0x10, 0xe8, 0x4a, 0x73, 0x91, 0xb8, 0x57, 0x3c, 0xc0, 0x0b, 0xd2, 0x05, 0xdd, - 0x37, 0x84, 0x90, 0x90, 0x10, 0x0f, 0x3c, 0x20, 0xf1, 0xc0, 0x08, 0x81, 0x84, 0xae, 0x78, 0x43, - 0xe2, 0x1d, 0xad, 0xb5, 0x7f, 0x6a, 0xef, 0xaa, 0xea, 0x38, 0x67, 0x66, 0xe0, 0xc9, 0xbd, 0xbf, - 0xb5, 0x6b, 0xff, 0xae, 0xb5, 0xf6, 0xda, 0x6b, 0xaf, 0xbd, 0x0d, 0xcd, 0x78, 0x32, 0xb8, 0x3b, - 0x89, 0xa3, 0x34, 0x62, 0xf5, 0x51, 0x18, 0x4f, 0x06, 0xbd, 0xab, 0x27, 0x51, 0x74, 0x32, 0xe2, - 0xf7, 0xfc, 0x49, 0x70, 0xcf, 0x0f, 0xc3, 0x28, 0xf5, 0xd3, 0x20, 0x0a, 0x13, 0x91, 0xc9, 0xfd, - 0x31, 0x2c, 0x3e, 0xe6, 0xe1, 0x21, 0xe7, 0x43, 0x8f, 0xff, 0x74, 0xca, 0x93, 0x94, 0x7d, 0x03, - 0x96, 0x7d, 0xfe, 0x33, 0xce, 0x87, 0xfd, 0x89, 0x9f, 0x24, 0x93, 0xd3, 0xd8, 0x4f, 0x78, 0xd7, - 0xb9, 0xee, 0xdc, 0x6e, 0x7b, 0x1d, 0x41, 0x38, 0xd0, 0x38, 0xfb, 0x10, 0xda, 0x09, 0x66, 0xe5, - 0x61, 0x1a, 0x47, 0x93, 0xf3, 0x6e, 0x85, 0xf2, 0xb5, 0x10, 0xdb, 0x11, 0x90, 0x3b, 0x82, 0x25, - 0x5d, 0x43, 0x32, 0x89, 0xc2, 0x84, 0xb3, 0xfb, 0xb0, 0x3a, 0x08, 0x26, 0xa7, 0x3c, 0xee, 0xd3, - 0xc7, 0xe3, 0x90, 0x8f, 0xa3, 0x30, 0x18, 0x74, 0x9d, 0xeb, 0xd5, 0xdb, 0x4d, 0x8f, 0x09, 0x1a, - 0x7e, 0xf1, 0x54, 0x52, 0xd8, 0x2d, 0x58, 0xe2, 0xa1, 0xc0, 0xf9, 0x90, 0xbe, 0x92, 0x55, 0x2d, - 0x66, 0x30, 0x7e, 0xe0, 0xfe, 0xcd, 0x0a, 0x2c, 0x3f, 0x09, 0x83, 0xf4, 0xa5, 0x3f, 0x1a, 0xf1, - 0x54, 0xf5, 0xe9, 0x16, 0x2c, 0xbd, 0x26, 0x80, 0xfa, 0xf4, 0x3a, 0x8a, 0x87, 0xb2, 0x47, 0x8b, - 0x02, 0x3e, 0x90, 0xe8, 0xcc, 0x96, 0x55, 0x66, 0xb6, 0xac, 0x74, 0xb8, 0xaa, 0x33, 0x86, 0xeb, - 0x16, 0x2c, 0xc5, 0x7c, 0x10, 0x9d, 0xf1, 0xf8, 0xbc, 0xff, 0x3a, 0x08, 0x87, 0xd1, 0xeb, 0x6e, - 0xed, 0xba, 0x73, 0xbb, 0xee, 0x2d, 0x2a, 0xf8, 0x25, 0xa1, 0xec, 0x21, 0x2c, 0x0d, 0x4e, 0xfd, - 0x30, 0xe4, 0xa3, 0xfe, 0x91, 0x3f, 0x78, 0x35, 0x9d, 0x24, 0xdd, 0xfa, 0x75, 0xe7, 0x76, 0x6b, - 0xe3, 0xca, 0x5d, 0x9a, 0xd5, 0xbb, 0x5b, 0xa7, 0x7e, 0xf8, 0x90, 0x28, 0x87, 0xa1, 0x3f, 0x49, - 0x4e, 0xa3, 0xd4, 0x5b, 0x94, 0x5f, 0x08, 0x38, 0x71, 0x57, 0x81, 0x99, 0x23, 0x21, 0xc6, 0xde, - 0xfd, 0x67, 0x0e, 0xac, 0xbc, 0x08, 0x47, 0xd1, 0xe0, 0xd5, 0xaf, 0x38, 0x44, 0x25, 0x7d, 0xa8, - 0xbc, 0x6b, 0x1f, 0xaa, 0x5f, 0xb5, 0x0f, 0x6b, 0xb0, 0x6a, 0x37, 0x56, 0xf6, 0x82, 0xc3, 0x65, - 0xfc, 0xfa, 0x84, 0xab, 0x66, 0xa9, 0x6e, 0x7c, 0x1d, 0x3a, 0x83, 0x69, 0x1c, 0xf3, 0xb0, 0xd0, - 0x8f, 0x25, 0x89, 0xeb, 0x8e, 0x7c, 0x08, 0xed, 0x90, 0xbf, 0xce, 0xb2, 0x49, 0xde, 0x0d, 0xf9, - 0x6b, 0x95, 0xc5, 0xed, 0xc2, 0x5a, 0xbe, 0x1a, 0xd9, 0x80, 0xff, 0xe6, 0x40, 0xed, 0x45, 0xfa, - 0x26, 0x62, 0x77, 0xa1, 0x96, 0x9e, 0x4f, 0x84, 0x84, 0x2c, 0x6e, 0x30, 0xd9, 0xb5, 0xcd, 0xe1, - 0x30, 0xe6, 0x49, 0xf2, 0xfc, 0x7c, 0xc2, 0xbd, 0xb6, 0x2f, 0x12, 0x7d, 0xcc, 0xc7, 0xba, 0x30, - 0x2f, 0xd3, 0x54, 0x61, 0xd3, 0x53, 0x49, 0x76, 0x0d, 0xc0, 0x1f, 0x47, 0xd3, 0x30, 0xed, 0x27, - 0x7e, 0x4a, 0x43, 0x55, 0xf5, 0x0c, 0x84, 0x5d, 0x85, 0xe6, 0xe4, 0x55, 0x3f, 0x19, 0xc4, 0xc1, - 0x24, 0x25, 0xb6, 0x69, 0x7a, 0x19, 0xc0, 0xbe, 0x01, 0x8d, 0x68, 0x9a, 0x4e, 0xa2, 0x20, 0x4c, - 0x25, 0xab, 0x2c, 0xc9, 0xb6, 0x3c, 0x9b, 0xa6, 0x07, 0x08, 0x7b, 0x3a, 0x03, 0xbb, 0x01, 0x0b, - 0x83, 0x28, 0x3c, 0x0e, 0xe2, 0xb1, 0x50, 0x06, 0xdd, 0x39, 0xaa, 0xcd, 0x06, 0xdd, 0x7f, 0x55, - 0x81, 0xd6, 0xf3, 0xd8, 0x0f, 0x13, 0x7f, 0x80, 0x00, 0x36, 0x3d, 0x7d, 0xd3, 0x3f, 0xf5, 0x93, - 0x53, 0xea, 0x6d, 0xd3, 0x53, 0x49, 0xb6, 0x06, 0x73, 0xa2, 0xa1, 0xd4, 0xa7, 0xaa, 0x27, 0x53, - 0xec, 0x23, 0x58, 0x0e, 0xa7, 0xe3, 0xbe, 0x5d, 0x57, 0x95, 0xb8, 0xa5, 0x48, 0xc0, 0x01, 0x38, - 0xc2, 0xb9, 0x16, 0x55, 0x88, 0x1e, 0x1a, 0x08, 0x73, 0xa1, 0x2d, 0x53, 0x3c, 0x38, 0x39, 0x15, - 0xdd, 0xac, 0x7b, 0x16, 0x86, 0x65, 0xa4, 0xc1, 0x98, 0xf7, 0x93, 0xd4, 0x1f, 0x4f, 0x64, 0xb7, - 0x0c, 0x84, 0xe8, 0x51, 0xea, 0x8f, 0xfa, 0xc7, 0x9c, 0x27, 0xdd, 0x79, 0x49, 0xd7, 0x08, 0xbb, - 0x09, 0x8b, 0x43, 0x9e, 0xa4, 0x7d, 0x39, 0x29, 0x3c, 0xe9, 0x36, 0x48, 0xf4, 0x73, 0x28, 0x96, - 0x13, 0xfb, 0xaf, 0xfb, 0x38, 0x00, 0xfc, 0x4d, 0xb7, 0x29, 0xda, 0x9a, 0x21, 0xc8, 0x39, 0x8f, - 0x79, 0x6a, 0x8c, 0x5e, 0x22, 0x39, 0xd4, 0xdd, 0x03, 0x66, 0xc0, 0xdb, 0x3c, 0xf5, 0x83, 0x51, - 0xc2, 0x3e, 0x81, 0x76, 0x6a, 0x64, 0x26, 0x55, 0xd8, 0xd2, 0xec, 0x64, 0x7c, 0xe0, 0x59, 0xf9, - 0xdc, 0x53, 0x68, 0x3c, 0xe2, 0x7c, 0x2f, 0x18, 0x07, 0x29, 0x5b, 0x83, 0xfa, 0x71, 0xf0, 0x86, - 0x0b, 0x86, 0xaf, 0xee, 0x5e, 0xf2, 0x44, 0x92, 0x7d, 0x00, 0x40, 0x3f, 0xfa, 0x63, 0xcd, 0x58, - 0xbb, 0x97, 0xbc, 0x26, 0x61, 0x4f, 0x91, 0xb3, 0x7a, 0x30, 0x3f, 0xe1, 0xf1, 0x80, 0xab, 0xf9, - 0xdb, 0xbd, 0xe4, 0x29, 0xe0, 0xe1, 0x3c, 0xd4, 0x47, 0x58, 0xba, 0xfb, 0x27, 0x35, 0x68, 0x1d, - 0xf2, 0x50, 0x4b, 0x1a, 0x83, 0x1a, 0x8e, 0x89, 0x94, 0x2e, 0xfa, 0xcd, 0xbe, 0x06, 0x2d, 0x1a, - 0xa7, 0x24, 0x8d, 0x83, 0xf0, 0x44, 0x30, 0xf8, 0xc3, 0x4a, 0xd7, 0xf1, 0x00, 0xe1, 0x43, 0x42, - 0x59, 0x07, 0xaa, 0xfe, 0x58, 0x31, 0x38, 0xfe, 0x64, 0x57, 0xa0, 0xe1, 0x8f, 0x53, 0xd1, 0xbc, - 0x36, 0xc1, 0xf3, 0xfe, 0x38, 0xa5, 0xa6, 0x7d, 0x08, 0xed, 0x89, 0x7f, 0x3e, 0x46, 0x79, 0xd6, - 0x5c, 0xd1, 0xf6, 0x5a, 0x12, 0xdb, 0x45, 0xb6, 0xd8, 0x80, 0x15, 0x33, 0x8b, 0xaa, 0xbc, 0xae, - 0x2b, 0x5f, 0x36, 0x72, 0xcb, 0x36, 0xdc, 0x82, 0x25, 0xf5, 0x4d, 0x2c, 0xfa, 0x43, 0xbc, 0xd2, - 0xf4, 0x16, 0x25, 0xac, 0x7a, 0x79, 0x1b, 0x3a, 0xc7, 0x41, 0xe8, 0x8f, 0xfa, 0x83, 0x51, 0x7a, - 0xd6, 0x1f, 0xf2, 0x51, 0xea, 0x13, 0xd7, 0xd4, 0xbd, 0x45, 0xc2, 0xb7, 0x46, 0xe9, 0xd9, 0x36, - 0xa2, 0xec, 0x23, 0x68, 0x1e, 0x73, 0xde, 0xa7, 0xc1, 0xea, 0x36, 0x2c, 0x09, 0x54, 0x33, 0xe4, - 0x35, 0x8e, 0xd5, 0x5c, 0x7d, 0x04, 0x9d, 0x68, 0x9a, 0x9e, 0x44, 0x41, 0x78, 0xd2, 0x47, 0x9d, - 0xd7, 0x0f, 0x86, 0xc4, 0x45, 0xb5, 0x87, 0x95, 0xfb, 0x8e, 0xb7, 0xa8, 0x68, 0xa8, 0x7d, 0x9e, - 0x0c, 0xd9, 0x4d, 0x58, 0x1a, 0xf9, 0x49, 0xda, 0x3f, 0x8d, 0x26, 0xfd, 0xc9, 0xf4, 0xe8, 0x15, - 0x3f, 0xef, 0x2e, 0xd0, 0x40, 0x2c, 0x20, 0xbc, 0x1b, 0x4d, 0x0e, 0x08, 0x64, 0xef, 0x03, 0x50, - 0x3b, 0x45, 0x23, 0xe0, 0xba, 0x73, 0x7b, 0xc1, 0x6b, 0x22, 0x22, 0x2a, 0xfd, 0x0c, 0x1a, 0x34, - 0x3d, 0xe9, 0xe8, 0xac, 0xdb, 0x22, 0x06, 0xfb, 0x40, 0xb6, 0xd0, 0x98, 0xd8, 0xbb, 0xdb, 0x3c, - 0x49, 0x9f, 0x8f, 0xce, 0x70, 0xfd, 0x3e, 0xf7, 0xe6, 0x87, 0x22, 0xd5, 0xfb, 0x0c, 0xda, 0x26, - 0x01, 0x67, 0x11, 0x9b, 0x81, 0xb3, 0x5f, 0xf3, 0xf0, 0x27, 0x5b, 0x85, 0xfa, 0x99, 0x3f, 0x9a, - 0x72, 0xa9, 0x48, 0x45, 0xe2, 0xb3, 0xca, 0xa7, 0x8e, 0xfb, 0x27, 0x0e, 0xb4, 0x45, 0x0d, 0xd2, - 0x00, 0xb8, 0x01, 0x0b, 0x6a, 0xf8, 0x79, 0x1c, 0x47, 0xb1, 0xd4, 0x27, 0x36, 0xc8, 0xee, 0x40, - 0x47, 0x01, 0x93, 0x98, 0x07, 0x63, 0xff, 0x44, 0x95, 0x5d, 0xc0, 0xd9, 0x46, 0x56, 0x62, 0x1c, - 0x4d, 0x53, 0x2e, 0x97, 0x9a, 0xb6, 0xec, 0x9f, 0x87, 0x98, 0x67, 0x67, 0x41, 0x7d, 0x52, 0xc2, - 0x5b, 0x16, 0xe6, 0xfe, 0x3d, 0x07, 0x18, 0x36, 0xfd, 0x79, 0x24, 0x8a, 0x90, 0x6c, 0x91, 0x67, - 0x4b, 0xe7, 0x9d, 0xd9, 0xb2, 0xf2, 0x36, 0xb6, 0x74, 0xa1, 0x2e, 0x5a, 0x5f, 0x2b, 0x69, 0xbd, - 0x20, 0x7d, 0xb7, 0xd6, 0xa8, 0x76, 0x6a, 0xee, 0x7f, 0xa9, 0xc2, 0xea, 0x96, 0x58, 0x2b, 0x37, - 0x07, 0x03, 0x3e, 0xd1, 0x0c, 0xfb, 0x01, 0xb4, 0xc2, 0x68, 0xc8, 0x15, 0x9b, 0x88, 0x86, 0x01, - 0x42, 0x06, 0x8f, 0x9c, 0xfa, 0x41, 0x28, 0x1a, 0x2e, 0xc6, 0xb3, 0x49, 0x08, 0x35, 0xfb, 0x26, - 0x2c, 0x4d, 0x78, 0x38, 0x34, 0xf9, 0x52, 0x58, 0x33, 0x0b, 0x12, 0x96, 0x2c, 0xf9, 0x01, 0xb4, - 0x8e, 0xa7, 0x22, 0x1f, 0x4a, 0x73, 0x8d, 0xf8, 0x00, 0x24, 0xb4, 0x29, 0x84, 0x7a, 0x32, 0x4d, - 0x4e, 0x89, 0x5a, 0x27, 0xea, 0x3c, 0xa6, 0x91, 0xf4, 0x3e, 0xc0, 0x70, 0x9a, 0xa4, 0x92, 0x4d, - 0xe7, 0x88, 0xd8, 0x44, 0x44, 0xb0, 0xe9, 0x37, 0x61, 0x65, 0xec, 0xbf, 0xe9, 0x13, 0xff, 0xf4, - 0x83, 0xb0, 0x7f, 0x3c, 0x22, 0x75, 0x3f, 0x4f, 0xf9, 0x3a, 0x63, 0xff, 0xcd, 0xf7, 0x91, 0xf2, - 0x24, 0x7c, 0x44, 0x38, 0xca, 0xb2, 0xb2, 0x33, 0x62, 0x9e, 0xf0, 0xf8, 0x8c, 0x93, 0xf8, 0xd5, - 0xb4, 0x31, 0xe1, 0x09, 0x14, 0x5b, 0x34, 0xc6, 0x7e, 0xa7, 0xa3, 0x81, 0x90, 0x35, 0x6f, 0x7e, - 0x1c, 0x84, 0xbb, 0xe9, 0x68, 0xc0, 0xae, 0x02, 0xa0, 0xf0, 0x4e, 0x78, 0xdc, 0x7f, 0xf5, 0x9a, - 0x04, 0xa7, 0x46, 0xc2, 0x7a, 0xc0, 0xe3, 0xcf, 0x5f, 0xb3, 0xf7, 0xa0, 0x39, 0x48, 0x48, 0xfa, - 0xfd, 0xf3, 0x6e, 0x8b, 0xa4, 0xaa, 0x31, 0x48, 0x50, 0xee, 0xfd, 0x73, 0xf6, 0x11, 0x30, 0x6c, - 0xad, 0x4f, 0xb3, 0xc0, 0x87, 0x54, 0x7c, 0x42, 0x6a, 0x6c, 0x81, 0x1a, 0xbb, 0x29, 0x09, 0x58, - 0x4f, 0xc2, 0xbe, 0x06, 0x0b, 0xaa, 0xb1, 0xc7, 0x23, 0xff, 0x24, 0x21, 0x39, 0x5e, 0xf0, 0xda, - 0x12, 0x7c, 0x84, 0x98, 0xfb, 0x52, 0x58, 0x37, 0xc6, 0xdc, 0x4a, 0xb9, 0xc1, 0x75, 0x96, 0x10, - 0x9a, 0xd7, 0x86, 0x27, 0x53, 0x65, 0x93, 0x56, 0x29, 0x99, 0x34, 0xf7, 0x17, 0x0e, 0xb4, 0x65, - 0xc9, 0x64, 0x12, 0xb0, 0xfb, 0xc0, 0xd4, 0x2c, 0xa6, 0x6f, 0x82, 0x61, 0xff, 0xe8, 0x3c, 0xe5, - 0x89, 0x60, 0x9a, 0xdd, 0x4b, 0x5e, 0x09, 0x0d, 0x15, 0x97, 0x85, 0x26, 0x69, 0x2c, 0x78, 0x7a, - 0xf7, 0x92, 0x57, 0xa0, 0xa0, 0x88, 0xa1, 0xd1, 0x31, 0x4d, 0xfb, 0x41, 0x38, 0xe4, 0x6f, 0x88, - 0x95, 0x16, 0x3c, 0x0b, 0x7b, 0xb8, 0x08, 0x6d, 0xf3, 0x3b, 0xf7, 0x27, 0xd0, 0x50, 0x26, 0x0b, - 0x2d, 0xd7, 0xb9, 0x76, 0x79, 0x06, 0xc2, 0x7a, 0xd0, 0xb0, 0x5b, 0xe1, 0x35, 0xbe, 0x4a, 0xdd, - 0xee, 0x5f, 0x80, 0xce, 0x1e, 0x32, 0x51, 0x88, 0x4c, 0x2b, 0xed, 0xb0, 0x35, 0x98, 0x33, 0x84, - 0xa7, 0xe9, 0xc9, 0x14, 0x2e, 0x78, 0xa7, 0x51, 0x92, 0xca, 0x7a, 0xe8, 0xb7, 0xfb, 0xef, 0x1c, - 0x60, 0x3b, 0x49, 0x1a, 0x8c, 0xfd, 0x94, 0x3f, 0xe2, 0x5a, 0x3d, 0x3c, 0x83, 0x36, 0x96, 0xf6, - 0x3c, 0xda, 0x14, 0x56, 0x91, 0x58, 0xcd, 0xbf, 0x21, 0xc5, 0xb9, 0xf8, 0xc1, 0x5d, 0x33, 0xb7, - 0x50, 0xbc, 0x56, 0x01, 0x28, 0x6d, 0xa9, 0x1f, 0x9f, 0xf0, 0x94, 0x4c, 0x26, 0x69, 0x70, 0x83, - 0x80, 0xb6, 0xa2, 0xf0, 0xb8, 0xf7, 0xbb, 0xb0, 0x5c, 0x28, 0xc3, 0xd4, 0xd1, 0xcd, 0x12, 0x1d, - 0x5d, 0x35, 0x75, 0xf4, 0x00, 0x56, 0xac, 0x76, 0x49, 0x8e, 0xeb, 0xc2, 0x3c, 0x0a, 0x06, 0xae, - 0xcc, 0x8e, 0x58, 0x99, 0x65, 0x92, 0x6d, 0xc0, 0xea, 0x31, 0xe7, 0xb1, 0x9f, 0x52, 0x92, 0x44, - 0x07, 0xe7, 0x44, 0x96, 0x5c, 0x4a, 0x73, 0xff, 0xbb, 0x03, 0x4b, 0xa8, 0x4d, 0x9f, 0xfa, 0xe1, - 0xb9, 0x1a, 0xab, 0xbd, 0xd2, 0xb1, 0xba, 0x6d, 0x2c, 0x4c, 0x46, 0xee, 0xaf, 0x3a, 0x50, 0xd5, - 0xfc, 0x40, 0xb1, 0xeb, 0xd0, 0xb6, 0x9a, 0x5b, 0x17, 0x26, 0x60, 0xe2, 0xa7, 0x07, 0x3c, 0x7e, - 0x78, 0x9e, 0xf2, 0x5f, 0x7f, 0x28, 0x6f, 0x42, 0x27, 0x6b, 0xb6, 0x1c, 0x47, 0x06, 0x35, 0x64, - 0x4c, 0x59, 0x00, 0xfd, 0x76, 0xff, 0x91, 0x23, 0x32, 0x6e, 0x45, 0x81, 0x36, 0x0f, 0x31, 0x23, - 0x5a, 0x99, 0x2a, 0x23, 0xfe, 0x9e, 0x69, 0x5e, 0xff, 0xfa, 0x9d, 0x45, 0x9d, 0x98, 0xf0, 0x70, - 0xd8, 0xf7, 0x47, 0x23, 0x52, 0xc4, 0x0d, 0x6f, 0x1e, 0xd3, 0x9b, 0xa3, 0x91, 0x7b, 0x0b, 0x96, - 0x8d, 0xd6, 0xbd, 0xa5, 0x1f, 0xfb, 0xc0, 0xf6, 0x82, 0x24, 0x7d, 0x11, 0x26, 0x13, 0xc3, 0x72, - 0x7a, 0x0f, 0x9a, 0xa8, 0x6d, 0xb1, 0x65, 0x42, 0x72, 0xeb, 0x1e, 0xaa, 0x5f, 0x6c, 0x57, 0x42, - 0x44, 0xff, 0x8d, 0x24, 0x56, 0x24, 0xd1, 0x7f, 0x43, 0x44, 0xf7, 0x53, 0x58, 0xb1, 0xca, 0x93, - 0x55, 0x7f, 0x08, 0xf5, 0x69, 0xfa, 0x26, 0x52, 0xb6, 0x71, 0x4b, 0x72, 0x08, 0xee, 0xc2, 0x3c, - 0x41, 0x71, 0x1f, 0xc0, 0xf2, 0x3e, 0x7f, 0x2d, 0x05, 0x59, 0x35, 0xe4, 0xe6, 0x85, 0x3b, 0x34, - 0xa2, 0xbb, 0x77, 0x81, 0x99, 0x1f, 0x67, 0x02, 0xa0, 0xf6, 0x6b, 0x8e, 0xb5, 0x5f, 0x73, 0x6f, - 0x02, 0x3b, 0x0c, 0x4e, 0xc2, 0xa7, 0x3c, 0x49, 0xfc, 0x13, 0x2d, 0xfa, 0x1d, 0xa8, 0x8e, 0x93, - 0x13, 0xa9, 0xaa, 0xf0, 0xa7, 0xfb, 0x2d, 0x58, 0xb1, 0xf2, 0xc9, 0x82, 0xaf, 0x42, 0x33, 0x09, - 0x4e, 0x42, 0x3f, 0x9d, 0xc6, 0x5c, 0x16, 0x9d, 0x01, 0xee, 0x23, 0x58, 0xfd, 0x3e, 0x8f, 0x83, - 0xe3, 0xf3, 0x8b, 0x8a, 0xb7, 0xcb, 0xa9, 0xe4, 0xcb, 0xd9, 0x81, 0xcb, 0xb9, 0x72, 0x64, 0xf5, - 0x82, 0x7d, 0xe5, 0x4c, 0x36, 0x3c, 0x91, 0x30, 0x74, 0x5f, 0xc5, 0xd4, 0x7d, 0xee, 0x0b, 0x60, - 0x5b, 0x51, 0x18, 0xf2, 0x41, 0x7a, 0xc0, 0x79, 0x9c, 0xb9, 0x8a, 0x32, 0x5e, 0x6d, 0x6d, 0xac, - 0xcb, 0x91, 0xcd, 0x2b, 0x54, 0xc9, 0xc4, 0x0c, 0x6a, 0x13, 0x1e, 0x8f, 0xa9, 0xe0, 0x86, 0x47, - 0xbf, 0xdd, 0xcb, 0xb0, 0x62, 0x15, 0x2b, 0x37, 0xd7, 0x1f, 0xc3, 0xe5, 0xed, 0x20, 0x19, 0x14, - 0x2b, 0xec, 0xc2, 0xfc, 0x64, 0x7a, 0xd4, 0xcf, 0x24, 0x51, 0x25, 0x71, 0xbf, 0x95, 0xff, 0x44, - 0x16, 0xf6, 0x37, 0x1c, 0xa8, 0xed, 0x3e, 0xdf, 0xdb, 0xc2, 0xb5, 0x22, 0x08, 0x07, 0xd1, 0x18, - 0xad, 0x30, 0xd1, 0x69, 0x9d, 0x9e, 0x29, 0x61, 0x57, 0xa1, 0x49, 0xc6, 0x1b, 0x6e, 0x31, 0xa5, - 0x1d, 0x94, 0x01, 0xb8, 0xbd, 0xe5, 0x6f, 0x26, 0x41, 0x4c, 0xfb, 0x57, 0xb5, 0x2b, 0xad, 0xd1, - 0x32, 0x53, 0x24, 0xb8, 0xbf, 0x98, 0x87, 0x79, 0xb9, 0xf8, 0x8a, 0x85, 0x3c, 0x0d, 0xce, 0x78, - 0xb6, 0x90, 0x63, 0x0a, 0x0d, 0xe3, 0x98, 0x8f, 0xa3, 0x54, 0xdb, 0x6f, 0x62, 0x1a, 0x6c, 0x90, - 0xb6, 0xef, 0xd2, 0x88, 0x10, 0x1b, 0xfe, 0xaa, 0xc8, 0x65, 0x81, 0xec, 0x2a, 0xcc, 0x2b, 0x63, - 0xa0, 0xa6, 0x77, 0x16, 0x0a, 0xc2, 0xd1, 0x18, 0xf8, 0x13, 0x7f, 0x10, 0xa4, 0xe7, 0x52, 0x2d, - 0xe8, 0x34, 0x96, 0x3f, 0x8a, 0x06, 0xfe, 0xa8, 0x7f, 0xe4, 0x8f, 0xfc, 0x70, 0xc0, 0x95, 0x7b, - 0xc0, 0x02, 0x71, 0xab, 0x2c, 0x9b, 0xa5, 0xb2, 0x89, 0xed, 0x74, 0x0e, 0xc5, 0x35, 0x7c, 0x10, - 0x8d, 0xc7, 0x41, 0x8a, 0x3b, 0x6c, 0x32, 0xcd, 0xaa, 0x9e, 0x81, 0x08, 0x67, 0x04, 0xa5, 0x5e, - 0x8b, 0x11, 0x6c, 0x2a, 0x67, 0x84, 0x01, 0x62, 0x29, 0x39, 0x0b, 0xad, 0xea, 0x19, 0x08, 0xce, - 0xc5, 0x34, 0x4c, 0x78, 0x9a, 0x8e, 0xf8, 0x50, 0x37, 0xa8, 0x45, 0xd9, 0x8a, 0x04, 0x76, 0x1f, - 0x56, 0xc4, 0xa6, 0x3f, 0xf1, 0xd3, 0x28, 0x39, 0x0d, 0x92, 0x7e, 0x82, 0xbb, 0x5f, 0xb1, 0xf9, - 0x2c, 0x23, 0xb1, 0x4f, 0x61, 0x3d, 0x07, 0xc7, 0x7c, 0xc0, 0x83, 0x33, 0x3e, 0x24, 0x13, 0xae, - 0xea, 0xcd, 0x22, 0xb3, 0xeb, 0xd0, 0x0a, 0xa7, 0xe3, 0xfe, 0x74, 0x32, 0xf4, 0xd1, 0x88, 0x59, - 0x24, 0xe3, 0xd2, 0x84, 0xd8, 0xc7, 0xa0, 0xec, 0x34, 0x69, 0x3d, 0x2e, 0x59, 0x1a, 0x0e, 0xb9, - 0xd7, 0xb3, 0x73, 0x20, 0x63, 0x66, 0x26, 0x69, 0x47, 0x6e, 0xf4, 0x14, 0x40, 0x72, 0x12, 0x07, - 0x67, 0x7e, 0xca, 0xbb, 0xcb, 0x42, 0xa9, 0xcb, 0x24, 0x7e, 0x17, 0x84, 0x41, 0x1a, 0xf8, 0x69, - 0x14, 0x77, 0x19, 0xd1, 0x32, 0x00, 0x07, 0x91, 0xf8, 0x23, 0x49, 0xfd, 0x74, 0x9a, 0x48, 0x0b, - 0x75, 0x85, 0x98, 0xab, 0x48, 0x60, 0x9f, 0xc0, 0x9a, 0xe0, 0x08, 0x22, 0x49, 0xdb, 0x9b, 0x4c, - 0x85, 0x55, 0x1a, 0x91, 0x19, 0x54, 0x1c, 0x4a, 0xc9, 0x22, 0x85, 0x0f, 0x2f, 0x8b, 0xa1, 0x9c, - 0x41, 0xc6, 0xf6, 0x61, 0x0b, 0x82, 0x41, 0x5f, 0xe6, 0x40, 0x11, 0x59, 0xa3, 0x5e, 0x14, 0x09, - 0xc8, 0xe2, 0xa3, 0xe0, 0x98, 0xa7, 0xc1, 0x98, 0x77, 0xd7, 0x05, 0x8b, 0xab, 0x34, 0x0a, 0xe0, - 0x74, 0x42, 0x94, 0xae, 0x10, 0x78, 0x91, 0x72, 0xff, 0xc0, 0x11, 0x8b, 0x8f, 0x14, 0xd4, 0xc4, - 0xd8, 0x56, 0x09, 0x11, 0xed, 0x47, 0xe1, 0xe8, 0x5c, 0x4a, 0x2d, 0x08, 0xe8, 0x59, 0x38, 0x3a, - 0x47, 0xc3, 0x3e, 0x08, 0xcd, 0x2c, 0x42, 0xcf, 0xb5, 0x15, 0x48, 0x99, 0x3e, 0x80, 0xd6, 0x64, - 0x7a, 0x34, 0x0a, 0x06, 0x22, 0x4b, 0x55, 0x94, 0x22, 0x20, 0xca, 0x80, 0xfb, 0x4a, 0x31, 0x53, - 0x22, 0x47, 0x8d, 0x72, 0xb4, 0x24, 0x86, 0x59, 0xdc, 0x87, 0xb0, 0x6a, 0x37, 0x50, 0x2a, 0xf4, - 0x3b, 0xd0, 0x90, 0xf2, 0x9f, 0xc8, 0xcd, 0xfd, 0xa2, 0xe1, 0x67, 0xc5, 0x6d, 0x90, 0xa6, 0xbb, - 0xff, 0xba, 0x06, 0x2b, 0x12, 0xdd, 0x1a, 0x45, 0x09, 0x3f, 0x9c, 0x8e, 0xc7, 0x7e, 0x5c, 0xa2, - 0x58, 0x9c, 0x0b, 0x14, 0x4b, 0xa5, 0xa8, 0x58, 0xae, 0x59, 0xfb, 0x4b, 0xa1, 0x99, 0x0c, 0x84, - 0xdd, 0x86, 0xa5, 0xc1, 0x28, 0x4a, 0x84, 0xb9, 0x6f, 0xba, 0xfa, 0xf2, 0x70, 0x51, 0x19, 0xd6, - 0xcb, 0x94, 0xa1, 0xa9, 0xc8, 0xe6, 0x72, 0x8a, 0xcc, 0x85, 0x36, 0x16, 0xca, 0x95, 0x6e, 0x9e, - 0x97, 0x9b, 0x2d, 0x03, 0xc3, 0xf6, 0xe4, 0xd5, 0x86, 0xd0, 0x51, 0x4b, 0x65, 0x4a, 0x23, 0x18, - 0x73, 0xd2, 0xfd, 0x46, 0xee, 0xa6, 0x54, 0x1a, 0x45, 0x12, 0x7b, 0x04, 0x20, 0xea, 0x22, 0x03, - 0x04, 0xc8, 0x00, 0xb9, 0x69, 0xcf, 0x8a, 0x39, 0xfe, 0x77, 0x31, 0x31, 0x8d, 0x39, 0x19, 0x25, - 0xc6, 0x97, 0xee, 0xdf, 0x72, 0xa0, 0x65, 0xd0, 0xd8, 0x65, 0x58, 0xde, 0x7a, 0xf6, 0xec, 0x60, - 0xc7, 0xdb, 0x7c, 0xfe, 0xe4, 0xfb, 0x3b, 0xfd, 0xad, 0xbd, 0x67, 0x87, 0x3b, 0x9d, 0x4b, 0x08, - 0xef, 0x3d, 0xdb, 0xda, 0xdc, 0xeb, 0x3f, 0x7a, 0xe6, 0x6d, 0x29, 0xd8, 0x61, 0x6b, 0xc0, 0xbc, - 0x9d, 0xa7, 0xcf, 0x9e, 0xef, 0x58, 0x78, 0x85, 0x75, 0xa0, 0xfd, 0xd0, 0xdb, 0xd9, 0xdc, 0xda, - 0x95, 0x48, 0x95, 0xad, 0x42, 0xe7, 0xd1, 0x8b, 0xfd, 0xed, 0x27, 0xfb, 0x8f, 0xfb, 0x5b, 0x9b, - 0xfb, 0x5b, 0x3b, 0x7b, 0x3b, 0xdb, 0x9d, 0x1a, 0x5b, 0x80, 0xe6, 0xe6, 0xc3, 0xcd, 0xfd, 0xed, - 0x67, 0xfb, 0x3b, 0xdb, 0x9d, 0xba, 0xfb, 0x5f, 0x1d, 0xb8, 0x4c, 0xad, 0x1e, 0xe6, 0x85, 0xe4, - 0x3a, 0xb4, 0x06, 0x51, 0x34, 0x41, 0xc3, 0x3f, 0x5b, 0xda, 0x4c, 0x08, 0x05, 0x40, 0x28, 0x85, - 0xe3, 0x28, 0x1e, 0x70, 0x29, 0x23, 0x40, 0xd0, 0x23, 0x44, 0x50, 0x00, 0xe4, 0xf4, 0x8a, 0x1c, - 0x42, 0x44, 0x5a, 0x02, 0x13, 0x59, 0xd6, 0x60, 0xee, 0x28, 0xe6, 0xfe, 0xe0, 0x54, 0x4a, 0x87, - 0x4c, 0xb1, 0xaf, 0x67, 0x3b, 0xd3, 0x01, 0x8e, 0xfe, 0x88, 0x0f, 0x89, 0x63, 0x1a, 0xde, 0x92, - 0xc4, 0xb7, 0x24, 0x8c, 0x5a, 0xd0, 0x3f, 0xf2, 0xc3, 0x61, 0x14, 0xf2, 0xa1, 0x34, 0x7b, 0x33, - 0xc0, 0x3d, 0x80, 0xb5, 0x7c, 0xff, 0xa4, 0x8c, 0x7d, 0x62, 0xc8, 0x98, 0xb0, 0x42, 0x7b, 0xb3, - 0x67, 0xd3, 0x90, 0xb7, 0x5f, 0x56, 0xa0, 0x86, 0x46, 0xc9, 0x6c, 0x03, 0xc6, 0xb4, 0x33, 0xab, - 0x85, 0x73, 0x01, 0xda, 0xec, 0x8a, 0x25, 0x4a, 0x3a, 0x5a, 0x32, 0x24, 0xa3, 0xc7, 0x7c, 0x70, - 0x26, 0x5d, 0x2d, 0x06, 0x82, 0x02, 0x82, 0x9b, 0x00, 0xfa, 0x5a, 0x0a, 0x88, 0x4a, 0x2b, 0x1a, - 0x7d, 0x39, 0x9f, 0xd1, 0xe8, 0xbb, 0x2e, 0xcc, 0x07, 0xe1, 0x51, 0x34, 0x0d, 0x87, 0x24, 0x10, - 0x0d, 0x4f, 0x25, 0xe9, 0x24, 0x82, 0x04, 0x15, 0xf5, 0xa7, 0x60, 0xff, 0x0c, 0x60, 0x1b, 0xd0, - 0x4c, 0xce, 0xc3, 0x81, 0xc9, 0xf3, 0xab, 0x72, 0x94, 0x70, 0x0c, 0xee, 0x1e, 0x9e, 0x87, 0x03, - 0xe2, 0xf0, 0x2c, 0x9b, 0xfb, 0xbb, 0xd0, 0x50, 0x30, 0xb2, 0xe5, 0x8b, 0xfd, 0xcf, 0xf7, 0x9f, - 0xbd, 0xdc, 0xef, 0x1f, 0xfe, 0x60, 0x7f, 0xab, 0x73, 0x89, 0x2d, 0x41, 0x6b, 0x73, 0x8b, 0x38, - 0x9d, 0x00, 0x07, 0xb3, 0x1c, 0x6c, 0x1e, 0x1e, 0x6a, 0xa4, 0xe2, 0x32, 0xdc, 0xc8, 0x27, 0x64, - 0xf9, 0x69, 0x4f, 0xfb, 0x27, 0xb0, 0x6c, 0x60, 0xd9, 0x2e, 0x62, 0x82, 0x40, 0x6e, 0x17, 0x41, - 0x26, 0xa3, 0xa0, 0xb8, 0x1d, 0x58, 0x7c, 0xcc, 0xd3, 0x27, 0xe1, 0x71, 0xa4, 0x4a, 0xfa, 0x9f, - 0x35, 0x58, 0xd2, 0x90, 0x2c, 0xe8, 0x36, 0x2c, 0x05, 0x43, 0x1e, 0xa6, 0x41, 0x7a, 0xde, 0xb7, - 0xfc, 0x05, 0x79, 0x18, 0x4d, 0x6d, 0x7f, 0x14, 0xf8, 0xea, 0xc0, 0x47, 0x24, 0x70, 0xff, 0x8c, - 0x36, 0x80, 0xe9, 0xb7, 0x21, 0xbe, 0x12, 0x6e, 0x8a, 0x52, 0x1a, 0x6a, 0x20, 0xc4, 0xe5, 0x32, - 0xa3, 0x3f, 0x11, 0x26, 0x67, 0x19, 0x09, 0xa7, 0x4a, 0x94, 0x84, 0x5d, 0xae, 0x0b, 0x3b, 0x41, - 0x03, 0x85, 0x13, 0x95, 0x39, 0xa1, 0x1f, 0xf3, 0x27, 0x2a, 0xc6, 0xa9, 0x4c, 0xa3, 0x70, 0x2a, - 0x83, 0xfa, 0xf3, 0x3c, 0x1c, 0xf0, 0x61, 0x3f, 0x8d, 0xfa, 0xa4, 0xe7, 0x89, 0x25, 0x1a, 0x5e, - 0x1e, 0xc6, 0x75, 0x23, 0xe5, 0x49, 0x1a, 0x72, 0xe1, 0x9a, 0x6e, 0x90, 0x17, 0x54, 0x41, 0xb8, - 0x3f, 0x98, 0xc6, 0x41, 0xd2, 0x6d, 0xd3, 0x79, 0x0b, 0xfd, 0x66, 0xdf, 0x86, 0xcb, 0x47, 0x3c, - 0x49, 0xfb, 0xa7, 0xdc, 0x1f, 0xf2, 0x98, 0xd8, 0x4b, 0x1c, 0xec, 0x08, 0x93, 0xab, 0x9c, 0x88, - 0x8c, 0x7b, 0xc6, 0xe3, 0x24, 0x88, 0x42, 0x32, 0xb6, 0x9a, 0x9e, 0x4a, 0x62, 0x79, 0xd8, 0x79, - 0xbd, 0x50, 0xeb, 0x11, 0x5c, 0xa2, 0x8e, 0x97, 0x13, 0xd9, 0x0d, 0x98, 0xa3, 0x0e, 0x24, 0xdd, - 0x0e, 0xf1, 0x4c, 0x3b, 0x93, 0xf9, 0x20, 0xf4, 0x24, 0x0d, 0x67, 0x79, 0x10, 0x8d, 0xa2, 0x98, - 0x2c, 0xae, 0xa6, 0x27, 0x12, 0xf6, 0xe8, 0x9c, 0xc4, 0xfe, 0xe4, 0x54, 0x5a, 0x5d, 0x79, 0xf8, - 0xbb, 0xb5, 0x46, 0xab, 0xd3, 0x76, 0xff, 0x1c, 0xd4, 0xa9, 0x58, 0x2a, 0x8e, 0x06, 0xd3, 0x91, - 0xc5, 0x11, 0xda, 0x85, 0xf9, 0x90, 0xa7, 0xaf, 0xa3, 0xf8, 0x95, 0x3a, 0x3d, 0x94, 0x49, 0xf7, - 0x67, 0xb4, 0x43, 0xd3, 0xa7, 0x69, 0x2f, 0xc8, 0xb4, 0xc4, 0x7d, 0xb6, 0x98, 0xaa, 0xe4, 0xd4, - 0x97, 0x9b, 0xc6, 0x06, 0x01, 0x87, 0xa7, 0x3e, 0xea, 0x5a, 0x6b, 0xf6, 0xc5, 0x3e, 0xbc, 0x45, - 0xd8, 0xae, 0x98, 0xfc, 0x1b, 0xb0, 0xa8, 0xce, 0xe9, 0x92, 0xfe, 0x88, 0x1f, 0xa7, 0xca, 0x8b, - 0x16, 0x4e, 0xc7, 0xb4, 0x59, 0xdf, 0xe3, 0xc7, 0xa9, 0xbb, 0x0f, 0xcb, 0x52, 0xff, 0x3d, 0x9b, - 0x70, 0x55, 0xf5, 0x6f, 0x97, 0xd9, 0x12, 0xad, 0x8d, 0x15, 0x5b, 0x61, 0x8a, 0x93, 0x49, 0x3b, - 0xa7, 0xeb, 0x01, 0x33, 0xf5, 0xa9, 0x2c, 0x50, 0x2e, 0xe6, 0xca, 0x4f, 0x28, 0xbb, 0x63, 0x61, - 0x38, 0x3e, 0xc9, 0x74, 0x30, 0x50, 0xa7, 0xab, 0x0d, 0x4f, 0x25, 0xdd, 0x3f, 0x72, 0x60, 0x85, - 0x4a, 0x53, 0xd6, 0x90, 0x5c, 0xb3, 0x3e, 0xfd, 0x0a, 0xcd, 0x54, 0x5e, 0x5a, 0xe1, 0x9b, 0x5c, - 0x85, 0xba, 0xb9, 0x8a, 0x89, 0xc4, 0x57, 0xf7, 0xc9, 0xd4, 0xf2, 0x3e, 0x19, 0xf7, 0xef, 0x3b, - 0xb0, 0x2c, 0x16, 0x12, 0xb2, 0xb6, 0x65, 0xf7, 0xff, 0x3c, 0x2c, 0x08, 0x8b, 0x40, 0x6a, 0x05, - 0xd9, 0xd0, 0x4c, 0xb5, 0x12, 0x2a, 0x32, 0xef, 0x5e, 0xf2, 0xec, 0xcc, 0xec, 0x01, 0x59, 0x65, - 0x61, 0x9f, 0xd0, 0x92, 0x73, 0x78, 0x7b, 0xac, 0x77, 0x2f, 0x79, 0x46, 0xf6, 0x87, 0x0d, 0x34, - 0x96, 0x11, 0x77, 0x1f, 0xc3, 0x82, 0x55, 0x91, 0xe5, 0x0f, 0x6a, 0x0b, 0x7f, 0x50, 0xc1, 0xf1, - 0x5a, 0x29, 0x71, 0xbc, 0xfe, 0xcb, 0x2a, 0x30, 0x64, 0x96, 0xdc, 0x6c, 0x5c, 0xb7, 0x4f, 0x2f, - 0xd4, 0x91, 0x7c, 0x06, 0xb1, 0x0d, 0x60, 0x46, 0x52, 0x9d, 0xaa, 0x54, 0xf5, 0xa9, 0x4a, 0x09, - 0x15, 0x55, 0xad, 0xb4, 0x3a, 0xf4, 0x89, 0x05, 0xed, 0xf5, 0xc5, 0xd0, 0x97, 0xd2, 0x70, 0x65, - 0xa4, 0xe3, 0x0b, 0xdc, 0x95, 0xc8, 0xfd, 0xb1, 0x4a, 0xe7, 0xe7, 0x78, 0xee, 0xc2, 0x39, 0x9e, - 0x2f, 0xf8, 0xdd, 0x8c, 0x1d, 0x5a, 0xc3, 0xde, 0xa1, 0xdd, 0x80, 0x05, 0x75, 0x4a, 0x21, 0x4e, - 0x44, 0xe5, 0x76, 0xd8, 0x02, 0xd9, 0x1d, 0xe8, 0xa8, 0x4d, 0x92, 0xde, 0x06, 0x8a, 0xf3, 0xbe, - 0x02, 0x8e, 0x6b, 0x40, 0xe6, 0x89, 0x6b, 0x51, 0x63, 0x33, 0x80, 0xf6, 0x54, 0xc8, 0x25, 0xfd, - 0x69, 0x28, 0x8f, 0xe3, 0xf9, 0x90, 0x36, 0xc2, 0xb8, 0xa7, 0xca, 0x13, 0xdc, 0xbf, 0xe3, 0x40, - 0x07, 0xe7, 0xcd, 0x62, 0xcd, 0xcf, 0x80, 0x24, 0xe3, 0x1d, 0x39, 0xd3, 0xca, 0xcb, 0x3e, 0x85, - 0x26, 0xa5, 0xa3, 0x09, 0x0f, 0x25, 0x5f, 0x76, 0x6d, 0xbe, 0xcc, 0x74, 0xca, 0xee, 0x25, 0x2f, - 0xcb, 0x6c, 0x70, 0xe5, 0x7f, 0x74, 0xa0, 0x25, 0x6b, 0xf9, 0x95, 0x3d, 0x3d, 0x3d, 0x23, 0x7e, - 0x42, 0x18, 0x60, 0x59, 0xb8, 0xc4, 0x6d, 0x58, 0x1a, 0xfb, 0xe9, 0x34, 0xc6, 0x35, 0xdd, 0xf2, - 0xf2, 0xe4, 0x61, 0x5c, 0xa0, 0x49, 0x7d, 0x26, 0xfd, 0x34, 0x18, 0xf5, 0x15, 0x55, 0x46, 0x2a, - 0x94, 0x91, 0x50, 0x8b, 0x24, 0xa9, 0x7f, 0xc2, 0xe5, 0xda, 0x2b, 0x12, 0x6e, 0x17, 0xd6, 0x0e, - 0xb2, 0x93, 0x1b, 0xc3, 0xc6, 0x76, 0xff, 0xf9, 0x02, 0xac, 0x17, 0x48, 0x3a, 0xae, 0x4a, 0xba, - 0x2e, 0x46, 0xc1, 0xf8, 0x28, 0xd2, 0x1b, 0x14, 0xc7, 0xf4, 0x6a, 0x58, 0x24, 0x76, 0x02, 0x97, - 0x95, 0x91, 0x81, 0x63, 0x9a, 0x2d, 0x88, 0x15, 0x5a, 0xe9, 0x3e, 0xb6, 0xa7, 0x30, 0x5f, 0xa1, - 0xc2, 0x4d, 0x41, 0x2e, 0x2f, 0x8f, 0x9d, 0x42, 0x57, 0x5b, 0x33, 0x52, 0x61, 0x1b, 0x16, 0x0f, - 0xd6, 0xf5, 0xd1, 0x05, 0x75, 0x59, 0x26, 0xb9, 0x37, 0xb3, 0x34, 0x76, 0x0e, 0xd7, 0x14, 0x8d, - 0x34, 0x72, 0xb1, 0xbe, 0xda, 0x3b, 0xf5, 0x8d, 0x36, 0x1b, 0x76, 0xa5, 0x17, 0x14, 0xcc, 0x7e, - 0x02, 0x6b, 0xaf, 0xfd, 0x20, 0x55, 0xcd, 0x32, 0xec, 0x8b, 0x3a, 0x55, 0xb9, 0x71, 0x41, 0x95, - 0x2f, 0xc5, 0xc7, 0xd6, 0x32, 0x35, 0xa3, 0xc4, 0xde, 0x9f, 0x56, 0x60, 0xd1, 0x2e, 0x07, 0xd9, - 0x54, 0xca, 0xbe, 0xd2, 0x81, 0xca, 0x22, 0xcd, 0xc1, 0xc5, 0x7d, 0x7e, 0xa5, 0x6c, 0x9f, 0x6f, - 0xee, 0xac, 0xab, 0x17, 0xb9, 0x08, 0x6b, 0xef, 0xe6, 0x22, 0xac, 0x97, 0xba, 0x08, 0x67, 0x7b, - 0x92, 0xe6, 0x7e, 0x55, 0x4f, 0xd2, 0xfc, 0x5b, 0x3d, 0x49, 0xbd, 0xff, 0xe3, 0x00, 0x2b, 0x72, - 0x2f, 0x7b, 0x2c, 0x5c, 0x1b, 0x21, 0x1f, 0x49, 0x25, 0xf6, 0xcd, 0x77, 0x93, 0x00, 0x35, 0x5b, - 0xea, 0x6b, 0x14, 0x45, 0x33, 0xb8, 0xc9, 0x34, 0xb1, 0x16, 0xbc, 0x32, 0x52, 0xce, 0x4d, 0x5a, - 0xbb, 0xd8, 0x4d, 0x5a, 0xbf, 0xd8, 0x4d, 0x3a, 0x97, 0x77, 0x93, 0xf6, 0xfe, 0xba, 0x03, 0x2b, - 0x25, 0x6c, 0xf6, 0x9b, 0xeb, 0x38, 0x32, 0x86, 0xa5, 0x7d, 0x2a, 0x92, 0x31, 0x4c, 0xb0, 0xf7, - 0x97, 0x61, 0xc1, 0x12, 0xad, 0xdf, 0x5c, 0xfd, 0x79, 0x2b, 0x51, 0x70, 0xb6, 0x85, 0xf5, 0xfe, - 0x57, 0x05, 0x58, 0x51, 0xbc, 0xff, 0xbf, 0xb6, 0xa1, 0x38, 0x4e, 0xd5, 0x92, 0x71, 0xfa, 0x7f, - 0xba, 0xf2, 0x7c, 0x04, 0xcb, 0x32, 0x62, 0xd3, 0x70, 0x66, 0x09, 0x8e, 0x29, 0x12, 0xd0, 0x4e, - 0xb6, 0x7d, 0xd4, 0x0d, 0x2b, 0x42, 0xcd, 0x58, 0x7e, 0x73, 0xae, 0x6a, 0xb7, 0x07, 0x5d, 0x39, - 0x42, 0x3b, 0x67, 0x3c, 0x4c, 0x0f, 0xa7, 0x47, 0x22, 0x64, 0x31, 0x88, 0x42, 0x32, 0x03, 0x4d, - 0xa2, 0x34, 0x28, 0xbe, 0x0d, 0x6d, 0x73, 0xf9, 0x90, 0xd3, 0x91, 0xf3, 0x67, 0xa2, 0x29, 0x61, - 0xe6, 0x62, 0xdb, 0xb0, 0x48, 0x4a, 0x72, 0xa8, 0xbf, 0xab, 0xd0, 0x77, 0x6f, 0xf1, 0xd1, 0xec, - 0x5e, 0xf2, 0x72, 0xdf, 0xb0, 0xdf, 0x81, 0x45, 0x7b, 0x03, 0x28, 0xad, 0x92, 0xb2, 0x1d, 0x01, - 0x7e, 0x6e, 0x67, 0x66, 0x9b, 0xd0, 0xc9, 0xef, 0x20, 0x65, 0x34, 0xcf, 0x8c, 0x02, 0x0a, 0xd9, - 0xd9, 0xa7, 0xf2, 0xc0, 0xb2, 0x4e, 0xbe, 0x93, 0x1b, 0xf6, 0x67, 0xc6, 0x30, 0xdd, 0x15, 0x7f, - 0x8c, 0x23, 0xcc, 0xdf, 0x03, 0xc8, 0x30, 0xd6, 0x81, 0xf6, 0xb3, 0x83, 0x9d, 0xfd, 0xfe, 0xd6, - 0xee, 0xe6, 0xfe, 0xfe, 0xce, 0x5e, 0xe7, 0x12, 0x63, 0xb0, 0x48, 0xae, 0xbe, 0x6d, 0x8d, 0x39, - 0x88, 0x49, 0xe7, 0x8a, 0xc2, 0x2a, 0x6c, 0x15, 0x3a, 0x4f, 0xf6, 0x73, 0x68, 0xf5, 0x61, 0x53, - 0xcb, 0x87, 0xbb, 0x06, 0xab, 0x22, 0x22, 0xf7, 0xa1, 0x60, 0x0f, 0x65, 0x9d, 0xfc, 0x63, 0x07, - 0x2e, 0xe7, 0x08, 0x59, 0xc8, 0x97, 0x30, 0x40, 0x6c, 0xab, 0xc4, 0x06, 0xe9, 0x00, 0x42, 0xd9, - 0x9a, 0x39, 0x0d, 0x52, 0x24, 0x20, 0xcf, 0x1b, 0xb6, 0x69, 0x4e, 0x92, 0xca, 0x48, 0xee, 0xba, - 0x8e, 0xac, 0xc9, 0x35, 0xfc, 0x58, 0x44, 0xfa, 0x9a, 0x84, 0xec, 0x00, 0xd8, 0x6e, 0xb2, 0x4a, - 0xe2, 0xb6, 0xc2, 0x32, 0x76, 0xec, 0xf6, 0x96, 0xd2, 0xdc, 0x7f, 0x5b, 0x05, 0xf6, 0xbd, 0x29, - 0x8f, 0xcf, 0x29, 0xa6, 0x4b, 0x7b, 0x4e, 0xd7, 0xf3, 0x7e, 0xc1, 0xb9, 0xc9, 0xf4, 0xe8, 0x73, - 0x7e, 0xae, 0x82, 0x25, 0x2b, 0xef, 0x14, 0x2c, 0x59, 0x16, 0xac, 0x58, 0xbb, 0x38, 0x58, 0xb1, - 0x7e, 0x51, 0xb0, 0xe2, 0xd7, 0x60, 0x21, 0x38, 0x09, 0x23, 0x54, 0x07, 0x68, 0x42, 0x24, 0xdd, - 0xb9, 0xeb, 0x55, 0xdc, 0x7a, 0x4b, 0x70, 0x1f, 0x31, 0xf6, 0x20, 0xcb, 0xc4, 0x87, 0x27, 0x14, - 0x5c, 0x6b, 0x2a, 0x88, 0x9d, 0xe1, 0x09, 0xdf, 0x8b, 0x06, 0x7e, 0x1a, 0xc5, 0xb4, 0x4f, 0x53, - 0x1f, 0x23, 0x9e, 0xb0, 0x1b, 0xb0, 0x98, 0x44, 0x53, 0x34, 0xaa, 0xd4, 0x30, 0x08, 0x47, 0x53, - 0x5b, 0xa0, 0x07, 0x62, 0x30, 0xee, 0xc2, 0xca, 0x34, 0xe1, 0xfd, 0x71, 0x90, 0x24, 0xb8, 0x70, - 0x0e, 0xa2, 0x30, 0x8d, 0xa3, 0x91, 0x74, 0x37, 0x2d, 0x4f, 0x13, 0xfe, 0x54, 0x50, 0xb6, 0x04, - 0x81, 0x7d, 0x3b, 0x6b, 0xd2, 0xc4, 0x0f, 0xe2, 0xa4, 0x0b, 0xd4, 0x24, 0xd5, 0x53, 0x6c, 0xf7, - 0x81, 0x1f, 0xc4, 0xba, 0x2d, 0x98, 0x48, 0x72, 0x41, 0x94, 0xad, 0x5c, 0x10, 0xa5, 0x8c, 0xbf, - 0xbb, 0x0b, 0x0d, 0xf5, 0x39, 0xee, 0x81, 0x8f, 0xe3, 0x68, 0xac, 0xf6, 0xc0, 0xf8, 0x9b, 0x2d, - 0x42, 0x25, 0x8d, 0xe4, 0xfe, 0xb5, 0x92, 0x46, 0xee, 0xef, 0x43, 0xcb, 0x18, 0x01, 0xf6, 0xa1, - 0xd8, 0x8e, 0xa3, 0xad, 0x25, 0x37, 0xcf, 0xe2, 0x14, 0xa5, 0x29, 0xd1, 0x27, 0x43, 0xf6, 0x0d, - 0x58, 0x1e, 0x06, 0x31, 0xa7, 0x38, 0xdf, 0x7e, 0xcc, 0xcf, 0x78, 0x9c, 0x28, 0x57, 0x43, 0x47, - 0x13, 0x3c, 0x81, 0xbb, 0x7d, 0x58, 0xb1, 0xb8, 0x4a, 0x0b, 0xdd, 0x1c, 0x05, 0x0d, 0x2a, 0x6f, - 0xa7, 0x1d, 0x50, 0x28, 0x69, 0xb8, 0x5c, 0x49, 0x2f, 0x49, 0x7f, 0x12, 0x47, 0x47, 0x54, 0x89, - 0xe3, 0x59, 0x98, 0xfb, 0xcb, 0x0a, 0x54, 0x77, 0xa3, 0x89, 0x79, 0xf6, 0xe3, 0x14, 0xcf, 0x7e, - 0xa4, 0x5d, 0xd9, 0xd7, 0x66, 0xa3, 0x5c, 0xfc, 0x2d, 0x90, 0xdd, 0x81, 0x45, 0xe4, 0xe0, 0x34, - 0x42, 0x3b, 0xfa, 0xb5, 0x1f, 0x8b, 0x08, 0xc3, 0x2a, 0xb1, 0x45, 0x8e, 0xc2, 0x56, 0xa1, 0xaa, - 0xcd, 0x21, 0xca, 0x80, 0x49, 0xdc, 0xc4, 0xd1, 0xf9, 0xfa, 0xb9, 0x74, 0x69, 0xca, 0x14, 0x2a, - 0x04, 0xfb, 0x7b, 0x21, 0x26, 0x62, 0x51, 0x2b, 0x23, 0xa1, 0x8d, 0x8b, 0x82, 0x30, 0xce, 0x4c, - 0x46, 0x9d, 0x36, 0x9d, 0xf5, 0x0d, 0xdb, 0x59, 0x7f, 0x1d, 0x5a, 0xe9, 0xe8, 0xac, 0x3f, 0xf1, - 0xcf, 0x47, 0x91, 0x3f, 0x94, 0x0c, 0x68, 0x42, 0xec, 0x3e, 0xc0, 0x78, 0x32, 0xe9, 0xe3, 0x3a, - 0x1a, 0x0f, 0x69, 0x67, 0xde, 0xda, 0xe8, 0xc8, 0xd1, 0x7f, 0x7a, 0x70, 0xe0, 0x11, 0xee, 0x19, - 0x79, 0xdc, 0x97, 0xd0, 0xd4, 0x04, 0x33, 0x34, 0x95, 0x22, 0x2c, 0x5a, 0x76, 0x68, 0x2a, 0x05, - 0x54, 0xdc, 0x84, 0x45, 0xa1, 0x3c, 0xb5, 0x3a, 0x10, 0xa7, 0xe2, 0x39, 0xd4, 0xfd, 0x33, 0x07, - 0xea, 0x34, 0xe1, 0x68, 0x4d, 0x08, 0x9a, 0x3e, 0xab, 0xa2, 0x49, 0x5c, 0xf0, 0xf2, 0x30, 0x73, - 0xad, 0x30, 0xf9, 0x8a, 0x1e, 0x7d, 0x33, 0x54, 0xfe, 0x3a, 0x34, 0x75, 0x4d, 0xc6, 0x0c, 0x66, - 0x20, 0xbb, 0x06, 0xb5, 0xd3, 0x68, 0xa2, 0x36, 0x5c, 0xa0, 0x8e, 0xb3, 0xa3, 0x89, 0x47, 0x78, - 0xd6, 0x1e, 0x2c, 0x4f, 0x74, 0x41, 0x18, 0xb5, 0x79, 0xb8, 0xa4, 0xaf, 0x73, 0xa5, 0x7d, 0x7d, - 0x01, 0x4b, 0x28, 0x96, 0x86, 0xef, 0x7e, 0xb6, 0x6a, 0xfd, 0x3a, 0xae, 0xd4, 0x83, 0xd1, 0x74, - 0xc8, 0xcd, 0x6d, 0x2f, 0xf9, 0x66, 0x25, 0xae, 0x0c, 0x3e, 0xf7, 0x5f, 0x38, 0x42, 0xdc, 0xb1, - 0x5c, 0x76, 0x1b, 0x6a, 0xa8, 0x05, 0x73, 0x5e, 0x0e, 0x1d, 0xf5, 0x82, 0xf9, 0x3c, 0xca, 0x81, - 0xb3, 0x48, 0xde, 0x53, 0xb3, 0x74, 0xe1, 0x3b, 0xcd, 0xf6, 0x8c, 0xba, 0x67, 0xb9, 0xad, 0x56, - 0x0e, 0x65, 0x77, 0x8d, 0xa3, 0xa7, 0x9a, 0xa5, 0x59, 0x95, 0x61, 0x30, 0x3c, 0xe1, 0xc6, 0x91, - 0xd3, 0x1f, 0x3b, 0xb0, 0x60, 0xb5, 0x09, 0x99, 0x96, 0x82, 0xc8, 0x85, 0xd3, 0x44, 0xce, 0xbc, - 0x09, 0x99, 0x0c, 0x5f, 0xb1, 0x19, 0x5e, 0x1f, 0x61, 0x54, 0xcd, 0x23, 0x8c, 0xfb, 0xd0, 0xcc, - 0xee, 0x49, 0xd8, 0x8d, 0xc2, 0x1a, 0x55, 0xfc, 0x4f, 0x96, 0x29, 0x73, 0x92, 0xd7, 0x0d, 0x27, - 0xb9, 0xfb, 0x00, 0x5a, 0x46, 0x7e, 0xd3, 0xc9, 0xed, 0x58, 0x4e, 0x6e, 0x1d, 0x1c, 0x57, 0xc9, - 0x82, 0xe3, 0xdc, 0x9f, 0x57, 0x60, 0x01, 0xd9, 0x3b, 0x08, 0x4f, 0x0e, 0xa2, 0x51, 0x30, 0x38, - 0x27, 0xb6, 0x52, 0x9c, 0x2c, 0x57, 0x41, 0xc5, 0xe6, 0x36, 0x8c, 0xd2, 0xaf, 0x23, 0x82, 0x85, - 0xaa, 0xd2, 0x69, 0xd4, 0x65, 0xa8, 0x09, 0x8e, 0xfc, 0x84, 0x1b, 0x17, 0x27, 0x3c, 0x1b, 0x44, - 0x8d, 0x83, 0x00, 0x85, 0x3a, 0x8e, 0x83, 0xd1, 0x28, 0x10, 0x79, 0xc5, 0xf6, 0xad, 0x8c, 0x84, - 0x75, 0x0e, 0x83, 0xc4, 0x3f, 0xca, 0x8e, 0x27, 0x75, 0x9a, 0x7c, 0x7f, 0xfe, 0x1b, 0xc3, 0xf7, - 0x27, 0x62, 0xa3, 0x6d, 0x30, 0x3f, 0x91, 0xf3, 0x85, 0x89, 0x74, 0xff, 0x4d, 0x05, 0x5a, 0x06, - 0x5b, 0xa0, 0x38, 0x97, 0x2e, 0x37, 0x06, 0x2a, 0xcf, 0xed, 0x43, 0xcb, 0x21, 0x60, 0x20, 0xec, - 0x86, 0x5d, 0x2b, 0x9d, 0x03, 0x90, 0xc0, 0x5b, 0x2c, 0x74, 0x15, 0x9a, 0xc8, 0xfa, 0x1f, 0x93, - 0xf7, 0x41, 0x5e, 0x52, 0xd2, 0x80, 0xa2, 0x6e, 0x10, 0xb5, 0x9e, 0x51, 0x09, 0x78, 0xeb, 0x49, - 0xfe, 0xa7, 0xd0, 0x96, 0xc5, 0xd0, 0x1c, 0x53, 0xa7, 0x33, 0xe1, 0xb3, 0xe6, 0xdf, 0xb3, 0x72, - 0xaa, 0x2f, 0x37, 0xd4, 0x97, 0x8d, 0x8b, 0xbe, 0x54, 0x39, 0xdd, 0xc7, 0x3a, 0x48, 0xe2, 0x71, - 0xec, 0x4f, 0x4e, 0x95, 0x42, 0xb9, 0x0f, 0x2b, 0x4a, 0x6f, 0x4c, 0x43, 0x3f, 0x0c, 0xa3, 0x69, - 0x38, 0xe0, 0x2a, 0x8e, 0xae, 0x8c, 0xe4, 0x0e, 0x75, 0xd4, 0x35, 0x15, 0xc4, 0xee, 0x40, 0x5d, - 0xd8, 0x51, 0x62, 0x55, 0x2e, 0x57, 0x21, 0x22, 0x0b, 0xbb, 0x0d, 0x75, 0x61, 0x4e, 0x55, 0x66, - 0x0a, 0xbd, 0xc8, 0xe0, 0xde, 0x85, 0x25, 0x0a, 0xf3, 0x36, 0x74, 0xdf, 0x7b, 0x65, 0xab, 0xf5, - 0xdc, 0x40, 0x04, 0x83, 0xaf, 0x02, 0xdb, 0x17, 0x72, 0x65, 0x1e, 0x75, 0xfe, 0x59, 0x15, 0x5a, - 0x06, 0x8c, 0xfa, 0x89, 0xce, 0xa7, 0xfa, 0xc3, 0xc0, 0x1f, 0xf3, 0x94, 0xc7, 0x52, 0x96, 0x72, - 0x28, 0xe6, 0xf3, 0xcf, 0x4e, 0xfa, 0xd1, 0x34, 0xed, 0x0f, 0xf9, 0x49, 0xcc, 0xb9, 0x34, 0x23, - 0x72, 0x28, 0xe6, 0x43, 0x6e, 0x36, 0xf2, 0x89, 0x13, 0xa5, 0x1c, 0xaa, 0x0e, 0x2e, 0xc5, 0x38, - 0xd5, 0xb2, 0x83, 0x4b, 0x31, 0x2a, 0x79, 0xcd, 0x5a, 0x2f, 0xd1, 0xac, 0x9f, 0xc0, 0x9a, 0xd0, - 0xa1, 0x52, 0x7b, 0xf4, 0x73, 0xcc, 0x35, 0x83, 0xca, 0xee, 0x40, 0x07, 0xdb, 0xac, 0x44, 0x23, - 0x09, 0x7e, 0x26, 0x64, 0xcc, 0xf1, 0x0a, 0x38, 0xe6, 0x25, 0x4f, 0xba, 0x99, 0x57, 0x44, 0x8f, - 0x14, 0x70, 0xca, 0xeb, 0xbf, 0xb1, 0xf3, 0x36, 0x65, 0xde, 0x1c, 0xce, 0x3e, 0x85, 0xf5, 0x31, - 0x1f, 0x06, 0xbe, 0x5d, 0x44, 0x3f, 0x5b, 0xe4, 0x67, 0x91, 0xb1, 0x16, 0x1c, 0x85, 0x9f, 0x45, - 0xe3, 0xa3, 0x40, 0x2c, 0x6c, 0xc2, 0xe7, 0x5f, 0xf3, 0x0a, 0xb8, 0xbb, 0x00, 0xad, 0xc3, 0x34, - 0x9a, 0xa8, 0xa9, 0x5f, 0x84, 0xb6, 0x48, 0xca, 0xc8, 0xc9, 0xf7, 0xe0, 0x0a, 0xf1, 0xeb, 0xf3, - 0x68, 0x12, 0x8d, 0xa2, 0x93, 0x73, 0x6b, 0xe7, 0xfe, 0x1f, 0x1c, 0x58, 0xb1, 0xa8, 0xd9, 0xd6, - 0x9d, 0xdc, 0x8c, 0x2a, 0xdc, 0x4d, 0xb0, 0xf8, 0xb2, 0xb1, 0x2c, 0x88, 0x8c, 0xe2, 0x54, 0xe7, - 0x85, 0x8c, 0x80, 0xdb, 0xcc, 0xee, 0x70, 0xa8, 0x0f, 0x05, 0xbf, 0x77, 0x8b, 0xfc, 0x2e, 0xbf, - 0x57, 0xb7, 0x3b, 0x54, 0x11, 0xbf, 0x23, 0x63, 0x7d, 0x86, 0xb2, 0xd3, 0x55, 0x3b, 0x3e, 0xc3, - 0xf4, 0xf4, 0xa8, 0x16, 0x0c, 0x34, 0x98, 0xb8, 0xbf, 0x70, 0x00, 0xb2, 0xd6, 0x51, 0x84, 0x88, - 0x5e, 0xda, 0xc4, 0xbd, 0x64, 0x63, 0x19, 0xfb, 0x10, 0xda, 0xfa, 0x90, 0x3f, 0x5b, 0x2d, 0x5b, - 0x0a, 0x43, 0xeb, 0xe2, 0x16, 0x2c, 0x9d, 0x8c, 0xa2, 0x23, 0xb2, 0x62, 0x28, 0x14, 0x37, 0x91, - 0xf1, 0xa3, 0x8b, 0x02, 0x7e, 0x24, 0xd1, 0x6c, 0x69, 0xad, 0x99, 0x4b, 0x6b, 0xf9, 0x42, 0xf9, - 0xf3, 0x8a, 0x3e, 0x69, 0xcd, 0x46, 0xe2, 0xad, 0x52, 0xce, 0x36, 0x0a, 0x6a, 0x7d, 0xc6, 0xe1, - 0x26, 0x6d, 0x3d, 0x0e, 0x2e, 0x74, 0xfc, 0x3e, 0x80, 0xc5, 0x58, 0xe8, 0x4c, 0xa5, 0x50, 0x6b, - 0x6f, 0x51, 0xa8, 0x0b, 0xb1, 0xb5, 0x32, 0x7f, 0x1d, 0x3a, 0xfe, 0xf0, 0x8c, 0xc7, 0x69, 0x40, - 0x8e, 0x30, 0x32, 0xa3, 0x44, 0x07, 0x97, 0x0c, 0x9c, 0xac, 0x95, 0x5b, 0xb0, 0x24, 0xa3, 0x79, - 0x75, 0x4e, 0x79, 0x43, 0x2f, 0x83, 0x31, 0xa3, 0xfb, 0x4f, 0xd5, 0xc1, 0xae, 0x3d, 0xbb, 0x6f, - 0x1f, 0x15, 0xb3, 0x87, 0x95, 0x5c, 0x0f, 0xbf, 0x26, 0x0f, 0x5a, 0x87, 0xca, 0xe3, 0x56, 0x35, - 0xa2, 0xc6, 0x86, 0xf2, 0x60, 0xdc, 0x1e, 0xd6, 0xda, 0xbb, 0x0c, 0xab, 0xfb, 0x9f, 0x1d, 0x98, - 0xdf, 0x8d, 0x26, 0xbb, 0x38, 0xc4, 0x68, 0xe3, 0xa0, 0x98, 0xe8, 0x50, 0x7a, 0x95, 0xbc, 0x20, - 0xba, 0xae, 0xd4, 0x2a, 0x59, 0xc8, 0x5b, 0x25, 0x7f, 0x11, 0xde, 0x23, 0x9f, 0x6f, 0x1c, 0x4d, - 0xa2, 0x18, 0xc5, 0xd5, 0x1f, 0x09, 0x13, 0x24, 0x0a, 0xd3, 0x53, 0xa5, 0x4e, 0xdf, 0x96, 0x85, - 0x1c, 0x31, 0xb8, 0x09, 0x16, 0x1b, 0x2b, 0x69, 0x45, 0x09, 0x2d, 0x5b, 0x24, 0xb8, 0xbf, 0x0d, - 0x4d, 0xda, 0x61, 0x50, 0xd7, 0x3e, 0x82, 0xe6, 0x69, 0x34, 0xe9, 0x9f, 0x06, 0x61, 0xaa, 0xc4, - 0x7f, 0x31, 0x33, 0xfd, 0x77, 0x69, 0x50, 0x74, 0x06, 0xf7, 0x97, 0x73, 0x30, 0xff, 0x24, 0x3c, - 0x8b, 0x82, 0x01, 0x1d, 0x26, 0x8f, 0xf9, 0x38, 0x52, 0x97, 0x0b, 0xf0, 0x37, 0x0e, 0x07, 0x45, - 0xd2, 0x4e, 0x04, 0xf3, 0xb6, 0x45, 0xd0, 0x88, 0x84, 0xe8, 0x1a, 0x6e, 0x76, 0x39, 0x50, 0x08, - 0x98, 0x81, 0xe0, 0x46, 0x31, 0x36, 0x2f, 0xf7, 0xc9, 0x54, 0x76, 0x79, 0xa3, 0x6e, 0x5c, 0xde, - 0xc0, 0xd2, 0xc4, 0xa5, 0x33, 0x1a, 0x59, 0x11, 0x32, 0x6a, 0x20, 0xd8, 0x16, 0x19, 0x13, 0x28, - 0x82, 0xc6, 0x44, 0x5b, 0x24, 0x44, 0x9b, 0xdf, 0x98, 0x0b, 0x9f, 0xbe, 0x36, 0xcc, 0x70, 0xf3, - 0x6b, 0x82, 0x68, 0xbc, 0x89, 0x0f, 0x44, 0x1e, 0xb1, 0x58, 0x98, 0x10, 0x9a, 0xaf, 0xf9, 0xbb, - 0xa9, 0xe2, 0x7e, 0x71, 0x1e, 0x46, 0x5d, 0x3f, 0xe4, 0x5a, 0x25, 0x8b, 0x7e, 0x82, 0xb8, 0x20, - 0x99, 0xc7, 0x8d, 0x2d, 0xb3, 0x08, 0x8a, 0x56, 0x5b, 0x66, 0x64, 0x28, 0x7f, 0x34, 0x3a, 0xf2, - 0x07, 0xaf, 0xc4, 0x56, 0xb3, 0x2d, 0x8e, 0x82, 0x2c, 0x90, 0x22, 0xfb, 0xb2, 0x59, 0xa7, 0xf0, - 0x9b, 0x9a, 0x67, 0x42, 0x6c, 0x03, 0x5a, 0xe4, 0x4e, 0x90, 0xf3, 0xbe, 0x48, 0xf3, 0xde, 0x31, - 0xfd, 0x0d, 0x34, 0xf3, 0x66, 0x26, 0xf3, 0x10, 0x7c, 0xa9, 0x10, 0xa6, 0xec, 0x0f, 0x87, 0x32, - 0x7e, 0xa0, 0x23, 0x2e, 0x08, 0x6a, 0x80, 0x1c, 0x16, 0x62, 0xc0, 0x44, 0x86, 0x65, 0xca, 0x60, - 0x61, 0xec, 0x9a, 0x70, 0x93, 0x4d, 0xfc, 0x60, 0x48, 0x11, 0x37, 0x62, 0x73, 0xaa, 0x31, 0x2c, - 0x43, 0xfd, 0xa6, 0x65, 0x75, 0x85, 0x46, 0xc5, 0xc2, 0x70, 0x6c, 0x74, 0x7a, 0x9c, 0xc5, 0x35, - 0xdb, 0x20, 0xfb, 0x98, 0x4e, 0x70, 0x53, 0x4e, 0xc1, 0xcb, 0x8b, 0x1b, 0xef, 0xc9, 0x3e, 0x4b, - 0xa6, 0x56, 0x7f, 0x0f, 0x31, 0x8b, 0x27, 0x72, 0xa2, 0x51, 0x27, 0x9c, 0xe8, 0x6b, 0x96, 0x51, - 0x27, 0xb3, 0x92, 0x13, 0x5d, 0x64, 0x70, 0x37, 0xa1, 0x6d, 0x16, 0xc0, 0x1a, 0x50, 0x7b, 0x76, - 0xb0, 0xb3, 0xdf, 0xb9, 0xc4, 0x5a, 0x30, 0x7f, 0xb8, 0xf3, 0xfc, 0xf9, 0xde, 0xce, 0x76, 0xc7, - 0x61, 0x6d, 0x68, 0xe8, 0x80, 0xcd, 0x0a, 0xa6, 0x36, 0xb7, 0xb6, 0x76, 0x0e, 0x9e, 0xef, 0x6c, - 0x77, 0xaa, 0xee, 0x1f, 0x55, 0xa0, 0x65, 0x94, 0x7c, 0x81, 0x0b, 0xe7, 0x1a, 0x00, 0xed, 0x34, - 0xb2, 0xd0, 0x8d, 0x9a, 0x67, 0x20, 0xa8, 0x39, 0xf5, 0x1e, 0xbc, 0x2a, 0xee, 0x49, 0xaa, 0x34, - 0x8d, 0x17, 0x5d, 0x48, 0x34, 0xcf, 0x2a, 0xea, 0x9e, 0x0d, 0x22, 0x2f, 0x49, 0x80, 0xe2, 0x07, - 0x85, 0x04, 0x9a, 0x10, 0xce, 0x4d, 0xcc, 0x93, 0x68, 0x74, 0xc6, 0x45, 0x16, 0x61, 0xaf, 0x59, - 0x18, 0xd6, 0x25, 0x55, 0x90, 0x11, 0xdb, 0x5b, 0xf7, 0x6c, 0x90, 0x7d, 0x53, 0xcd, 0x4d, 0x83, - 0xe6, 0x66, 0xbd, 0x38, 0xd0, 0xe6, 0xbc, 0xb8, 0x29, 0xb0, 0xcd, 0xe1, 0x50, 0x52, 0xcd, 0x5b, - 0x97, 0xb1, 0x79, 0xcd, 0x57, 0x29, 0x91, 0x12, 0x41, 0xad, 0x94, 0x0b, 0xea, 0x5b, 0xd9, 0xd9, - 0x7d, 0x02, 0xad, 0x03, 0xe3, 0xe2, 0xb0, 0x8b, 0x3a, 0x4d, 0x5d, 0x19, 0x16, 0xba, 0x50, 0xf8, - 0x5e, 0x32, 0xd4, 0x68, 0x52, 0xc5, 0x6c, 0x92, 0xfb, 0x4f, 0x1c, 0x71, 0x17, 0x4b, 0x77, 0x41, - 0xd4, 0xef, 0x42, 0x5b, 0x7b, 0xa3, 0xb3, 0xf0, 0x75, 0x0b, 0xc3, 0x3c, 0xd4, 0x9c, 0x7e, 0x74, - 0x7c, 0x9c, 0x70, 0x15, 0x68, 0x6a, 0x61, 0xca, 0xb8, 0x44, 0x73, 0x35, 0x10, 0x35, 0x24, 0x32, - 0xe0, 0xb4, 0x80, 0x23, 0xa3, 0x48, 0xaf, 0xa5, 0x0a, 0xb1, 0xd5, 0x69, 0x1d, 0x65, 0x9f, 0x1f, - 0xe9, 0x3b, 0xd0, 0xd0, 0xe5, 0xda, 0x2b, 0x87, 0xca, 0xa9, 0xe9, 0xb8, 0x42, 0xd1, 0xc6, 0xd3, - 0x6a, 0xb4, 0xe0, 0xd7, 0x22, 0x81, 0xdd, 0x05, 0x76, 0x1c, 0xc4, 0xf9, 0xec, 0x82, 0x81, 0x4b, - 0x28, 0xee, 0x4b, 0x58, 0x51, 0x72, 0x67, 0x58, 0xbd, 0xf6, 0x44, 0x3a, 0x17, 0xe9, 0xa5, 0x4a, - 0x51, 0x2f, 0xb9, 0xbf, 0xac, 0xc2, 0xbc, 0x9c, 0xed, 0xc2, 0x05, 0x74, 0xb1, 0xee, 0x59, 0x18, - 0xeb, 0x5a, 0xd7, 0x0c, 0x89, 0x11, 0xe4, 0x6a, 0x55, 0x58, 0x6f, 0xaa, 0x65, 0xeb, 0x0d, 0x83, - 0xda, 0xc4, 0x4f, 0x4f, 0xc9, 0x3d, 0xd3, 0xf4, 0xe8, 0xb7, 0x72, 0xaa, 0xd6, 0x6d, 0xa7, 0x6a, - 0xd9, 0x75, 0x7b, 0x61, 0x72, 0x15, 0xaf, 0xdb, 0x5f, 0x85, 0xa6, 0x58, 0x17, 0x33, 0xbf, 0x69, - 0x06, 0xe4, 0xd6, 0xd1, 0x46, 0x61, 0x1d, 0x7d, 0xf7, 0x15, 0xee, 0xdb, 0x30, 0x27, 0xae, 0x9c, - 0xc8, 0x40, 0xe2, 0xab, 0xea, 0xb8, 0x51, 0xe4, 0x53, 0x7f, 0x45, 0x34, 0x92, 0x27, 0xf3, 0x9a, - 0x97, 0x56, 0x5b, 0xf6, 0xa5, 0x55, 0xd3, 0xdd, 0xdb, 0xb6, 0xdd, 0xbd, 0xee, 0x23, 0x58, 0xb0, - 0x8a, 0x43, 0x0d, 0x2b, 0x03, 0x91, 0x3b, 0x97, 0xd8, 0x02, 0x34, 0x9f, 0xec, 0xf7, 0x1f, 0xed, - 0x3d, 0x79, 0xbc, 0xfb, 0xbc, 0xe3, 0x60, 0xf2, 0xf0, 0xc5, 0xd6, 0xd6, 0xce, 0xce, 0x36, 0x69, - 0x5c, 0x80, 0xb9, 0x47, 0x9b, 0x4f, 0xf6, 0x48, 0xdf, 0x6e, 0x0b, 0xde, 0x96, 0x65, 0xe9, 0x23, - 0x9e, 0x6f, 0x02, 0x53, 0xbe, 0x01, 0x0a, 0x46, 0x9a, 0x8c, 0x78, 0xaa, 0x62, 0xe4, 0x97, 0x25, - 0xe5, 0x89, 0x26, 0xa8, 0x6b, 0x1e, 0x59, 0x29, 0x99, 0x88, 0xc8, 0x41, 0xca, 0x8b, 0x88, 0xcc, - 0xea, 0x69, 0xba, 0xdb, 0x83, 0xee, 0x36, 0xc7, 0xd2, 0x36, 0x47, 0xa3, 0x5c, 0x73, 0x70, 0x73, - 0x57, 0x42, 0x93, 0x3b, 0xbf, 0xef, 0xc1, 0xe5, 0x4d, 0x11, 0x0e, 0xff, 0x9b, 0x8a, 0x96, 0x74, - 0xbb, 0xb0, 0x96, 0x2f, 0x52, 0x56, 0xf6, 0x08, 0x96, 0xb7, 0xf9, 0xd1, 0xf4, 0x64, 0x8f, 0x9f, - 0x65, 0x15, 0x31, 0xa8, 0x25, 0xa7, 0xd1, 0x6b, 0x39, 0x3e, 0xf4, 0x9b, 0xbd, 0x0f, 0x30, 0xc2, - 0x3c, 0xfd, 0x64, 0xc2, 0x07, 0xea, 0xaa, 0x23, 0x21, 0x87, 0x13, 0x3e, 0x70, 0x3f, 0x01, 0x66, - 0x96, 0x23, 0xc7, 0x0b, 0xed, 0xad, 0xe9, 0x51, 0x3f, 0x39, 0x4f, 0x52, 0x3e, 0x56, 0x77, 0x38, - 0x4d, 0xc8, 0xbd, 0x05, 0xed, 0x03, 0xff, 0xdc, 0xe3, 0x3f, 0x95, 0x8f, 0x30, 0xac, 0xc3, 0xfc, - 0xc4, 0x3f, 0x47, 0x16, 0xd4, 0x0e, 0x63, 0x22, 0xbb, 0xff, 0xbb, 0x02, 0x73, 0x22, 0x27, 0x96, - 0x3a, 0xe4, 0x49, 0x1a, 0x84, 0x24, 0x69, 0xaa, 0x54, 0x03, 0x2a, 0xc8, 0x76, 0xa5, 0x44, 0xb6, - 0xa5, 0x17, 0x43, 0x5d, 0x19, 0x93, 0x02, 0x6c, 0x61, 0x28, 0x69, 0x59, 0xd8, 0xb3, 0x70, 0x2b, - 0x66, 0x40, 0xee, 0x20, 0x24, 0xb3, 0xea, 0x44, 0xfb, 0x94, 0xda, 0x92, 0x62, 0x6c, 0x42, 0xa5, - 0xb6, 0xe3, 0xbc, 0x90, 0xf6, 0x82, 0xed, 0x58, 0xb0, 0x11, 0x1b, 0xef, 0x60, 0x23, 0x0a, 0xd7, - 0xc6, 0xdb, 0x6c, 0x44, 0x78, 0x07, 0x1b, 0xd1, 0x65, 0xd0, 0xa1, 0xfb, 0xe8, 0xb8, 0x4b, 0x51, - 0xbc, 0xfb, 0x0f, 0x1c, 0xe8, 0x48, 0x2e, 0xd2, 0x34, 0x75, 0xa4, 0xf6, 0xb6, 0x8b, 0x4b, 0x37, - 0x60, 0x81, 0xf6, 0x48, 0x5a, 0x05, 0xc8, 0xe3, 0x29, 0x0b, 0xc4, 0x7e, 0xa8, 0x80, 0x99, 0x71, - 0x30, 0x92, 0x93, 0x62, 0x42, 0x4a, 0x8b, 0xc4, 0xbe, 0x0c, 0xdf, 0x75, 0x3c, 0x9d, 0x76, 0xff, - 0xd4, 0x81, 0x65, 0xa3, 0xc1, 0x92, 0x0b, 0x1f, 0x40, 0x5b, 0x3f, 0xfb, 0xc0, 0xf5, 0xe2, 0xb6, - 0x6e, 0x8b, 0x4d, 0xf6, 0x99, 0x95, 0x99, 0x26, 0xd3, 0x3f, 0xa7, 0x06, 0x26, 0xd3, 0xb1, 0x5c, - 0x55, 0x4c, 0x08, 0x19, 0xe9, 0x35, 0xe7, 0xaf, 0x74, 0x16, 0xb1, 0xae, 0x59, 0x18, 0xf9, 0x96, - 0x71, 0x6f, 0xa7, 0x33, 0xd5, 0xa4, 0x6f, 0xd9, 0x04, 0xdd, 0xbf, 0x5a, 0x81, 0x15, 0xb1, 0x59, - 0x97, 0x4e, 0x12, 0x7d, 0xf3, 0x76, 0x4e, 0xf8, 0x2d, 0x84, 0x44, 0xee, 0x5e, 0xf2, 0x64, 0x9a, - 0x7d, 0xe7, 0x1d, 0x1d, 0x0c, 0x3a, 0xa6, 0x78, 0xc6, 0x5c, 0x54, 0xcb, 0xe6, 0xe2, 0x2d, 0x23, - 0x5d, 0xe6, 0xe6, 0xaf, 0x97, 0xbb, 0xf9, 0xdf, 0xc9, 0xad, 0xfe, 0x70, 0x1e, 0xea, 0xc9, 0x20, - 0x9a, 0x70, 0x77, 0x0d, 0x56, 0xed, 0x21, 0x90, 0x8a, 0xea, 0x17, 0x0e, 0x74, 0x1f, 0x89, 0xc3, - 0xc3, 0x20, 0x3c, 0xd9, 0x0d, 0x92, 0x34, 0x8a, 0xf5, 0x33, 0x06, 0xd7, 0x00, 0x92, 0xd4, 0x8f, - 0xa5, 0x51, 0x2b, 0x4c, 0x03, 0x03, 0xc1, 0x9e, 0xf0, 0x70, 0x28, 0xa8, 0x62, 0x06, 0x75, 0xba, - 0x60, 0x7a, 0x49, 0x87, 0x83, 0x65, 0xc0, 0xdc, 0x14, 0x91, 0xf8, 0xd8, 0x64, 0x7e, 0x46, 0xda, - 0x5f, 0xec, 0xe2, 0x73, 0xa8, 0xfb, 0x07, 0x15, 0x58, 0xca, 0x1a, 0x49, 0xd1, 0x22, 0xb6, 0x0e, - 0x91, 0x56, 0x4b, 0xa6, 0x43, 0xe4, 0xe1, 0x40, 0x3f, 0x40, 0x33, 0xc6, 0xf0, 0x39, 0x18, 0x28, - 0xbb, 0x01, 0x2d, 0x95, 0x8a, 0xa6, 0xa9, 0x71, 0x9f, 0xd8, 0x84, 0x45, 0x6c, 0x2d, 0x1a, 0x52, - 0xd2, 0x28, 0x94, 0x29, 0xba, 0xdb, 0x34, 0x4e, 0xe9, 0x4b, 0x31, 0xf2, 0x2a, 0xc9, 0x3a, 0xc2, - 0x12, 0x11, 0x4f, 0xbb, 0x90, 0x15, 0x62, 0xae, 0xd0, 0x0d, 0xfd, 0x0e, 0x8b, 0x96, 0x4c, 0x51, - 0x62, 0x16, 0x18, 0x5d, 0xf3, 0x4c, 0x48, 0xed, 0xea, 0xa2, 0xa9, 0x71, 0x22, 0x5a, 0xf3, 0x2c, - 0xcc, 0xfd, 0xdb, 0x0e, 0x5c, 0x29, 0x99, 0x46, 0x29, 0xa9, 0xdb, 0xb0, 0x7c, 0xac, 0x89, 0x6a, - 0xa8, 0x85, 0xb8, 0xae, 0xa9, 0x08, 0x09, 0x7b, 0x78, 0xbd, 0xe2, 0x07, 0xda, 0x38, 0x15, 0x93, - 0x67, 0xc5, 0xc1, 0x17, 0x09, 0xee, 0x01, 0xf4, 0x76, 0xde, 0xa0, 0xe0, 0x6f, 0x99, 0xaf, 0xdf, - 0x29, 0xce, 0xda, 0x28, 0x28, 0xb6, 0x8b, 0x5d, 0x4d, 0xc7, 0xb0, 0x60, 0x95, 0xc5, 0xbe, 0xf5, - 0xae, 0x85, 0x98, 0x32, 0x7a, 0x5d, 0xce, 0xba, 0x78, 0xbe, 0x4f, 0x45, 0xe3, 0x1b, 0x90, 0x7b, - 0x06, 0x4b, 0x4f, 0xa7, 0xa3, 0x34, 0xc8, 0x9e, 0xf2, 0x63, 0xdf, 0x91, 0x1f, 0x51, 0x11, 0x6a, - 0xe8, 0x4a, 0xab, 0x32, 0xf3, 0xe1, 0x88, 0x8d, 0xb1, 0xa4, 0x7e, 0xb1, 0xc6, 0x22, 0xc1, 0xbd, - 0x02, 0xeb, 0x59, 0x95, 0x62, 0xec, 0xd4, 0xe2, 0xf0, 0x87, 0x8e, 0x08, 0x29, 0xb3, 0x5f, 0x16, - 0x64, 0x8f, 0x61, 0x25, 0x09, 0xc2, 0x93, 0x11, 0x37, 0xcb, 0x49, 0xe4, 0x48, 0x5c, 0xb6, 0x9b, - 0x27, 0x5f, 0x1f, 0xf4, 0xca, 0xbe, 0x40, 0x06, 0x29, 0x6f, 0x68, 0xc6, 0x20, 0xb9, 0x21, 0x29, - 0xeb, 0xc0, 0x77, 0x61, 0xd1, 0xae, 0x8c, 0x7d, 0x2a, 0x83, 0xe8, 0xb3, 0x96, 0x99, 0x67, 0x43, - 0x36, 0x67, 0x58, 0x39, 0xdd, 0x9f, 0x3b, 0xd0, 0xf5, 0x38, 0xb2, 0x31, 0x37, 0x2a, 0x95, 0xdc, - 0xf3, 0xa0, 0x50, 0xec, 0xec, 0x0e, 0xeb, 0xe0, 0x7c, 0xd5, 0xd7, 0xbb, 0x33, 0x27, 0x65, 0xf7, - 0x52, 0x49, 0xaf, 0x1e, 0x36, 0x60, 0x4e, 0xf6, 0x6f, 0x1d, 0x2e, 0xcb, 0x26, 0xa9, 0xe6, 0x64, - 0x87, 0x0a, 0x56, 0xa5, 0xd6, 0xa1, 0x42, 0x0f, 0xba, 0xe2, 0xb5, 0x0a, 0xb3, 0x1f, 0xf2, 0xc3, - 0x6d, 0x60, 0x4f, 0xfd, 0x81, 0x1f, 0x47, 0x51, 0x78, 0xc0, 0x63, 0x19, 0x03, 0x44, 0x06, 0x10, - 0xf9, 0xdc, 0x95, 0xad, 0x26, 0x52, 0xea, 0x81, 0x85, 0x28, 0x54, 0x0f, 0x59, 0x88, 0x94, 0xeb, - 0xc1, 0xca, 0x43, 0xff, 0x15, 0x57, 0x25, 0x65, 0xa3, 0xd4, 0x9a, 0xe8, 0x42, 0xd5, 0xd8, 0xab, - 0xfb, 0x31, 0xc5, 0x6a, 0x3d, 0x33, 0xb7, 0xbb, 0x01, 0xab, 0x76, 0x99, 0x52, 0x95, 0xf4, 0xa0, - 0x31, 0x96, 0x98, 0x6c, 0x9d, 0x4e, 0xdf, 0xf9, 0x12, 0x5a, 0xc6, 0x0b, 0x24, 0x6c, 0x1d, 0x56, - 0x5e, 0x3e, 0x79, 0xbe, 0xbf, 0x73, 0x78, 0xd8, 0x3f, 0x78, 0xf1, 0xf0, 0xf3, 0x9d, 0x1f, 0xf4, - 0x77, 0x37, 0x0f, 0x77, 0x3b, 0x97, 0xd8, 0x1a, 0xb0, 0xfd, 0x9d, 0xc3, 0xe7, 0x3b, 0xdb, 0x16, - 0xee, 0xb0, 0x6b, 0xd0, 0x7b, 0xb1, 0xff, 0xe2, 0x70, 0x67, 0xbb, 0x5f, 0xf6, 0x5d, 0x85, 0xbd, - 0x0f, 0x57, 0x24, 0xbd, 0xe4, 0xf3, 0xea, 0x9d, 0x07, 0xd0, 0xc9, 0xfb, 0x40, 0x2c, 0xaf, 0xd1, - 0xdb, 0xdc, 0x4b, 0x1b, 0x3f, 0xaf, 0xc2, 0xa2, 0x08, 0xf2, 0x13, 0x6f, 0x73, 0xf2, 0x98, 0x3d, - 0x85, 0x79, 0xf9, 0xc8, 0x2b, 0x53, 0xac, 0x65, 0x3f, 0x2b, 0xdb, 0x5b, 0xcb, 0xc3, 0x72, 0x5a, - 0x57, 0xfe, 0xda, 0x7f, 0xfa, 0x1f, 0x7f, 0xb7, 0xb2, 0xc0, 0x5a, 0xf7, 0xce, 0x3e, 0xbe, 0x77, - 0xc2, 0xc3, 0x04, 0xcb, 0xf8, 0x3d, 0x80, 0xec, 0xe9, 0x52, 0xd6, 0xd5, 0x3e, 0x80, 0xdc, 0xbb, - 0xae, 0xbd, 0x2b, 0x25, 0x14, 0x59, 0xee, 0x15, 0x2a, 0x77, 0xc5, 0x5d, 0xc4, 0x72, 0x83, 0x30, - 0x48, 0xc5, 0x33, 0xa6, 0x9f, 0x39, 0x77, 0xd8, 0x10, 0xda, 0xe6, 0xa3, 0xa2, 0x4c, 0x9d, 0x11, - 0x95, 0x3c, 0x8b, 0xda, 0x7b, 0xaf, 0x94, 0xa6, 0x78, 0x99, 0xea, 0xb8, 0xec, 0x76, 0xb0, 0x8e, - 0x29, 0xe5, 0xc8, 0x6a, 0x19, 0x09, 0x09, 0xcf, 0xde, 0x0e, 0x65, 0x57, 0x0d, 0xa1, 0x2b, 0xbc, - 0x5c, 0xda, 0x7b, 0x7f, 0x06, 0x55, 0xd6, 0xf5, 0x3e, 0xd5, 0xb5, 0xee, 0x32, 0xac, 0x6b, 0x40, - 0x79, 0xd4, 0xcb, 0xa5, 0x9f, 0x39, 0x77, 0x36, 0xfe, 0xfd, 0x2d, 0x68, 0xea, 0xf3, 0x63, 0xf6, - 0x13, 0x58, 0xb0, 0xa2, 0x30, 0x99, 0xea, 0x46, 0x59, 0xd0, 0x66, 0xef, 0x6a, 0x39, 0x51, 0x56, - 0x7c, 0x8d, 0x2a, 0xee, 0xb2, 0x35, 0xac, 0x58, 0x86, 0x31, 0xde, 0xa3, 0x78, 0x62, 0x71, 0x25, - 0xf1, 0x95, 0xa1, 0xc9, 0x44, 0x65, 0x57, 0xf3, 0xca, 0xc5, 0xaa, 0xed, 0xfd, 0x19, 0x54, 0x59, - 0xdd, 0x55, 0xaa, 0x6e, 0x8d, 0xad, 0x9a, 0xd5, 0xe9, 0x33, 0x5d, 0x4e, 0xf7, 0x70, 0xcd, 0x67, - 0x35, 0xd9, 0xfb, 0x9a, 0xb1, 0xca, 0x9e, 0xdb, 0xd4, 0x2c, 0x52, 0x7c, 0x73, 0xd3, 0xed, 0x52, - 0x55, 0x8c, 0xd1, 0xf4, 0x99, 0xaf, 0x6a, 0xb2, 0x23, 0x68, 0x19, 0x8f, 0x61, 0xb1, 0x2b, 0x33, - 0x1f, 0xee, 0xea, 0xf5, 0xca, 0x48, 0x65, 0x5d, 0x31, 0xcb, 0xbf, 0x87, 0x86, 0xce, 0x8f, 0xa0, - 0xa9, 0x9f, 0x57, 0x62, 0xeb, 0xc6, 0x73, 0x57, 0xe6, 0x73, 0x50, 0xbd, 0x6e, 0x91, 0x50, 0xc6, - 0x7c, 0x66, 0xe9, 0xc8, 0x7c, 0x2f, 0xa1, 0x65, 0x3c, 0xa1, 0xa4, 0x3b, 0x50, 0x7c, 0xa6, 0x49, - 0x77, 0xa0, 0xe4, 0xc5, 0x25, 0x77, 0x99, 0xaa, 0x68, 0xb1, 0x26, 0xf1, 0x77, 0xfa, 0x26, 0x4a, - 0xd8, 0x1e, 0x5c, 0x96, 0x1a, 0xfb, 0x88, 0x7f, 0x95, 0x69, 0x28, 0x79, 0xc9, 0xf4, 0xbe, 0xc3, - 0x1e, 0x40, 0x43, 0xbd, 0x94, 0xc5, 0xd6, 0xca, 0x5f, 0xfc, 0xea, 0xad, 0x17, 0x70, 0xa9, 0x5e, - 0x7f, 0x00, 0x90, 0xbd, 0xd7, 0xa4, 0x95, 0x44, 0xe1, 0xfd, 0x27, 0xcd, 0x01, 0xc5, 0xc7, 0x9d, - 0xdc, 0x35, 0xea, 0x60, 0x87, 0x91, 0x92, 0x08, 0xf9, 0x6b, 0x75, 0xe5, 0xfe, 0xc7, 0xd0, 0x32, - 0x9e, 0x6c, 0xd2, 0xc3, 0x57, 0x7c, 0xee, 0x49, 0x0f, 0x5f, 0xc9, 0x0b, 0x4f, 0x6e, 0x8f, 0x4a, - 0x5f, 0x75, 0x97, 0xb0, 0xf4, 0x24, 0x38, 0x09, 0xc7, 0x22, 0x03, 0x4e, 0xd0, 0x29, 0x2c, 0x58, - 0xef, 0x32, 0x69, 0x09, 0x2d, 0x7b, 0xf5, 0x49, 0x4b, 0x68, 0xe9, 0x53, 0x4e, 0x8a, 0xcf, 0xdc, - 0x65, 0xac, 0xe7, 0x8c, 0xb2, 0x18, 0x35, 0xfd, 0x10, 0x5a, 0xc6, 0x1b, 0x4b, 0xba, 0x2f, 0xc5, - 0xe7, 0x9c, 0x74, 0x5f, 0xca, 0x9e, 0x64, 0x5a, 0xa5, 0x3a, 0x16, 0x5d, 0x62, 0x05, 0xba, 0x3c, - 0x8e, 0x65, 0xff, 0x04, 0x16, 0xed, 0x57, 0x97, 0xb4, 0xec, 0x97, 0xbe, 0xdf, 0xa4, 0x65, 0x7f, - 0xc6, 0x53, 0x4d, 0x92, 0xa5, 0xef, 0xac, 0xe8, 0x4a, 0xee, 0x7d, 0x21, 0x23, 0xd0, 0xbe, 0x64, - 0xdf, 0x43, 0x05, 0x27, 0x6f, 0xf3, 0xb3, 0x75, 0x83, 0x6b, 0xcd, 0x3b, 0xff, 0x5a, 0x5e, 0x0a, - 0x17, 0xff, 0x6d, 0x66, 0x16, 0xd7, 0xdf, 0x69, 0xd5, 0xa2, 0x5b, 0xfd, 0xc6, 0xaa, 0x65, 0x5e, - 0xfc, 0x37, 0x56, 0x2d, 0xeb, 0xf2, 0x7f, 0x7e, 0xd5, 0x4a, 0x03, 0x2c, 0x23, 0x84, 0xa5, 0xdc, - 0x4d, 0x11, 0x2d, 0x15, 0xe5, 0x97, 0xf9, 0x7a, 0xd7, 0xde, 0x7e, 0xc1, 0xc4, 0xd6, 0x20, 0x4a, - 0x09, 0xde, 0x53, 0x57, 0x27, 0x7f, 0x1f, 0xda, 0xe6, 0x4b, 0x30, 0xcc, 0x14, 0xe5, 0x7c, 0x4d, - 0xef, 0x95, 0xd2, 0xec, 0xc9, 0x65, 0x6d, 0xb3, 0x1a, 0xf6, 0x7d, 0x58, 0xd3, 0xa2, 0x6e, 0x5e, - 0x3e, 0x48, 0xd8, 0x07, 0x25, 0x57, 0x12, 0x4c, 0x3b, 0xae, 0x77, 0x65, 0xe6, 0x9d, 0x85, 0xfb, - 0x0e, 0x32, 0x8d, 0xfd, 0xbc, 0x46, 0xb6, 0x60, 0x94, 0xbd, 0x2a, 0x92, 0x2d, 0x18, 0xa5, 0x6f, - 0x72, 0x28, 0xa6, 0x61, 0x2b, 0xd6, 0x18, 0x89, 0xc3, 0x7a, 0xf6, 0x43, 0x58, 0x32, 0xae, 0x77, - 0x1d, 0x9e, 0x87, 0x03, 0x2d, 0x00, 0xc5, 0xdb, 0xc7, 0xbd, 0xb2, 0x5d, 0x8a, 0xbb, 0x4e, 0xe5, - 0x2f, 0xbb, 0xd6, 0xe0, 0x20, 0xf3, 0x6f, 0x41, 0xcb, 0xbc, 0x3a, 0xf6, 0x96, 0x72, 0xd7, 0x0d, - 0x92, 0x79, 0x71, 0xf6, 0xbe, 0xc3, 0x0e, 0x44, 0xd0, 0x96, 0x7e, 0xea, 0x33, 0x8a, 0xf3, 0xcb, - 0xa7, 0xfd, 0x04, 0xa8, 0x9e, 0xc8, 0xb2, 0xc7, 0x5f, 0x6f, 0x3b, 0xf7, 0x1d, 0xf6, 0x0f, 0x1d, - 0x68, 0x5b, 0x57, 0xbb, 0xac, 0x10, 0x98, 0x5c, 0xcb, 0xba, 0x26, 0xcd, 0x6c, 0x9a, 0xeb, 0x51, - 0xb7, 0xf7, 0xee, 0x7c, 0xd7, 0x1a, 0xd6, 0x2f, 0x2c, 0x87, 0xda, 0xdd, 0xfc, 0x7b, 0x9f, 0x5f, - 0xe6, 0x33, 0x98, 0x77, 0xbe, 0xbf, 0xbc, 0xef, 0xb0, 0x3f, 0x76, 0x60, 0xd1, 0x76, 0x03, 0xeb, - 0xee, 0x96, 0x3a, 0x9c, 0xf5, 0xe4, 0xcf, 0xf0, 0x1d, 0xff, 0x90, 0x5a, 0xf9, 0xfc, 0x8e, 0x67, - 0xb5, 0x52, 0x3e, 0xe5, 0xf2, 0xeb, 0xb5, 0x96, 0x7d, 0x26, 0xde, 0xbb, 0x56, 0x87, 0x35, 0xac, - 0xf8, 0x54, 0xb2, 0x66, 0x18, 0xf3, 0x71, 0x63, 0x9a, 0x84, 0x1f, 0x8b, 0x77, 0x2e, 0xd5, 0x79, - 0x02, 0xf2, 0xdd, 0xbb, 0x7e, 0xef, 0xde, 0xa0, 0x3e, 0x5d, 0x73, 0xaf, 0x58, 0x7d, 0xca, 0xaf, - 0xf0, 0x9b, 0xa2, 0x75, 0xf2, 0x5d, 0xe2, 0x6c, 0x89, 0x2a, 0xbc, 0x55, 0x3c, 0xbb, 0x91, 0x63, - 0xd1, 0x48, 0x99, 0xdd, 0x12, 0x8e, 0x77, 0x2c, 0xc6, 0xbd, 0x43, 0x6d, 0xbd, 0xe1, 0x7e, 0x30, - 0xb3, 0xad, 0xf7, 0xc8, 0x99, 0x8b, 0x2d, 0x3e, 0x00, 0xc8, 0x0e, 0x57, 0x59, 0xee, 0x60, 0x4f, - 0xab, 0x8c, 0xe2, 0xf9, 0xab, 0x2d, 0x81, 0xea, 0xfc, 0x0f, 0x4b, 0xfc, 0x91, 0x50, 0x80, 0x4f, - 0xd4, 0x91, 0xa0, 0x69, 0xe6, 0xd8, 0x27, 0xa0, 0x96, 0x99, 0x93, 0x2f, 0xdf, 0x52, 0x7f, 0xfa, - 0x7c, 0xf1, 0x05, 0x2c, 0xec, 0x45, 0xd1, 0xab, 0xe9, 0x44, 0x47, 0xa7, 0xd8, 0xe7, 0x2c, 0xbb, - 0x7e, 0x72, 0xda, 0xcb, 0xf5, 0xc2, 0xbd, 0x4e, 0x45, 0xf5, 0x58, 0xd7, 0x28, 0xea, 0xde, 0x17, - 0xd9, 0xc1, 0xed, 0x97, 0xcc, 0x87, 0x65, 0xad, 0x55, 0x75, 0xc3, 0x7b, 0x76, 0x31, 0x96, 0x2e, - 0xcd, 0x57, 0x61, 0xd9, 0xe3, 0xaa, 0xb5, 0xf7, 0x12, 0x55, 0x26, 0xe9, 0x94, 0xf6, 0x36, 0x1f, - 0xd0, 0xed, 0x14, 0x3a, 0xac, 0x58, 0xc9, 0x1a, 0xae, 0x4f, 0x39, 0x7a, 0x0b, 0x16, 0x68, 0xaf, - 0x34, 0x13, 0xff, 0x3c, 0xe6, 0x3f, 0xbd, 0xf7, 0x85, 0x3c, 0x06, 0xf9, 0x52, 0xad, 0x34, 0xea, - 0x9c, 0xc8, 0x5a, 0x69, 0x72, 0x07, 0x4b, 0xd6, 0x4a, 0x53, 0x38, 0x58, 0xb2, 0x86, 0x5a, 0x9d, - 0x53, 0xb1, 0x11, 0x2c, 0x17, 0xce, 0xa2, 0xf4, 0x22, 0x33, 0xeb, 0x04, 0xab, 0x77, 0x7d, 0x76, - 0x06, 0xbb, 0xb6, 0x3b, 0x76, 0x6d, 0x87, 0xb0, 0xb0, 0xcd, 0xc5, 0x60, 0x89, 0x70, 0xdc, 0xdc, - 0xfd, 0x40, 0x33, 0xd8, 0x37, 0xbf, 0x24, 0x10, 0xcd, 0x36, 0x25, 0x28, 0x0e, 0x96, 0xfd, 0x08, - 0x5a, 0x8f, 0x79, 0xaa, 0xe2, 0x6f, 0xb5, 0x31, 0x9b, 0x0b, 0xc8, 0xed, 0x95, 0x84, 0xef, 0xda, - 0x3c, 0x43, 0xa5, 0xdd, 0xe3, 0xc3, 0x13, 0x2e, 0x94, 0x53, 0x3f, 0x18, 0x7e, 0xc9, 0xfe, 0x12, - 0x15, 0xae, 0x2f, 0x20, 0xac, 0x19, 0xc1, 0x94, 0x66, 0xe1, 0x4b, 0x39, 0xbc, 0xac, 0xe4, 0x30, - 0x1a, 0x72, 0xc3, 0xa8, 0x0a, 0xa1, 0x65, 0xdc, 0x1b, 0xd2, 0x02, 0x54, 0xbc, 0xa1, 0xa6, 0x05, - 0xa8, 0xe4, 0x9a, 0x91, 0x7b, 0x9b, 0xea, 0x71, 0xd9, 0xf5, 0xac, 0x1e, 0x71, 0xb5, 0x28, 0xab, - 0xe9, 0xde, 0x17, 0xfe, 0x38, 0xfd, 0x92, 0xbd, 0xa4, 0xa7, 0x95, 0xcc, 0xf8, 0xe2, 0xcc, 0x3a, - 0xcf, 0x87, 0x22, 0xeb, 0xc1, 0x32, 0x48, 0xb6, 0xc5, 0x2e, 0xaa, 0x22, 0xdb, 0xeb, 0x3b, 0x00, - 0x87, 0x69, 0x34, 0xd9, 0xf6, 0xf9, 0x38, 0x0a, 0x33, 0x5d, 0x9b, 0x45, 0xb7, 0x66, 0xfa, 0xcb, - 0x08, 0x71, 0x65, 0x2f, 0x8d, 0xed, 0x8c, 0x15, 0xa2, 0xad, 0x98, 0x6b, 0x66, 0x00, 0xac, 0x1e, - 0x90, 0x92, 0x20, 0xd8, 0xfb, 0x0e, 0xdb, 0x04, 0xc8, 0x0e, 0x23, 0xf5, 0xe6, 0xa4, 0x70, 0xce, - 0xa9, 0xd5, 0x5e, 0xc9, 0xc9, 0xe5, 0x01, 0x34, 0xb3, 0xd3, 0xad, 0xf5, 0xec, 0x76, 0x9e, 0x75, - 0x16, 0xa6, 0x57, 0xf0, 0xc2, 0x99, 0x93, 0xdb, 0xa1, 0xa1, 0x02, 0xd6, 0xc0, 0xa1, 0xa2, 0x83, - 0xa4, 0x00, 0x56, 0x44, 0x03, 0xb5, 0x81, 0x43, 0x51, 0x99, 0xaa, 0x27, 0x25, 0xe7, 0x3e, 0x5a, - 0x9a, 0x4b, 0x0f, 0x44, 0x2c, 0x1f, 0x0b, 0x72, 0xab, 0x88, 0x08, 0x45, 0xd5, 0x3c, 0x86, 0xe5, - 0x82, 0x8f, 0x5d, 0x8b, 0xf4, 0xac, 0x43, 0x14, 0x2d, 0xd2, 0x33, 0xdd, 0xf3, 0xee, 0x65, 0xaa, - 0x72, 0xc9, 0x05, 0xda, 0x53, 0xbd, 0x0e, 0xd2, 0xc1, 0x29, 0x56, 0xf7, 0x87, 0x0e, 0xac, 0x94, - 0xb8, 0xd0, 0xd9, 0x87, 0x6a, 0x7b, 0x3e, 0xd3, 0xbd, 0xde, 0x2b, 0xf5, 0xb0, 0xba, 0x87, 0x54, - 0xcf, 0x53, 0xf6, 0xb9, 0xb5, 0xb0, 0x09, 0xe7, 0xa6, 0x94, 0xcc, 0xb7, 0x1a, 0x15, 0xa5, 0x16, - 0xc5, 0x4f, 0x61, 0x5d, 0x34, 0x64, 0x73, 0x34, 0xca, 0x79, 0x7f, 0xaf, 0x15, 0xfe, 0x27, 0x8e, - 0xe5, 0xd5, 0xee, 0xcd, 0xfe, 0x9f, 0x39, 0x33, 0x0c, 0x60, 0xd1, 0x54, 0x36, 0x85, 0x4e, 0xde, - 0xa3, 0xca, 0x66, 0x97, 0xd5, 0xfb, 0xc0, 0xda, 0x68, 0x96, 0x78, 0x61, 0x7f, 0x8b, 0x2a, 0xfb, - 0xc0, 0xed, 0x95, 0x8d, 0x8b, 0xd8, 0x7b, 0xe2, 0x7c, 0xfc, 0x15, 0xed, 0xfe, 0xcd, 0xf5, 0x53, - 0x55, 0x30, 0xcb, 0x5f, 0xad, 0xb7, 0xba, 0xe5, 0xde, 0xe3, 0x9b, 0x54, 0xfd, 0x75, 0xf7, 0xbd, - 0xb2, 0xea, 0x63, 0xf1, 0x89, 0xd8, 0xf4, 0xae, 0xe7, 0xe5, 0x5a, 0xb5, 0xe0, 0x7a, 0xd9, 0x7c, - 0xcf, 0xdc, 0xbd, 0xe4, 0xc6, 0xfa, 0x12, 0xd9, 0x76, 0x6d, 0xd3, 0xdd, 0xab, 0xc5, 0xa7, 0xc4, - 0xaf, 0xac, 0xc5, 0xa7, 0xcc, 0x3f, 0x6c, 0xdb, 0x35, 0xca, 0x33, 0xfc, 0x99, 0x73, 0xe7, 0xe1, - 0xad, 0x1f, 0xfe, 0xd6, 0x49, 0x90, 0x9e, 0x4e, 0x8f, 0xee, 0x0e, 0xa2, 0xf1, 0xbd, 0x91, 0x72, - 0xeb, 0xc9, 0x9b, 0x0a, 0xf7, 0x46, 0xe1, 0xf0, 0x1e, 0x15, 0x7b, 0x34, 0x47, 0xff, 0xc4, 0xeb, - 0x5b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x73, 0xd9, 0x4f, 0x40, 0xf6, 0x6b, 0x00, 0x00, + // 8731 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0xd9, + 0x95, 0x9e, 0xaa, 0x7f, 0xc8, 0xee, 0xd3, 0x4d, 0xb2, 0x79, 0x49, 0x91, 0xad, 0x1e, 0x8d, 0x46, + 0x53, 0xd6, 0x4a, 0xb2, 0x3c, 0x96, 0x34, 0xb4, 0x3d, 0x99, 0x9d, 0xc9, 0x66, 0x43, 0x91, 0x94, + 0xa8, 0x19, 0x8a, 0xa2, 0x8b, 0x92, 0x15, 0xdb, 0xbb, 0x68, 0x17, 0xbb, 0x2f, 0xc9, 0xb2, 0xba, + 0xab, 0xda, 0x55, 0xd5, 0x94, 0xe8, 0xc9, 0x04, 0x48, 0x10, 0x04, 0x41, 0x5e, 0x02, 0x27, 0x08, + 0x90, 0x04, 0x09, 0x16, 0xf0, 0x06, 0xc8, 0x2e, 0xf2, 0x90, 0xbc, 0x04, 0xd8, 0x04, 0xfb, 0x16, + 0x04, 0x0b, 0x04, 0x08, 0xf2, 0x90, 0x87, 0x00, 0x79, 0x88, 0x11, 0x24, 0x40, 0x60, 0xe4, 0x2d, + 0x40, 0xde, 0x83, 0x73, 0xee, 0x4f, 0xdd, 0x5b, 0x55, 0x2d, 0x6a, 0x6c, 0x67, 0x9f, 0xd8, 0xf7, + 0x3b, 0xb7, 0xee, 0xef, 0x39, 0xe7, 0x9e, 0x7b, 0xee, 0xb9, 0x97, 0xd0, 0x8c, 0x27, 0x83, 0xbb, + 0x93, 0x38, 0x4a, 0x23, 0x56, 0x1f, 0x85, 0xf1, 0x64, 0xd0, 0xbb, 0x7a, 0x12, 0x45, 0x27, 0x23, + 0x7e, 0xcf, 0x9f, 0x04, 0xf7, 0xfc, 0x30, 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x99, 0xdc, + 0x1f, 0xc1, 0xe2, 0x23, 0x1e, 0x1e, 0x72, 0x3e, 0xf4, 0xf8, 0x4f, 0xa6, 0x3c, 0x49, 0xd9, 0x37, + 0x60, 0xd9, 0xe7, 0x3f, 0xe5, 0x7c, 0xd8, 0x9f, 0xf8, 0x49, 0x32, 0x39, 0x8d, 0xfd, 0x84, 0x77, + 0x9d, 0xeb, 0xce, 0xed, 0xb6, 0xd7, 0x11, 0x84, 0x03, 0x8d, 0xb3, 0xf7, 0xa1, 0x9d, 0x60, 0x56, + 0x1e, 0xa6, 0x71, 0x34, 0x39, 0xef, 0x56, 0x28, 0x5f, 0x0b, 0xb1, 0x1d, 0x01, 0xb9, 0x23, 0x58, + 0xd2, 0x35, 0x24, 0x93, 0x28, 0x4c, 0x38, 0xbb, 0x0f, 0xab, 0x83, 0x60, 0x72, 0xca, 0xe3, 0x3e, + 0x7d, 0x3c, 0x0e, 0xf9, 0x38, 0x0a, 0x83, 0x41, 0xd7, 0xb9, 0x5e, 0xbd, 0xdd, 0xf4, 0x98, 0xa0, + 0xe1, 0x17, 0x4f, 0x24, 0x85, 0xdd, 0x82, 0x25, 0x1e, 0x0a, 0x9c, 0x0f, 0xe9, 0x2b, 0x59, 0xd5, + 0x62, 0x06, 0xe3, 0x07, 0xee, 0xdf, 0xae, 0xc0, 0xf2, 0xe3, 0x30, 0x48, 0x5f, 0xf8, 0xa3, 0x11, + 0x4f, 0x55, 0x9f, 0x6e, 0xc1, 0xd2, 0x2b, 0x02, 0xa8, 0x4f, 0xaf, 0xa2, 0x78, 0x28, 0x7b, 0xb4, + 0x28, 0xe0, 0x03, 0x89, 0xce, 0x6c, 0x59, 0x65, 0x66, 0xcb, 0x4a, 0x87, 0xab, 0x3a, 0x63, 0xb8, + 0x6e, 0xc1, 0x52, 0xcc, 0x07, 0xd1, 0x19, 0x8f, 0xcf, 0xfb, 0xaf, 0x82, 0x70, 0x18, 0xbd, 0xea, + 0xd6, 0xae, 0x3b, 0xb7, 0xeb, 0xde, 0xa2, 0x82, 0x5f, 0x10, 0xca, 0x1e, 0xc0, 0xd2, 0xe0, 0xd4, + 0x0f, 0x43, 0x3e, 0xea, 0x1f, 0xf9, 0x83, 0x97, 0xd3, 0x49, 0xd2, 0xad, 0x5f, 0x77, 0x6e, 0xb7, + 0x36, 0xae, 0xdc, 0xa5, 0x59, 0xbd, 0xbb, 0x75, 0xea, 0x87, 0x0f, 0x88, 0x72, 0x18, 0xfa, 0x93, + 0xe4, 0x34, 0x4a, 0xbd, 0x45, 0xf9, 0x85, 0x80, 0x13, 0x77, 0x15, 0x98, 0x39, 0x12, 0x62, 0xec, + 0xdd, 0x7f, 0xe1, 0xc0, 0xca, 0xf3, 0x70, 0x14, 0x0d, 0x5e, 0xfe, 0x8a, 0x43, 0x54, 0xd2, 0x87, + 0xca, 0xdb, 0xf6, 0xa1, 0xfa, 0x55, 0xfb, 0xb0, 0x06, 0xab, 0x76, 0x63, 0x65, 0x2f, 0x38, 0x5c, + 0xc6, 0xaf, 0x4f, 0xb8, 0x6a, 0x96, 0xea, 0xc6, 0xd7, 0xa1, 0x33, 0x98, 0xc6, 0x31, 0x0f, 0x0b, + 0xfd, 0x58, 0x92, 0xb8, 0xee, 0xc8, 0xfb, 0xd0, 0x0e, 0xf9, 0xab, 0x2c, 0x9b, 0xe4, 0xdd, 0x90, + 0xbf, 0x52, 0x59, 0xdc, 0x2e, 0xac, 0xe5, 0xab, 0x91, 0x0d, 0xf8, 0xef, 0x0e, 0xd4, 0x9e, 0xa7, + 0xaf, 0x23, 0x76, 0x17, 0x6a, 0xe9, 0xf9, 0x44, 0x48, 0xc8, 0xe2, 0x06, 0x93, 0x5d, 0xdb, 0x1c, + 0x0e, 0x63, 0x9e, 0x24, 0xcf, 0xce, 0x27, 0xdc, 0x6b, 0xfb, 0x22, 0xd1, 0xc7, 0x7c, 0xac, 0x0b, + 0xf3, 0x32, 0x4d, 0x15, 0x36, 0x3d, 0x95, 0x64, 0xd7, 0x00, 0xfc, 0x71, 0x34, 0x0d, 0xd3, 0x7e, + 0xe2, 0xa7, 0x34, 0x54, 0x55, 0xcf, 0x40, 0xd8, 0x55, 0x68, 0x4e, 0x5e, 0xf6, 0x93, 0x41, 0x1c, + 0x4c, 0x52, 0x62, 0x9b, 0xa6, 0x97, 0x01, 0xec, 0x1b, 0xd0, 0x88, 0xa6, 0xe9, 0x24, 0x0a, 0xc2, + 0x54, 0xb2, 0xca, 0x92, 0x6c, 0xcb, 0xd3, 0x69, 0x7a, 0x80, 0xb0, 0xa7, 0x33, 0xb0, 0x1b, 0xb0, + 0x30, 0x88, 0xc2, 0xe3, 0x20, 0x1e, 0x0b, 0x65, 0xd0, 0x9d, 0xa3, 0xda, 0x6c, 0xd0, 0xfd, 0x37, + 0x15, 0x68, 0x3d, 0x8b, 0xfd, 0x30, 0xf1, 0x07, 0x08, 0x60, 0xd3, 0xd3, 0xd7, 0xfd, 0x53, 0x3f, + 0x39, 0xa5, 0xde, 0x36, 0x3d, 0x95, 0x64, 0x6b, 0x30, 0x27, 0x1a, 0x4a, 0x7d, 0xaa, 0x7a, 0x32, + 0xc5, 0x3e, 0x80, 0xe5, 0x70, 0x3a, 0xee, 0xdb, 0x75, 0x55, 0x89, 0x5b, 0x8a, 0x04, 0x1c, 0x80, + 0x23, 0x9c, 0x6b, 0x51, 0x85, 0xe8, 0xa1, 0x81, 0x30, 0x17, 0xda, 0x32, 0xc5, 0x83, 0x93, 0x53, + 0xd1, 0xcd, 0xba, 0x67, 0x61, 0x58, 0x46, 0x1a, 0x8c, 0x79, 0x3f, 0x49, 0xfd, 0xf1, 0x44, 0x76, + 0xcb, 0x40, 0x88, 0x1e, 0xa5, 0xfe, 0xa8, 0x7f, 0xcc, 0x79, 0xd2, 0x9d, 0x97, 0x74, 0x8d, 0xb0, + 0x9b, 0xb0, 0x38, 0xe4, 0x49, 0xda, 0x97, 0x93, 0xc2, 0x93, 0x6e, 0x83, 0x44, 0x3f, 0x87, 0x62, + 0x39, 0xb1, 0xff, 0xaa, 0x8f, 0x03, 0xc0, 0x5f, 0x77, 0x9b, 0xa2, 0xad, 0x19, 0x82, 0x9c, 0xf3, + 0x88, 0xa7, 0xc6, 0xe8, 0x25, 0x92, 0x43, 0xdd, 0x3d, 0x60, 0x06, 0xbc, 0xcd, 0x53, 0x3f, 0x18, + 0x25, 0xec, 0x23, 0x68, 0xa7, 0x46, 0x66, 0x52, 0x85, 0x2d, 0xcd, 0x4e, 0xc6, 0x07, 0x9e, 0x95, + 0xcf, 0x3d, 0x85, 0xc6, 0x43, 0xce, 0xf7, 0x82, 0x71, 0x90, 0xb2, 0x35, 0xa8, 0x1f, 0x07, 0xaf, + 0xb9, 0x60, 0xf8, 0xea, 0xee, 0x25, 0x4f, 0x24, 0xd9, 0x7b, 0x00, 0xf4, 0xa3, 0x3f, 0xd6, 0x8c, + 0xb5, 0x7b, 0xc9, 0x6b, 0x12, 0xf6, 0x04, 0x39, 0xab, 0x07, 0xf3, 0x13, 0x1e, 0x0f, 0xb8, 0x9a, + 0xbf, 0xdd, 0x4b, 0x9e, 0x02, 0x1e, 0xcc, 0x43, 0x7d, 0x84, 0xa5, 0xbb, 0x7f, 0x52, 0x83, 0xd6, + 0x21, 0x0f, 0xb5, 0xa4, 0x31, 0xa8, 0xe1, 0x98, 0x48, 0xe9, 0xa2, 0xdf, 0xec, 0x6b, 0xd0, 0xa2, + 0x71, 0x4a, 0xd2, 0x38, 0x08, 0x4f, 0x04, 0x83, 0x3f, 0xa8, 0x74, 0x1d, 0x0f, 0x10, 0x3e, 0x24, + 0x94, 0x75, 0xa0, 0xea, 0x8f, 0x15, 0x83, 0xe3, 0x4f, 0x76, 0x05, 0x1a, 0xfe, 0x38, 0x15, 0xcd, + 0x6b, 0x13, 0x3c, 0xef, 0x8f, 0x53, 0x6a, 0xda, 0xfb, 0xd0, 0x9e, 0xf8, 0xe7, 0x63, 0x94, 0x67, + 0xcd, 0x15, 0x6d, 0xaf, 0x25, 0xb1, 0x5d, 0x64, 0x8b, 0x0d, 0x58, 0x31, 0xb3, 0xa8, 0xca, 0xeb, + 0xba, 0xf2, 0x65, 0x23, 0xb7, 0x6c, 0xc3, 0x2d, 0x58, 0x52, 0xdf, 0xc4, 0xa2, 0x3f, 0xc4, 0x2b, + 0x4d, 0x6f, 0x51, 0xc2, 0xaa, 0x97, 0xb7, 0xa1, 0x73, 0x1c, 0x84, 0xfe, 0xa8, 0x3f, 0x18, 0xa5, + 0x67, 0xfd, 0x21, 0x1f, 0xa5, 0x3e, 0x71, 0x4d, 0xdd, 0x5b, 0x24, 0x7c, 0x6b, 0x94, 0x9e, 0x6d, + 0x23, 0xca, 0x3e, 0x80, 0xe6, 0x31, 0xe7, 0x7d, 0x1a, 0xac, 0x6e, 0xc3, 0x92, 0x40, 0x35, 0x43, + 0x5e, 0xe3, 0x58, 0xcd, 0xd5, 0x07, 0xd0, 0x89, 0xa6, 0xe9, 0x49, 0x14, 0x84, 0x27, 0x7d, 0xd4, + 0x79, 0xfd, 0x60, 0x48, 0x5c, 0x54, 0x7b, 0x50, 0xb9, 0xef, 0x78, 0x8b, 0x8a, 0x86, 0xda, 0xe7, + 0xf1, 0x90, 0xdd, 0x84, 0xa5, 0x91, 0x9f, 0xa4, 0xfd, 0xd3, 0x68, 0xd2, 0x9f, 0x4c, 0x8f, 0x5e, + 0xf2, 0xf3, 0xee, 0x02, 0x0d, 0xc4, 0x02, 0xc2, 0xbb, 0xd1, 0xe4, 0x80, 0x40, 0xf6, 0x2e, 0x00, + 0xb5, 0x53, 0x34, 0x02, 0xae, 0x3b, 0xb7, 0x17, 0xbc, 0x26, 0x22, 0xa2, 0xd2, 0x4f, 0xa0, 0x41, + 0xd3, 0x93, 0x8e, 0xce, 0xba, 0x2d, 0x62, 0xb0, 0xf7, 0x64, 0x0b, 0x8d, 0x89, 0xbd, 0xbb, 0xcd, + 0x93, 0xf4, 0xd9, 0xe8, 0x0c, 0xd7, 0xef, 0x73, 0x6f, 0x7e, 0x28, 0x52, 0xbd, 0x4f, 0xa0, 0x6d, + 0x12, 0x70, 0x16, 0xb1, 0x19, 0x38, 0xfb, 0x35, 0x0f, 0x7f, 0xb2, 0x55, 0xa8, 0x9f, 0xf9, 0xa3, + 0x29, 0x97, 0x8a, 0x54, 0x24, 0x3e, 0xa9, 0x7c, 0xec, 0xb8, 0x7f, 0xe2, 0x40, 0x5b, 0xd4, 0x20, + 0x0d, 0x80, 0x1b, 0xb0, 0xa0, 0x86, 0x9f, 0xc7, 0x71, 0x14, 0x4b, 0x7d, 0x62, 0x83, 0xec, 0x0e, + 0x74, 0x14, 0x30, 0x89, 0x79, 0x30, 0xf6, 0x4f, 0x54, 0xd9, 0x05, 0x9c, 0x6d, 0x64, 0x25, 0xc6, + 0xd1, 0x34, 0xe5, 0x72, 0xa9, 0x69, 0xcb, 0xfe, 0x79, 0x88, 0x79, 0x76, 0x16, 0xd4, 0x27, 0x25, + 0xbc, 0x65, 0x61, 0xee, 0x3f, 0x70, 0x80, 0x61, 0xd3, 0x9f, 0x45, 0xa2, 0x08, 0xc9, 0x16, 0x79, + 0xb6, 0x74, 0xde, 0x9a, 0x2d, 0x2b, 0x6f, 0x62, 0x4b, 0x17, 0xea, 0xa2, 0xf5, 0xb5, 0x92, 0xd6, + 0x0b, 0xd2, 0x67, 0xb5, 0x46, 0xb5, 0x53, 0x73, 0xff, 0x6b, 0x15, 0x56, 0xb7, 0xc4, 0x5a, 0xb9, + 0x39, 0x18, 0xf0, 0x89, 0x66, 0xd8, 0xf7, 0xa0, 0x15, 0x46, 0x43, 0xae, 0xd8, 0x44, 0x34, 0x0c, + 0x10, 0x32, 0x78, 0xe4, 0xd4, 0x0f, 0x42, 0xd1, 0x70, 0x31, 0x9e, 0x4d, 0x42, 0xa8, 0xd9, 0x37, + 0x61, 0x69, 0xc2, 0xc3, 0xa1, 0xc9, 0x97, 0xc2, 0x9a, 0x59, 0x90, 0xb0, 0x64, 0xc9, 0xf7, 0xa0, + 0x75, 0x3c, 0x15, 0xf9, 0x50, 0x9a, 0x6b, 0xc4, 0x07, 0x20, 0xa1, 0x4d, 0x21, 0xd4, 0x93, 0x69, + 0x72, 0x4a, 0xd4, 0x3a, 0x51, 0xe7, 0x31, 0x8d, 0xa4, 0x77, 0x01, 0x86, 0xd3, 0x24, 0x95, 0x6c, + 0x3a, 0x47, 0xc4, 0x26, 0x22, 0x82, 0x4d, 0xbf, 0x09, 0x2b, 0x63, 0xff, 0x75, 0x9f, 0xf8, 0xa7, + 0x1f, 0x84, 0xfd, 0xe3, 0x11, 0xa9, 0xfb, 0x79, 0xca, 0xd7, 0x19, 0xfb, 0xaf, 0xbf, 0x87, 0x94, + 0xc7, 0xe1, 0x43, 0xc2, 0x51, 0x96, 0x95, 0x9d, 0x11, 0xf3, 0x84, 0xc7, 0x67, 0x9c, 0xc4, 0xaf, + 0xa6, 0x8d, 0x09, 0x4f, 0xa0, 0xd8, 0xa2, 0x31, 0xf6, 0x3b, 0x1d, 0x0d, 0x84, 0xac, 0x79, 0xf3, + 0xe3, 0x20, 0xdc, 0x4d, 0x47, 0x03, 0x76, 0x15, 0x00, 0x85, 0x77, 0xc2, 0xe3, 0xfe, 0xcb, 0x57, + 0x24, 0x38, 0x35, 0x12, 0xd6, 0x03, 0x1e, 0x7f, 0xfe, 0x8a, 0xbd, 0x03, 0xcd, 0x41, 0x42, 0xd2, + 0xef, 0x9f, 0x77, 0x5b, 0x24, 0x55, 0x8d, 0x41, 0x82, 0x72, 0xef, 0x9f, 0xb3, 0x0f, 0x80, 0x61, + 0x6b, 0x7d, 0x9a, 0x05, 0x3e, 0xa4, 0xe2, 0x13, 0x52, 0x63, 0x0b, 0xd4, 0xd8, 0x4d, 0x49, 0xc0, + 0x7a, 0x12, 0xf6, 0x35, 0x58, 0x50, 0x8d, 0x3d, 0x1e, 0xf9, 0x27, 0x09, 0xc9, 0xf1, 0x82, 0xd7, + 0x96, 0xe0, 0x43, 0xc4, 0xdc, 0x17, 0xc2, 0xba, 0x31, 0xe6, 0x56, 0xca, 0x0d, 0xae, 0xb3, 0x84, + 0xd0, 0xbc, 0x36, 0x3c, 0x99, 0x2a, 0x9b, 0xb4, 0x4a, 0xc9, 0xa4, 0xb9, 0x3f, 0x77, 0xa0, 0x2d, + 0x4b, 0x26, 0x93, 0x80, 0xdd, 0x07, 0xa6, 0x66, 0x31, 0x7d, 0x1d, 0x0c, 0xfb, 0x47, 0xe7, 0x29, + 0x4f, 0x04, 0xd3, 0xec, 0x5e, 0xf2, 0x4a, 0x68, 0xa8, 0xb8, 0x2c, 0x34, 0x49, 0x63, 0xc1, 0xd3, + 0xbb, 0x97, 0xbc, 0x02, 0x05, 0x45, 0x0c, 0x8d, 0x8e, 0x69, 0xda, 0x0f, 0xc2, 0x21, 0x7f, 0x4d, + 0xac, 0xb4, 0xe0, 0x59, 0xd8, 0x83, 0x45, 0x68, 0x9b, 0xdf, 0xb9, 0x3f, 0x86, 0x86, 0x32, 0x59, + 0x68, 0xb9, 0xce, 0xb5, 0xcb, 0x33, 0x10, 0xd6, 0x83, 0x86, 0xdd, 0x0a, 0xaf, 0xf1, 0x55, 0xea, + 0x76, 0xff, 0x12, 0x74, 0xf6, 0x90, 0x89, 0x42, 0x64, 0x5a, 0x69, 0x87, 0xad, 0xc1, 0x9c, 0x21, + 0x3c, 0x4d, 0x4f, 0xa6, 0x70, 0xc1, 0x3b, 0x8d, 0x92, 0x54, 0xd6, 0x43, 0xbf, 0xdd, 0x3f, 0x73, + 0x80, 0xed, 0x24, 0x69, 0x30, 0xf6, 0x53, 0xfe, 0x90, 0x6b, 0xf5, 0xf0, 0x14, 0xda, 0x58, 0xda, + 0xb3, 0x68, 0x53, 0x58, 0x45, 0x62, 0x35, 0xff, 0x86, 0x14, 0xe7, 0xe2, 0x07, 0x77, 0xcd, 0xdc, + 0x42, 0xf1, 0x5a, 0x05, 0xa0, 0xb4, 0xa5, 0x7e, 0x7c, 0xc2, 0x53, 0x32, 0x99, 0xa4, 0xc1, 0x0d, + 0x02, 0xda, 0x8a, 0xc2, 0xe3, 0xde, 0xef, 0xc2, 0x72, 0xa1, 0x0c, 0x53, 0x47, 0x37, 0x4b, 0x74, + 0x74, 0xd5, 0xd4, 0xd1, 0x03, 0x58, 0xb1, 0xda, 0x25, 0x39, 0xae, 0x0b, 0xf3, 0x28, 0x18, 0xb8, + 0x32, 0x3b, 0x62, 0x65, 0x96, 0x49, 0xb6, 0x01, 0xab, 0xc7, 0x9c, 0xc7, 0x7e, 0x4a, 0x49, 0x12, + 0x1d, 0x9c, 0x13, 0x59, 0x72, 0x29, 0xcd, 0xfd, 0x1f, 0x0e, 0x2c, 0xa1, 0x36, 0x7d, 0xe2, 0x87, + 0xe7, 0x6a, 0xac, 0xf6, 0x4a, 0xc7, 0xea, 0xb6, 0xb1, 0x30, 0x19, 0xb9, 0xbf, 0xea, 0x40, 0x55, + 0xf3, 0x03, 0xc5, 0xae, 0x43, 0xdb, 0x6a, 0x6e, 0x5d, 0x98, 0x80, 0x89, 0x9f, 0x1e, 0xf0, 0xf8, + 0xc1, 0x79, 0xca, 0x7f, 0xfd, 0xa1, 0xbc, 0x09, 0x9d, 0xac, 0xd9, 0x72, 0x1c, 0x19, 0xd4, 0x90, + 0x31, 0x65, 0x01, 0xf4, 0xdb, 0xfd, 0x27, 0x8e, 0xc8, 0xb8, 0x15, 0x05, 0xda, 0x3c, 0xc4, 0x8c, + 0x68, 0x65, 0xaa, 0x8c, 0xf8, 0x7b, 0xa6, 0x79, 0xfd, 0xeb, 0x77, 0x16, 0x75, 0x62, 0xc2, 0xc3, + 0x61, 0xdf, 0x1f, 0x8d, 0x48, 0x11, 0x37, 0xbc, 0x79, 0x4c, 0x6f, 0x8e, 0x46, 0xee, 0x2d, 0x58, + 0x36, 0x5a, 0xf7, 0x86, 0x7e, 0xec, 0x03, 0xdb, 0x0b, 0x92, 0xf4, 0x79, 0x98, 0x4c, 0x0c, 0xcb, + 0xe9, 0x1d, 0x68, 0xa2, 0xb6, 0xc5, 0x96, 0x09, 0xc9, 0xad, 0x7b, 0xa8, 0x7e, 0xb1, 0x5d, 0x09, + 0x11, 0xfd, 0xd7, 0x92, 0x58, 0x91, 0x44, 0xff, 0x35, 0x11, 0xdd, 0x8f, 0x61, 0xc5, 0x2a, 0x4f, + 0x56, 0xfd, 0x3e, 0xd4, 0xa7, 0xe9, 0xeb, 0x48, 0xd9, 0xc6, 0x2d, 0xc9, 0x21, 0xb8, 0x0b, 0xf3, + 0x04, 0xc5, 0xfd, 0x14, 0x96, 0xf7, 0xf9, 0x2b, 0x29, 0xc8, 0xaa, 0x21, 0x37, 0x2f, 0xdc, 0xa1, + 0x11, 0xdd, 0xbd, 0x0b, 0xcc, 0xfc, 0x38, 0x13, 0x00, 0xb5, 0x5f, 0x73, 0xac, 0xfd, 0x9a, 0x7b, + 0x13, 0xd8, 0x61, 0x70, 0x12, 0x3e, 0xe1, 0x49, 0xe2, 0x9f, 0x68, 0xd1, 0xef, 0x40, 0x75, 0x9c, + 0x9c, 0x48, 0x55, 0x85, 0x3f, 0xdd, 0x6f, 0xc1, 0x8a, 0x95, 0x4f, 0x16, 0x7c, 0x15, 0x9a, 0x49, + 0x70, 0x12, 0xfa, 0xe9, 0x34, 0xe6, 0xb2, 0xe8, 0x0c, 0x70, 0x1f, 0xc2, 0xea, 0xf7, 0x78, 0x1c, + 0x1c, 0x9f, 0x5f, 0x54, 0xbc, 0x5d, 0x4e, 0x25, 0x5f, 0xce, 0x0e, 0x5c, 0xce, 0x95, 0x23, 0xab, + 0x17, 0xec, 0x2b, 0x67, 0xb2, 0xe1, 0x89, 0x84, 0xa1, 0xfb, 0x2a, 0xa6, 0xee, 0x73, 0x9f, 0x03, + 0xdb, 0x8a, 0xc2, 0x90, 0x0f, 0xd2, 0x03, 0xce, 0xe3, 0xcc, 0x55, 0x94, 0xf1, 0x6a, 0x6b, 0x63, + 0x5d, 0x8e, 0x6c, 0x5e, 0xa1, 0x4a, 0x26, 0x66, 0x50, 0x9b, 0xf0, 0x78, 0x4c, 0x05, 0x37, 0x3c, + 0xfa, 0xed, 0x5e, 0x86, 0x15, 0xab, 0x58, 0xb9, 0xb9, 0xfe, 0x10, 0x2e, 0x6f, 0x07, 0xc9, 0xa0, + 0x58, 0x61, 0x17, 0xe6, 0x27, 0xd3, 0xa3, 0x7e, 0x26, 0x89, 0x2a, 0x89, 0xfb, 0xad, 0xfc, 0x27, + 0xb2, 0xb0, 0xbf, 0xe5, 0x40, 0x6d, 0xf7, 0xd9, 0xde, 0x16, 0xae, 0x15, 0x41, 0x38, 0x88, 0xc6, + 0x68, 0x85, 0x89, 0x4e, 0xeb, 0xf4, 0x4c, 0x09, 0xbb, 0x0a, 0x4d, 0x32, 0xde, 0x70, 0x8b, 0x29, + 0xed, 0xa0, 0x0c, 0xc0, 0xed, 0x2d, 0x7f, 0x3d, 0x09, 0x62, 0xda, 0xbf, 0xaa, 0x5d, 0x69, 0x8d, + 0x96, 0x99, 0x22, 0xc1, 0xfd, 0xf9, 0x3c, 0xcc, 0xcb, 0xc5, 0x57, 0x2c, 0xe4, 0x69, 0x70, 0xc6, + 0xb3, 0x85, 0x1c, 0x53, 0x68, 0x18, 0xc7, 0x7c, 0x1c, 0xa5, 0xda, 0x7e, 0x13, 0xd3, 0x60, 0x83, + 0xb4, 0x7d, 0x97, 0x46, 0x84, 0xd8, 0xf0, 0x57, 0x45, 0x2e, 0x0b, 0x64, 0x57, 0x61, 0x5e, 0x19, + 0x03, 0x35, 0xbd, 0xb3, 0x50, 0x10, 0x8e, 0xc6, 0xc0, 0x9f, 0xf8, 0x83, 0x20, 0x3d, 0x97, 0x6a, + 0x41, 0xa7, 0xb1, 0xfc, 0x51, 0x34, 0xf0, 0x47, 0xfd, 0x23, 0x7f, 0xe4, 0x87, 0x03, 0xae, 0xdc, + 0x03, 0x16, 0x88, 0x5b, 0x65, 0xd9, 0x2c, 0x95, 0x4d, 0x6c, 0xa7, 0x73, 0x28, 0xae, 0xe1, 0x83, + 0x68, 0x3c, 0x0e, 0x52, 0xdc, 0x61, 0x93, 0x69, 0x56, 0xf5, 0x0c, 0x44, 0x38, 0x23, 0x28, 0xf5, + 0x4a, 0x8c, 0x60, 0x53, 0x39, 0x23, 0x0c, 0x10, 0x4b, 0xc9, 0x59, 0x68, 0x55, 0xcf, 0x40, 0x70, + 0x2e, 0xa6, 0x61, 0xc2, 0xd3, 0x74, 0xc4, 0x87, 0xba, 0x41, 0x2d, 0xca, 0x56, 0x24, 0xb0, 0xfb, + 0xb0, 0x22, 0x36, 0xfd, 0x89, 0x9f, 0x46, 0xc9, 0x69, 0x90, 0xf4, 0x13, 0xdc, 0xfd, 0x8a, 0xcd, + 0x67, 0x19, 0x89, 0x7d, 0x0c, 0xeb, 0x39, 0x38, 0xe6, 0x03, 0x1e, 0x9c, 0xf1, 0x21, 0x99, 0x70, + 0x55, 0x6f, 0x16, 0x99, 0x5d, 0x87, 0x56, 0x38, 0x1d, 0xf7, 0xa7, 0x93, 0xa1, 0x8f, 0x46, 0xcc, + 0x22, 0x19, 0x97, 0x26, 0xc4, 0x3e, 0x04, 0x65, 0xa7, 0x49, 0xeb, 0x71, 0xc9, 0xd2, 0x70, 0xc8, + 0xbd, 0x9e, 0x9d, 0x03, 0x19, 0x33, 0x33, 0x49, 0x3b, 0x72, 0xa3, 0xa7, 0x00, 0x92, 0x93, 0x38, + 0x38, 0xf3, 0x53, 0xde, 0x5d, 0x16, 0x4a, 0x5d, 0x26, 0xf1, 0xbb, 0x20, 0x0c, 0xd2, 0xc0, 0x4f, + 0xa3, 0xb8, 0xcb, 0x88, 0x96, 0x01, 0x38, 0x88, 0xc4, 0x1f, 0x49, 0xea, 0xa7, 0xd3, 0x44, 0x5a, + 0xa8, 0x2b, 0xc4, 0x5c, 0x45, 0x02, 0xfb, 0x08, 0xd6, 0x04, 0x47, 0x10, 0x49, 0xda, 0xde, 0x64, + 0x2a, 0xac, 0xd2, 0x88, 0xcc, 0xa0, 0xe2, 0x50, 0x4a, 0x16, 0x29, 0x7c, 0x78, 0x59, 0x0c, 0xe5, + 0x0c, 0x32, 0xb6, 0x0f, 0x5b, 0x10, 0x0c, 0xfa, 0x32, 0x07, 0x8a, 0xc8, 0x1a, 0xf5, 0xa2, 0x48, + 0x40, 0x16, 0x1f, 0x05, 0xc7, 0x3c, 0x0d, 0xc6, 0xbc, 0xbb, 0x2e, 0x58, 0x5c, 0xa5, 0x51, 0x00, + 0xa7, 0x13, 0xa2, 0x74, 0x85, 0xc0, 0x8b, 0x94, 0xfb, 0x07, 0x8e, 0x58, 0x7c, 0xa4, 0xa0, 0x26, + 0xc6, 0xb6, 0x4a, 0x88, 0x68, 0x3f, 0x0a, 0x47, 0xe7, 0x52, 0x6a, 0x41, 0x40, 0x4f, 0xc3, 0xd1, + 0x39, 0x1a, 0xf6, 0x41, 0x68, 0x66, 0x11, 0x7a, 0xae, 0xad, 0x40, 0xca, 0xf4, 0x1e, 0xb4, 0x26, + 0xd3, 0xa3, 0x51, 0x30, 0x10, 0x59, 0xaa, 0xa2, 0x14, 0x01, 0x51, 0x06, 0xdc, 0x57, 0x8a, 0x99, + 0x12, 0x39, 0x6a, 0x94, 0xa3, 0x25, 0x31, 0xcc, 0xe2, 0x3e, 0x80, 0x55, 0xbb, 0x81, 0x52, 0xa1, + 0xdf, 0x81, 0x86, 0x94, 0xff, 0x44, 0x6e, 0xee, 0x17, 0x0d, 0x3f, 0x2b, 0x6e, 0x83, 0x34, 0xdd, + 0xfd, 0xb7, 0x35, 0x58, 0x91, 0xe8, 0xd6, 0x28, 0x4a, 0xf8, 0xe1, 0x74, 0x3c, 0xf6, 0xe3, 0x12, + 0xc5, 0xe2, 0x5c, 0xa0, 0x58, 0x2a, 0x45, 0xc5, 0x72, 0xcd, 0xda, 0x5f, 0x0a, 0xcd, 0x64, 0x20, + 0xec, 0x36, 0x2c, 0x0d, 0x46, 0x51, 0x22, 0xcc, 0x7d, 0xd3, 0xd5, 0x97, 0x87, 0x8b, 0xca, 0xb0, + 0x5e, 0xa6, 0x0c, 0x4d, 0x45, 0x36, 0x97, 0x53, 0x64, 0x2e, 0xb4, 0xb1, 0x50, 0xae, 0x74, 0xf3, + 0xbc, 0xdc, 0x6c, 0x19, 0x18, 0xb6, 0x27, 0xaf, 0x36, 0x84, 0x8e, 0x5a, 0x2a, 0x53, 0x1a, 0xc1, + 0x98, 0x93, 0xee, 0x37, 0x72, 0x37, 0xa5, 0xd2, 0x28, 0x92, 0xd8, 0x43, 0x00, 0x51, 0x17, 0x19, + 0x20, 0x40, 0x06, 0xc8, 0x4d, 0x7b, 0x56, 0xcc, 0xf1, 0xbf, 0x8b, 0x89, 0x69, 0xcc, 0xc9, 0x28, + 0x31, 0xbe, 0x74, 0xff, 0x8e, 0x03, 0x2d, 0x83, 0xc6, 0x2e, 0xc3, 0xf2, 0xd6, 0xd3, 0xa7, 0x07, + 0x3b, 0xde, 0xe6, 0xb3, 0xc7, 0xdf, 0xdb, 0xe9, 0x6f, 0xed, 0x3d, 0x3d, 0xdc, 0xe9, 0x5c, 0x42, + 0x78, 0xef, 0xe9, 0xd6, 0xe6, 0x5e, 0xff, 0xe1, 0x53, 0x6f, 0x4b, 0xc1, 0x0e, 0x5b, 0x03, 0xe6, + 0xed, 0x3c, 0x79, 0xfa, 0x6c, 0xc7, 0xc2, 0x2b, 0xac, 0x03, 0xed, 0x07, 0xde, 0xce, 0xe6, 0xd6, + 0xae, 0x44, 0xaa, 0x6c, 0x15, 0x3a, 0x0f, 0x9f, 0xef, 0x6f, 0x3f, 0xde, 0x7f, 0xd4, 0xdf, 0xda, + 0xdc, 0xdf, 0xda, 0xd9, 0xdb, 0xd9, 0xee, 0xd4, 0xd8, 0x02, 0x34, 0x37, 0x1f, 0x6c, 0xee, 0x6f, + 0x3f, 0xdd, 0xdf, 0xd9, 0xee, 0xd4, 0xdd, 0xff, 0xe6, 0xc0, 0x65, 0x6a, 0xf5, 0x30, 0x2f, 0x24, + 0xd7, 0xa1, 0x35, 0x88, 0xa2, 0x09, 0x1a, 0xfe, 0xd9, 0xd2, 0x66, 0x42, 0x28, 0x00, 0x42, 0x29, + 0x1c, 0x47, 0xf1, 0x80, 0x4b, 0x19, 0x01, 0x82, 0x1e, 0x22, 0x82, 0x02, 0x20, 0xa7, 0x57, 0xe4, + 0x10, 0x22, 0xd2, 0x12, 0x98, 0xc8, 0xb2, 0x06, 0x73, 0x47, 0x31, 0xf7, 0x07, 0xa7, 0x52, 0x3a, + 0x64, 0x8a, 0x7d, 0x3d, 0xdb, 0x99, 0x0e, 0x70, 0xf4, 0x47, 0x7c, 0x48, 0x1c, 0xd3, 0xf0, 0x96, + 0x24, 0xbe, 0x25, 0x61, 0xd4, 0x82, 0xfe, 0x91, 0x1f, 0x0e, 0xa3, 0x90, 0x0f, 0xa5, 0xd9, 0x9b, + 0x01, 0xee, 0x01, 0xac, 0xe5, 0xfb, 0x27, 0x65, 0xec, 0x23, 0x43, 0xc6, 0x84, 0x15, 0xda, 0x9b, + 0x3d, 0x9b, 0x86, 0xbc, 0xfd, 0xa2, 0x02, 0x35, 0x34, 0x4a, 0x66, 0x1b, 0x30, 0xa6, 0x9d, 0x59, + 0x2d, 0x9c, 0x0b, 0xd0, 0x66, 0x57, 0x2c, 0x51, 0xd2, 0xd1, 0x92, 0x21, 0x19, 0x3d, 0xe6, 0x83, + 0x33, 0xe9, 0x6a, 0x31, 0x10, 0x14, 0x10, 0xdc, 0x04, 0xd0, 0xd7, 0x52, 0x40, 0x54, 0x5a, 0xd1, + 0xe8, 0xcb, 0xf9, 0x8c, 0x46, 0xdf, 0x75, 0x61, 0x3e, 0x08, 0x8f, 0xa2, 0x69, 0x38, 0x24, 0x81, + 0x68, 0x78, 0x2a, 0x49, 0x27, 0x11, 0x24, 0xa8, 0xa8, 0x3f, 0x05, 0xfb, 0x67, 0x00, 0xdb, 0x80, + 0x66, 0x72, 0x1e, 0x0e, 0x4c, 0x9e, 0x5f, 0x95, 0xa3, 0x84, 0x63, 0x70, 0xf7, 0xf0, 0x3c, 0x1c, + 0x10, 0x87, 0x67, 0xd9, 0xdc, 0xdf, 0x85, 0x86, 0x82, 0x91, 0x2d, 0x9f, 0xef, 0x7f, 0xbe, 0xff, + 0xf4, 0xc5, 0x7e, 0xff, 0xf0, 0xfb, 0xfb, 0x5b, 0x9d, 0x4b, 0x6c, 0x09, 0x5a, 0x9b, 0x5b, 0xc4, + 0xe9, 0x04, 0x38, 0x98, 0xe5, 0x60, 0xf3, 0xf0, 0x50, 0x23, 0x15, 0x97, 0xe1, 0x46, 0x3e, 0x21, + 0xcb, 0x4f, 0x7b, 0xda, 0x3f, 0x82, 0x65, 0x03, 0xcb, 0x76, 0x11, 0x13, 0x04, 0x72, 0xbb, 0x08, + 0x32, 0x19, 0x05, 0xc5, 0xed, 0xc0, 0xe2, 0x23, 0x9e, 0x3e, 0x0e, 0x8f, 0x23, 0x55, 0xd2, 0xff, + 0xaa, 0xc1, 0x92, 0x86, 0x64, 0x41, 0xb7, 0x61, 0x29, 0x18, 0xf2, 0x30, 0x0d, 0xd2, 0xf3, 0xbe, + 0xe5, 0x2f, 0xc8, 0xc3, 0x68, 0x6a, 0xfb, 0xa3, 0xc0, 0x57, 0x07, 0x3e, 0x22, 0x81, 0xfb, 0x67, + 0xb4, 0x01, 0x4c, 0xbf, 0x0d, 0xf1, 0x95, 0x70, 0x53, 0x94, 0xd2, 0x50, 0x03, 0x21, 0x2e, 0x97, + 0x19, 0xfd, 0x89, 0x30, 0x39, 0xcb, 0x48, 0x38, 0x55, 0xa2, 0x24, 0xec, 0x72, 0x5d, 0xd8, 0x09, + 0x1a, 0x28, 0x9c, 0xa8, 0xcc, 0x09, 0xfd, 0x98, 0x3f, 0x51, 0x31, 0x4e, 0x65, 0x1a, 0x85, 0x53, + 0x19, 0xd4, 0x9f, 0xe7, 0xe1, 0x80, 0x0f, 0xfb, 0x69, 0xd4, 0x27, 0x3d, 0x4f, 0x2c, 0xd1, 0xf0, + 0xf2, 0x30, 0xae, 0x1b, 0x29, 0x4f, 0xd2, 0x90, 0x0b, 0xd7, 0x74, 0x83, 0xbc, 0xa0, 0x0a, 0xc2, + 0xfd, 0xc1, 0x34, 0x0e, 0x92, 0x6e, 0x9b, 0xce, 0x5b, 0xe8, 0x37, 0xfb, 0x36, 0x5c, 0x3e, 0xe2, + 0x49, 0xda, 0x3f, 0xe5, 0xfe, 0x90, 0xc7, 0xc4, 0x5e, 0xe2, 0x60, 0x47, 0x98, 0x5c, 0xe5, 0x44, + 0x64, 0xdc, 0x33, 0x1e, 0x27, 0x41, 0x14, 0x92, 0xb1, 0xd5, 0xf4, 0x54, 0x12, 0xcb, 0xc3, 0xce, + 0xeb, 0x85, 0x5a, 0x8f, 0xe0, 0x12, 0x75, 0xbc, 0x9c, 0xc8, 0x6e, 0xc0, 0x1c, 0x75, 0x20, 0xe9, + 0x76, 0x88, 0x67, 0xda, 0x99, 0xcc, 0x07, 0xa1, 0x27, 0x69, 0x38, 0xcb, 0x83, 0x68, 0x14, 0xc5, + 0x64, 0x71, 0x35, 0x3d, 0x91, 0xb0, 0x47, 0xe7, 0x24, 0xf6, 0x27, 0xa7, 0xd2, 0xea, 0xca, 0xc3, + 0x9f, 0xd5, 0x1a, 0xad, 0x4e, 0xdb, 0xfd, 0x0b, 0x50, 0xa7, 0x62, 0xa9, 0x38, 0x1a, 0x4c, 0x47, + 0x16, 0x47, 0x68, 0x17, 0xe6, 0x43, 0x9e, 0xbe, 0x8a, 0xe2, 0x97, 0xea, 0xf4, 0x50, 0x26, 0xdd, + 0x9f, 0xd2, 0x0e, 0x4d, 0x9f, 0xa6, 0x3d, 0x27, 0xd3, 0x12, 0xf7, 0xd9, 0x62, 0xaa, 0x92, 0x53, + 0x5f, 0x6e, 0x1a, 0x1b, 0x04, 0x1c, 0x9e, 0xfa, 0xa8, 0x6b, 0xad, 0xd9, 0x17, 0xfb, 0xf0, 0x16, + 0x61, 0xbb, 0x62, 0xf2, 0x6f, 0xc0, 0xa2, 0x3a, 0xa7, 0x4b, 0xfa, 0x23, 0x7e, 0x9c, 0x2a, 0x2f, + 0x5a, 0x38, 0x1d, 0xd3, 0x66, 0x7d, 0x8f, 0x1f, 0xa7, 0xee, 0x3e, 0x2c, 0x4b, 0xfd, 0xf7, 0x74, + 0xc2, 0x55, 0xd5, 0xbf, 0x5d, 0x66, 0x4b, 0xb4, 0x36, 0x56, 0x6c, 0x85, 0x29, 0x4e, 0x26, 0xed, + 0x9c, 0xae, 0x07, 0xcc, 0xd4, 0xa7, 0xb2, 0x40, 0xb9, 0x98, 0x2b, 0x3f, 0xa1, 0xec, 0x8e, 0x85, + 0xe1, 0xf8, 0x24, 0xd3, 0xc1, 0x40, 0x9d, 0xae, 0x36, 0x3c, 0x95, 0x74, 0xff, 0xc8, 0x81, 0x15, + 0x2a, 0x4d, 0x59, 0x43, 0x72, 0xcd, 0xfa, 0xf8, 0x2b, 0x34, 0x53, 0x79, 0x69, 0x85, 0x6f, 0x72, + 0x15, 0xea, 0xe6, 0x2a, 0x26, 0x12, 0x5f, 0xdd, 0x27, 0x53, 0xcb, 0xfb, 0x64, 0xdc, 0x7f, 0xe8, + 0xc0, 0xb2, 0x58, 0x48, 0xc8, 0xda, 0x96, 0xdd, 0xff, 0x8b, 0xb0, 0x20, 0x2c, 0x02, 0xa9, 0x15, + 0x64, 0x43, 0x33, 0xd5, 0x4a, 0xa8, 0xc8, 0xbc, 0x7b, 0xc9, 0xb3, 0x33, 0xb3, 0x4f, 0xc9, 0x2a, + 0x0b, 0xfb, 0x84, 0x96, 0x9c, 0xc3, 0xdb, 0x63, 0xbd, 0x7b, 0xc9, 0x33, 0xb2, 0x3f, 0x68, 0xa0, + 0xb1, 0x8c, 0xb8, 0xfb, 0x08, 0x16, 0xac, 0x8a, 0x2c, 0x7f, 0x50, 0x5b, 0xf8, 0x83, 0x0a, 0x8e, + 0xd7, 0x4a, 0x89, 0xe3, 0xf5, 0x5f, 0x57, 0x81, 0x21, 0xb3, 0xe4, 0x66, 0xe3, 0xba, 0x7d, 0x7a, + 0xa1, 0x8e, 0xe4, 0x33, 0x88, 0x6d, 0x00, 0x33, 0x92, 0xea, 0x54, 0xa5, 0xaa, 0x4f, 0x55, 0x4a, + 0xa8, 0xa8, 0x6a, 0xa5, 0xd5, 0xa1, 0x4f, 0x2c, 0x68, 0xaf, 0x2f, 0x86, 0xbe, 0x94, 0x86, 0x2b, + 0x23, 0x1d, 0x5f, 0xe0, 0xae, 0x44, 0xee, 0x8f, 0x55, 0x3a, 0x3f, 0xc7, 0x73, 0x17, 0xce, 0xf1, + 0x7c, 0xc1, 0xef, 0x66, 0xec, 0xd0, 0x1a, 0xf6, 0x0e, 0xed, 0x06, 0x2c, 0xa8, 0x53, 0x0a, 0x71, + 0x22, 0x2a, 0xb7, 0xc3, 0x16, 0xc8, 0xee, 0x40, 0x47, 0x6d, 0x92, 0xf4, 0x36, 0x50, 0x9c, 0xf7, + 0x15, 0x70, 0x5c, 0x03, 0x32, 0x4f, 0x5c, 0x8b, 0x1a, 0x9b, 0x01, 0xb4, 0xa7, 0x42, 0x2e, 0xe9, + 0x4f, 0x43, 0x79, 0x1c, 0xcf, 0x87, 0xb4, 0x11, 0xc6, 0x3d, 0x55, 0x9e, 0xe0, 0xfe, 0x3d, 0x07, + 0x3a, 0x38, 0x6f, 0x16, 0x6b, 0x7e, 0x02, 0x24, 0x19, 0x6f, 0xc9, 0x99, 0x56, 0x5e, 0xf6, 0x31, + 0x34, 0x29, 0x1d, 0x4d, 0x78, 0x28, 0xf9, 0xb2, 0x6b, 0xf3, 0x65, 0xa6, 0x53, 0x76, 0x2f, 0x79, + 0x59, 0x66, 0x83, 0x2b, 0xff, 0x93, 0x03, 0x2d, 0x59, 0xcb, 0xaf, 0xec, 0xe9, 0xe9, 0x19, 0xf1, + 0x13, 0xc2, 0x00, 0xcb, 0xc2, 0x25, 0x6e, 0xc3, 0xd2, 0xd8, 0x4f, 0xa7, 0x31, 0xae, 0xe9, 0x96, + 0x97, 0x27, 0x0f, 0xe3, 0x02, 0x4d, 0xea, 0x33, 0xe9, 0xa7, 0xc1, 0xa8, 0xaf, 0xa8, 0x32, 0x52, + 0xa1, 0x8c, 0x84, 0x5a, 0x24, 0x49, 0xfd, 0x13, 0x2e, 0xd7, 0x5e, 0x91, 0x70, 0xbb, 0xb0, 0x76, + 0x90, 0x9d, 0xdc, 0x18, 0x36, 0xb6, 0xfb, 0x2f, 0x17, 0x60, 0xbd, 0x40, 0xd2, 0x71, 0x55, 0xd2, + 0x75, 0x31, 0x0a, 0xc6, 0x47, 0x91, 0xde, 0xa0, 0x38, 0xa6, 0x57, 0xc3, 0x22, 0xb1, 0x13, 0xb8, + 0xac, 0x8c, 0x0c, 0x1c, 0xd3, 0x6c, 0x41, 0xac, 0xd0, 0x4a, 0xf7, 0xa1, 0x3d, 0x85, 0xf9, 0x0a, + 0x15, 0x6e, 0x0a, 0x72, 0x79, 0x79, 0xec, 0x14, 0xba, 0xda, 0x9a, 0x91, 0x0a, 0xdb, 0xb0, 0x78, + 0xb0, 0xae, 0x0f, 0x2e, 0xa8, 0xcb, 0x32, 0xc9, 0xbd, 0x99, 0xa5, 0xb1, 0x73, 0xb8, 0xa6, 0x68, + 0xa4, 0x91, 0x8b, 0xf5, 0xd5, 0xde, 0xaa, 0x6f, 0xb4, 0xd9, 0xb0, 0x2b, 0xbd, 0xa0, 0x60, 0xf6, + 0x63, 0x58, 0x7b, 0xe5, 0x07, 0xa9, 0x6a, 0x96, 0x61, 0x5f, 0xd4, 0xa9, 0xca, 0x8d, 0x0b, 0xaa, + 0x7c, 0x21, 0x3e, 0xb6, 0x96, 0xa9, 0x19, 0x25, 0xf6, 0xfe, 0xb4, 0x02, 0x8b, 0x76, 0x39, 0xc8, + 0xa6, 0x52, 0xf6, 0x95, 0x0e, 0x54, 0x16, 0x69, 0x0e, 0x2e, 0xee, 0xf3, 0x2b, 0x65, 0xfb, 0x7c, + 0x73, 0x67, 0x5d, 0xbd, 0xc8, 0x45, 0x58, 0x7b, 0x3b, 0x17, 0x61, 0xbd, 0xd4, 0x45, 0x38, 0xdb, + 0x93, 0x34, 0xf7, 0xab, 0x7a, 0x92, 0xe6, 0xdf, 0xe8, 0x49, 0xea, 0xfd, 0x5f, 0x07, 0x58, 0x91, + 0x7b, 0xd9, 0x23, 0xe1, 0xda, 0x08, 0xf9, 0x48, 0x2a, 0xb1, 0x6f, 0xbe, 0x9d, 0x04, 0xa8, 0xd9, + 0x52, 0x5f, 0xa3, 0x28, 0x9a, 0xc1, 0x4d, 0xa6, 0x89, 0xb5, 0xe0, 0x95, 0x91, 0x72, 0x6e, 0xd2, + 0xda, 0xc5, 0x6e, 0xd2, 0xfa, 0xc5, 0x6e, 0xd2, 0xb9, 0xbc, 0x9b, 0xb4, 0xf7, 0x37, 0x1d, 0x58, + 0x29, 0x61, 0xb3, 0xdf, 0x5c, 0xc7, 0x91, 0x31, 0x2c, 0xed, 0x53, 0x91, 0x8c, 0x61, 0x82, 0xbd, + 0xbf, 0x0a, 0x0b, 0x96, 0x68, 0xfd, 0xe6, 0xea, 0xcf, 0x5b, 0x89, 0x82, 0xb3, 0x2d, 0xac, 0xf7, + 0xbf, 0x2b, 0xc0, 0x8a, 0xe2, 0xfd, 0xe7, 0xda, 0x86, 0xe2, 0x38, 0x55, 0x4b, 0xc6, 0xe9, 0xff, + 0xeb, 0xca, 0xf3, 0x01, 0x2c, 0xcb, 0x88, 0x4d, 0xc3, 0x99, 0x25, 0x38, 0xa6, 0x48, 0x40, 0x3b, + 0xd9, 0xf6, 0x51, 0x37, 0xac, 0x08, 0x35, 0x63, 0xf9, 0xcd, 0xb9, 0xaa, 0xdd, 0x1e, 0x74, 0xe5, + 0x08, 0xed, 0x9c, 0xf1, 0x30, 0x3d, 0x9c, 0x1e, 0x89, 0x90, 0xc5, 0x20, 0x0a, 0xc9, 0x0c, 0x34, + 0x89, 0xd2, 0xa0, 0xf8, 0x36, 0xb4, 0xcd, 0xe5, 0x43, 0x4e, 0x47, 0xce, 0x9f, 0x89, 0xa6, 0x84, + 0x99, 0x8b, 0x6d, 0xc3, 0x22, 0x29, 0xc9, 0xa1, 0xfe, 0xae, 0x42, 0xdf, 0xbd, 0xc1, 0x47, 0xb3, + 0x7b, 0xc9, 0xcb, 0x7d, 0xc3, 0x7e, 0x07, 0x16, 0xed, 0x0d, 0xa0, 0xb4, 0x4a, 0xca, 0x76, 0x04, + 0xf8, 0xb9, 0x9d, 0x99, 0x6d, 0x42, 0x27, 0xbf, 0x83, 0x94, 0xd1, 0x3c, 0x33, 0x0a, 0x28, 0x64, + 0x67, 0x1f, 0xcb, 0x03, 0xcb, 0x3a, 0xf9, 0x4e, 0x6e, 0xd8, 0x9f, 0x19, 0xc3, 0x74, 0x57, 0xfc, + 0x31, 0x8e, 0x30, 0x7f, 0x0f, 0x20, 0xc3, 0x58, 0x07, 0xda, 0x4f, 0x0f, 0x76, 0xf6, 0xfb, 0x5b, + 0xbb, 0x9b, 0xfb, 0xfb, 0x3b, 0x7b, 0x9d, 0x4b, 0x8c, 0xc1, 0x22, 0xb9, 0xfa, 0xb6, 0x35, 0xe6, + 0x20, 0x26, 0x9d, 0x2b, 0x0a, 0xab, 0xb0, 0x55, 0xe8, 0x3c, 0xde, 0xcf, 0xa1, 0xd5, 0x07, 0x4d, + 0x2d, 0x1f, 0xee, 0x1a, 0xac, 0x8a, 0x88, 0xdc, 0x07, 0x82, 0x3d, 0x94, 0x75, 0xf2, 0x4f, 0x1d, + 0xb8, 0x9c, 0x23, 0x64, 0x21, 0x5f, 0xc2, 0x00, 0xb1, 0xad, 0x12, 0x1b, 0xa4, 0x03, 0x08, 0x65, + 0x6b, 0xe6, 0x34, 0x48, 0x91, 0x80, 0x3c, 0x6f, 0xd8, 0xa6, 0x39, 0x49, 0x2a, 0x23, 0xb9, 0xeb, + 0x3a, 0xb2, 0x26, 0xd7, 0xf0, 0x63, 0x11, 0xe9, 0x6b, 0x12, 0xb2, 0x03, 0x60, 0xbb, 0xc9, 0x2a, + 0x89, 0xdb, 0x0a, 0xcb, 0xd8, 0xb1, 0xdb, 0x5b, 0x4a, 0x73, 0xff, 0x7d, 0x15, 0xd8, 0x77, 0xa7, + 0x3c, 0x3e, 0xa7, 0x98, 0x2e, 0xed, 0x39, 0x5d, 0xcf, 0xfb, 0x05, 0xe7, 0x26, 0xd3, 0xa3, 0xcf, + 0xf9, 0xb9, 0x0a, 0x96, 0xac, 0xbc, 0x55, 0xb0, 0x64, 0x59, 0xb0, 0x62, 0xed, 0xe2, 0x60, 0xc5, + 0xfa, 0x45, 0xc1, 0x8a, 0x5f, 0x83, 0x85, 0xe0, 0x24, 0x8c, 0x50, 0x1d, 0xa0, 0x09, 0x91, 0x74, + 0xe7, 0xae, 0x57, 0x71, 0xeb, 0x2d, 0xc1, 0x7d, 0xc4, 0xd8, 0xa7, 0x59, 0x26, 0x3e, 0x3c, 0xa1, + 0xe0, 0x5a, 0x53, 0x41, 0xec, 0x0c, 0x4f, 0xf8, 0x5e, 0x34, 0xf0, 0xd3, 0x28, 0xa6, 0x7d, 0x9a, + 0xfa, 0x18, 0xf1, 0x84, 0xdd, 0x80, 0xc5, 0x24, 0x9a, 0xa2, 0x51, 0xa5, 0x86, 0x41, 0x38, 0x9a, + 0xda, 0x02, 0x3d, 0x10, 0x83, 0x71, 0x17, 0x56, 0xa6, 0x09, 0xef, 0x8f, 0x83, 0x24, 0xc1, 0x85, + 0x73, 0x10, 0x85, 0x69, 0x1c, 0x8d, 0xa4, 0xbb, 0x69, 0x79, 0x9a, 0xf0, 0x27, 0x82, 0xb2, 0x25, + 0x08, 0xec, 0xdb, 0x59, 0x93, 0x26, 0x7e, 0x10, 0x27, 0x5d, 0xa0, 0x26, 0xa9, 0x9e, 0x62, 0xbb, + 0x0f, 0xfc, 0x20, 0xd6, 0x6d, 0xc1, 0x44, 0x92, 0x0b, 0xa2, 0x6c, 0xe5, 0x82, 0x28, 0x65, 0xfc, + 0xdd, 0x5d, 0x68, 0xa8, 0xcf, 0x71, 0x0f, 0x7c, 0x1c, 0x47, 0x63, 0xb5, 0x07, 0xc6, 0xdf, 0x6c, + 0x11, 0x2a, 0x69, 0x24, 0xf7, 0xaf, 0x95, 0x34, 0x72, 0x7f, 0x1f, 0x5a, 0xc6, 0x08, 0xb0, 0xf7, + 0xc5, 0x76, 0x1c, 0x6d, 0x2d, 0xb9, 0x79, 0x16, 0xa7, 0x28, 0x4d, 0x89, 0x3e, 0x1e, 0xb2, 0x6f, + 0xc0, 0xf2, 0x30, 0x88, 0x39, 0xc5, 0xf9, 0xf6, 0x63, 0x7e, 0xc6, 0xe3, 0x44, 0xb9, 0x1a, 0x3a, + 0x9a, 0xe0, 0x09, 0xdc, 0xed, 0xc3, 0x8a, 0xc5, 0x55, 0x5a, 0xe8, 0xe6, 0x28, 0x68, 0x50, 0x79, + 0x3b, 0xed, 0x80, 0x42, 0x49, 0xc3, 0xe5, 0x4a, 0x7a, 0x49, 0xfa, 0x93, 0x38, 0x3a, 0xa2, 0x4a, + 0x1c, 0xcf, 0xc2, 0xdc, 0x5f, 0x54, 0xa0, 0xba, 0x1b, 0x4d, 0xcc, 0xb3, 0x1f, 0xa7, 0x78, 0xf6, + 0x23, 0xed, 0xca, 0xbe, 0x36, 0x1b, 0xe5, 0xe2, 0x6f, 0x81, 0xec, 0x0e, 0x2c, 0x22, 0x07, 0xa7, + 0x11, 0xda, 0xd1, 0xaf, 0xfc, 0x58, 0x44, 0x18, 0x56, 0x89, 0x2d, 0x72, 0x14, 0xb6, 0x0a, 0x55, + 0x6d, 0x0e, 0x51, 0x06, 0x4c, 0xe2, 0x26, 0x8e, 0xce, 0xd7, 0xcf, 0xa5, 0x4b, 0x53, 0xa6, 0x50, + 0x21, 0xd8, 0xdf, 0x0b, 0x31, 0x11, 0x8b, 0x5a, 0x19, 0x09, 0x6d, 0x5c, 0x14, 0x84, 0x71, 0x66, + 0x32, 0xea, 0xb4, 0xe9, 0xac, 0x6f, 0xd8, 0xce, 0xfa, 0xeb, 0xd0, 0x4a, 0x47, 0x67, 0xfd, 0x89, + 0x7f, 0x3e, 0x8a, 0xfc, 0xa1, 0x64, 0x40, 0x13, 0x62, 0xf7, 0x01, 0xc6, 0x93, 0x49, 0x1f, 0xd7, + 0xd1, 0x78, 0x48, 0x3b, 0xf3, 0xd6, 0x46, 0x47, 0x8e, 0xfe, 0x93, 0x83, 0x03, 0x8f, 0x70, 0xcf, + 0xc8, 0xe3, 0xbe, 0x80, 0xa6, 0x26, 0x98, 0xa1, 0xa9, 0x14, 0x61, 0xd1, 0xb2, 0x43, 0x53, 0x29, + 0xa0, 0xe2, 0x26, 0x2c, 0x0a, 0xe5, 0xa9, 0xd5, 0x81, 0x38, 0x15, 0xcf, 0xa1, 0xee, 0x2f, 0x1d, + 0xa8, 0xd3, 0x84, 0xa3, 0x35, 0x21, 0x68, 0xfa, 0xac, 0x8a, 0x26, 0x71, 0xc1, 0xcb, 0xc3, 0xcc, + 0xb5, 0xc2, 0xe4, 0x2b, 0x7a, 0xf4, 0xcd, 0x50, 0xf9, 0xeb, 0xd0, 0xd4, 0x35, 0x19, 0x33, 0x98, + 0x81, 0xec, 0x1a, 0xd4, 0x4e, 0xa3, 0x89, 0xda, 0x70, 0x81, 0x3a, 0xce, 0x8e, 0x26, 0x1e, 0xe1, + 0x59, 0x7b, 0xb0, 0x3c, 0xd1, 0x05, 0x61, 0xd4, 0xe6, 0xe1, 0x92, 0xbe, 0xce, 0x95, 0xf6, 0xf5, + 0x39, 0x2c, 0xa1, 0x58, 0x1a, 0xbe, 0xfb, 0xd9, 0xaa, 0xf5, 0xeb, 0xb8, 0x52, 0x0f, 0x46, 0xd3, + 0x21, 0x37, 0xb7, 0xbd, 0xe4, 0x9b, 0x95, 0xb8, 0x32, 0xf8, 0xdc, 0x7f, 0xe5, 0x08, 0x71, 0xc7, + 0x72, 0xd9, 0x6d, 0xa8, 0xa1, 0x16, 0xcc, 0x79, 0x39, 0x74, 0xd4, 0x0b, 0xe6, 0xf3, 0x28, 0x07, + 0xce, 0x22, 0x79, 0x4f, 0xcd, 0xd2, 0x85, 0xef, 0x34, 0xdb, 0x33, 0xea, 0x9e, 0xe5, 0xb6, 0x5a, + 0x39, 0x94, 0xdd, 0x35, 0x8e, 0x9e, 0x6a, 0x96, 0x66, 0x55, 0x86, 0xc1, 0xf0, 0x84, 0x1b, 0x47, + 0x4e, 0x7f, 0xec, 0xc0, 0x82, 0xd5, 0x26, 0x64, 0x5a, 0x0a, 0x22, 0x17, 0x4e, 0x13, 0x39, 0xf3, + 0x26, 0x64, 0x32, 0x7c, 0xc5, 0x66, 0x78, 0x7d, 0x84, 0x51, 0x35, 0x8f, 0x30, 0xee, 0x43, 0x33, + 0xbb, 0x27, 0x61, 0x37, 0x0a, 0x6b, 0x54, 0xf1, 0x3f, 0x59, 0xa6, 0xcc, 0x49, 0x5e, 0x37, 0x9c, + 0xe4, 0xee, 0xa7, 0xd0, 0x32, 0xf2, 0x9b, 0x4e, 0x6e, 0xc7, 0x72, 0x72, 0xeb, 0xe0, 0xb8, 0x4a, + 0x16, 0x1c, 0xe7, 0xfe, 0xac, 0x02, 0x0b, 0xc8, 0xde, 0x41, 0x78, 0x72, 0x10, 0x8d, 0x82, 0xc1, + 0x39, 0xb1, 0x95, 0xe2, 0x64, 0xb9, 0x0a, 0x2a, 0x36, 0xb7, 0x61, 0x94, 0x7e, 0x1d, 0x11, 0x2c, + 0x54, 0x95, 0x4e, 0xa3, 0x2e, 0x43, 0x4d, 0x70, 0xe4, 0x27, 0xdc, 0xb8, 0x38, 0xe1, 0xd9, 0x20, + 0x6a, 0x1c, 0x04, 0x28, 0xd4, 0x71, 0x1c, 0x8c, 0x46, 0x81, 0xc8, 0x2b, 0xb6, 0x6f, 0x65, 0x24, + 0xac, 0x73, 0x18, 0x24, 0xfe, 0x51, 0x76, 0x3c, 0xa9, 0xd3, 0xe4, 0xfb, 0xf3, 0x5f, 0x1b, 0xbe, + 0x3f, 0x11, 0x1b, 0x6d, 0x83, 0xf9, 0x89, 0x9c, 0x2f, 0x4c, 0xa4, 0xfb, 0xef, 0x2a, 0xd0, 0x32, + 0xd8, 0x02, 0xc5, 0xb9, 0x74, 0xb9, 0x31, 0x50, 0x79, 0x6e, 0x1f, 0x5a, 0x0e, 0x01, 0x03, 0x61, + 0x37, 0xec, 0x5a, 0xe9, 0x1c, 0x80, 0x04, 0xde, 0x62, 0xa1, 0xab, 0xd0, 0x44, 0xd6, 0xff, 0x90, + 0xbc, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x14, 0x75, 0x83, 0xa8, 0xf5, 0x8c, 0x4a, 0xc0, 0x1b, 0x4f, + 0xf2, 0x3f, 0x86, 0xb6, 0x2c, 0x86, 0xe6, 0x98, 0x3a, 0x9d, 0x09, 0x9f, 0x35, 0xff, 0x9e, 0x95, + 0x53, 0x7d, 0xb9, 0xa1, 0xbe, 0x6c, 0x5c, 0xf4, 0xa5, 0xca, 0xe9, 0x3e, 0xd2, 0x41, 0x12, 0x8f, + 0x62, 0x7f, 0x72, 0xaa, 0x14, 0xca, 0x7d, 0x58, 0x51, 0x7a, 0x63, 0x1a, 0xfa, 0x61, 0x18, 0x4d, + 0xc3, 0x01, 0x57, 0x71, 0x74, 0x65, 0x24, 0x77, 0xa8, 0xa3, 0xae, 0xa9, 0x20, 0x76, 0x07, 0xea, + 0xc2, 0x8e, 0x12, 0xab, 0x72, 0xb9, 0x0a, 0x11, 0x59, 0xd8, 0x6d, 0xa8, 0x0b, 0x73, 0xaa, 0x32, + 0x53, 0xe8, 0x45, 0x06, 0xf7, 0x2e, 0x2c, 0x51, 0x98, 0xb7, 0xa1, 0xfb, 0xde, 0x29, 0x5b, 0xad, + 0xe7, 0x06, 0x22, 0x18, 0x7c, 0x15, 0xd8, 0xbe, 0x90, 0x2b, 0xf3, 0xa8, 0xf3, 0x97, 0x55, 0x68, + 0x19, 0x30, 0xea, 0x27, 0x3a, 0x9f, 0xea, 0x0f, 0x03, 0x7f, 0xcc, 0x53, 0x1e, 0x4b, 0x59, 0xca, + 0xa1, 0x98, 0xcf, 0x3f, 0x3b, 0xe9, 0x47, 0xd3, 0xb4, 0x3f, 0xe4, 0x27, 0x31, 0xe7, 0xd2, 0x8c, + 0xc8, 0xa1, 0x98, 0x0f, 0xb9, 0xd9, 0xc8, 0x27, 0x4e, 0x94, 0x72, 0xa8, 0x3a, 0xb8, 0x14, 0xe3, + 0x54, 0xcb, 0x0e, 0x2e, 0xc5, 0xa8, 0xe4, 0x35, 0x6b, 0xbd, 0x44, 0xb3, 0x7e, 0x04, 0x6b, 0x42, + 0x87, 0x4a, 0xed, 0xd1, 0xcf, 0x31, 0xd7, 0x0c, 0x2a, 0xbb, 0x03, 0x1d, 0x6c, 0xb3, 0x12, 0x8d, + 0x24, 0xf8, 0xa9, 0x90, 0x31, 0xc7, 0x2b, 0xe0, 0x98, 0x97, 0x3c, 0xe9, 0x66, 0x5e, 0x11, 0x3d, + 0x52, 0xc0, 0x29, 0xaf, 0xff, 0xda, 0xce, 0xdb, 0x94, 0x79, 0x73, 0x38, 0xfb, 0x18, 0xd6, 0xc7, + 0x7c, 0x18, 0xf8, 0x76, 0x11, 0xfd, 0x6c, 0x91, 0x9f, 0x45, 0xc6, 0x5a, 0x70, 0x14, 0x7e, 0x1a, + 0x8d, 0x8f, 0x02, 0xb1, 0xb0, 0x09, 0x9f, 0x7f, 0xcd, 0x2b, 0xe0, 0xee, 0x02, 0xb4, 0x0e, 0xd3, + 0x68, 0xa2, 0xa6, 0x7e, 0x11, 0xda, 0x22, 0x29, 0x23, 0x27, 0xdf, 0x81, 0x2b, 0xc4, 0xaf, 0xcf, + 0xa2, 0x49, 0x34, 0x8a, 0x4e, 0xce, 0xad, 0x9d, 0xfb, 0x7f, 0x74, 0x60, 0xc5, 0xa2, 0x66, 0x5b, + 0x77, 0x72, 0x33, 0xaa, 0x70, 0x37, 0xc1, 0xe2, 0xcb, 0xc6, 0xb2, 0x20, 0x32, 0x8a, 0x53, 0x9d, + 0xe7, 0x32, 0x02, 0x6e, 0x33, 0xbb, 0xc3, 0xa1, 0x3e, 0x14, 0xfc, 0xde, 0x2d, 0xf2, 0xbb, 0xfc, + 0x5e, 0xdd, 0xee, 0x50, 0x45, 0xfc, 0x8e, 0x8c, 0xf5, 0x19, 0xca, 0x4e, 0x57, 0xed, 0xf8, 0x0c, + 0xd3, 0xd3, 0xa3, 0x5a, 0x30, 0xd0, 0x60, 0xe2, 0xfe, 0xdc, 0x01, 0xc8, 0x5a, 0x47, 0x11, 0x22, + 0x7a, 0x69, 0x13, 0xf7, 0x92, 0x8d, 0x65, 0xec, 0x7d, 0x68, 0xeb, 0x43, 0xfe, 0x6c, 0xb5, 0x6c, + 0x29, 0x0c, 0xad, 0x8b, 0x5b, 0xb0, 0x74, 0x32, 0x8a, 0x8e, 0xc8, 0x8a, 0xa1, 0x50, 0xdc, 0x44, + 0xc6, 0x8f, 0x2e, 0x0a, 0xf8, 0xa1, 0x44, 0xb3, 0xa5, 0xb5, 0x66, 0x2e, 0xad, 0xe5, 0x0b, 0xe5, + 0xcf, 0x2a, 0xfa, 0xa4, 0x35, 0x1b, 0x89, 0x37, 0x4a, 0x39, 0xdb, 0x28, 0xa8, 0xf5, 0x19, 0x87, + 0x9b, 0xb4, 0xf5, 0x38, 0xb8, 0xd0, 0xf1, 0xfb, 0x29, 0x2c, 0xc6, 0x42, 0x67, 0x2a, 0x85, 0x5a, + 0x7b, 0x83, 0x42, 0x5d, 0x88, 0xad, 0x95, 0xf9, 0xeb, 0xd0, 0xf1, 0x87, 0x67, 0x3c, 0x4e, 0x03, + 0x72, 0x84, 0x91, 0x19, 0x25, 0x3a, 0xb8, 0x64, 0xe0, 0x64, 0xad, 0xdc, 0x82, 0x25, 0x19, 0xcd, + 0xab, 0x73, 0xca, 0x1b, 0x7a, 0x19, 0x8c, 0x19, 0xdd, 0x7f, 0xae, 0x0e, 0x76, 0xed, 0xd9, 0x7d, + 0xf3, 0xa8, 0x98, 0x3d, 0xac, 0xe4, 0x7a, 0xf8, 0x35, 0x79, 0xd0, 0x3a, 0x54, 0x1e, 0xb7, 0xaa, + 0x11, 0x35, 0x36, 0x94, 0x07, 0xe3, 0xf6, 0xb0, 0xd6, 0xde, 0x66, 0x58, 0xdd, 0xff, 0xe2, 0xc0, + 0xfc, 0x6e, 0x34, 0xd9, 0xc5, 0x21, 0x46, 0x1b, 0x07, 0xc5, 0x44, 0x87, 0xd2, 0xab, 0xe4, 0x05, + 0xd1, 0x75, 0xa5, 0x56, 0xc9, 0x42, 0xde, 0x2a, 0xf9, 0xcb, 0xf0, 0x0e, 0xf9, 0x7c, 0xe3, 0x68, + 0x12, 0xc5, 0x28, 0xae, 0xfe, 0x48, 0x98, 0x20, 0x51, 0x98, 0x9e, 0x2a, 0x75, 0xfa, 0xa6, 0x2c, + 0xe4, 0x88, 0xc1, 0x4d, 0xb0, 0xd8, 0x58, 0x49, 0x2b, 0x4a, 0x68, 0xd9, 0x22, 0xc1, 0xfd, 0x6d, + 0x68, 0xd2, 0x0e, 0x83, 0xba, 0xf6, 0x01, 0x34, 0x4f, 0xa3, 0x49, 0xff, 0x34, 0x08, 0x53, 0x25, + 0xfe, 0x8b, 0x99, 0xe9, 0xbf, 0x4b, 0x83, 0xa2, 0x33, 0xb8, 0x7f, 0x36, 0x07, 0xf3, 0x8f, 0xc3, + 0xb3, 0x28, 0x18, 0xd0, 0x61, 0xf2, 0x98, 0x8f, 0x23, 0x75, 0xb9, 0x00, 0x7f, 0xd3, 0x45, 0xdb, + 0xec, 0xfa, 0x9f, 0x10, 0x21, 0x03, 0xc1, 0xad, 0x60, 0x6c, 0x5e, 0xdf, 0x93, 0xa9, 0xec, 0x7a, + 0x46, 0xdd, 0xb8, 0x9e, 0x81, 0xa5, 0x89, 0x6b, 0x65, 0x34, 0x76, 0x22, 0x28, 0xd4, 0x40, 0x70, + 0xf0, 0x65, 0xd4, 0x9f, 0x08, 0x0b, 0x13, 0x21, 0x2a, 0x12, 0xa2, 0xed, 0x6d, 0xcc, 0x85, 0xd7, + 0x5e, 0x9b, 0x5e, 0xb8, 0xbd, 0x35, 0x41, 0x34, 0xcf, 0xc4, 0x07, 0x22, 0x8f, 0x58, 0x0e, 0x4c, + 0x08, 0x0d, 0xd4, 0xfc, 0xed, 0x53, 0x71, 0x83, 0x38, 0x0f, 0xa3, 0x36, 0x1f, 0x72, 0xad, 0x74, + 0x45, 0x3f, 0x41, 0x5c, 0x81, 0xcc, 0xe3, 0xc6, 0xa6, 0x58, 0x84, 0x3d, 0xab, 0x4d, 0x31, 0xb2, + 0x8c, 0x3f, 0x1a, 0x1d, 0xf9, 0x83, 0x97, 0x62, 0x33, 0xd9, 0x16, 0x87, 0x3d, 0x16, 0x48, 0xb1, + 0x7b, 0xd9, 0xbc, 0x52, 0x80, 0x4d, 0xcd, 0x33, 0x21, 0xb6, 0x01, 0x2d, 0x72, 0x18, 0xc8, 0x99, + 0x5d, 0xa4, 0x99, 0xed, 0x98, 0x1e, 0x05, 0x9a, 0x5b, 0x33, 0x93, 0x79, 0xcc, 0xbd, 0x54, 0x08, + 0x44, 0xf6, 0x87, 0x43, 0x19, 0x21, 0xd0, 0x11, 0x57, 0x00, 0x35, 0x40, 0x2e, 0x09, 0x31, 0x60, + 0x22, 0xc3, 0x32, 0x65, 0xb0, 0x30, 0x76, 0x4d, 0x38, 0xc2, 0x26, 0x7e, 0x30, 0xa4, 0x98, 0x1a, + 0xb1, 0xfd, 0xd4, 0x18, 0x96, 0xa1, 0x7e, 0xd3, 0xc2, 0xb9, 0x42, 0xa3, 0x62, 0x61, 0x38, 0x36, + 0x3a, 0x3d, 0xce, 0x22, 0x97, 0x6d, 0x90, 0x7d, 0x48, 0x67, 0xb4, 0x29, 0xa7, 0xf0, 0xe4, 0xc5, + 0x8d, 0x77, 0x64, 0x9f, 0x25, 0xdb, 0xaa, 0xbf, 0x87, 0x98, 0xc5, 0x13, 0x39, 0xd1, 0x6c, 0x13, + 0x6e, 0xf2, 0x35, 0xcb, 0x6c, 0x93, 0x59, 0xc9, 0x4d, 0x2e, 0x32, 0xb8, 0x9b, 0xd0, 0x36, 0x0b, + 0x60, 0x0d, 0xa8, 0x3d, 0x3d, 0xd8, 0xd9, 0xef, 0x5c, 0x62, 0x2d, 0x98, 0x3f, 0xdc, 0x79, 0xf6, + 0x6c, 0x6f, 0x67, 0xbb, 0xe3, 0xb0, 0x36, 0x34, 0x74, 0x48, 0x66, 0x05, 0x53, 0x9b, 0x5b, 0x5b, + 0x3b, 0x07, 0xcf, 0x76, 0xb6, 0x3b, 0xd5, 0xcf, 0x6a, 0x8d, 0x4a, 0xa7, 0xea, 0xfe, 0x51, 0x05, + 0x5a, 0x46, 0xf9, 0x17, 0xb8, 0x6a, 0xae, 0x01, 0xd0, 0x8e, 0x22, 0x0b, 0xd1, 0xa8, 0x79, 0x06, + 0x82, 0x1a, 0x52, 0xef, 0xb5, 0xab, 0xe2, 0x3e, 0xa4, 0x4a, 0xd3, 0xa8, 0xd1, 0xc5, 0x43, 0xf3, + 0x4c, 0xa2, 0xee, 0xd9, 0x20, 0x72, 0x94, 0x04, 0x28, 0x4e, 0x50, 0xc8, 0xa1, 0x09, 0xe1, 0x0c, + 0xc5, 0x3c, 0x89, 0x46, 0x67, 0x5c, 0x64, 0x11, 0x76, 0x99, 0x85, 0x61, 0x5d, 0x52, 0xd5, 0x18, + 0x31, 0xbc, 0x75, 0xcf, 0x06, 0xd9, 0x37, 0xd5, 0x0c, 0x35, 0x68, 0x86, 0xd6, 0x8b, 0xc3, 0x6d, + 0xce, 0x8e, 0x9b, 0x02, 0xdb, 0x1c, 0x0e, 0x25, 0xd5, 0xbc, 0x5d, 0x19, 0x9b, 0xd7, 0x79, 0x95, + 0x2a, 0x29, 0x11, 0xd7, 0x4a, 0xb9, 0xb8, 0xbe, 0x91, 0xa9, 0xdd, 0xc7, 0xd0, 0x3a, 0x30, 0x2e, + 0x08, 0xbb, 0xa8, 0xd9, 0xd4, 0xd5, 0x60, 0xa1, 0xf3, 0x84, 0x8f, 0x25, 0x43, 0x8d, 0x26, 0x55, + 0xcc, 0x26, 0xb9, 0xff, 0xcc, 0x11, 0x77, 0xae, 0x74, 0x17, 0x44, 0xfd, 0x2e, 0xb4, 0xb5, 0xd7, + 0x39, 0x0b, 0x53, 0xb7, 0x30, 0xcc, 0x43, 0xcd, 0xe9, 0x47, 0xc7, 0xc7, 0x09, 0x57, 0x01, 0xa5, + 0x16, 0xa6, 0x8c, 0x48, 0x34, 0x4b, 0x03, 0x51, 0x43, 0x22, 0x03, 0x4b, 0x0b, 0x38, 0x32, 0x8a, + 0xf4, 0x4e, 0xaa, 0x50, 0x5a, 0x9d, 0xd6, 0xd1, 0xf4, 0xf9, 0x91, 0xbe, 0x03, 0x0d, 0x5d, 0xae, + 0xbd, 0x42, 0xa8, 0x9c, 0x9a, 0x8e, 0x2b, 0x11, 0x6d, 0x30, 0xad, 0x46, 0x0b, 0x7e, 0x2d, 0x12, + 0xd8, 0x5d, 0x60, 0xc7, 0x41, 0x9c, 0xcf, 0x2e, 0x18, 0xb8, 0x84, 0xe2, 0xbe, 0x80, 0x15, 0x25, + 0x7d, 0x86, 0x75, 0x6b, 0x4f, 0xa4, 0x73, 0x91, 0x76, 0xaa, 0x14, 0xb5, 0x93, 0xfb, 0x8b, 0x2a, + 0xcc, 0xcb, 0xd9, 0x2e, 0x5c, 0x34, 0x17, 0xeb, 0x9b, 0x85, 0xb1, 0xae, 0x75, 0x9d, 0x90, 0x18, + 0x41, 0xae, 0x59, 0x85, 0x55, 0xa7, 0x5a, 0xb6, 0xea, 0x30, 0xa8, 0x4d, 0xfc, 0xf4, 0x94, 0xdc, + 0x30, 0x4d, 0x8f, 0x7e, 0x2b, 0xe7, 0x69, 0xdd, 0x76, 0x9e, 0x96, 0x5d, 0xab, 0x17, 0xa6, 0x55, + 0xf1, 0x5a, 0xfd, 0x55, 0x68, 0x8a, 0xd5, 0x31, 0xf3, 0x8f, 0x66, 0x40, 0x6e, 0x35, 0x6d, 0x14, + 0x56, 0xd3, 0xb7, 0x5f, 0xe7, 0xbe, 0x0d, 0x73, 0xe2, 0x6a, 0x89, 0x0c, 0x18, 0xbe, 0xaa, 0x8e, + 0x15, 0x45, 0x3e, 0xf5, 0x57, 0x44, 0x1d, 0x79, 0x32, 0xaf, 0x79, 0x39, 0xb5, 0x65, 0x5f, 0x4e, + 0x35, 0xdd, 0xba, 0x6d, 0xdb, 0xad, 0xeb, 0x3e, 0x84, 0x05, 0xab, 0x38, 0xd4, 0xb3, 0x32, 0xe0, + 0xb8, 0x73, 0x89, 0x2d, 0x40, 0xf3, 0xf1, 0x7e, 0xff, 0xe1, 0xde, 0xe3, 0x47, 0xbb, 0xcf, 0x3a, + 0x0e, 0x26, 0x0f, 0x9f, 0x6f, 0x6d, 0xed, 0xec, 0x6c, 0x93, 0xde, 0x05, 0x98, 0x7b, 0xb8, 0xf9, + 0x18, 0x75, 0x70, 0xd5, 0xdd, 0x16, 0xbc, 0x2d, 0xcb, 0xd2, 0x47, 0x39, 0xdf, 0x04, 0xa6, 0x7c, + 0x00, 0x14, 0x74, 0x34, 0x19, 0xf1, 0x54, 0xc5, 0xc2, 0x2f, 0x4b, 0xca, 0x63, 0x4d, 0x50, 0xd7, + 0x39, 0xb2, 0x52, 0x32, 0x11, 0x91, 0x83, 0x94, 0x17, 0x11, 0x99, 0xd5, 0xd3, 0x74, 0xb7, 0x07, + 0xdd, 0x6d, 0x8e, 0xa5, 0x6d, 0x8e, 0x46, 0xb9, 0xe6, 0xe0, 0x26, 0xae, 0x84, 0x26, 0x77, 0x78, + 0xdf, 0x85, 0xcb, 0x9b, 0x22, 0xec, 0xfd, 0x37, 0x15, 0x15, 0xe9, 0x76, 0x61, 0x2d, 0x5f, 0xa4, + 0xac, 0xec, 0x21, 0x2c, 0x6f, 0xf3, 0xa3, 0xe9, 0xc9, 0x1e, 0x3f, 0xcb, 0x2a, 0x62, 0x50, 0x4b, + 0x4e, 0xa3, 0x57, 0x72, 0x7c, 0xe8, 0x37, 0x7b, 0x17, 0x60, 0x84, 0x79, 0xfa, 0xc9, 0x84, 0x0f, + 0xd4, 0x95, 0x46, 0x42, 0x0e, 0x27, 0x7c, 0xe0, 0x7e, 0x04, 0xcc, 0x2c, 0x47, 0x8e, 0x17, 0x5a, + 0x5d, 0xd3, 0xa3, 0x7e, 0x72, 0x9e, 0xa4, 0x7c, 0xac, 0xee, 0x6a, 0x9a, 0x90, 0x7b, 0x0b, 0xda, + 0x07, 0xfe, 0xb9, 0xc7, 0x7f, 0x22, 0x1f, 0x5b, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x8e, 0x2c, 0xa8, + 0x1d, 0xc3, 0x44, 0x76, 0xff, 0x4f, 0x05, 0xe6, 0x44, 0x4e, 0x2c, 0x75, 0xc8, 0x93, 0x34, 0x08, + 0x49, 0xd2, 0x54, 0xa9, 0x06, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0x4b, 0x6f, 0x85, 0xba, 0x1a, + 0x26, 0x05, 0xd8, 0xc2, 0x50, 0xd2, 0xb2, 0xf0, 0x66, 0xe1, 0x3e, 0xcc, 0x80, 0xdc, 0x81, 0x47, + 0x66, 0xdb, 0x89, 0xf6, 0x29, 0xb5, 0x25, 0xc5, 0xd8, 0x84, 0x4a, 0x2d, 0xc8, 0x79, 0x21, 0xed, + 0x05, 0x0b, 0xb2, 0x60, 0x29, 0x36, 0xde, 0xc2, 0x52, 0x14, 0x2e, 0x8c, 0x37, 0x59, 0x8a, 0xf0, + 0x16, 0x96, 0xa2, 0xcb, 0xa0, 0x43, 0xf7, 0xce, 0x71, 0x37, 0xa2, 0x78, 0xf7, 0x1f, 0x39, 0xd0, + 0x91, 0x5c, 0xa4, 0x69, 0xea, 0xe8, 0xec, 0x4d, 0x17, 0x94, 0x6e, 0xc0, 0x02, 0xed, 0x85, 0xb4, + 0x0a, 0x90, 0xc7, 0x50, 0x16, 0x88, 0xfd, 0x50, 0x81, 0x31, 0xe3, 0x60, 0x24, 0x27, 0xc5, 0x84, + 0x94, 0x16, 0x89, 0x7d, 0x19, 0xa6, 0xeb, 0x78, 0x3a, 0xed, 0xfe, 0xa9, 0x03, 0xcb, 0x46, 0x83, + 0x25, 0x17, 0x7e, 0x0a, 0x6d, 0xfd, 0xbc, 0x03, 0xd7, 0x8b, 0xdb, 0xba, 0x2d, 0x36, 0xd9, 0x67, + 0x56, 0x66, 0x9a, 0x4c, 0xff, 0x9c, 0x1a, 0x98, 0x4c, 0xc7, 0x72, 0x55, 0x31, 0x21, 0x64, 0xa4, + 0x57, 0x9c, 0xbf, 0xd4, 0x59, 0xc4, 0xba, 0x66, 0x61, 0xe4, 0x43, 0xc6, 0x3d, 0x9c, 0xce, 0x54, + 0x93, 0x3e, 0x64, 0x13, 0x74, 0xff, 0x7a, 0x05, 0x56, 0xc4, 0xa6, 0x5c, 0x3a, 0x43, 0xf4, 0x0d, + 0xdb, 0x39, 0xe1, 0x9f, 0x10, 0x12, 0xb9, 0x7b, 0xc9, 0x93, 0x69, 0xf6, 0x9d, 0xb7, 0x74, 0x24, + 0xe8, 0xd8, 0xe1, 0x19, 0x73, 0x51, 0x2d, 0x9b, 0x8b, 0x37, 0x8c, 0x74, 0x99, 0x3b, 0xbf, 0x5e, + 0xee, 0xce, 0x7f, 0x2b, 0xf7, 0xf9, 0x83, 0x79, 0xa8, 0x27, 0x83, 0x68, 0xc2, 0xdd, 0x35, 0x58, + 0xb5, 0x87, 0x40, 0x2a, 0xaa, 0x9f, 0x3b, 0xd0, 0x7d, 0x28, 0x0e, 0x09, 0x83, 0xf0, 0x64, 0x37, + 0x48, 0xd2, 0x28, 0xd6, 0xcf, 0x15, 0x5c, 0x03, 0x48, 0x52, 0x3f, 0x96, 0x46, 0xad, 0x30, 0x0d, + 0x0c, 0x04, 0x7b, 0xc2, 0xc3, 0xa1, 0xa0, 0x8a, 0x19, 0xd4, 0xe9, 0x82, 0xe9, 0x25, 0x1d, 0x0b, + 0x96, 0x01, 0x73, 0x53, 0x44, 0xdc, 0x63, 0x93, 0xf9, 0x19, 0x69, 0x7f, 0xb1, 0x5b, 0xcf, 0xa1, + 0xee, 0x1f, 0x54, 0x60, 0x29, 0x6b, 0x24, 0x45, 0x85, 0xd8, 0x3a, 0x44, 0x5a, 0x2d, 0x99, 0x0e, + 0x91, 0x87, 0x00, 0xfd, 0x00, 0xcd, 0x18, 0xc3, 0xb7, 0x60, 0xa0, 0xec, 0x06, 0xb4, 0x54, 0x2a, + 0x9a, 0xa6, 0xc6, 0xbd, 0x61, 0x13, 0x16, 0x31, 0xb4, 0x68, 0x48, 0x49, 0xa3, 0x50, 0xa6, 0xe8, + 0x0e, 0xd3, 0x38, 0xa5, 0x2f, 0xc5, 0xc8, 0xab, 0x24, 0xeb, 0x08, 0x4b, 0x44, 0x3c, 0xe1, 0x42, + 0x56, 0x88, 0xb9, 0x42, 0x37, 0xf4, 0x7b, 0x2b, 0x5a, 0x32, 0x45, 0x89, 0x59, 0x00, 0x74, 0xcd, + 0x33, 0x21, 0xb5, 0xb7, 0x8b, 0xa6, 0xc6, 0xc9, 0x67, 0xcd, 0xb3, 0x30, 0xf7, 0xef, 0x3a, 0x70, + 0xa5, 0x64, 0x1a, 0xa5, 0xa4, 0x6e, 0xc3, 0xf2, 0xb1, 0x26, 0xaa, 0xa1, 0x16, 0xe2, 0xba, 0xa6, + 0x22, 0x21, 0xec, 0xe1, 0xf5, 0x8a, 0x1f, 0x68, 0xe3, 0x54, 0x4c, 0x9e, 0x15, 0xef, 0x5e, 0x24, + 0xb8, 0x07, 0xd0, 0xdb, 0x79, 0x8d, 0x82, 0xbf, 0x65, 0xbe, 0x72, 0xa7, 0x38, 0x6b, 0xa3, 0xa0, + 0xd8, 0x2e, 0x76, 0x29, 0x1d, 0xc3, 0x82, 0x55, 0x16, 0xfb, 0xd6, 0xdb, 0x16, 0x62, 0xca, 0xe8, + 0x75, 0x39, 0xeb, 0xe2, 0x99, 0x3e, 0x15, 0x75, 0x6f, 0x40, 0xee, 0x19, 0x2c, 0x3d, 0x99, 0x8e, + 0xd2, 0x20, 0x7b, 0xb2, 0x8f, 0x7d, 0x47, 0x7e, 0x44, 0x45, 0xa8, 0xa1, 0x2b, 0xad, 0xca, 0xcc, + 0x87, 0x23, 0x36, 0xc6, 0x92, 0xfa, 0xc5, 0x1a, 0x8b, 0x04, 0xf7, 0x0a, 0xac, 0x67, 0x55, 0x8a, + 0xb1, 0x53, 0x8b, 0xc3, 0x1f, 0x3a, 0x22, 0x74, 0xcc, 0x7e, 0x41, 0x90, 0x3d, 0x82, 0x95, 0x24, + 0x08, 0x4f, 0x46, 0xdc, 0x2c, 0x27, 0x91, 0x23, 0x71, 0xd9, 0x6e, 0x9e, 0x7c, 0x65, 0xd0, 0x2b, + 0xfb, 0x02, 0x19, 0xa4, 0xbc, 0xa1, 0x19, 0x83, 0xe4, 0x86, 0xa4, 0xac, 0x03, 0x9f, 0xc1, 0xa2, + 0x5d, 0x19, 0xfb, 0x58, 0x06, 0xcb, 0x67, 0x2d, 0x33, 0xcf, 0x80, 0x6c, 0xce, 0xb0, 0x72, 0xba, + 0x3f, 0x73, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x54, 0x2a, 0xb9, 0xe7, 0xd3, 0x42, 0xb1, 0xb3, + 0x3b, 0xac, 0x83, 0xf0, 0x55, 0x5f, 0xef, 0xce, 0x9c, 0x94, 0xdd, 0x4b, 0x25, 0xbd, 0x7a, 0xd0, + 0x80, 0x39, 0xd9, 0xbf, 0x75, 0xb8, 0x2c, 0x9b, 0xa4, 0x9a, 0x93, 0x1d, 0x1e, 0x58, 0x95, 0x5a, + 0x87, 0x07, 0x3d, 0xe8, 0x8a, 0x57, 0x29, 0xcc, 0x7e, 0xc8, 0x0f, 0xb7, 0x81, 0x3d, 0xf1, 0x07, + 0x7e, 0x1c, 0x45, 0xe1, 0x01, 0x8f, 0x65, 0xac, 0x0f, 0x19, 0x40, 0xe4, 0x5b, 0x57, 0xb6, 0x9a, + 0x48, 0xa9, 0x87, 0x14, 0xa2, 0x50, 0x3d, 0x58, 0x21, 0x52, 0xae, 0x07, 0x2b, 0x0f, 0xfc, 0x97, + 0x5c, 0x95, 0x94, 0x8d, 0x52, 0x6b, 0xa2, 0x0b, 0x55, 0x63, 0xaf, 0xee, 0xc1, 0x14, 0xab, 0xf5, + 0xcc, 0xdc, 0xee, 0x06, 0xac, 0xda, 0x65, 0x4a, 0x55, 0xd2, 0x83, 0xc6, 0x58, 0x62, 0xb2, 0x75, + 0x3a, 0x7d, 0xe7, 0x4b, 0x68, 0x19, 0x2f, 0x8d, 0xb0, 0x75, 0x58, 0x79, 0xf1, 0xf8, 0xd9, 0xfe, + 0xce, 0xe1, 0x61, 0xff, 0xe0, 0xf9, 0x83, 0xcf, 0x77, 0xbe, 0xdf, 0xdf, 0xdd, 0x3c, 0xdc, 0xed, + 0x5c, 0x62, 0x6b, 0xc0, 0xf6, 0x77, 0x0e, 0x9f, 0xed, 0x6c, 0x5b, 0xb8, 0xc3, 0xae, 0x41, 0xef, + 0xf9, 0xfe, 0xf3, 0xc3, 0x9d, 0xed, 0x7e, 0xd9, 0x77, 0x15, 0xf6, 0x2e, 0x5c, 0x91, 0xf4, 0x92, + 0xcf, 0xab, 0x77, 0x3e, 0x85, 0x4e, 0xde, 0x07, 0x62, 0xf9, 0x8e, 0xde, 0xe4, 0x64, 0xda, 0xf8, + 0x59, 0x15, 0x16, 0x45, 0x30, 0x9f, 0x78, 0x83, 0x93, 0xc7, 0xec, 0x09, 0xcc, 0xcb, 0xc7, 0x5c, + 0x99, 0x62, 0x2d, 0xfb, 0xf9, 0xd8, 0xde, 0x5a, 0x1e, 0x96, 0xd3, 0xba, 0xf2, 0x37, 0xfe, 0xf3, + 0xff, 0xfc, 0xfb, 0x95, 0x05, 0xd6, 0xba, 0x77, 0xf6, 0xe1, 0xbd, 0x13, 0x1e, 0x26, 0x58, 0xc6, + 0xef, 0x01, 0x64, 0x4f, 0x94, 0xb2, 0xae, 0xf6, 0x01, 0xe4, 0xde, 0x6f, 0xed, 0x5d, 0x29, 0xa1, + 0xc8, 0x72, 0xaf, 0x50, 0xb9, 0x2b, 0xee, 0x22, 0x96, 0x1b, 0x84, 0x41, 0x2a, 0x9e, 0x2b, 0xfd, + 0xc4, 0xb9, 0xc3, 0x86, 0xd0, 0x36, 0x1f, 0x0f, 0x65, 0xea, 0x2c, 0xa8, 0xe4, 0xf9, 0xd3, 0xde, + 0x3b, 0xa5, 0x34, 0xc5, 0xcb, 0x54, 0xc7, 0x65, 0xb7, 0x83, 0x75, 0x4c, 0x29, 0x47, 0x56, 0xcb, + 0x48, 0x48, 0x78, 0xf6, 0x46, 0x28, 0xbb, 0x6a, 0x08, 0x5d, 0xe1, 0x85, 0xd2, 0xde, 0xbb, 0x33, + 0xa8, 0xb2, 0xae, 0x77, 0xa9, 0xae, 0x75, 0x97, 0x61, 0x5d, 0x03, 0xca, 0xa3, 0x5e, 0x28, 0xfd, + 0xc4, 0xb9, 0xb3, 0xf1, 0x1f, 0x6e, 0x41, 0x53, 0x9f, 0x13, 0xb3, 0x1f, 0xc3, 0x82, 0x15, 0x6d, + 0xc9, 0x54, 0x37, 0xca, 0x82, 0x33, 0x7b, 0x57, 0xcb, 0x89, 0xb2, 0xe2, 0x6b, 0x54, 0x71, 0x97, + 0xad, 0x61, 0xc5, 0x32, 0x5c, 0xf1, 0x1e, 0xc5, 0x0d, 0x8b, 0xab, 0x87, 0x2f, 0x0d, 0x4d, 0x26, + 0x2a, 0xbb, 0x9a, 0x57, 0x2e, 0x56, 0x6d, 0xef, 0xce, 0xa0, 0xca, 0xea, 0xae, 0x52, 0x75, 0x6b, + 0x6c, 0xd5, 0xac, 0x4e, 0x9f, 0xdd, 0x72, 0xba, 0x6f, 0x6b, 0x3e, 0x9f, 0xc9, 0xde, 0xd5, 0x8c, + 0x55, 0xf6, 0xac, 0xa6, 0x66, 0x91, 0xe2, 0xdb, 0x9a, 0x6e, 0x97, 0xaa, 0x62, 0x8c, 0xa6, 0xcf, + 0x7c, 0x3d, 0x93, 0x1d, 0x41, 0xcb, 0x78, 0xf4, 0x8a, 0x5d, 0x99, 0xf9, 0x40, 0x57, 0xaf, 0x57, + 0x46, 0x2a, 0xeb, 0x8a, 0x59, 0xfe, 0x3d, 0x34, 0x74, 0x7e, 0x08, 0x4d, 0xfd, 0x8c, 0x12, 0x5b, + 0x37, 0x9e, 0xb5, 0x32, 0x9f, 0x7d, 0xea, 0x75, 0x8b, 0x84, 0x32, 0xe6, 0x33, 0x4b, 0x47, 0xe6, + 0x7b, 0x01, 0x2d, 0xe3, 0xa9, 0x24, 0xdd, 0x81, 0xe2, 0x73, 0x4c, 0xba, 0x03, 0x25, 0x2f, 0x2b, + 0xb9, 0xcb, 0x54, 0x45, 0x8b, 0x35, 0x89, 0xbf, 0xd3, 0xd7, 0x51, 0xc2, 0xf6, 0xe0, 0xb2, 0xd4, + 0xd8, 0x47, 0xfc, 0xab, 0x4c, 0x43, 0xc9, 0x8b, 0xa5, 0xf7, 0x1d, 0xf6, 0x29, 0x34, 0xd4, 0x8b, + 0x58, 0x6c, 0xad, 0xfc, 0x65, 0xaf, 0xde, 0x7a, 0x01, 0x97, 0xea, 0xf5, 0xfb, 0x00, 0xd9, 0xbb, + 0x4c, 0x5a, 0x49, 0x14, 0xde, 0x79, 0xd2, 0x1c, 0x50, 0x7c, 0xc4, 0xc9, 0x5d, 0xa3, 0x0e, 0x76, + 0x18, 0x29, 0x89, 0x90, 0xbf, 0x52, 0x57, 0xeb, 0x7f, 0x04, 0x2d, 0xe3, 0x69, 0x26, 0x3d, 0x7c, + 0xc5, 0x67, 0x9d, 0xf4, 0xf0, 0x95, 0xbc, 0xe4, 0xe4, 0xf6, 0xa8, 0xf4, 0x55, 0x77, 0x09, 0x4b, + 0x4f, 0x82, 0x93, 0x70, 0x2c, 0x32, 0xe0, 0x04, 0x9d, 0xc2, 0x82, 0xf5, 0xfe, 0x92, 0x96, 0xd0, + 0xb2, 0xd7, 0x9d, 0xb4, 0x84, 0x96, 0x3e, 0xd9, 0xa4, 0xf8, 0xcc, 0x5d, 0xc6, 0x7a, 0xce, 0x28, + 0x8b, 0x51, 0xd3, 0x0f, 0xa0, 0x65, 0xbc, 0xa5, 0xa4, 0xfb, 0x52, 0x7c, 0xb6, 0x49, 0xf7, 0xa5, + 0xec, 0xe9, 0xa5, 0x55, 0xaa, 0x63, 0xd1, 0x25, 0x56, 0xa0, 0x4b, 0xe2, 0x58, 0xf6, 0x8f, 0x61, + 0xd1, 0x7e, 0x5d, 0x49, 0xcb, 0x7e, 0xe9, 0x3b, 0x4d, 0x5a, 0xf6, 0x67, 0x3c, 0xc9, 0x24, 0x59, + 0xfa, 0xce, 0x8a, 0xae, 0xe4, 0xde, 0x17, 0x32, 0xd2, 0xec, 0x4b, 0xf6, 0x5d, 0x54, 0x70, 0xf2, + 0xd6, 0x3e, 0x5b, 0x37, 0xb8, 0xd6, 0xbc, 0xdb, 0xaf, 0xe5, 0xa5, 0x70, 0xc1, 0xdf, 0x66, 0x66, + 0x71, 0xcd, 0x9d, 0x56, 0x2d, 0xba, 0xbd, 0x6f, 0xac, 0x5a, 0xe6, 0x05, 0x7f, 0x63, 0xd5, 0xb2, + 0x2e, 0xf9, 0xe7, 0x57, 0xad, 0x34, 0xc0, 0x32, 0x42, 0x58, 0xca, 0xdd, 0x08, 0xd1, 0x52, 0x51, + 0x7e, 0x69, 0xaf, 0x77, 0xed, 0xcd, 0x17, 0x49, 0x6c, 0x0d, 0xa2, 0x94, 0xe0, 0x3d, 0x75, 0x45, + 0xf2, 0xf7, 0xa1, 0x6d, 0xbe, 0xf8, 0xc2, 0x4c, 0x51, 0xce, 0xd7, 0xf4, 0x4e, 0x29, 0xcd, 0x9e, + 0x5c, 0xd6, 0x36, 0xab, 0x61, 0xdf, 0x83, 0x35, 0x2d, 0xea, 0xe6, 0x25, 0x83, 0x84, 0xbd, 0x57, + 0x72, 0xf5, 0xc0, 0xb4, 0xe3, 0x7a, 0x57, 0x66, 0xde, 0x4d, 0xb8, 0xef, 0x20, 0xd3, 0xd8, 0xcf, + 0x68, 0x64, 0x0b, 0x46, 0xd9, 0xeb, 0x21, 0xd9, 0x82, 0x51, 0xfa, 0xf6, 0x86, 0x62, 0x1a, 0xb6, + 0x62, 0x8d, 0x91, 0x38, 0x94, 0x67, 0x3f, 0x80, 0x25, 0xe3, 0x1a, 0xd7, 0xe1, 0x79, 0x38, 0xd0, + 0x02, 0x50, 0xbc, 0x65, 0xdc, 0x2b, 0xdb, 0xa5, 0xb8, 0xeb, 0x54, 0xfe, 0xb2, 0x6b, 0x0d, 0x0e, + 0x32, 0xff, 0x16, 0xb4, 0xcc, 0x2b, 0x62, 0x6f, 0x28, 0x77, 0xdd, 0x20, 0x99, 0x17, 0x64, 0xef, + 0x3b, 0xec, 0x40, 0x04, 0x67, 0xe9, 0x27, 0x3d, 0xa3, 0x38, 0xbf, 0x7c, 0xda, 0x4f, 0x7d, 0xea, + 0x89, 0x2c, 0x7b, 0xe4, 0xf5, 0xb6, 0x73, 0xdf, 0x61, 0xff, 0xd8, 0x81, 0xb6, 0x75, 0x85, 0xcb, + 0x0a, 0x75, 0xc9, 0xb5, 0xac, 0x6b, 0xd2, 0xcc, 0xa6, 0xb9, 0x1e, 0x75, 0x7b, 0xef, 0xce, 0x67, + 0xd6, 0xb0, 0x7e, 0x61, 0x39, 0xd4, 0xee, 0xe6, 0xdf, 0xf5, 0xfc, 0x32, 0x9f, 0xc1, 0xbc, 0xdb, + 0xfd, 0xe5, 0x7d, 0x87, 0xfd, 0xb1, 0x03, 0x8b, 0xb6, 0x1b, 0x58, 0x77, 0xb7, 0xd4, 0xe1, 0xac, + 0x27, 0x7f, 0x86, 0xef, 0xf8, 0x07, 0xd4, 0xca, 0x67, 0x77, 0x3c, 0xab, 0x95, 0xf2, 0xc9, 0x96, + 0x5f, 0xaf, 0xb5, 0xec, 0x13, 0xf1, 0xae, 0xb5, 0x3a, 0xac, 0x61, 0xc5, 0x27, 0x91, 0x35, 0xc3, + 0x98, 0x8f, 0x18, 0xd3, 0x24, 0xfc, 0x48, 0xbc, 0x67, 0xa9, 0xce, 0x13, 0x90, 0xef, 0xde, 0xf6, + 0x7b, 0xf7, 0x06, 0xf5, 0xe9, 0x9a, 0x7b, 0xc5, 0xea, 0x53, 0x7e, 0x85, 0xdf, 0x14, 0xad, 0x93, + 0xef, 0x0f, 0x67, 0x4b, 0x54, 0xe1, 0x4d, 0xe2, 0xd9, 0x8d, 0x1c, 0x8b, 0x46, 0xca, 0xec, 0x96, + 0x70, 0xbc, 0x65, 0x31, 0xee, 0x1d, 0x6a, 0xeb, 0x0d, 0xf7, 0xbd, 0x99, 0x6d, 0xbd, 0x47, 0xce, + 0x5c, 0x6c, 0xf1, 0x01, 0x40, 0x76, 0xb8, 0xca, 0x72, 0x07, 0x7b, 0x5a, 0x65, 0x14, 0xcf, 0x5f, + 0x6d, 0x09, 0x54, 0xe7, 0x7f, 0x58, 0xe2, 0x0f, 0x85, 0x02, 0x7c, 0xac, 0x8e, 0x04, 0x4d, 0x33, + 0xc7, 0x3e, 0x01, 0xb5, 0xcc, 0x9c, 0x7c, 0xf9, 0x96, 0xfa, 0xd3, 0xe7, 0x8b, 0xcf, 0x61, 0x61, + 0x2f, 0x8a, 0x5e, 0x4e, 0x27, 0x3a, 0x0a, 0xc5, 0x3e, 0x67, 0xd9, 0xf5, 0x93, 0xd3, 0x5e, 0xae, + 0x17, 0xee, 0x75, 0x2a, 0xaa, 0xc7, 0xba, 0x46, 0x51, 0xf7, 0xbe, 0xc8, 0x0e, 0x6e, 0xbf, 0x64, + 0x3e, 0x2c, 0x6b, 0xad, 0xaa, 0x1b, 0xde, 0xb3, 0x8b, 0xb1, 0x74, 0x69, 0xbe, 0x0a, 0xcb, 0x1e, + 0x57, 0xad, 0xbd, 0x97, 0xa8, 0x32, 0x49, 0xa7, 0xb4, 0xb7, 0xf9, 0x80, 0x6e, 0xa1, 0xd0, 0x61, + 0xc5, 0x4a, 0xd6, 0x70, 0x7d, 0xca, 0xd1, 0x5b, 0xb0, 0x40, 0x7b, 0xa5, 0x99, 0xf8, 0xe7, 0x31, + 0xff, 0xc9, 0xbd, 0x2f, 0xe4, 0x31, 0xc8, 0x97, 0x6a, 0xa5, 0x51, 0xe7, 0x44, 0xd6, 0x4a, 0x93, + 0x3b, 0x58, 0xb2, 0x56, 0x9a, 0xc2, 0xc1, 0x92, 0x35, 0xd4, 0xea, 0x9c, 0x8a, 0x8d, 0x60, 0xb9, + 0x70, 0x16, 0xa5, 0x17, 0x99, 0x59, 0x27, 0x58, 0xbd, 0xeb, 0xb3, 0x33, 0xd8, 0xb5, 0xdd, 0xb1, + 0x6b, 0x3b, 0x84, 0x85, 0x6d, 0x2e, 0x06, 0x4b, 0x84, 0xdd, 0xe6, 0xee, 0x01, 0x9a, 0x41, 0xbd, + 0xf9, 0x25, 0x81, 0x68, 0xb6, 0x29, 0x41, 0xf1, 0xae, 0xec, 0x87, 0xd0, 0x7a, 0xc4, 0x53, 0x15, + 0x67, 0xab, 0x8d, 0xd9, 0x5c, 0xe0, 0x6d, 0xaf, 0x24, 0x4c, 0xd7, 0xe6, 0x19, 0x2a, 0xed, 0x1e, + 0x1f, 0x9e, 0x70, 0xa1, 0x9c, 0xfa, 0xc1, 0xf0, 0x4b, 0xf6, 0x57, 0xa8, 0x70, 0x7d, 0xd1, 0x60, + 0xcd, 0x08, 0x9a, 0x34, 0x0b, 0x5f, 0xca, 0xe1, 0x65, 0x25, 0x87, 0xd1, 0x90, 0x1b, 0x46, 0x55, + 0x08, 0x2d, 0xe3, 0x7e, 0x90, 0x16, 0xa0, 0xe2, 0x4d, 0x34, 0x2d, 0x40, 0x25, 0xd7, 0x89, 0xdc, + 0xdb, 0x54, 0x8f, 0xcb, 0xae, 0x67, 0xf5, 0x88, 0x2b, 0x44, 0x59, 0x4d, 0xf7, 0xbe, 0xf0, 0xc7, + 0xe9, 0x97, 0xec, 0x05, 0x3d, 0xa1, 0x64, 0xc6, 0x11, 0x67, 0xd6, 0x79, 0x3e, 0xe4, 0x58, 0x0f, + 0x96, 0x41, 0xb2, 0x2d, 0x76, 0x51, 0x15, 0xd9, 0x5e, 0xdf, 0x01, 0x38, 0x4c, 0xa3, 0xc9, 0xb6, + 0xcf, 0xc7, 0x51, 0x98, 0xe9, 0xda, 0x2c, 0x8a, 0x35, 0xd3, 0x5f, 0x46, 0x28, 0x2b, 0x7b, 0x61, + 0x6c, 0x67, 0xac, 0x50, 0x6c, 0xc5, 0x5c, 0x33, 0x03, 0x5d, 0xf5, 0x80, 0x94, 0x04, 0xbb, 0xde, + 0x77, 0xd8, 0x26, 0x40, 0x76, 0x18, 0xa9, 0x37, 0x27, 0x85, 0x73, 0x4e, 0xad, 0xf6, 0x4a, 0x4e, + 0x2e, 0x0f, 0xa0, 0x99, 0x9d, 0x6e, 0xad, 0x67, 0xb7, 0xf0, 0xac, 0xb3, 0x30, 0xbd, 0x82, 0x17, + 0xce, 0x9c, 0xdc, 0x0e, 0x0d, 0x15, 0xb0, 0x06, 0x0e, 0x15, 0x1d, 0x24, 0x05, 0xb0, 0x22, 0x1a, + 0xa8, 0x0d, 0x1c, 0x8a, 0xbe, 0x54, 0x3d, 0x29, 0x39, 0xf7, 0xd1, 0xd2, 0x5c, 0x7a, 0x20, 0x62, + 0xf9, 0x58, 0x90, 0x5b, 0x45, 0xe4, 0x27, 0xaa, 0xe6, 0x31, 0x2c, 0x17, 0x7c, 0xec, 0x5a, 0xa4, + 0x67, 0x1d, 0xa2, 0x68, 0x91, 0x9e, 0xe9, 0x9e, 0x77, 0x2f, 0x53, 0x95, 0x4b, 0x2e, 0xd0, 0x9e, + 0xea, 0x55, 0x90, 0x0e, 0x4e, 0xb1, 0xba, 0x3f, 0x74, 0x60, 0xa5, 0xc4, 0x85, 0xce, 0xde, 0x57, + 0xdb, 0xf3, 0x99, 0xee, 0xf5, 0x5e, 0xa9, 0x87, 0xd5, 0x3d, 0xa4, 0x7a, 0x9e, 0xb0, 0xcf, 0xad, + 0x85, 0x4d, 0x38, 0x37, 0xa5, 0x64, 0xbe, 0xd1, 0xa8, 0x28, 0xb5, 0x28, 0x7e, 0x02, 0xeb, 0xa2, + 0x21, 0x9b, 0xa3, 0x51, 0xce, 0xfb, 0x7b, 0xad, 0xf0, 0xbf, 0x6f, 0x2c, 0xaf, 0x76, 0x6f, 0xf6, + 0xff, 0xc6, 0x99, 0x61, 0x00, 0x8b, 0xa6, 0xb2, 0x29, 0x74, 0xf2, 0x1e, 0x55, 0x36, 0xbb, 0xac, + 0xde, 0x7b, 0xd6, 0x46, 0xb3, 0xc4, 0x0b, 0xfb, 0x5b, 0x54, 0xd9, 0x7b, 0x6e, 0xaf, 0x6c, 0x5c, + 0xc4, 0xde, 0x13, 0xe7, 0xe3, 0xaf, 0x69, 0xf7, 0x6f, 0xae, 0x9f, 0xaa, 0x82, 0x59, 0xfe, 0x6a, + 0xbd, 0xd5, 0x2d, 0xf7, 0x1e, 0xdf, 0xa4, 0xea, 0xaf, 0xbb, 0xef, 0x94, 0x55, 0x1f, 0x8b, 0x4f, + 0xc4, 0xa6, 0x77, 0x3d, 0x2f, 0xd7, 0xaa, 0x05, 0xd7, 0xcb, 0xe6, 0x7b, 0xe6, 0xee, 0x25, 0x37, + 0xd6, 0x97, 0xc8, 0xb6, 0x6b, 0x9b, 0xee, 0x5e, 0x2d, 0x3e, 0x25, 0x7e, 0x65, 0x2d, 0x3e, 0x65, + 0xfe, 0x61, 0xdb, 0xae, 0x51, 0x9e, 0xe1, 0x4f, 0x9c, 0x3b, 0x0f, 0x6e, 0xfd, 0xe0, 0xb7, 0x4e, + 0x82, 0xf4, 0x74, 0x7a, 0x74, 0x77, 0x10, 0x8d, 0xef, 0x8d, 0x94, 0x5b, 0x4f, 0xde, 0x48, 0xb8, + 0x37, 0x0a, 0x87, 0xf7, 0xa8, 0xd8, 0xa3, 0x39, 0xfa, 0x67, 0x5d, 0xdf, 0xfa, 0x7f, 0x01, 0x00, + 0x00, 0xff, 0xff, 0x8f, 0xe0, 0xfe, 0x46, 0xde, 0x6b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 116bef58c82a..e7094a17d6ec 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -2217,10 +2217,7 @@ message Invoice { */ string memo = 1 [json_name = "memo"]; - /** Deprecated. An optional cryptographic receipt of payment which is not - implemented. - */ - bytes receipt = 2 [json_name = "receipt", deprecated = true]; + reserved 2; /** The hex-encoded preimage (32 byte) which will allow settling an incoming diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 95b04dfce164..0dcce3012d42 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -2628,11 +2628,6 @@ "type": "string", "description": "*\nAn optional memo to attach along with the invoice. Used for record keeping\npurposes for the invoice's creator, and will also be set in the description\nfield of the encoded payment request if the description_hash field is not\nbeing used." }, - "receipt": { - "type": "string", - "format": "byte", - "description": "* Deprecated. An optional cryptographic receipt of payment which is not\nimplemented." - }, "r_preimage": { "type": "string", "format": "byte", diff --git a/rpcserver.go b/rpcserver.go index 828ce7cf9144..bea756998b7a 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -3549,7 +3549,6 @@ func (r *rpcServer) AddInvoice(ctx context.Context, addInvoiceData := &invoicesrpc.AddInvoiceData{ Memo: invoice.Memo, - Receipt: invoice.Receipt, Value: value, DescriptionHash: invoice.DescriptionHash, Expiry: invoice.Expiry, From 84d6bc0d6f3eeff6c070d6ba096753ff8502244d Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:35:05 -0800 Subject: [PATCH 02/25] lnwire/features: add Encode256 and Decode256 These will allow us to serialize invoice features bits without double encoding the length. --- lnwire/features.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lnwire/features.go b/lnwire/features.go index 7700e2d5d97f..7900a9b389e1 100644 --- a/lnwire/features.go +++ b/lnwire/features.go @@ -216,8 +216,16 @@ func (fv *RawFeatureVector) Encode(w io.Writer) error { return fv.encode(w, length, 8) } +// EncodeBase256 writes the feature vector in base256 representation. Every +// feature is encoded as a bit, and the bit vector is serialized using the least +// number of bytes. +func (fv *RawFeatureVector) EncodeBase256(w io.Writer) error { + length := fv.SerializeSize() + return fv.encode(w, length, 8) +} + // EncodeBase32 writes the feature vector in base32 representation. Every feature -// encoded as a bit, and the bit vector is serialized using the least number of +// is encoded as a bit, and the bit vector is serialized using the least number of // bytes. func (fv *RawFeatureVector) EncodeBase32(w io.Writer) error { length := fv.SerializeSize32() @@ -239,8 +247,8 @@ func (fv *RawFeatureVector) encode(w io.Writer, length, width int) error { } // Decode reads the feature vector from its byte representation. Every feature -// encoded as a bit, and the bit vector is serialized using the least number of -// bytes. Since the bit vector length is variable, the first two bytes of the +// is encoded as a bit, and the bit vector is serialized using the least number +// of bytes. Since the bit vector length is variable, the first two bytes of the // serialization represent the length. func (fv *RawFeatureVector) Decode(r io.Reader) error { // Read the length of the feature vector. @@ -253,6 +261,13 @@ func (fv *RawFeatureVector) Decode(r io.Reader) error { return fv.decode(r, int(length), 8) } +// DecodeBase256 reads the feature vector from its base256 representation. Every +// feature encoded as a bit, and the bit vector is serialized using the least +// number of bytes. +func (fv *RawFeatureVector) DecodeBase256(r io.Reader, length int) error { + return fv.decode(r, length, 8) +} + // DecodeBase32 reads the feature vector from its base32 representation. Every // feature encoded as a bit, and the bit vector is serialized using the least // number of bytes. From dda4cb29f44a66c8dd20029d6d844cae7f98b24f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:35:18 -0800 Subject: [PATCH 03/25] channeldb/migration12: copy invoice serialization --- channeldb/migration12/invoices.go | 240 ++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 channeldb/migration12/invoices.go diff --git a/channeldb/migration12/invoices.go b/channeldb/migration12/invoices.go new file mode 100644 index 000000000000..e1e5810360c6 --- /dev/null +++ b/channeldb/migration12/invoices.go @@ -0,0 +1,240 @@ +package migration12 + +import ( + "bytes" + "encoding/binary" + "io" + "time" + + "github.com/btcsuite/btcd/wire" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/tlv" +) + +const ( + // MaxMemoSize is maximum size of the memo field within invoices stored + // in the database. + MaxMemoSize = 1024 + + // maxReceiptSize is the maximum size of the payment receipt stored + // within the database along side incoming/outgoing invoices. + maxReceiptSize = 1024 + + // MaxPaymentRequestSize is the max size of a payment request for + // this invoice. + // TODO(halseth): determine the max length payment request when field + // lengths are final. + MaxPaymentRequestSize = 4096 + + memoType tlv.Type = 0 + payReqType tlv.Type = 1 + createTimeType tlv.Type = 2 + settleTimeType tlv.Type = 3 + addIndexType tlv.Type = 4 + settleIndexType tlv.Type = 5 + preimageType tlv.Type = 6 + valueType tlv.Type = 7 + cltvDeltaType tlv.Type = 8 + expiryType tlv.Type = 9 + paymentAddrType tlv.Type = 10 + featuresType tlv.Type = 11 + invStateType tlv.Type = 12 + amtPaidType tlv.Type = 13 +) + +var ( + // invoiceBucket is the name of the bucket within the database that + // stores all data related to invoices no matter their final state. + // Within the invoice bucket, each invoice is keyed by its invoice ID + // which is a monotonically increasing uint32. + invoiceBucket = []byte("invoices") + + // Big endian is the preferred byte order, due to cursor scans over + // integer keys iterating in order. + byteOrder = binary.BigEndian +) + +// ContractState describes the state the invoice is in. +type ContractState uint8 + +// ContractTerm is a companion struct to the Invoice struct. This struct houses +// the necessary conditions required before the invoice can be considered fully +// settled by the payee. +type ContractTerm struct { + // PaymentPreimage is the preimage which is to be revealed in the + // occasion that an HTLC paying to the hash of this preimage is + // extended. + PaymentPreimage lntypes.Preimage + + // Value is the expected amount of milli-satoshis to be paid to an HTLC + // which can be satisfied by the above preimage. + Value lnwire.MilliSatoshi + + // State describes the state the invoice is in. + State ContractState +} + +// Invoice is a payment invoice generated by a payee in order to request +// payment for some good or service. The inclusion of invoices within Lightning +// creates a payment work flow for merchants very similar to that of the +// existing financial system within PayPal, etc. Invoices are added to the +// database when a payment is requested, then can be settled manually once the +// payment is received at the upper layer. For record keeping purposes, +// invoices are never deleted from the database, instead a bit is toggled +// denoting the invoice has been fully settled. Within the database, all +// invoices must have a unique payment hash which is generated by taking the +// sha256 of the payment preimage. +type Invoice struct { + // Memo is an optional memo to be stored along side an invoice. The + // memo may contain further details pertaining to the invoice itself, + // or any other message which fits within the size constraints. + Memo []byte + + // PaymentRequest is an optional field where a payment request created + // for this invoice can be stored. + PaymentRequest []byte + + // FinalCltvDelta is the minimum required number of blocks before htlc + // expiry when the invoice is accepted. + FinalCltvDelta int32 + + // Expiry defines how long after creation this invoice should expire. + Expiry time.Duration + + // CreationDate is the exact time the invoice was created. + CreationDate time.Time + + // SettleDate is the exact time the invoice was settled. + SettleDate time.Time + + // Terms are the contractual payment terms of the invoice. Once all the + // terms have been satisfied by the payer, then the invoice can be + // considered fully fulfilled. + // + // TODO(roasbeef): later allow for multiple terms to fulfill the final + // invoice: payment fragmentation, etc. + Terms ContractTerm + + // AddIndex is an auto-incrementing integer that acts as a + // monotonically increasing sequence number for all invoices created. + // Clients can then use this field as a "checkpoint" of sorts when + // implementing a streaming RPC to notify consumers of instances where + // an invoice has been added before they re-connected. + // + // NOTE: This index starts at 1. + AddIndex uint64 + + // SettleIndex is an auto-incrementing integer that acts as a + // monotonically increasing sequence number for all settled invoices. + // Clients can then use this field as a "checkpoint" of sorts when + // implementing a streaming RPC to notify consumers of instances where + // an invoice has been settled before they re-connected. + // + // NOTE: This index starts at 1. + SettleIndex uint64 + + // AmtPaid is the final amount that we ultimately accepted for pay for + // this invoice. We specify this value independently as it's possible + // that the invoice originally didn't specify an amount, or the sender + // overpaid. + AmtPaid lnwire.MilliSatoshi + + // Htlcs records all htlcs that paid to this invoice. Some of these + // htlcs may have been marked as canceled. + Htlcs []byte +} + +// LegacyDeserializeInvoice decodes an invoice from the passed io.Reader using +// the pre-TLV serialization. +// +// nolint: dupl +func LegacyDeserializeInvoice(r io.Reader) (Invoice, error) { + var err error + invoice := Invoice{} + + // TODO(roasbeef): use read full everywhere + invoice.Memo, err = wire.ReadVarBytes(r, 0, MaxMemoSize, "") + if err != nil { + return invoice, err + } + _, err = wire.ReadVarBytes(r, 0, maxReceiptSize, "") + if err != nil { + return invoice, err + } + + invoice.PaymentRequest, err = wire.ReadVarBytes(r, 0, MaxPaymentRequestSize, "") + if err != nil { + return invoice, err + } + + if err := binary.Read(r, byteOrder, &invoice.FinalCltvDelta); err != nil { + return invoice, err + } + + var expiry int64 + if err := binary.Read(r, byteOrder, &expiry); err != nil { + return invoice, err + } + invoice.Expiry = time.Duration(expiry) + + birthBytes, err := wire.ReadVarBytes(r, 0, 300, "birth") + if err != nil { + return invoice, err + } + if err := invoice.CreationDate.UnmarshalBinary(birthBytes); err != nil { + return invoice, err + } + + settledBytes, err := wire.ReadVarBytes(r, 0, 300, "settled") + if err != nil { + return invoice, err + } + if err := invoice.SettleDate.UnmarshalBinary(settledBytes); err != nil { + return invoice, err + } + + if _, err := io.ReadFull(r, invoice.Terms.PaymentPreimage[:]); err != nil { + return invoice, err + } + var scratch [8]byte + if _, err := io.ReadFull(r, scratch[:]); err != nil { + return invoice, err + } + invoice.Terms.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:])) + + if err := binary.Read(r, byteOrder, &invoice.Terms.State); err != nil { + return invoice, err + } + + if err := binary.Read(r, byteOrder, &invoice.AddIndex); err != nil { + return invoice, err + } + if err := binary.Read(r, byteOrder, &invoice.SettleIndex); err != nil { + return invoice, err + } + if err := binary.Read(r, byteOrder, &invoice.AmtPaid); err != nil { + return invoice, err + } + + invoice.Htlcs, err = deserializeHtlcs(r) + if err != nil { + return Invoice{}, err + } + + return invoice, nil +} + +// deserializeHtlcs reads a list of invoice htlcs from a reader and returns it +// as a flattened byte slice. +func deserializeHtlcs(r io.Reader) ([]byte, error) { + var b bytes.Buffer + _, err := io.Copy(&b, r) + return b.Bytes(), err +} + +// serializeHtlcs writes a serialized list of invoice htlcs into a writer. +func serializeHtlcs(w io.Writer, htlcs []byte) error { + _, err := w.Write(htlcs) + return err +} From ba29d4e29961ae3a6459cd55fa8f8a89ab5946e0 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:35:31 -0800 Subject: [PATCH 04/25] channeldb/migration12: write out invoices using TLV encoding --- channeldb/migration12/invoices.go | 169 +++++++++++++++++++++++++++++ channeldb/migration12/log.go | 14 +++ channeldb/migration12/migration.go | 74 +++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 channeldb/migration12/log.go create mode 100644 channeldb/migration12/migration.go diff --git a/channeldb/migration12/invoices.go b/channeldb/migration12/invoices.go index e1e5810360c6..634b98ca3695 100644 --- a/channeldb/migration12/invoices.go +++ b/channeldb/migration12/invoices.go @@ -73,6 +73,13 @@ type ContractTerm struct { // State describes the state the invoice is in. State ContractState + + // PaymentAddr is a randomly generated value include in the MPP record + // by the sender to prevent probing of the receiver. + PaymentAddr [32]byte + + // Features is the feature vectors advertised on the payment request. + Features *lnwire.FeatureVector } // Invoice is a payment invoice generated by a payee in order to request @@ -225,6 +232,95 @@ func LegacyDeserializeInvoice(r io.Reader) (Invoice, error) { return invoice, nil } +// DeserializeInvoice deserializes an invoice from an io.Reader. +// +// nolint: dupl +func DeserializeInvoice(r io.Reader) (Invoice, error) { + var ( + preimage [32]byte + value uint64 + cltvDelta uint32 + expiry uint64 + amtPaid uint64 + state uint8 + + creationDateBytes []byte + settleDateBytes []byte + featureBytes []byte + ) + + var i Invoice + tlvStream, err := tlv.NewStream( + // Memo and payreq. + tlv.MakePrimitiveRecord(memoType, &i.Memo), + tlv.MakePrimitiveRecord(payReqType, &i.PaymentRequest), + + // Add/settle metadata. + tlv.MakePrimitiveRecord(createTimeType, &creationDateBytes), + tlv.MakePrimitiveRecord(settleTimeType, &settleDateBytes), + tlv.MakePrimitiveRecord(addIndexType, &i.AddIndex), + tlv.MakePrimitiveRecord(settleIndexType, &i.SettleIndex), + + // Terms. + tlv.MakePrimitiveRecord(preimageType, &preimage), + tlv.MakePrimitiveRecord(valueType, &value), + tlv.MakePrimitiveRecord(cltvDeltaType, &cltvDelta), + tlv.MakePrimitiveRecord(expiryType, &expiry), + tlv.MakePrimitiveRecord(paymentAddrType, &i.Terms.PaymentAddr), + tlv.MakePrimitiveRecord(featuresType, &featureBytes), + + // Invoice state. + tlv.MakePrimitiveRecord(invStateType, &state), + tlv.MakePrimitiveRecord(amtPaidType, &amtPaid), + ) + if err != nil { + return i, err + } + + var bodyLen int64 + err = binary.Read(r, byteOrder, &bodyLen) + if err != nil { + return i, err + } + + lr := io.LimitReader(r, bodyLen) + if err = tlvStream.Decode(lr); err != nil { + return i, err + } + + i.Terms.PaymentPreimage = lntypes.Preimage(preimage) + i.Terms.Value = lnwire.MilliSatoshi(value) + i.FinalCltvDelta = int32(cltvDelta) + i.Expiry = time.Duration(expiry) + i.AmtPaid = lnwire.MilliSatoshi(amtPaid) + i.Terms.State = ContractState(state) + + err = i.CreationDate.UnmarshalBinary(creationDateBytes) + if err != nil { + return i, err + } + + err = i.SettleDate.UnmarshalBinary(settleDateBytes) + if err != nil { + return i, err + } + + rawFeatures := lnwire.NewRawFeatureVector() + err = rawFeatures.DecodeBase256( + bytes.NewReader(featureBytes), len(featureBytes), + ) + if err != nil { + return i, err + } + + i.Terms.Features = lnwire.NewFeatureVector( + rawFeatures, lnwire.Features, + ) + + i.Htlcs, err = deserializeHtlcs(r) + return i, err +} + // deserializeHtlcs reads a list of invoice htlcs from a reader and returns it // as a flattened byte slice. func deserializeHtlcs(r io.Reader) ([]byte, error) { @@ -233,6 +329,79 @@ func deserializeHtlcs(r io.Reader) ([]byte, error) { return b.Bytes(), err } +// SerializeInvoice serializes an invoice to a writer. +// +// nolint: dupl +func SerializeInvoice(w io.Writer, i *Invoice) error { + creationDateBytes, err := i.CreationDate.MarshalBinary() + if err != nil { + return err + } + + settleDateBytes, err := i.SettleDate.MarshalBinary() + if err != nil { + return err + } + + var fb bytes.Buffer + err = i.Terms.Features.EncodeBase256(&fb) + if err != nil { + return err + } + featureBytes := fb.Bytes() + + preimage := [32]byte(i.Terms.PaymentPreimage) + value := uint64(i.Terms.Value) + cltvDelta := uint32(i.FinalCltvDelta) + expiry := uint64(i.Expiry) + + amtPaid := uint64(i.AmtPaid) + state := uint8(i.Terms.State) + + tlvStream, err := tlv.NewStream( + // Memo and payreq. + tlv.MakePrimitiveRecord(memoType, &i.Memo), + tlv.MakePrimitiveRecord(payReqType, &i.PaymentRequest), + + // Add/settle metadata. + tlv.MakePrimitiveRecord(createTimeType, &creationDateBytes), + tlv.MakePrimitiveRecord(settleTimeType, &settleDateBytes), + tlv.MakePrimitiveRecord(addIndexType, &i.AddIndex), + tlv.MakePrimitiveRecord(settleIndexType, &i.SettleIndex), + + // Terms. + tlv.MakePrimitiveRecord(preimageType, &preimage), + tlv.MakePrimitiveRecord(valueType, &value), + tlv.MakePrimitiveRecord(cltvDeltaType, &cltvDelta), + tlv.MakePrimitiveRecord(expiryType, &expiry), + tlv.MakePrimitiveRecord(paymentAddrType, &i.Terms.PaymentAddr), + tlv.MakePrimitiveRecord(featuresType, &featureBytes), + + // Invoice state. + tlv.MakePrimitiveRecord(invStateType, &state), + tlv.MakePrimitiveRecord(amtPaidType, &amtPaid), + ) + if err != nil { + return err + } + + var b bytes.Buffer + if err = tlvStream.Encode(&b); err != nil { + return err + } + + err = binary.Write(w, byteOrder, uint64(b.Len())) + if err != nil { + return err + } + + if _, err = w.Write(b.Bytes()); err != nil { + return err + } + + return serializeHtlcs(w, i.Htlcs) +} + // serializeHtlcs writes a serialized list of invoice htlcs into a writer. func serializeHtlcs(w io.Writer, htlcs []byte) error { _, err := w.Write(htlcs) diff --git a/channeldb/migration12/log.go b/channeldb/migration12/log.go new file mode 100644 index 000000000000..1352e52aea05 --- /dev/null +++ b/channeldb/migration12/log.go @@ -0,0 +1,14 @@ +package migration12 + +import ( + "github.com/btcsuite/btclog" +) + +// log is a logger that is initialized as disabled. This means the package will +// not perform any logging by default until a logger is set. +var log = btclog.Disabled + +// UseLogger uses a specified Logger to output package logging info. +func UseLogger(logger btclog.Logger) { + log = logger +} diff --git a/channeldb/migration12/migration.go b/channeldb/migration12/migration.go new file mode 100644 index 000000000000..d80497dd0dcb --- /dev/null +++ b/channeldb/migration12/migration.go @@ -0,0 +1,74 @@ +package migration12 + +import ( + "bytes" + + "github.com/coreos/bbolt" + "github.com/lightningnetwork/lnd/lnwire" +) + +var emptyFeatures = lnwire.NewFeatureVector(nil, nil) + +// MigrateInvoiceTLV migrates all existing invoice bodies over to be serialized +// in a single TLV stream. In the process, we drop the Receipt field and add +// PaymentAddr and Features to the invoice Terms. +func MigrateInvoiceTLV(tx *bbolt.Tx) error { + log.Infof("Migrating invoice bodies to TLV, " + + "adding payment addresses and feature vectors.") + + invoiceB := tx.Bucket(invoiceBucket) + if invoiceB == nil { + return nil + } + + type keyedInvoice struct { + key []byte + invoice Invoice + } + + // Read in all existing invoices using the old format. + var invoices []keyedInvoice + err := invoiceB.ForEach(func(k, v []byte) error { + if v == nil { + return nil + } + + invoiceReader := bytes.NewReader(v) + invoice, err := LegacyDeserializeInvoice(invoiceReader) + if err != nil { + return err + } + + // Insert an empty feature vector on all old payments. + invoice.Terms.Features = emptyFeatures + + invoices = append(invoices, keyedInvoice{ + key: k, + invoice: invoice, + }) + + return nil + }) + if err != nil { + return err + } + + // Write out each one under its original key using TLV. + for _, ki := range invoices { + var b bytes.Buffer + err = SerializeInvoice(&b, &ki.invoice) + if err != nil { + return err + } + + err = invoiceB.Put(ki.key, b.Bytes()) + if err != nil { + return err + } + } + + log.Infof("Migration to TLV invoice bodies, " + + "payment address, and features complete!") + + return nil +} From 4a525e3c40e596cdf9bb15c216cd6411d798aadc Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:35:43 -0800 Subject: [PATCH 05/25] channeldb/migration12: add tlv invoice migration tests --- channeldb/migration12/migration_test.go | 280 ++++++++++++++++++++++++ channeldb/migtest/migtest.go | 93 ++++++++ 2 files changed, 373 insertions(+) create mode 100644 channeldb/migration12/migration_test.go create mode 100644 channeldb/migtest/migtest.go diff --git a/channeldb/migration12/migration_test.go b/channeldb/migration12/migration_test.go new file mode 100644 index 000000000000..9d3a7f968607 --- /dev/null +++ b/channeldb/migration12/migration_test.go @@ -0,0 +1,280 @@ +package migration12_test + +import ( + "bytes" + "fmt" + "reflect" + "testing" + "time" + + "github.com/coreos/bbolt" + "github.com/davecgh/go-spew/spew" + "github.com/lightningnetwork/lnd/channeldb/migration12" + "github.com/lightningnetwork/lnd/channeldb/migtest" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" +) + +var ( + // invoiceBucket is the name of the bucket within the database that + // stores all data related to invoices no matter their final state. + // Within the invoice bucket, each invoice is keyed by its invoice ID + // which is a monotonically increasing uint32. + invoiceBucket = []byte("invoices") + + preimage = lntypes.Preimage{ + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + } + + hash = preimage.Hash() + + paymentAddr = [32]byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + } + + beforeInvoice0Htlcs = []byte{ + 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x09, 0x62, 0x79, 0x65, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x06, 0x70, 0x61, 0x79, 0x72, 0x65, 0x71, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x4e, 0x94, 0x91, 0x4f, 0x00, + 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x77, 0xc4, 0xd3, + 0xd5, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x20, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x0e, 0x77, 0xd5, 0xc8, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x20, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa4, + } + + afterInvoice0Htlcs = []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x0b, + 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, + 0x64, 0x01, 0x06, 0x70, 0x61, 0x79, 0x72, 0x65, 0x71, 0x02, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x77, 0xc4, 0xd3, 0xd5, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x20, 0x03, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x0e, 0x77, 0xd5, 0xc8, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x20, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x20, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x07, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x08, 0x04, 0x00, + 0x00, 0x00, 0x20, 0x09, 0x08, 0x00, 0x00, 0x4e, 0x94, 0x91, + 0x4f, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0c, + 0x01, 0x03, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xa4, + } + + testHtlc = []byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, + 0x07, 0x04, 0x00, 0x00, 0x00, 0x58, 0x09, 0x08, 0x00, 0x13, + 0xbc, 0xbf, 0x72, 0x4e, 0x1e, 0x00, 0x0b, 0x08, 0x00, 0x17, + 0xaf, 0x4c, 0x22, 0xc4, 0x24, 0x00, 0x0d, 0x04, 0x00, 0x00, + 0x23, 0x1d, 0x0f, 0x01, 0x02, + } + + beforeInvoice1Htlc = append([]byte{ + 0x0b, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x09, 0x62, 0x79, 0x65, 0x20, 0x77, 0x6f, 0x72, + 0x6c, 0x64, 0x06, 0x70, 0x61, 0x79, 0x72, 0x65, 0x71, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x4e, 0x94, 0x91, 0x4f, 0x00, + 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x77, 0xc4, 0xd3, + 0xd5, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x20, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x0e, 0x77, 0xd5, 0xc8, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x20, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa4, + }, testHtlc...) + + afterInvoice1Htlc = append([]byte{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x0b, + 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, + 0x64, 0x01, 0x06, 0x70, 0x61, 0x79, 0x72, 0x65, 0x71, 0x02, + 0x0f, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x77, 0xc4, 0xd3, 0xd5, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x20, 0x03, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x0e, 0x77, 0xd5, 0xc8, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0x20, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, 0x20, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x07, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x08, 0x04, 0x00, + 0x00, 0x00, 0x20, 0x09, 0x08, 0x00, 0x00, 0x4e, 0x94, 0x91, + 0x4f, 0x00, 0x00, 0x0a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0c, + 0x01, 0x03, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0xa4, + }, testHtlc...) +) + +// genInvoice returns the expected invoice given the number of passed htlcs. The +// serializations above reflect the invoices generated here in their old +// encoding, with the addition of the receipt "bye world". The payment address +// and feature bits did not exist in the prior, but we expect them to be +// populated with empty values after decoding. +func genInvoice(numHtlcs int) migration12.Invoice { + var htlcs []byte + switch numHtlcs { + case 0: + case 1: + htlcs = testHtlc + default: + panic("can only generate invoices with 0 or 1 htlcs") + } + + return migration12.Invoice{ + Memo: []byte("hello world"), + PaymentRequest: []byte("payreq"), + FinalCltvDelta: 32, + Expiry: 24 * time.Hour, + CreationDate: time.Unix(3333333, 0).UTC(), + SettleDate: time.Unix(4444444, 0).UTC(), + Terms: migration12.ContractTerm{ + PaymentPreimage: preimage, + Value: lnwire.MilliSatoshi(1000), + State: migration12.ContractState(3), + Features: lnwire.NewFeatureVector( + nil, lnwire.Features, + ), + PaymentAddr: paymentAddr, + }, + AddIndex: 5, + SettleIndex: 6, + AmtPaid: lnwire.MilliSatoshi(420), + Htlcs: htlcs, + } +} + +type migrationTest struct { + name string + beforeMigration func(*bbolt.Tx) error + afterMigration func(*bbolt.Tx) error +} + +var migrationTests = []migrationTest{ + { + name: "no invoices", + beforeMigration: func(*bbolt.Tx) error { return nil }, + afterMigration: func(*bbolt.Tx) error { return nil }, + }, + { + name: "zero htlcs", + beforeMigration: genBeforeMigration(beforeInvoice0Htlcs), + afterMigration: genAfterMigration(0, afterInvoice0Htlcs), + }, + { + name: "one htlc", + beforeMigration: genBeforeMigration(beforeInvoice1Htlc), + afterMigration: genAfterMigration(1, afterInvoice1Htlc), + }, +} + +// genBeforeMigration creates a closure that inserts an invoice serialized under +// the old format under the test payment hash. +func genBeforeMigration(beforeBytes []byte) func(*bbolt.Tx) error { + return func(tx *bbolt.Tx) error { + invoices, err := tx.CreateBucketIfNotExists( + invoiceBucket, + ) + if err != nil { + return err + } + + return invoices.Put(hash[:], beforeBytes) + } +} + +// genAfterMigration creates a closure that verifies the tlv invoice migration +// succeeded, but comparing the resulting encoding of the invoice to the +// expected serialization. In addition, the decoded invoice is compared against +// the expected invoice for equality. +func genAfterMigration(numHtlcs int, afterBytes []byte) func(*bbolt.Tx) error { + return func(tx *bbolt.Tx) error { + invoices := tx.Bucket(invoiceBucket) + if invoices == nil { + return fmt.Errorf("invoice bucket not found") + } + + // Fetch the new invoice bytes and check that they match our + // expected serialization. + invoiceBytes := invoices.Get(hash[:]) + if !bytes.Equal(invoiceBytes, afterBytes) { + return fmt.Errorf("invoice bytes mismatch, "+ + "want: %x, got: %x", + invoiceBytes, afterBytes) + } + + // Decode the invoice using the new serialization, which is + // imported from the migration package so that it can't be + // modified. + invoiceReader := bytes.NewReader(invoiceBytes) + invoice, err := migration12.DeserializeInvoice(invoiceReader) + if err != nil { + return fmt.Errorf("unable to deserialize invoice: %v", + err) + } + + // Normalize times to UTC so the test is deterministic in all + // timezones. + invoice.CreationDate = invoice.CreationDate.UTC() + invoice.SettleDate = invoice.SettleDate.UTC() + + // Finally, compare the decoded and expected invoices for + // equality of the parsed fields. + expInvoice := genInvoice(numHtlcs) + if !reflect.DeepEqual(expInvoice, invoice) { + return fmt.Errorf("invoice mismatch, "+ + "want: %v, got: %v", + spew.Sdump(expInvoice), spew.Sdump(invoice)) + + } + + return nil + } +} + +// TestTLVInvoiceMigration executes a suite of migration tests for moving +// invoices to use TLV for their bodies. In the process, feature bits and +// payment addresses are added to the invoice while the receipt field is +// dropped. We test a few different invoices with a varying number of HTLCs, as +// well as the case where there are no invoices present. +// +// NOTE: The test vectors each include a receipt that is not present on the +// final struct, but verifies that the field is properly removed. +func TestTLVInvoiceMigration(t *testing.T) { + for _, test := range migrationTests { + test := test + t.Run(test.name, func(t *testing.T) { + migtest.ApplyMigration( + t, + test.beforeMigration, + test.afterMigration, + migration12.MigrateInvoiceTLV, + false, + ) + }) + } +} diff --git a/channeldb/migtest/migtest.go b/channeldb/migtest/migtest.go new file mode 100644 index 000000000000..b6ecbafade93 --- /dev/null +++ b/channeldb/migtest/migtest.go @@ -0,0 +1,93 @@ +package migtest + +import ( + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/coreos/bbolt" + "github.com/lightningnetwork/lnd/channeldb" +) + +// MakeDB creates a new instance of the ChannelDB for testing purposes. A +// callback which cleans up the created temporary directories is also returned +// and intended to be executed after the test completes. +func MakeDB() (*channeldb.DB, func(), error) { + // First, create a temporary directory to be used for the duration of + // this test. + tempDirName, err := ioutil.TempDir("", "channeldb") + if err != nil { + return nil, nil, err + } + + // Next, create channeldb for the first time. + cdb, err := channeldb.Open(tempDirName) + if err != nil { + return nil, nil, err + } + + cleanUp := func() { + cdb.Close() + os.RemoveAll(tempDirName) + } + + return cdb, cleanUp, nil +} + +// ApplyMigration is a helper test function that encapsulates the general steps +// which are needed to properly check the result of applying migration function. +func ApplyMigration(t *testing.T, + beforeMigration, afterMigration, migrationFunc func(tx *bbolt.Tx) error, + shouldFail bool) { + + cdb, cleanUp, err := MakeDB() + defer cleanUp() + if err != nil { + t.Fatal(err) + } + + // beforeMigration usually used for populating the database + // with test data. + err = cdb.Update(beforeMigration) + if err != nil { + t.Fatal(err) + } + + defer func() { + if r := recover(); r != nil { + err = newError(r) + } + + if err == nil && shouldFail { + t.Fatal("error wasn't received on migration stage") + } else if err != nil && !shouldFail { + t.Fatalf("error was received on migration stage: %v", err) + } + + // afterMigration usually used for checking the database state and + // throwing the error if something went wrong. + err = cdb.Update(afterMigration) + if err != nil { + t.Fatal(err) + } + }() + + // Apply migration. + err = cdb.Update(migrationFunc) + if err != nil { + t.Fatal(err) + } +} + +func newError(e interface{}) error { + var err error + switch e := e.(type) { + case error: + err = e + default: + err = fmt.Errorf("%v", e) + } + + return err +} From d51c6e95b1fee5d45e42a3283f9da007b86e7153 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:36:04 -0800 Subject: [PATCH 06/25] channeldb: complete migration 12 for TLV invoices --- channeldb/db.go | 7 + channeldb/invoice_test.go | 8 +- channeldb/invoices.go | 274 +++++++++++++++++-------------- channeldb/log.go | 2 + htlcswitch/test_utils.go | 3 + invoices/invoiceregistry_test.go | 31 ++-- lnrpc/invoicesrpc/addinvoice.go | 8 + lnwire/features.go | 7 + zpay32/invoice.go | 8 + 9 files changed, 210 insertions(+), 138 deletions(-) diff --git a/channeldb/db.go b/channeldb/db.go index a67ccd2fcfc3..d7513ea66b12 100644 --- a/channeldb/db.go +++ b/channeldb/db.go @@ -13,6 +13,7 @@ import ( "github.com/btcsuite/btcd/wire" "github.com/coreos/bbolt" "github.com/go-errors/errors" + "github.com/lightningnetwork/lnd/channeldb/migration12" "github.com/lightningnetwork/lnd/channeldb/migration_01_to_11" "github.com/lightningnetwork/lnd/lnwire" ) @@ -116,6 +117,12 @@ var ( number: 11, migration: migration_01_to_11.MigrateInvoices, }, + { + // Migrate to TLV invoice bodies, add payment address + // and features, remove receipt. + number: 12, + migration: migration12.MigrateInvoiceTLV, + }, } // Big endian is the preferred byte order, due to cursor scans over diff --git a/channeldb/invoice_test.go b/channeldb/invoice_test.go index 4b5dda87eb9a..e109d387b9bf 100644 --- a/channeldb/invoice_test.go +++ b/channeldb/invoice_test.go @@ -10,6 +10,10 @@ import ( "github.com/lightningnetwork/lnd/lnwire" ) +var ( + emptyFeatures = lnwire.NewFeatureVector(nil, lnwire.Features) +) + func randInvoice(value lnwire.MilliSatoshi) (*Invoice, error) { var pre [32]byte if _, err := rand.Read(pre[:]); err != nil { @@ -23,12 +27,12 @@ func randInvoice(value lnwire.MilliSatoshi) (*Invoice, error) { Terms: ContractTerm{ PaymentPreimage: pre, Value: value, + Features: emptyFeatures, }, Htlcs: map[CircuitKey]*InvoiceHTLC{}, Expiry: 4000, } i.Memo = []byte("memo") - i.Receipt = []byte("receipt") // Create a random byte slice of MaxPaymentRequestSize bytes to be used // as a dummy paymentrequest, and determine if it should be set based @@ -64,10 +68,10 @@ func TestInvoiceWorkflow(t *testing.T) { Htlcs: map[CircuitKey]*InvoiceHTLC{}, } fakeInvoice.Memo = []byte("memo") - fakeInvoice.Receipt = []byte("receipt") fakeInvoice.PaymentRequest = []byte("") copy(fakeInvoice.Terms.PaymentPreimage[:], rev[:]) fakeInvoice.Terms.Value = lnwire.NewMSatFromSatoshis(10000) + fakeInvoice.Terms.Features = emptyFeatures paymentHash := fakeInvoice.Terms.PaymentPreimage.Hash() diff --git a/channeldb/invoices.go b/channeldb/invoices.go index 20f0c0a8b286..1f17d5f3b97b 100644 --- a/channeldb/invoices.go +++ b/channeldb/invoices.go @@ -8,7 +8,6 @@ import ( "io" "time" - "github.com/btcsuite/btcd/wire" "github.com/coreos/bbolt" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" @@ -84,10 +83,6 @@ const ( // in the database. MaxMemoSize = 1024 - // MaxReceiptSize is the maximum size of the payment receipt stored - // within the database along side incoming/outgoing invoices. - MaxReceiptSize = 1024 - // MaxPaymentRequestSize is the max size of a payment request for // this invoice. // TODO(halseth): determine the max length payment request when field @@ -96,6 +91,11 @@ const ( // A set of tlv type definitions used to serialize invoice htlcs to the // database. + // + // NOTE: A migration should be added whenever this list changes. This + // prevents against the database being rolled back to an older + // format where the surrounding logic might assume a different set of + // fields are known. chanIDType tlv.Type = 1 htlcIDType tlv.Type = 3 amtType tlv.Type = 5 @@ -103,7 +103,28 @@ const ( acceptTimeType tlv.Type = 9 resolveTimeType tlv.Type = 11 expiryHeightType tlv.Type = 13 - stateType tlv.Type = 15 + htlcStateType tlv.Type = 15 + + // A set of tlv type definitions used to serialize invoice bodiees. + // + // NOTE: A migration should be added whenever this list changes. This + // prevents against the database being rolled back to an older + // format where the surrounding logic might assume a different set of + // fields are known. + memoType tlv.Type = 0 + payReqType tlv.Type = 1 + createTimeType tlv.Type = 2 + settleTimeType tlv.Type = 3 + addIndexType tlv.Type = 4 + settleIndexType tlv.Type = 5 + preimageType tlv.Type = 6 + valueType tlv.Type = 7 + cltvDeltaType tlv.Type = 8 + expiryType tlv.Type = 9 + paymentAddrType tlv.Type = 10 + featuresType tlv.Type = 11 + invStateType tlv.Type = 12 + amtPaidType tlv.Type = 13 ) // ContractState describes the state the invoice is in. @@ -156,6 +177,13 @@ type ContractTerm struct { // State describes the state the invoice is in. State ContractState + + // PaymentAddr is a randomly generated value include in the MPP record + // by the sender to prevent probing of the receiver. + PaymentAddr [32]byte + + // Features is the feature vectors advertised on the payment request. + Features *lnwire.FeatureVector } // Invoice is a payment invoice generated by a payee in order to request @@ -174,12 +202,6 @@ type Invoice struct { // or any other message which fits within the size constraints. Memo []byte - // Receipt is an optional field dedicated for storing a - // cryptographically binding receipt of payment. - // - // TODO(roasbeef): document scheme. - Receipt []byte - // PaymentRequest is an optional field where a payment request created // for this invoice can be stored. PaymentRequest []byte @@ -312,16 +334,14 @@ func validateInvoice(i *Invoice) error { return fmt.Errorf("max length a memo is %v, and invoice "+ "of length %v was provided", MaxMemoSize, len(i.Memo)) } - if len(i.Receipt) > MaxReceiptSize { - return fmt.Errorf("max length a receipt is %v, and invoice "+ - "of length %v was provided", MaxReceiptSize, - len(i.Receipt)) - } if len(i.PaymentRequest) > MaxPaymentRequestSize { return fmt.Errorf("max length of payment request is %v, length "+ "provided was %v", MaxPaymentRequestSize, len(i.PaymentRequest)) } + if i.Terms.Features == nil { + return errors.New("invoice must have a feature vector") + } return nil } @@ -892,71 +912,73 @@ func putInvoice(invoices, invoiceIndex, addIndex *bbolt.Bucket, // would modify the on disk format, make a copy of the original code and store // it with the migration. func serializeInvoice(w io.Writer, i *Invoice) error { - if err := wire.WriteVarBytes(w, 0, i.Memo[:]); err != nil { - return err - } - if err := wire.WriteVarBytes(w, 0, i.Receipt[:]); err != nil { - return err - } - if err := wire.WriteVarBytes(w, 0, i.PaymentRequest[:]); err != nil { - return err - } - - if err := binary.Write(w, byteOrder, i.FinalCltvDelta); err != nil { - return err - } - - if err := binary.Write(w, byteOrder, int64(i.Expiry)); err != nil { - return err - } - - birthBytes, err := i.CreationDate.MarshalBinary() + creationDateBytes, err := i.CreationDate.MarshalBinary() if err != nil { return err } - if err := wire.WriteVarBytes(w, 0, birthBytes); err != nil { - return err - } - - settleBytes, err := i.SettleDate.MarshalBinary() + settleDateBytes, err := i.SettleDate.MarshalBinary() if err != nil { return err } - if err := wire.WriteVarBytes(w, 0, settleBytes); err != nil { - return err - } - - if _, err := w.Write(i.Terms.PaymentPreimage[:]); err != nil { + var fb bytes.Buffer + err = i.Terms.Features.EncodeBase256(&fb) + if err != nil { return err } - - var scratch [8]byte - byteOrder.PutUint64(scratch[:], uint64(i.Terms.Value)) - if _, err := w.Write(scratch[:]); err != nil { + featureBytes := fb.Bytes() + + preimage := [32]byte(i.Terms.PaymentPreimage) + value := uint64(i.Terms.Value) + cltvDelta := uint32(i.FinalCltvDelta) + expiry := uint64(i.Expiry) + + amtPaid := uint64(i.AmtPaid) + state := uint8(i.Terms.State) + + tlvStream, err := tlv.NewStream( + // Memo and payreq. + tlv.MakePrimitiveRecord(memoType, &i.Memo), + tlv.MakePrimitiveRecord(payReqType, &i.PaymentRequest), + + // Add/settle metadata. + tlv.MakePrimitiveRecord(createTimeType, &creationDateBytes), + tlv.MakePrimitiveRecord(settleTimeType, &settleDateBytes), + tlv.MakePrimitiveRecord(addIndexType, &i.AddIndex), + tlv.MakePrimitiveRecord(settleIndexType, &i.SettleIndex), + + // Terms. + tlv.MakePrimitiveRecord(preimageType, &preimage), + tlv.MakePrimitiveRecord(valueType, &value), + tlv.MakePrimitiveRecord(cltvDeltaType, &cltvDelta), + tlv.MakePrimitiveRecord(expiryType, &expiry), + tlv.MakePrimitiveRecord(paymentAddrType, &i.Terms.PaymentAddr), + tlv.MakePrimitiveRecord(featuresType, &featureBytes), + + // Invoice state. + tlv.MakePrimitiveRecord(invStateType, &state), + tlv.MakePrimitiveRecord(amtPaidType, &amtPaid), + ) + if err != nil { return err } - if err := binary.Write(w, byteOrder, i.Terms.State); err != nil { + var b bytes.Buffer + if err = tlvStream.Encode(&b); err != nil { return err } - if err := binary.Write(w, byteOrder, i.AddIndex); err != nil { - return err - } - if err := binary.Write(w, byteOrder, i.SettleIndex); err != nil { - return err - } - if err := binary.Write(w, byteOrder, int64(i.AmtPaid)); err != nil { + err = binary.Write(w, byteOrder, uint64(b.Len())) + if err != nil { return err } - if err := serializeHtlcs(w, i.Htlcs); err != nil { + if _, err = w.Write(b.Bytes()); err != nil { return err } - return nil + return serializeHtlcs(w, i.Htlcs) } // serializeHtlcs serializes a map containing circuit keys and invoice htlcs to @@ -980,7 +1002,7 @@ func serializeHtlcs(w io.Writer, htlcs map[CircuitKey]*InvoiceHTLC) error { tlv.MakePrimitiveRecord(acceptTimeType, &acceptTime), tlv.MakePrimitiveRecord(resolveTimeType, &resolveTime), tlv.MakePrimitiveRecord(expiryHeightType, &htlc.Expiry), - tlv.MakePrimitiveRecord(stateType, &state), + tlv.MakePrimitiveRecord(htlcStateType, &state), ) if err != nil { return err @@ -1018,79 +1040,89 @@ func fetchInvoice(invoiceNum []byte, invoices *bbolt.Bucket) (Invoice, error) { } func deserializeInvoice(r io.Reader) (Invoice, error) { - var err error - invoice := Invoice{} - - // TODO(roasbeef): use read full everywhere - invoice.Memo, err = wire.ReadVarBytes(r, 0, MaxMemoSize, "") + var ( + preimage [32]byte + value uint64 + cltvDelta uint32 + expiry uint64 + amtPaid uint64 + state uint8 + + creationDateBytes []byte + settleDateBytes []byte + featureBytes []byte + ) + + var i Invoice + tlvStream, err := tlv.NewStream( + // Memo and payreq. + tlv.MakePrimitiveRecord(memoType, &i.Memo), + tlv.MakePrimitiveRecord(payReqType, &i.PaymentRequest), + + // Add/settle metadata. + tlv.MakePrimitiveRecord(createTimeType, &creationDateBytes), + tlv.MakePrimitiveRecord(settleTimeType, &settleDateBytes), + tlv.MakePrimitiveRecord(addIndexType, &i.AddIndex), + tlv.MakePrimitiveRecord(settleIndexType, &i.SettleIndex), + + // Terms. + tlv.MakePrimitiveRecord(preimageType, &preimage), + tlv.MakePrimitiveRecord(valueType, &value), + tlv.MakePrimitiveRecord(cltvDeltaType, &cltvDelta), + tlv.MakePrimitiveRecord(expiryType, &expiry), + tlv.MakePrimitiveRecord(paymentAddrType, &i.Terms.PaymentAddr), + tlv.MakePrimitiveRecord(featuresType, &featureBytes), + + // Invoice state. + tlv.MakePrimitiveRecord(invStateType, &state), + tlv.MakePrimitiveRecord(amtPaidType, &amtPaid), + ) if err != nil { - return invoice, err - } - invoice.Receipt, err = wire.ReadVarBytes(r, 0, MaxReceiptSize, "") - if err != nil { - return invoice, err + return i, err } - invoice.PaymentRequest, err = wire.ReadVarBytes(r, 0, MaxPaymentRequestSize, "") + var bodyLen int64 + err = binary.Read(r, byteOrder, &bodyLen) if err != nil { - return invoice, err + return i, err } - if err := binary.Read(r, byteOrder, &invoice.FinalCltvDelta); err != nil { - return invoice, err + lr := io.LimitReader(r, bodyLen) + if err = tlvStream.Decode(lr); err != nil { + return i, err } - var expiry int64 - if err := binary.Read(r, byteOrder, &expiry); err != nil { - return invoice, err - } - invoice.Expiry = time.Duration(expiry) + i.Terms.PaymentPreimage = lntypes.Preimage(preimage) + i.Terms.Value = lnwire.MilliSatoshi(value) + i.FinalCltvDelta = int32(cltvDelta) + i.Expiry = time.Duration(expiry) + i.AmtPaid = lnwire.MilliSatoshi(amtPaid) + i.Terms.State = ContractState(state) - birthBytes, err := wire.ReadVarBytes(r, 0, 300, "birth") + err = i.CreationDate.UnmarshalBinary(creationDateBytes) if err != nil { - return invoice, err - } - if err := invoice.CreationDate.UnmarshalBinary(birthBytes); err != nil { - return invoice, err + return i, err } - settledBytes, err := wire.ReadVarBytes(r, 0, 300, "settled") + err = i.SettleDate.UnmarshalBinary(settleDateBytes) if err != nil { - return invoice, err - } - if err := invoice.SettleDate.UnmarshalBinary(settledBytes); err != nil { - return invoice, err + return i, err } - if _, err := io.ReadFull(r, invoice.Terms.PaymentPreimage[:]); err != nil { - return invoice, err - } - var scratch [8]byte - if _, err := io.ReadFull(r, scratch[:]); err != nil { - return invoice, err - } - invoice.Terms.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:])) - - if err := binary.Read(r, byteOrder, &invoice.Terms.State); err != nil { - return invoice, err - } - - if err := binary.Read(r, byteOrder, &invoice.AddIndex); err != nil { - return invoice, err - } - if err := binary.Read(r, byteOrder, &invoice.SettleIndex); err != nil { - return invoice, err - } - if err := binary.Read(r, byteOrder, &invoice.AmtPaid); err != nil { - return invoice, err - } - - invoice.Htlcs, err = deserializeHtlcs(r) + rawFeatures := lnwire.NewRawFeatureVector() + err = rawFeatures.DecodeBase256( + bytes.NewReader(featureBytes), len(featureBytes), + ) if err != nil { - return Invoice{}, err + return i, err } - return invoice, nil + i.Terms.Features = lnwire.NewFeatureVector( + rawFeatures, lnwire.Features, + ) + + i.Htlcs, err = deserializeHtlcs(r) + return i, err } // deserializeHtlcs reads a list of invoice htlcs from a reader and returns it @@ -1134,7 +1166,7 @@ func deserializeHtlcs(r io.Reader) (map[CircuitKey]*InvoiceHTLC, error) { tlv.MakePrimitiveRecord(acceptTimeType, &acceptTime), tlv.MakePrimitiveRecord(resolveTimeType, &resolveTime), tlv.MakePrimitiveRecord(expiryHeightType, &htlc.Expiry), - tlv.MakePrimitiveRecord(stateType, &state), + tlv.MakePrimitiveRecord(htlcStateType, &state), ) if err != nil { return nil, err @@ -1167,9 +1199,9 @@ func copySlice(src []byte) []byte { func copyInvoice(src *Invoice) *Invoice { dest := Invoice{ Memo: copySlice(src.Memo), - Receipt: copySlice(src.Receipt), PaymentRequest: copySlice(src.PaymentRequest), FinalCltvDelta: src.FinalCltvDelta, + Expiry: src.Expiry, CreationDate: src.CreationDate, SettleDate: src.SettleDate, Terms: src.Terms, @@ -1181,6 +1213,8 @@ func copyInvoice(src *Invoice) *Invoice { ), } + dest.Terms.Features = src.Terms.Features.Clone() + for k, v := range src.Htlcs { dest.Htlcs[k] = v } @@ -1202,10 +1236,10 @@ func (d *DB) updateInvoice(hash lntypes.Hash, invoices, settleIndex *bbolt.Bucke // Create deep copy to prevent any accidental modification in the // callback. - copy := copyInvoice(&invoice) + invoiceCopy := copyInvoice(&invoice) // Call the callback and obtain the update descriptor. - update, err := callback(copy) + update, err := callback(invoiceCopy) if err != nil { return &invoice, err } diff --git a/channeldb/log.go b/channeldb/log.go index 30ddff03b43e..5229edbfbf9e 100644 --- a/channeldb/log.go +++ b/channeldb/log.go @@ -3,6 +3,7 @@ package channeldb import ( "github.com/btcsuite/btclog" "github.com/lightningnetwork/lnd/build" + "github.com/lightningnetwork/lnd/channeldb/migration12" "github.com/lightningnetwork/lnd/channeldb/migration_01_to_11" ) @@ -27,4 +28,5 @@ func DisableLog() { func UseLogger(logger btclog.Logger) { log = logger migration_01_to_11.UseLogger(logger) + migration12.UseLogger(logger) } diff --git a/htlcswitch/test_utils.go b/htlcswitch/test_utils.go index 44085f90df22..4f6d02ebf1f6 100644 --- a/htlcswitch/test_utils.go +++ b/htlcswitch/test_utils.go @@ -562,6 +562,9 @@ func generatePaymentWithPreimage(invoiceAmt, htlcAmt lnwire.MilliSatoshi, Terms: channeldb.ContractTerm{ Value: invoiceAmt, PaymentPreimage: preimage, + Features: lnwire.NewFeatureVector( + nil, lnwire.Features, + ), }, FinalCltvDelta: testInvoiceCltvExpiry, } diff --git a/invoices/invoiceregistry_test.go b/invoices/invoiceregistry_test.go index a137963e0ef3..51270354a3f2 100644 --- a/invoices/invoiceregistry_test.go +++ b/invoices/invoiceregistry_test.go @@ -28,6 +28,10 @@ var ( testFinalCltvRejectDelta = int32(4) testCurrentHeight = int32(1) + + testFeatures = lnwire.NewFeatureVector( + nil, lnwire.Features, + ) ) var ( @@ -35,6 +39,15 @@ var ( Terms: channeldb.ContractTerm{ PaymentPreimage: preimage, Value: lnwire.MilliSatoshi(100000), + Features: testFeatures, + }, + } + + testHodlInvoice = &channeldb.Invoice{ + Terms: channeldb.ContractTerm{ + PaymentPreimage: channeldb.UnknownPreimage, + Value: lnwire.MilliSatoshi(100000), + Features: testFeatures, }, } ) @@ -382,14 +395,7 @@ func TestSettleHoldInvoice(t *testing.T) { } // Add the invoice. - invoice := &channeldb.Invoice{ - Terms: channeldb.ContractTerm{ - PaymentPreimage: channeldb.UnknownPreimage, - Value: lnwire.MilliSatoshi(100000), - }, - } - - _, err = registry.AddInvoice(invoice, hash) + _, err = registry.AddInvoice(testHodlInvoice, hash) if err != nil { t.Fatal(err) } @@ -543,14 +549,7 @@ func TestCancelHoldInvoice(t *testing.T) { defer registry.Stop() // Add the invoice. - invoice := &channeldb.Invoice{ - Terms: channeldb.ContractTerm{ - PaymentPreimage: channeldb.UnknownPreimage, - Value: lnwire.MilliSatoshi(100000), - }, - } - - _, err = registry.AddInvoice(invoice, hash) + _, err = registry.AddInvoice(testHodlInvoice, hash) if err != nil { t.Fatal(err) } diff --git a/lnrpc/invoicesrpc/addinvoice.go b/lnrpc/invoicesrpc/addinvoice.go index da613808387d..70955e0f2ded 100644 --- a/lnrpc/invoicesrpc/addinvoice.go +++ b/lnrpc/invoicesrpc/addinvoice.go @@ -363,6 +363,13 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, } + // Set a blank feature vector, as our invoice generation forbids nil + // features. + invoiceFeatures := lnwire.NewFeatureVector( + lnwire.NewRawFeatureVector(), lnwire.Features, + ) + options = append(options, zpay32.Features(invoiceFeatures)) + // Create and encode the payment request as a bech32 (zpay32) string. creationDate := time.Now() payReq, err := zpay32.NewInvoice( @@ -390,6 +397,7 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, Terms: channeldb.ContractTerm{ Value: amtMSat, PaymentPreimage: paymentPreimage, + Features: invoiceFeatures, }, } diff --git a/lnwire/features.go b/lnwire/features.go index 7900a9b389e1..c9a60b5b3ecc 100644 --- a/lnwire/features.go +++ b/lnwire/features.go @@ -371,3 +371,10 @@ func (fv *FeatureVector) isFeatureBitPair(bit FeatureBit) bool { name2, known2 := fv.featureNames[bit^1] return known1 && known2 && name1 == name2 } + +// Clone copies a feature vector, carrying over its feature bits. The feature +// names are not copied. +func (fv *FeatureVector) Clone() *FeatureVector { + features := fv.RawFeatureVector.Clone() + return NewFeatureVector(features, fv.featureNames) +} diff --git a/zpay32/invoice.go b/zpay32/invoice.go index 4e7210f76b22..d36b31ca4306 100644 --- a/zpay32/invoice.go +++ b/zpay32/invoice.go @@ -242,6 +242,14 @@ func RouteHint(routeHint []HopHint) func(*Invoice) { } } +// Features is a functional option that allows callers of NewInvoice to set the +// desired feature bits that are advertised on the invoice. +func Features(features *lnwire.FeatureVector) func(*Invoice) { + return func(i *Invoice) { + i.Features = features + } +} + // NewInvoice creates a new Invoice object. The last parameter is a set of // variadic arguments for setting optional fields of the invoice. // From e77ef43d33d65bdb909f93d509f006fe7dd70b8f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:36:24 -0800 Subject: [PATCH 07/25] channeldb/invoices: optimize deserializeHtlcs Instead of allocating a byte slice to read in each htlc's raw TLV stream, use a LimitReader to truncate the stream to the proper length. --- channeldb/invoices.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/channeldb/invoices.go b/channeldb/invoices.go index 1f17d5f3b97b..eaedd178123a 100644 --- a/channeldb/invoices.go +++ b/channeldb/invoices.go @@ -1132,7 +1132,7 @@ func deserializeHtlcs(r io.Reader) (map[CircuitKey]*InvoiceHTLC, error) { for { // Read the length of the tlv stream for this htlc. - var streamLen uint64 + var streamLen int64 if err := binary.Read(r, byteOrder, &streamLen); err != nil { if err == io.EOF { break @@ -1141,11 +1141,9 @@ func deserializeHtlcs(r io.Reader) (map[CircuitKey]*InvoiceHTLC, error) { return nil, err } - streamBytes := make([]byte, streamLen) - if _, err := r.Read(streamBytes); err != nil { - return nil, err - } - streamReader := bytes.NewReader(streamBytes) + // Limit the reader so that it stops at the end of this htlc's + // stream. + htlcReader := io.LimitReader(r, streamLen) // Decode the contents into the htlc fields. var ( @@ -1172,7 +1170,7 @@ func deserializeHtlcs(r io.Reader) (map[CircuitKey]*InvoiceHTLC, error) { return nil, err } - if err := tlvStream.Decode(streamReader); err != nil { + if err := tlvStream.Decode(htlcReader); err != nil { return nil, err } From 7cc3281221a045ca0228f3a3b1a42ad043f227f3 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 18:36:41 -0800 Subject: [PATCH 08/25] multi: restructure invoice Terms field This commit restructures an invoice's ContractTerms to better encompass the restrictions placed on settling. For instance, the final ctlv delta and invoice expiry are moved from the main invoice body (where additional metadata is stored). Additionally, it moves the State field outside of the terms since it is rather metadata about the invoice instead of any terms offered to the sender in the payment request. --- channeldb/invoice_test.go | 10 +++---- channeldb/invoices.go | 49 ++++++++++++++++---------------- htlcswitch/link_test.go | 16 +++++------ htlcswitch/test_utils.go | 2 +- invoices/invoiceregistry.go | 24 ++++++++-------- invoices/invoiceregistry_test.go | 48 +++++++++++++++---------------- lnrpc/invoicesrpc/addinvoice.go | 4 +-- lnrpc/invoicesrpc/utils.go | 10 +++---- 8 files changed, 81 insertions(+), 82 deletions(-) diff --git a/channeldb/invoice_test.go b/channeldb/invoice_test.go index e109d387b9bf..46687e25ce6a 100644 --- a/channeldb/invoice_test.go +++ b/channeldb/invoice_test.go @@ -25,12 +25,12 @@ func randInvoice(value lnwire.MilliSatoshi) (*Invoice, error) { // failures due to the monotonic time component. CreationDate: time.Unix(time.Now().Unix(), 0), Terms: ContractTerm{ + Expiry: 4000, PaymentPreimage: pre, Value: value, Features: emptyFeatures, }, - Htlcs: map[CircuitKey]*InvoiceHTLC{}, - Expiry: 4000, + Htlcs: map[CircuitKey]*InvoiceHTLC{}, } i.Memo = []byte("memo") @@ -114,7 +114,7 @@ func TestInvoiceWorkflow(t *testing.T) { if err != nil { t.Fatalf("unable to fetch invoice: %v", err) } - if dbInvoice2.Terms.State != ContractSettled { + if dbInvoice2.State != ContractSettled { t.Fatalf("invoice should now be settled but isn't") } if dbInvoice2.SettleDate.IsZero() { @@ -363,7 +363,7 @@ func TestDuplicateSettleInvoice(t *testing.T) { // We'll update what we expect the settle invoice to be so that our // comparison below has the correct assumption. invoice.SettleIndex = 1 - invoice.Terms.State = ContractSettled + invoice.State = ContractSettled invoice.AmtPaid = amt invoice.SettleDate = dbInvoice.SettleDate invoice.Htlcs = map[CircuitKey]*InvoiceHTLC{ @@ -679,7 +679,7 @@ func TestQueryInvoices(t *testing.T) { // settles the invoice with the given amount. func getUpdateInvoice(amt lnwire.MilliSatoshi) InvoiceUpdateCallback { return func(invoice *Invoice) (*InvoiceUpdateDesc, error) { - if invoice.Terms.State == ContractSettled { + if invoice.State == ContractSettled { return nil, ErrInvoiceAlreadySettled } diff --git a/channeldb/invoices.go b/channeldb/invoices.go index eaedd178123a..d06ef46a72a1 100644 --- a/channeldb/invoices.go +++ b/channeldb/invoices.go @@ -166,6 +166,13 @@ func (c ContractState) String() string { // the necessary conditions required before the invoice can be considered fully // settled by the payee. type ContractTerm struct { + // FinalCltvDelta is the minimum required number of blocks before htlc + // expiry when the invoice is accepted. + FinalCltvDelta int32 + + // Expiry defines how long after creation this invoice should expire. + Expiry time.Duration + // PaymentPreimage is the preimage which is to be revealed in the // occasion that an HTLC paying to the hash of this preimage is // extended. @@ -175,9 +182,6 @@ type ContractTerm struct { // which can be satisfied by the above preimage. Value lnwire.MilliSatoshi - // State describes the state the invoice is in. - State ContractState - // PaymentAddr is a randomly generated value include in the MPP record // by the sender to prevent probing of the receiver. PaymentAddr [32]byte @@ -206,13 +210,6 @@ type Invoice struct { // for this invoice can be stored. PaymentRequest []byte - // FinalCltvDelta is the minimum required number of blocks before htlc - // expiry when the invoice is accepted. - FinalCltvDelta int32 - - // Expiry defines how long after creation this invoice should expire. - Expiry time.Duration - // CreationDate is the exact time the invoice was created. CreationDate time.Time @@ -245,6 +242,9 @@ type Invoice struct { // NOTE: This index starts at 1. SettleIndex uint64 + // State describes the state the invoice is in. + State ContractState + // AmtPaid is the final amount that we ultimately accepted for pay for // this invoice. We specify this value independently as it's possible // that the invoice originally didn't specify an amount, or the sender @@ -552,7 +552,7 @@ func (d *DB) FetchAllInvoices(pendingOnly bool) ([]Invoice, error) { } if pendingOnly && - invoice.Terms.State == ContractSettled { + invoice.State == ContractSettled { return nil } @@ -702,7 +702,7 @@ func (d *DB) QueryInvoices(q InvoiceQuery) (InvoiceSlice, error) { // Skip any settled invoices if the caller is only // interested in unsettled. if q.PendingOnly && - invoice.Terms.State == ContractSettled { + invoice.State == ContractSettled { continue } @@ -931,11 +931,11 @@ func serializeInvoice(w io.Writer, i *Invoice) error { preimage := [32]byte(i.Terms.PaymentPreimage) value := uint64(i.Terms.Value) - cltvDelta := uint32(i.FinalCltvDelta) - expiry := uint64(i.Expiry) + cltvDelta := uint32(i.Terms.FinalCltvDelta) + expiry := uint64(i.Terms.Expiry) amtPaid := uint64(i.AmtPaid) - state := uint8(i.Terms.State) + state := uint8(i.State) tlvStream, err := tlv.NewStream( // Memo and payreq. @@ -1094,10 +1094,10 @@ func deserializeInvoice(r io.Reader) (Invoice, error) { i.Terms.PaymentPreimage = lntypes.Preimage(preimage) i.Terms.Value = lnwire.MilliSatoshi(value) - i.FinalCltvDelta = int32(cltvDelta) - i.Expiry = time.Duration(expiry) + i.Terms.FinalCltvDelta = int32(cltvDelta) + i.Terms.Expiry = time.Duration(expiry) i.AmtPaid = lnwire.MilliSatoshi(amtPaid) - i.Terms.State = ContractState(state) + i.State = ContractState(state) err = i.CreationDate.UnmarshalBinary(creationDateBytes) if err != nil { @@ -1198,13 +1198,12 @@ func copyInvoice(src *Invoice) *Invoice { dest := Invoice{ Memo: copySlice(src.Memo), PaymentRequest: copySlice(src.PaymentRequest), - FinalCltvDelta: src.FinalCltvDelta, - Expiry: src.Expiry, CreationDate: src.CreationDate, SettleDate: src.SettleDate, Terms: src.Terms, AddIndex: src.AddIndex, SettleIndex: src.SettleIndex, + State: src.State, AmtPaid: src.AmtPaid, Htlcs: make( map[CircuitKey]*InvoiceHTLC, len(src.Htlcs), @@ -1230,7 +1229,7 @@ func (d *DB) updateInvoice(hash lntypes.Hash, invoices, settleIndex *bbolt.Bucke return nil, err } - preUpdateState := invoice.Terms.State + preUpdateState := invoice.State // Create deep copy to prevent any accidental modification in the // callback. @@ -1243,7 +1242,7 @@ func (d *DB) updateInvoice(hash lntypes.Hash, invoices, settleIndex *bbolt.Bucke } // Update invoice state. - invoice.Terms.State = update.State + invoice.State = update.State now := d.now() @@ -1291,8 +1290,8 @@ func (d *DB) updateInvoice(hash lntypes.Hash, invoices, settleIndex *bbolt.Bucke // If invoice moved to the settled state, update settle index and settle // time. - if preUpdateState != invoice.Terms.State && - invoice.Terms.State == ContractSettled { + if preUpdateState != invoice.State && + invoice.State == ContractSettled { if update.Preimage.Hash() != hash { return nil, fmt.Errorf("preimage does not match") @@ -1344,7 +1343,7 @@ func setSettleFields(settleIndex *bbolt.Bucket, invoiceNum []byte, return err } - invoice.Terms.State = ContractSettled + invoice.State = ContractSettled invoice.SettleDate = now invoice.SettleIndex = nextSettleSeqNo diff --git a/htlcswitch/link_test.go b/htlcswitch/link_test.go index 06613aa1a52d..810b5831769a 100644 --- a/htlcswitch/link_test.go +++ b/htlcswitch/link_test.go @@ -245,7 +245,7 @@ func TestChannelLinkSingleHopPayment(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State != channeldb.ContractSettled { + if invoice.State != channeldb.ContractSettled { t.Fatal("alice invoice wasn't settled") } @@ -505,7 +505,7 @@ func testChannelLinkMultiHopPayment(t *testing.T, if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State != channeldb.ContractSettled { + if invoice.State != channeldb.ContractSettled { t.Fatal("carol invoice haven't been settled") } @@ -919,7 +919,7 @@ func TestUpdateForwardingPolicy(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State != channeldb.ContractSettled { + if invoice.State != channeldb.ContractSettled { t.Fatal("carol invoice haven't been settled") } @@ -1078,7 +1078,7 @@ func TestChannelLinkMultiHopInsufficientPayment(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State == channeldb.ContractSettled { + if invoice.State == channeldb.ContractSettled { t.Fatal("carol invoice have been settled") } @@ -1269,7 +1269,7 @@ func TestChannelLinkMultiHopUnknownNextHop(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State == channeldb.ContractSettled { + if invoice.State == channeldb.ContractSettled { t.Fatal("carol invoice have been settled") } @@ -1384,7 +1384,7 @@ func TestChannelLinkMultiHopDecodeError(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State == channeldb.ContractSettled { + if invoice.State == channeldb.ContractSettled { t.Fatal("carol invoice have been settled") } @@ -3518,7 +3518,7 @@ func TestChannelRetransmission(t *testing.T) { err = errors.Errorf("unable to get invoice: %v", err) continue } - if invoice.Terms.State != channeldb.ContractSettled { + if invoice.State != channeldb.ContractSettled { err = errors.Errorf("alice invoice haven't been settled") continue } @@ -4055,7 +4055,7 @@ func TestChannelLinkAcceptOverpay(t *testing.T) { if err != nil { t.Fatalf("unable to get invoice: %v", err) } - if invoice.Terms.State != channeldb.ContractSettled { + if invoice.State != channeldb.ContractSettled { t.Fatal("carol invoice haven't been settled") } diff --git a/htlcswitch/test_utils.go b/htlcswitch/test_utils.go index 4f6d02ebf1f6..1308bf79001d 100644 --- a/htlcswitch/test_utils.go +++ b/htlcswitch/test_utils.go @@ -560,13 +560,13 @@ func generatePaymentWithPreimage(invoiceAmt, htlcAmt lnwire.MilliSatoshi, invoice := &channeldb.Invoice{ CreationDate: time.Now(), Terms: channeldb.ContractTerm{ + FinalCltvDelta: testInvoiceCltvExpiry, Value: invoiceAmt, PaymentPreimage: preimage, Features: lnwire.NewFeatureVector( nil, lnwire.Features, ), }, - FinalCltvDelta: testInvoiceCltvExpiry, } htlc := &lnwire.UpdateAddHTLC{ diff --git a/invoices/invoiceregistry.go b/invoices/invoiceregistry.go index 61f0feaf2bc5..51b57c091d2e 100644 --- a/invoices/invoiceregistry.go +++ b/invoices/invoiceregistry.go @@ -179,7 +179,7 @@ func (i *InvoiceRegistry) invoiceEventNotifier() { // For backwards compatibility, do not notify // all invoice subscribers of cancel and accept // events. - state := e.invoice.Terms.State + state := e.invoice.State if state != channeldb.ContractCanceled && state != channeldb.ContractAccepted { @@ -231,7 +231,7 @@ func (i *InvoiceRegistry) dispatchToClients(event *invoiceEvent) { // ensure we don't duplicate any events. // TODO(joostjager): Refactor switches. - state := event.invoice.Terms.State + state := event.invoice.State switch { // If we've already sent this settle event to // the client, then we can skip this. @@ -277,14 +277,14 @@ func (i *InvoiceRegistry) dispatchToClients(event *invoiceEvent) { // the latest add/settle index it has. We'll use this to ensure // we don't send a notification twice, which can happen if a new // event is added while we're catching up a new client. - switch event.invoice.Terms.State { + switch event.invoice.State { case channeldb.ContractSettled: client.settleIndex = invoice.SettleIndex case channeldb.ContractOpen: client.addIndex = invoice.AddIndex default: log.Errorf("unexpected invoice state: %v", - event.invoice.Terms.State) + event.invoice.State) } } } @@ -467,7 +467,7 @@ func (i *InvoiceRegistry) NotifyExitHopHtlc(rHash lntypes.Hash, // If the invoice is already canceled, there is no further // checking to do. - if inv.Terms.State == channeldb.ContractCanceled { + if inv.State == channeldb.ContractCanceled { debugLog("invoice already canceled") return nil, errNoUpdate } @@ -486,7 +486,7 @@ func (i *InvoiceRegistry) NotifyExitHopHtlc(rHash lntypes.Hash, return nil, errNoUpdate } - if expiry < uint32(currentHeight+inv.FinalCltvDelta) { + if expiry < uint32(currentHeight+inv.Terms.FinalCltvDelta) { debugLog("expiry too soon") return nil, errNoUpdate } @@ -506,7 +506,7 @@ func (i *InvoiceRegistry) NotifyExitHopHtlc(rHash lntypes.Hash, // Don't update invoice state if we are accepting a duplicate // payment. We do accept or settle the HTLC. - switch inv.Terms.State { + switch inv.State { case channeldb.ContractAccepted: debugLog("accepting duplicate payment to accepted invoice") update.State = channeldb.ContractAccepted @@ -546,7 +546,7 @@ func (i *InvoiceRegistry) NotifyExitHopHtlc(rHash lntypes.Hash, } if updateSubscribers { - i.notifyClients(rHash, invoice, invoice.Terms.State) + i.notifyClients(rHash, invoice, invoice.State) } // Inspect latest htlc state on the invoice. @@ -597,7 +597,7 @@ func (i *InvoiceRegistry) SettleHodlInvoice(preimage lntypes.Preimage) error { updateInvoice := func(invoice *channeldb.Invoice) ( *channeldb.InvoiceUpdateDesc, error) { - switch invoice.Terms.State { + switch invoice.State { case channeldb.ContractOpen: return nil, channeldb.ErrInvoiceStillOpen case channeldb.ContractCanceled: @@ -639,7 +639,7 @@ func (i *InvoiceRegistry) SettleHodlInvoice(preimage lntypes.Preimage) error { AcceptHeight: int32(htlc.AcceptHeight), }) } - i.notifyClients(hash, invoice, invoice.Terms.State) + i.notifyClients(hash, invoice, invoice.State) return nil } @@ -655,7 +655,7 @@ func (i *InvoiceRegistry) CancelInvoice(payHash lntypes.Hash) error { updateInvoice := func(invoice *channeldb.Invoice) ( *channeldb.InvoiceUpdateDesc, error) { - switch invoice.Terms.State { + switch invoice.State { case channeldb.ContractSettled: return nil, channeldb.ErrInvoiceAlreadySettled case channeldb.ContractCanceled: @@ -868,7 +868,7 @@ func (i *InvoiceRegistry) SubscribeNotifications(addIndex, settleIndex uint64) * invoiceEvent := ntfn.(*invoiceEvent) var targetChan chan *channeldb.Invoice - state := invoiceEvent.invoice.Terms.State + state := invoiceEvent.invoice.State switch state { case channeldb.ContractOpen: targetChan = client.NewInvoices diff --git a/invoices/invoiceregistry_test.go b/invoices/invoiceregistry_test.go index 51270354a3f2..9e6fc62a42c8 100644 --- a/invoices/invoiceregistry_test.go +++ b/invoices/invoiceregistry_test.go @@ -115,9 +115,9 @@ func TestSettleInvoice(t *testing.T) { // We expect the open state to be sent to the single invoice subscriber. select { case update := <-subscription.Updates: - if update.Terms.State != channeldb.ContractOpen { + if update.State != channeldb.ContractOpen { t.Fatalf("expected state ContractOpen, but got %v", - update.Terms.State) + update.State) } case <-time.After(testTimeout): t.Fatal("no update received") @@ -126,9 +126,9 @@ func TestSettleInvoice(t *testing.T) { // We expect a new invoice notification to be sent out. select { case newInvoice := <-allSubscriptions.NewInvoices: - if newInvoice.Terms.State != channeldb.ContractOpen { + if newInvoice.State != channeldb.ContractOpen { t.Fatalf("expected state ContractOpen, but got %v", - newInvoice.Terms.State) + newInvoice.State) } case <-time.After(testTimeout): t.Fatal("no update received") @@ -167,9 +167,9 @@ func TestSettleInvoice(t *testing.T) { // subscriber. select { case update := <-subscription.Updates: - if update.Terms.State != channeldb.ContractSettled { + if update.State != channeldb.ContractSettled { t.Fatalf("expected state ContractOpen, but got %v", - update.Terms.State) + update.State) } if update.AmtPaid != amtPaid { t.Fatal("invoice AmtPaid incorrect") @@ -181,9 +181,9 @@ func TestSettleInvoice(t *testing.T) { // We expect a settled notification to be sent out. select { case settledInvoice := <-allSubscriptions.SettledInvoices: - if settledInvoice.Terms.State != channeldb.ContractSettled { + if settledInvoice.State != channeldb.ContractSettled { t.Fatalf("expected state ContractOpen, but got %v", - settledInvoice.Terms.State) + settledInvoice.State) } case <-time.After(testTimeout): t.Fatal("no update received") @@ -288,10 +288,10 @@ func TestCancelInvoice(t *testing.T) { // We expect the open state to be sent to the single invoice subscriber. select { case update := <-subscription.Updates: - if update.Terms.State != channeldb.ContractOpen { + if update.State != channeldb.ContractOpen { t.Fatalf( "expected state ContractOpen, but got %v", - update.Terms.State, + update.State, ) } case <-time.After(testTimeout): @@ -301,10 +301,10 @@ func TestCancelInvoice(t *testing.T) { // We expect a new invoice notification to be sent out. select { case newInvoice := <-allSubscriptions.NewInvoices: - if newInvoice.Terms.State != channeldb.ContractOpen { + if newInvoice.State != channeldb.ContractOpen { t.Fatalf( "expected state ContractOpen, but got %v", - newInvoice.Terms.State, + newInvoice.State, ) } case <-time.After(testTimeout): @@ -321,10 +321,10 @@ func TestCancelInvoice(t *testing.T) { // subscriber. select { case update := <-subscription.Updates: - if update.Terms.State != channeldb.ContractCanceled { + if update.State != channeldb.ContractCanceled { t.Fatalf( "expected state ContractCanceled, but got %v", - update.Terms.State, + update.State, ) } case <-time.After(testTimeout): @@ -402,16 +402,16 @@ func TestSettleHoldInvoice(t *testing.T) { // We expect the open state to be sent to the single invoice subscriber. update := <-subscription.Updates - if update.Terms.State != channeldb.ContractOpen { + if update.State != channeldb.ContractOpen { t.Fatalf("expected state ContractOpen, but got %v", - update.Terms.State) + update.State) } // We expect a new invoice notification to be sent out. newInvoice := <-allSubscriptions.NewInvoices - if newInvoice.Terms.State != channeldb.ContractOpen { + if newInvoice.State != channeldb.ContractOpen { t.Fatalf("expected state ContractOpen, but got %v", - newInvoice.Terms.State) + newInvoice.State) } // Use slightly higher amount for accept/settle. @@ -474,9 +474,9 @@ func TestSettleHoldInvoice(t *testing.T) { // subscriber. For all invoice subscribers, we don't expect an update. // Those only get notified on settle. update = <-subscription.Updates - if update.Terms.State != channeldb.ContractAccepted { + if update.State != channeldb.ContractAccepted { t.Fatalf("expected state ContractAccepted, but got %v", - update.Terms.State) + update.State) } if update.AmtPaid != amtPaid { t.Fatal("invoice AmtPaid incorrect") @@ -500,9 +500,9 @@ func TestSettleHoldInvoice(t *testing.T) { // We expect a settled notification to be sent out for both all and // single invoice subscribers. settledInvoice := <-allSubscriptions.SettledInvoices - if settledInvoice.Terms.State != channeldb.ContractSettled { + if settledInvoice.State != channeldb.ContractSettled { t.Fatalf("expected state ContractSettled, but got %v", - settledInvoice.Terms.State) + settledInvoice.State) } if settledInvoice.AmtPaid != amtPaid { t.Fatalf("expected amount to be %v, but got %v", @@ -510,9 +510,9 @@ func TestSettleHoldInvoice(t *testing.T) { } update = <-subscription.Updates - if update.Terms.State != channeldb.ContractSettled { + if update.State != channeldb.ContractSettled { t.Fatalf("expected state ContractSettled, but got %v", - update.Terms.State) + update.State) } // Idempotency. diff --git a/lnrpc/invoicesrpc/addinvoice.go b/lnrpc/invoicesrpc/addinvoice.go index 70955e0f2ded..e99e94179ec2 100644 --- a/lnrpc/invoicesrpc/addinvoice.go +++ b/lnrpc/invoicesrpc/addinvoice.go @@ -392,9 +392,9 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, CreationDate: creationDate, Memo: []byte(invoice.Memo), PaymentRequest: []byte(payReqString), - FinalCltvDelta: int32(payReq.MinFinalCLTVExpiry()), - Expiry: payReq.Expiry(), Terms: channeldb.ContractTerm{ + FinalCltvDelta: int32(payReq.MinFinalCLTVExpiry()), + Expiry: payReq.Expiry(), Value: amtMSat, PaymentPreimage: paymentPreimage, Features: invoiceFeatures, diff --git a/lnrpc/invoicesrpc/utils.go b/lnrpc/invoicesrpc/utils.go index a12cc8589ada..7e56d17e026c 100644 --- a/lnrpc/invoicesrpc/utils.go +++ b/lnrpc/invoicesrpc/utils.go @@ -43,10 +43,10 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, satAmt := invoice.Terms.Value.ToSatoshis() satAmtPaid := invoice.AmtPaid.ToSatoshis() - isSettled := invoice.Terms.State == channeldb.ContractSettled + isSettled := invoice.State == channeldb.ContractSettled var state lnrpc.Invoice_InvoiceState - switch invoice.Terms.State { + switch invoice.State { case channeldb.ContractOpen: state = lnrpc.Invoice_OPEN case channeldb.ContractSettled: @@ -57,7 +57,7 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, state = lnrpc.Invoice_ACCEPTED default: return nil, fmt.Errorf("unknown invoice state %v", - invoice.Terms.State) + invoice.State) } rpcHtlcs := make([]*lnrpc.InvoiceHTLC, 0, len(invoice.Htlcs)) @@ -102,8 +102,8 @@ func CreateRPCInvoice(invoice *channeldb.Invoice, Settled: isSettled, PaymentRequest: paymentRequest, DescriptionHash: descHash, - Expiry: int64(invoice.Expiry.Seconds()), - CltvExpiry: uint64(invoice.FinalCltvDelta), + Expiry: int64(invoice.Terms.Expiry.Seconds()), + CltvExpiry: uint64(invoice.Terms.FinalCltvDelta), FallbackAddr: fallbackAddr, RouteHints: routeHints, AddIndex: invoice.AddIndex, From 1692a7e19d856659d1472ceb3ab0e13846de1c24 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:02:54 -0800 Subject: [PATCH 09/25] lnwire/feature: remove feature bit number from name The number and the name will be separate on the rpc level, so we remove the featire bit from the string. Currently this method is unused apart from maybe in some rare logging instances. --- lnwire/features.go | 7 +++---- lnwire/features_test.go | 16 ++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lnwire/features.go b/lnwire/features.go index c9a60b5b3ecc..79beef64453e 100644 --- a/lnwire/features.go +++ b/lnwire/features.go @@ -3,7 +3,6 @@ package lnwire import ( "encoding/binary" "errors" - "fmt" "io" ) @@ -349,10 +348,10 @@ func (fv *FeatureVector) UnknownRequiredFeatures() []FeatureBit { // as much. func (fv *FeatureVector) Name(bit FeatureBit) string { name, known := fv.featureNames[bit] - if !known { - name = "unknown" + if known { + return name } - return fmt.Sprintf("%s(%d)", name, bit) + return "unknown" } // IsKnown returns whether this feature bit represents a known feature. diff --git a/lnwire/features_test.go b/lnwire/features_test.go index 6a80bb8331c8..cff76ec1b8a6 100644 --- a/lnwire/features_test.go +++ b/lnwire/features_test.go @@ -205,42 +205,42 @@ func TestFeatureNames(t *testing.T) { }{ { bit: 0, - expectedName: "feature1(0)", + expectedName: "feature1", expectedKnown: true, }, { bit: 1, - expectedName: "unknown(1)", + expectedName: "unknown", expectedKnown: false, }, { bit: 2, - expectedName: "unknown(2)", + expectedName: "unknown", expectedKnown: false, }, { bit: 3, - expectedName: "feature2(3)", + expectedName: "feature2", expectedKnown: true, }, { bit: 4, - expectedName: "feature3(4)", + expectedName: "feature3", expectedKnown: true, }, { bit: 5, - expectedName: "feature3(5)", + expectedName: "feature3", expectedKnown: true, }, { bit: 6, - expectedName: "unknown(6)", + expectedName: "unknown", expectedKnown: false, }, { bit: 7, - expectedName: "unknown(7)", + expectedName: "unknown", expectedKnown: false, }, } From 90053fb0ab55fa1d1ee5f8da54c3b489711bb6f4 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:03:09 -0800 Subject: [PATCH 10/25] lnrpc: add feature bits to PayReq --- lnrpc/rpc.pb.go | 1203 +++++++++++++++++++++------------------- lnrpc/rpc.proto | 7 + lnrpc/rpc.swagger.json | 22 + 3 files changed, 664 insertions(+), 568 deletions(-) diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index ece77c69e7d5..8bf807b9befc 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -8134,6 +8134,7 @@ type PayReq struct { FallbackAddr string `protobuf:"bytes,8,opt,name=fallback_addr,proto3" json:"fallback_addr,omitempty"` CltvExpiry int64 `protobuf:"varint,9,opt,name=cltv_expiry,proto3" json:"cltv_expiry,omitempty"` RouteHints []*RouteHint `protobuf:"bytes,10,rep,name=route_hints,proto3" json:"route_hints,omitempty"` + Features []*Feature `protobuf:"bytes,11,rep,name=features,proto3" json:"features,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -8234,6 +8235,68 @@ func (m *PayReq) GetRouteHints() []*RouteHint { return nil } +func (m *PayReq) GetFeatures() []*Feature { + if m != nil { + return m.Features + } + return nil +} + +type Feature struct { + Bit uint32 `protobuf:"varint,1,opt,name=bit,proto3" json:"bit,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + IsRequired bool `protobuf:"varint,3,opt,name=is_required,proto3" json:"is_required,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Feature) Reset() { *m = Feature{} } +func (m *Feature) String() string { return proto.CompactTextString(m) } +func (*Feature) ProtoMessage() {} +func (*Feature) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{114} +} + +func (m *Feature) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Feature.Unmarshal(m, b) +} +func (m *Feature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Feature.Marshal(b, m, deterministic) +} +func (m *Feature) XXX_Merge(src proto.Message) { + xxx_messageInfo_Feature.Merge(m, src) +} +func (m *Feature) XXX_Size() int { + return xxx_messageInfo_Feature.Size(m) +} +func (m *Feature) XXX_DiscardUnknown() { + xxx_messageInfo_Feature.DiscardUnknown(m) +} + +var xxx_messageInfo_Feature proto.InternalMessageInfo + +func (m *Feature) GetBit() uint32 { + if m != nil { + return m.Bit + } + return 0 +} + +func (m *Feature) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Feature) GetIsRequired() bool { + if m != nil { + return m.IsRequired + } + return false +} + type FeeReportRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8244,7 +8307,7 @@ func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} } func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) } func (*FeeReportRequest) ProtoMessage() {} func (*FeeReportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{114} + return fileDescriptor_77a6da22d6a3feb1, []int{115} } func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error { @@ -8283,7 +8346,7 @@ func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} } func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) } func (*ChannelFeeReport) ProtoMessage() {} func (*ChannelFeeReport) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{115} + return fileDescriptor_77a6da22d6a3feb1, []int{116} } func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error { @@ -8350,7 +8413,7 @@ func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} } func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) } func (*FeeReportResponse) ProtoMessage() {} func (*FeeReportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{116} + return fileDescriptor_77a6da22d6a3feb1, []int{117} } func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error { @@ -8421,7 +8484,7 @@ func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} } func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateRequest) ProtoMessage() {} func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{117} + return fileDescriptor_77a6da22d6a3feb1, []int{118} } func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error { @@ -8525,7 +8588,7 @@ func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} } func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) } func (*PolicyUpdateResponse) ProtoMessage() {} func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{118} + return fileDescriptor_77a6da22d6a3feb1, []int{119} } func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error { @@ -8564,7 +8627,7 @@ func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryReque func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryRequest) ProtoMessage() {} func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{119} + return fileDescriptor_77a6da22d6a3feb1, []int{120} } func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error { @@ -8641,7 +8704,7 @@ func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} } func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) } func (*ForwardingEvent) ProtoMessage() {} func (*ForwardingEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{120} + return fileDescriptor_77a6da22d6a3feb1, []int{121} } func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error { @@ -8739,7 +8802,7 @@ func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResp func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) } func (*ForwardingHistoryResponse) ProtoMessage() {} func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{121} + return fileDescriptor_77a6da22d6a3feb1, []int{122} } func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error { @@ -8786,7 +8849,7 @@ func (m *ExportChannelBackupRequest) Reset() { *m = ExportChannelBackupR func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) } func (*ExportChannelBackupRequest) ProtoMessage() {} func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{122} + return fileDescriptor_77a6da22d6a3feb1, []int{123} } func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error { @@ -8833,7 +8896,7 @@ func (m *ChannelBackup) Reset() { *m = ChannelBackup{} } func (m *ChannelBackup) String() string { return proto.CompactTextString(m) } func (*ChannelBackup) ProtoMessage() {} func (*ChannelBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{123} + return fileDescriptor_77a6da22d6a3feb1, []int{124} } func (m *ChannelBackup) XXX_Unmarshal(b []byte) error { @@ -8887,7 +8950,7 @@ func (m *MultiChanBackup) Reset() { *m = MultiChanBackup{} } func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) } func (*MultiChanBackup) ProtoMessage() {} func (*MultiChanBackup) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{124} + return fileDescriptor_77a6da22d6a3feb1, []int{125} } func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error { @@ -8932,7 +8995,7 @@ func (m *ChanBackupExportRequest) Reset() { *m = ChanBackupExportRequest func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) } func (*ChanBackupExportRequest) ProtoMessage() {} func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{125} + return fileDescriptor_77a6da22d6a3feb1, []int{126} } func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error { @@ -8971,7 +9034,7 @@ func (m *ChanBackupSnapshot) Reset() { *m = ChanBackupSnapshot{} } func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) } func (*ChanBackupSnapshot) ProtoMessage() {} func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{126} + return fileDescriptor_77a6da22d6a3feb1, []int{127} } func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error { @@ -9019,7 +9082,7 @@ func (m *ChannelBackups) Reset() { *m = ChannelBackups{} } func (m *ChannelBackups) String() string { return proto.CompactTextString(m) } func (*ChannelBackups) ProtoMessage() {} func (*ChannelBackups) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{127} + return fileDescriptor_77a6da22d6a3feb1, []int{128} } func (m *ChannelBackups) XXX_Unmarshal(b []byte) error { @@ -9061,7 +9124,7 @@ func (m *RestoreChanBackupRequest) Reset() { *m = RestoreChanBackupReque func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) } func (*RestoreChanBackupRequest) ProtoMessage() {} func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{128} + return fileDescriptor_77a6da22d6a3feb1, []int{129} } func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error { @@ -9137,7 +9200,7 @@ func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} } func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) } func (*RestoreBackupResponse) ProtoMessage() {} func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{129} + return fileDescriptor_77a6da22d6a3feb1, []int{130} } func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error { @@ -9168,7 +9231,7 @@ func (m *ChannelBackupSubscription) Reset() { *m = ChannelBackupSubscrip func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) } func (*ChannelBackupSubscription) ProtoMessage() {} func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{130} + return fileDescriptor_77a6da22d6a3feb1, []int{131} } func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error { @@ -9199,7 +9262,7 @@ func (m *VerifyChanBackupResponse) Reset() { *m = VerifyChanBackupRespon func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) } func (*VerifyChanBackupResponse) ProtoMessage() {} func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{131} + return fileDescriptor_77a6da22d6a3feb1, []int{132} } func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error { @@ -9234,7 +9297,7 @@ func (m *MacaroonPermission) Reset() { *m = MacaroonPermission{} } func (m *MacaroonPermission) String() string { return proto.CompactTextString(m) } func (*MacaroonPermission) ProtoMessage() {} func (*MacaroonPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{132} + return fileDescriptor_77a6da22d6a3feb1, []int{133} } func (m *MacaroonPermission) XXX_Unmarshal(b []byte) error { @@ -9281,7 +9344,7 @@ func (m *BakeMacaroonRequest) Reset() { *m = BakeMacaroonRequest{} } func (m *BakeMacaroonRequest) String() string { return proto.CompactTextString(m) } func (*BakeMacaroonRequest) ProtoMessage() {} func (*BakeMacaroonRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{133} + return fileDescriptor_77a6da22d6a3feb1, []int{134} } func (m *BakeMacaroonRequest) XXX_Unmarshal(b []byte) error { @@ -9321,7 +9384,7 @@ func (m *BakeMacaroonResponse) Reset() { *m = BakeMacaroonResponse{} } func (m *BakeMacaroonResponse) String() string { return proto.CompactTextString(m) } func (*BakeMacaroonResponse) ProtoMessage() {} func (*BakeMacaroonResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{134} + return fileDescriptor_77a6da22d6a3feb1, []int{135} } func (m *BakeMacaroonResponse) XXX_Unmarshal(b []byte) error { @@ -9479,6 +9542,7 @@ func init() { proto.RegisterType((*DebugLevelResponse)(nil), "lnrpc.DebugLevelResponse") proto.RegisterType((*PayReqString)(nil), "lnrpc.PayReqString") proto.RegisterType((*PayReq)(nil), "lnrpc.PayReq") + proto.RegisterType((*Feature)(nil), "lnrpc.Feature") proto.RegisterType((*FeeReportRequest)(nil), "lnrpc.FeeReportRequest") proto.RegisterType((*ChannelFeeReport)(nil), "lnrpc.ChannelFeeReport") proto.RegisterType((*FeeReportResponse)(nil), "lnrpc.FeeReportResponse") @@ -9505,553 +9569,556 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 8731 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0xd9, - 0x95, 0x9e, 0xaa, 0x7f, 0xc8, 0xee, 0xd3, 0x4d, 0xb2, 0x79, 0x49, 0x91, 0xad, 0x1e, 0x8d, 0x46, - 0x53, 0xd6, 0x4a, 0xb2, 0x3c, 0x96, 0x34, 0xb4, 0x3d, 0x99, 0x9d, 0xc9, 0x66, 0x43, 0x91, 0x94, - 0xa8, 0x19, 0x8a, 0xa2, 0x8b, 0x92, 0x15, 0xdb, 0xbb, 0x68, 0x17, 0xbb, 0x2f, 0xc9, 0xb2, 0xba, - 0xab, 0xda, 0x55, 0xd5, 0x94, 0xe8, 0xc9, 0x04, 0x48, 0x10, 0x04, 0x41, 0x5e, 0x02, 0x27, 0x08, - 0x90, 0x04, 0x09, 0x16, 0xf0, 0x06, 0xc8, 0x2e, 0xf2, 0x90, 0xbc, 0x04, 0xd8, 0x04, 0xfb, 0x16, - 0x04, 0x0b, 0x04, 0x08, 0xf2, 0x90, 0x87, 0x00, 0x79, 0x88, 0x11, 0x24, 0x40, 0x60, 0xe4, 0x2d, - 0x40, 0xde, 0x83, 0x73, 0xee, 0x4f, 0xdd, 0x5b, 0x55, 0x2d, 0x6a, 0x6c, 0x67, 0x9f, 0xd8, 0xf7, - 0x3b, 0xb7, 0xee, 0xef, 0x39, 0xe7, 0x9e, 0x7b, 0xee, 0xb9, 0x97, 0xd0, 0x8c, 0x27, 0x83, 0xbb, - 0x93, 0x38, 0x4a, 0x23, 0x56, 0x1f, 0x85, 0xf1, 0x64, 0xd0, 0xbb, 0x7a, 0x12, 0x45, 0x27, 0x23, - 0x7e, 0xcf, 0x9f, 0x04, 0xf7, 0xfc, 0x30, 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x99, 0xdc, - 0x1f, 0xc1, 0xe2, 0x23, 0x1e, 0x1e, 0x72, 0x3e, 0xf4, 0xf8, 0x4f, 0xa6, 0x3c, 0x49, 0xd9, 0x37, - 0x60, 0xd9, 0xe7, 0x3f, 0xe5, 0x7c, 0xd8, 0x9f, 0xf8, 0x49, 0x32, 0x39, 0x8d, 0xfd, 0x84, 0x77, - 0x9d, 0xeb, 0xce, 0xed, 0xb6, 0xd7, 0x11, 0x84, 0x03, 0x8d, 0xb3, 0xf7, 0xa1, 0x9d, 0x60, 0x56, - 0x1e, 0xa6, 0x71, 0x34, 0x39, 0xef, 0x56, 0x28, 0x5f, 0x0b, 0xb1, 0x1d, 0x01, 0xb9, 0x23, 0x58, - 0xd2, 0x35, 0x24, 0x93, 0x28, 0x4c, 0x38, 0xbb, 0x0f, 0xab, 0x83, 0x60, 0x72, 0xca, 0xe3, 0x3e, - 0x7d, 0x3c, 0x0e, 0xf9, 0x38, 0x0a, 0x83, 0x41, 0xd7, 0xb9, 0x5e, 0xbd, 0xdd, 0xf4, 0x98, 0xa0, - 0xe1, 0x17, 0x4f, 0x24, 0x85, 0xdd, 0x82, 0x25, 0x1e, 0x0a, 0x9c, 0x0f, 0xe9, 0x2b, 0x59, 0xd5, - 0x62, 0x06, 0xe3, 0x07, 0xee, 0xdf, 0xae, 0xc0, 0xf2, 0xe3, 0x30, 0x48, 0x5f, 0xf8, 0xa3, 0x11, - 0x4f, 0x55, 0x9f, 0x6e, 0xc1, 0xd2, 0x2b, 0x02, 0xa8, 0x4f, 0xaf, 0xa2, 0x78, 0x28, 0x7b, 0xb4, - 0x28, 0xe0, 0x03, 0x89, 0xce, 0x6c, 0x59, 0x65, 0x66, 0xcb, 0x4a, 0x87, 0xab, 0x3a, 0x63, 0xb8, - 0x6e, 0xc1, 0x52, 0xcc, 0x07, 0xd1, 0x19, 0x8f, 0xcf, 0xfb, 0xaf, 0x82, 0x70, 0x18, 0xbd, 0xea, - 0xd6, 0xae, 0x3b, 0xb7, 0xeb, 0xde, 0xa2, 0x82, 0x5f, 0x10, 0xca, 0x1e, 0xc0, 0xd2, 0xe0, 0xd4, - 0x0f, 0x43, 0x3e, 0xea, 0x1f, 0xf9, 0x83, 0x97, 0xd3, 0x49, 0xd2, 0xad, 0x5f, 0x77, 0x6e, 0xb7, - 0x36, 0xae, 0xdc, 0xa5, 0x59, 0xbd, 0xbb, 0x75, 0xea, 0x87, 0x0f, 0x88, 0x72, 0x18, 0xfa, 0x93, - 0xe4, 0x34, 0x4a, 0xbd, 0x45, 0xf9, 0x85, 0x80, 0x13, 0x77, 0x15, 0x98, 0x39, 0x12, 0x62, 0xec, - 0xdd, 0x7f, 0xe1, 0xc0, 0xca, 0xf3, 0x70, 0x14, 0x0d, 0x5e, 0xfe, 0x8a, 0x43, 0x54, 0xd2, 0x87, - 0xca, 0xdb, 0xf6, 0xa1, 0xfa, 0x55, 0xfb, 0xb0, 0x06, 0xab, 0x76, 0x63, 0x65, 0x2f, 0x38, 0x5c, - 0xc6, 0xaf, 0x4f, 0xb8, 0x6a, 0x96, 0xea, 0xc6, 0xd7, 0xa1, 0x33, 0x98, 0xc6, 0x31, 0x0f, 0x0b, - 0xfd, 0x58, 0x92, 0xb8, 0xee, 0xc8, 0xfb, 0xd0, 0x0e, 0xf9, 0xab, 0x2c, 0x9b, 0xe4, 0xdd, 0x90, - 0xbf, 0x52, 0x59, 0xdc, 0x2e, 0xac, 0xe5, 0xab, 0x91, 0x0d, 0xf8, 0xef, 0x0e, 0xd4, 0x9e, 0xa7, - 0xaf, 0x23, 0x76, 0x17, 0x6a, 0xe9, 0xf9, 0x44, 0x48, 0xc8, 0xe2, 0x06, 0x93, 0x5d, 0xdb, 0x1c, - 0x0e, 0x63, 0x9e, 0x24, 0xcf, 0xce, 0x27, 0xdc, 0x6b, 0xfb, 0x22, 0xd1, 0xc7, 0x7c, 0xac, 0x0b, - 0xf3, 0x32, 0x4d, 0x15, 0x36, 0x3d, 0x95, 0x64, 0xd7, 0x00, 0xfc, 0x71, 0x34, 0x0d, 0xd3, 0x7e, - 0xe2, 0xa7, 0x34, 0x54, 0x55, 0xcf, 0x40, 0xd8, 0x55, 0x68, 0x4e, 0x5e, 0xf6, 0x93, 0x41, 0x1c, - 0x4c, 0x52, 0x62, 0x9b, 0xa6, 0x97, 0x01, 0xec, 0x1b, 0xd0, 0x88, 0xa6, 0xe9, 0x24, 0x0a, 0xc2, - 0x54, 0xb2, 0xca, 0x92, 0x6c, 0xcb, 0xd3, 0x69, 0x7a, 0x80, 0xb0, 0xa7, 0x33, 0xb0, 0x1b, 0xb0, - 0x30, 0x88, 0xc2, 0xe3, 0x20, 0x1e, 0x0b, 0x65, 0xd0, 0x9d, 0xa3, 0xda, 0x6c, 0xd0, 0xfd, 0x37, - 0x15, 0x68, 0x3d, 0x8b, 0xfd, 0x30, 0xf1, 0x07, 0x08, 0x60, 0xd3, 0xd3, 0xd7, 0xfd, 0x53, 0x3f, - 0x39, 0xa5, 0xde, 0x36, 0x3d, 0x95, 0x64, 0x6b, 0x30, 0x27, 0x1a, 0x4a, 0x7d, 0xaa, 0x7a, 0x32, - 0xc5, 0x3e, 0x80, 0xe5, 0x70, 0x3a, 0xee, 0xdb, 0x75, 0x55, 0x89, 0x5b, 0x8a, 0x04, 0x1c, 0x80, - 0x23, 0x9c, 0x6b, 0x51, 0x85, 0xe8, 0xa1, 0x81, 0x30, 0x17, 0xda, 0x32, 0xc5, 0x83, 0x93, 0x53, - 0xd1, 0xcd, 0xba, 0x67, 0x61, 0x58, 0x46, 0x1a, 0x8c, 0x79, 0x3f, 0x49, 0xfd, 0xf1, 0x44, 0x76, - 0xcb, 0x40, 0x88, 0x1e, 0xa5, 0xfe, 0xa8, 0x7f, 0xcc, 0x79, 0xd2, 0x9d, 0x97, 0x74, 0x8d, 0xb0, - 0x9b, 0xb0, 0x38, 0xe4, 0x49, 0xda, 0x97, 0x93, 0xc2, 0x93, 0x6e, 0x83, 0x44, 0x3f, 0x87, 0x62, - 0x39, 0xb1, 0xff, 0xaa, 0x8f, 0x03, 0xc0, 0x5f, 0x77, 0x9b, 0xa2, 0xad, 0x19, 0x82, 0x9c, 0xf3, - 0x88, 0xa7, 0xc6, 0xe8, 0x25, 0x92, 0x43, 0xdd, 0x3d, 0x60, 0x06, 0xbc, 0xcd, 0x53, 0x3f, 0x18, - 0x25, 0xec, 0x23, 0x68, 0xa7, 0x46, 0x66, 0x52, 0x85, 0x2d, 0xcd, 0x4e, 0xc6, 0x07, 0x9e, 0x95, - 0xcf, 0x3d, 0x85, 0xc6, 0x43, 0xce, 0xf7, 0x82, 0x71, 0x90, 0xb2, 0x35, 0xa8, 0x1f, 0x07, 0xaf, - 0xb9, 0x60, 0xf8, 0xea, 0xee, 0x25, 0x4f, 0x24, 0xd9, 0x7b, 0x00, 0xf4, 0xa3, 0x3f, 0xd6, 0x8c, - 0xb5, 0x7b, 0xc9, 0x6b, 0x12, 0xf6, 0x04, 0x39, 0xab, 0x07, 0xf3, 0x13, 0x1e, 0x0f, 0xb8, 0x9a, - 0xbf, 0xdd, 0x4b, 0x9e, 0x02, 0x1e, 0xcc, 0x43, 0x7d, 0x84, 0xa5, 0xbb, 0x7f, 0x52, 0x83, 0xd6, - 0x21, 0x0f, 0xb5, 0xa4, 0x31, 0xa8, 0xe1, 0x98, 0x48, 0xe9, 0xa2, 0xdf, 0xec, 0x6b, 0xd0, 0xa2, - 0x71, 0x4a, 0xd2, 0x38, 0x08, 0x4f, 0x04, 0x83, 0x3f, 0xa8, 0x74, 0x1d, 0x0f, 0x10, 0x3e, 0x24, - 0x94, 0x75, 0xa0, 0xea, 0x8f, 0x15, 0x83, 0xe3, 0x4f, 0x76, 0x05, 0x1a, 0xfe, 0x38, 0x15, 0xcd, - 0x6b, 0x13, 0x3c, 0xef, 0x8f, 0x53, 0x6a, 0xda, 0xfb, 0xd0, 0x9e, 0xf8, 0xe7, 0x63, 0x94, 0x67, - 0xcd, 0x15, 0x6d, 0xaf, 0x25, 0xb1, 0x5d, 0x64, 0x8b, 0x0d, 0x58, 0x31, 0xb3, 0xa8, 0xca, 0xeb, - 0xba, 0xf2, 0x65, 0x23, 0xb7, 0x6c, 0xc3, 0x2d, 0x58, 0x52, 0xdf, 0xc4, 0xa2, 0x3f, 0xc4, 0x2b, - 0x4d, 0x6f, 0x51, 0xc2, 0xaa, 0x97, 0xb7, 0xa1, 0x73, 0x1c, 0x84, 0xfe, 0xa8, 0x3f, 0x18, 0xa5, - 0x67, 0xfd, 0x21, 0x1f, 0xa5, 0x3e, 0x71, 0x4d, 0xdd, 0x5b, 0x24, 0x7c, 0x6b, 0x94, 0x9e, 0x6d, - 0x23, 0xca, 0x3e, 0x80, 0xe6, 0x31, 0xe7, 0x7d, 0x1a, 0xac, 0x6e, 0xc3, 0x92, 0x40, 0x35, 0x43, - 0x5e, 0xe3, 0x58, 0xcd, 0xd5, 0x07, 0xd0, 0x89, 0xa6, 0xe9, 0x49, 0x14, 0x84, 0x27, 0x7d, 0xd4, - 0x79, 0xfd, 0x60, 0x48, 0x5c, 0x54, 0x7b, 0x50, 0xb9, 0xef, 0x78, 0x8b, 0x8a, 0x86, 0xda, 0xe7, - 0xf1, 0x90, 0xdd, 0x84, 0xa5, 0x91, 0x9f, 0xa4, 0xfd, 0xd3, 0x68, 0xd2, 0x9f, 0x4c, 0x8f, 0x5e, - 0xf2, 0xf3, 0xee, 0x02, 0x0d, 0xc4, 0x02, 0xc2, 0xbb, 0xd1, 0xe4, 0x80, 0x40, 0xf6, 0x2e, 0x00, - 0xb5, 0x53, 0x34, 0x02, 0xae, 0x3b, 0xb7, 0x17, 0xbc, 0x26, 0x22, 0xa2, 0xd2, 0x4f, 0xa0, 0x41, - 0xd3, 0x93, 0x8e, 0xce, 0xba, 0x2d, 0x62, 0xb0, 0xf7, 0x64, 0x0b, 0x8d, 0x89, 0xbd, 0xbb, 0xcd, - 0x93, 0xf4, 0xd9, 0xe8, 0x0c, 0xd7, 0xef, 0x73, 0x6f, 0x7e, 0x28, 0x52, 0xbd, 0x4f, 0xa0, 0x6d, - 0x12, 0x70, 0x16, 0xb1, 0x19, 0x38, 0xfb, 0x35, 0x0f, 0x7f, 0xb2, 0x55, 0xa8, 0x9f, 0xf9, 0xa3, - 0x29, 0x97, 0x8a, 0x54, 0x24, 0x3e, 0xa9, 0x7c, 0xec, 0xb8, 0x7f, 0xe2, 0x40, 0x5b, 0xd4, 0x20, - 0x0d, 0x80, 0x1b, 0xb0, 0xa0, 0x86, 0x9f, 0xc7, 0x71, 0x14, 0x4b, 0x7d, 0x62, 0x83, 0xec, 0x0e, - 0x74, 0x14, 0x30, 0x89, 0x79, 0x30, 0xf6, 0x4f, 0x54, 0xd9, 0x05, 0x9c, 0x6d, 0x64, 0x25, 0xc6, - 0xd1, 0x34, 0xe5, 0x72, 0xa9, 0x69, 0xcb, 0xfe, 0x79, 0x88, 0x79, 0x76, 0x16, 0xd4, 0x27, 0x25, - 0xbc, 0x65, 0x61, 0xee, 0x3f, 0x70, 0x80, 0x61, 0xd3, 0x9f, 0x45, 0xa2, 0x08, 0xc9, 0x16, 0x79, - 0xb6, 0x74, 0xde, 0x9a, 0x2d, 0x2b, 0x6f, 0x62, 0x4b, 0x17, 0xea, 0xa2, 0xf5, 0xb5, 0x92, 0xd6, - 0x0b, 0xd2, 0x67, 0xb5, 0x46, 0xb5, 0x53, 0x73, 0xff, 0x6b, 0x15, 0x56, 0xb7, 0xc4, 0x5a, 0xb9, - 0x39, 0x18, 0xf0, 0x89, 0x66, 0xd8, 0xf7, 0xa0, 0x15, 0x46, 0x43, 0xae, 0xd8, 0x44, 0x34, 0x0c, - 0x10, 0x32, 0x78, 0xe4, 0xd4, 0x0f, 0x42, 0xd1, 0x70, 0x31, 0x9e, 0x4d, 0x42, 0xa8, 0xd9, 0x37, - 0x61, 0x69, 0xc2, 0xc3, 0xa1, 0xc9, 0x97, 0xc2, 0x9a, 0x59, 0x90, 0xb0, 0x64, 0xc9, 0xf7, 0xa0, - 0x75, 0x3c, 0x15, 0xf9, 0x50, 0x9a, 0x6b, 0xc4, 0x07, 0x20, 0xa1, 0x4d, 0x21, 0xd4, 0x93, 0x69, - 0x72, 0x4a, 0xd4, 0x3a, 0x51, 0xe7, 0x31, 0x8d, 0xa4, 0x77, 0x01, 0x86, 0xd3, 0x24, 0x95, 0x6c, - 0x3a, 0x47, 0xc4, 0x26, 0x22, 0x82, 0x4d, 0xbf, 0x09, 0x2b, 0x63, 0xff, 0x75, 0x9f, 0xf8, 0xa7, - 0x1f, 0x84, 0xfd, 0xe3, 0x11, 0xa9, 0xfb, 0x79, 0xca, 0xd7, 0x19, 0xfb, 0xaf, 0xbf, 0x87, 0x94, - 0xc7, 0xe1, 0x43, 0xc2, 0x51, 0x96, 0x95, 0x9d, 0x11, 0xf3, 0x84, 0xc7, 0x67, 0x9c, 0xc4, 0xaf, - 0xa6, 0x8d, 0x09, 0x4f, 0xa0, 0xd8, 0xa2, 0x31, 0xf6, 0x3b, 0x1d, 0x0d, 0x84, 0xac, 0x79, 0xf3, - 0xe3, 0x20, 0xdc, 0x4d, 0x47, 0x03, 0x76, 0x15, 0x00, 0x85, 0x77, 0xc2, 0xe3, 0xfe, 0xcb, 0x57, - 0x24, 0x38, 0x35, 0x12, 0xd6, 0x03, 0x1e, 0x7f, 0xfe, 0x8a, 0xbd, 0x03, 0xcd, 0x41, 0x42, 0xd2, - 0xef, 0x9f, 0x77, 0x5b, 0x24, 0x55, 0x8d, 0x41, 0x82, 0x72, 0xef, 0x9f, 0xb3, 0x0f, 0x80, 0x61, - 0x6b, 0x7d, 0x9a, 0x05, 0x3e, 0xa4, 0xe2, 0x13, 0x52, 0x63, 0x0b, 0xd4, 0xd8, 0x4d, 0x49, 0xc0, - 0x7a, 0x12, 0xf6, 0x35, 0x58, 0x50, 0x8d, 0x3d, 0x1e, 0xf9, 0x27, 0x09, 0xc9, 0xf1, 0x82, 0xd7, - 0x96, 0xe0, 0x43, 0xc4, 0xdc, 0x17, 0xc2, 0xba, 0x31, 0xe6, 0x56, 0xca, 0x0d, 0xae, 0xb3, 0x84, - 0xd0, 0xbc, 0x36, 0x3c, 0x99, 0x2a, 0x9b, 0xb4, 0x4a, 0xc9, 0xa4, 0xb9, 0x3f, 0x77, 0xa0, 0x2d, - 0x4b, 0x26, 0x93, 0x80, 0xdd, 0x07, 0xa6, 0x66, 0x31, 0x7d, 0x1d, 0x0c, 0xfb, 0x47, 0xe7, 0x29, - 0x4f, 0x04, 0xd3, 0xec, 0x5e, 0xf2, 0x4a, 0x68, 0xa8, 0xb8, 0x2c, 0x34, 0x49, 0x63, 0xc1, 0xd3, - 0xbb, 0x97, 0xbc, 0x02, 0x05, 0x45, 0x0c, 0x8d, 0x8e, 0x69, 0xda, 0x0f, 0xc2, 0x21, 0x7f, 0x4d, - 0xac, 0xb4, 0xe0, 0x59, 0xd8, 0x83, 0x45, 0x68, 0x9b, 0xdf, 0xb9, 0x3f, 0x86, 0x86, 0x32, 0x59, - 0x68, 0xb9, 0xce, 0xb5, 0xcb, 0x33, 0x10, 0xd6, 0x83, 0x86, 0xdd, 0x0a, 0xaf, 0xf1, 0x55, 0xea, - 0x76, 0xff, 0x12, 0x74, 0xf6, 0x90, 0x89, 0x42, 0x64, 0x5a, 0x69, 0x87, 0xad, 0xc1, 0x9c, 0x21, - 0x3c, 0x4d, 0x4f, 0xa6, 0x70, 0xc1, 0x3b, 0x8d, 0x92, 0x54, 0xd6, 0x43, 0xbf, 0xdd, 0x3f, 0x73, - 0x80, 0xed, 0x24, 0x69, 0x30, 0xf6, 0x53, 0xfe, 0x90, 0x6b, 0xf5, 0xf0, 0x14, 0xda, 0x58, 0xda, - 0xb3, 0x68, 0x53, 0x58, 0x45, 0x62, 0x35, 0xff, 0x86, 0x14, 0xe7, 0xe2, 0x07, 0x77, 0xcd, 0xdc, - 0x42, 0xf1, 0x5a, 0x05, 0xa0, 0xb4, 0xa5, 0x7e, 0x7c, 0xc2, 0x53, 0x32, 0x99, 0xa4, 0xc1, 0x0d, - 0x02, 0xda, 0x8a, 0xc2, 0xe3, 0xde, 0xef, 0xc2, 0x72, 0xa1, 0x0c, 0x53, 0x47, 0x37, 0x4b, 0x74, - 0x74, 0xd5, 0xd4, 0xd1, 0x03, 0x58, 0xb1, 0xda, 0x25, 0x39, 0xae, 0x0b, 0xf3, 0x28, 0x18, 0xb8, - 0x32, 0x3b, 0x62, 0x65, 0x96, 0x49, 0xb6, 0x01, 0xab, 0xc7, 0x9c, 0xc7, 0x7e, 0x4a, 0x49, 0x12, - 0x1d, 0x9c, 0x13, 0x59, 0x72, 0x29, 0xcd, 0xfd, 0x1f, 0x0e, 0x2c, 0xa1, 0x36, 0x7d, 0xe2, 0x87, - 0xe7, 0x6a, 0xac, 0xf6, 0x4a, 0xc7, 0xea, 0xb6, 0xb1, 0x30, 0x19, 0xb9, 0xbf, 0xea, 0x40, 0x55, - 0xf3, 0x03, 0xc5, 0xae, 0x43, 0xdb, 0x6a, 0x6e, 0x5d, 0x98, 0x80, 0x89, 0x9f, 0x1e, 0xf0, 0xf8, - 0xc1, 0x79, 0xca, 0x7f, 0xfd, 0xa1, 0xbc, 0x09, 0x9d, 0xac, 0xd9, 0x72, 0x1c, 0x19, 0xd4, 0x90, - 0x31, 0x65, 0x01, 0xf4, 0xdb, 0xfd, 0x27, 0x8e, 0xc8, 0xb8, 0x15, 0x05, 0xda, 0x3c, 0xc4, 0x8c, - 0x68, 0x65, 0xaa, 0x8c, 0xf8, 0x7b, 0xa6, 0x79, 0xfd, 0xeb, 0x77, 0x16, 0x75, 0x62, 0xc2, 0xc3, - 0x61, 0xdf, 0x1f, 0x8d, 0x48, 0x11, 0x37, 0xbc, 0x79, 0x4c, 0x6f, 0x8e, 0x46, 0xee, 0x2d, 0x58, - 0x36, 0x5a, 0xf7, 0x86, 0x7e, 0xec, 0x03, 0xdb, 0x0b, 0x92, 0xf4, 0x79, 0x98, 0x4c, 0x0c, 0xcb, - 0xe9, 0x1d, 0x68, 0xa2, 0xb6, 0xc5, 0x96, 0x09, 0xc9, 0xad, 0x7b, 0xa8, 0x7e, 0xb1, 0x5d, 0x09, - 0x11, 0xfd, 0xd7, 0x92, 0x58, 0x91, 0x44, 0xff, 0x35, 0x11, 0xdd, 0x8f, 0x61, 0xc5, 0x2a, 0x4f, - 0x56, 0xfd, 0x3e, 0xd4, 0xa7, 0xe9, 0xeb, 0x48, 0xd9, 0xc6, 0x2d, 0xc9, 0x21, 0xb8, 0x0b, 0xf3, - 0x04, 0xc5, 0xfd, 0x14, 0x96, 0xf7, 0xf9, 0x2b, 0x29, 0xc8, 0xaa, 0x21, 0x37, 0x2f, 0xdc, 0xa1, - 0x11, 0xdd, 0xbd, 0x0b, 0xcc, 0xfc, 0x38, 0x13, 0x00, 0xb5, 0x5f, 0x73, 0xac, 0xfd, 0x9a, 0x7b, - 0x13, 0xd8, 0x61, 0x70, 0x12, 0x3e, 0xe1, 0x49, 0xe2, 0x9f, 0x68, 0xd1, 0xef, 0x40, 0x75, 0x9c, - 0x9c, 0x48, 0x55, 0x85, 0x3f, 0xdd, 0x6f, 0xc1, 0x8a, 0x95, 0x4f, 0x16, 0x7c, 0x15, 0x9a, 0x49, - 0x70, 0x12, 0xfa, 0xe9, 0x34, 0xe6, 0xb2, 0xe8, 0x0c, 0x70, 0x1f, 0xc2, 0xea, 0xf7, 0x78, 0x1c, - 0x1c, 0x9f, 0x5f, 0x54, 0xbc, 0x5d, 0x4e, 0x25, 0x5f, 0xce, 0x0e, 0x5c, 0xce, 0x95, 0x23, 0xab, - 0x17, 0xec, 0x2b, 0x67, 0xb2, 0xe1, 0x89, 0x84, 0xa1, 0xfb, 0x2a, 0xa6, 0xee, 0x73, 0x9f, 0x03, - 0xdb, 0x8a, 0xc2, 0x90, 0x0f, 0xd2, 0x03, 0xce, 0xe3, 0xcc, 0x55, 0x94, 0xf1, 0x6a, 0x6b, 0x63, - 0x5d, 0x8e, 0x6c, 0x5e, 0xa1, 0x4a, 0x26, 0x66, 0x50, 0x9b, 0xf0, 0x78, 0x4c, 0x05, 0x37, 0x3c, - 0xfa, 0xed, 0x5e, 0x86, 0x15, 0xab, 0x58, 0xb9, 0xb9, 0xfe, 0x10, 0x2e, 0x6f, 0x07, 0xc9, 0xa0, - 0x58, 0x61, 0x17, 0xe6, 0x27, 0xd3, 0xa3, 0x7e, 0x26, 0x89, 0x2a, 0x89, 0xfb, 0xad, 0xfc, 0x27, - 0xb2, 0xb0, 0xbf, 0xe5, 0x40, 0x6d, 0xf7, 0xd9, 0xde, 0x16, 0xae, 0x15, 0x41, 0x38, 0x88, 0xc6, - 0x68, 0x85, 0x89, 0x4e, 0xeb, 0xf4, 0x4c, 0x09, 0xbb, 0x0a, 0x4d, 0x32, 0xde, 0x70, 0x8b, 0x29, - 0xed, 0xa0, 0x0c, 0xc0, 0xed, 0x2d, 0x7f, 0x3d, 0x09, 0x62, 0xda, 0xbf, 0xaa, 0x5d, 0x69, 0x8d, - 0x96, 0x99, 0x22, 0xc1, 0xfd, 0xf9, 0x3c, 0xcc, 0xcb, 0xc5, 0x57, 0x2c, 0xe4, 0x69, 0x70, 0xc6, - 0xb3, 0x85, 0x1c, 0x53, 0x68, 0x18, 0xc7, 0x7c, 0x1c, 0xa5, 0xda, 0x7e, 0x13, 0xd3, 0x60, 0x83, - 0xb4, 0x7d, 0x97, 0x46, 0x84, 0xd8, 0xf0, 0x57, 0x45, 0x2e, 0x0b, 0x64, 0x57, 0x61, 0x5e, 0x19, - 0x03, 0x35, 0xbd, 0xb3, 0x50, 0x10, 0x8e, 0xc6, 0xc0, 0x9f, 0xf8, 0x83, 0x20, 0x3d, 0x97, 0x6a, - 0x41, 0xa7, 0xb1, 0xfc, 0x51, 0x34, 0xf0, 0x47, 0xfd, 0x23, 0x7f, 0xe4, 0x87, 0x03, 0xae, 0xdc, - 0x03, 0x16, 0x88, 0x5b, 0x65, 0xd9, 0x2c, 0x95, 0x4d, 0x6c, 0xa7, 0x73, 0x28, 0xae, 0xe1, 0x83, - 0x68, 0x3c, 0x0e, 0x52, 0xdc, 0x61, 0x93, 0x69, 0x56, 0xf5, 0x0c, 0x44, 0x38, 0x23, 0x28, 0xf5, - 0x4a, 0x8c, 0x60, 0x53, 0x39, 0x23, 0x0c, 0x10, 0x4b, 0xc9, 0x59, 0x68, 0x55, 0xcf, 0x40, 0x70, - 0x2e, 0xa6, 0x61, 0xc2, 0xd3, 0x74, 0xc4, 0x87, 0xba, 0x41, 0x2d, 0xca, 0x56, 0x24, 0xb0, 0xfb, - 0xb0, 0x22, 0x36, 0xfd, 0x89, 0x9f, 0x46, 0xc9, 0x69, 0x90, 0xf4, 0x13, 0xdc, 0xfd, 0x8a, 0xcd, - 0x67, 0x19, 0x89, 0x7d, 0x0c, 0xeb, 0x39, 0x38, 0xe6, 0x03, 0x1e, 0x9c, 0xf1, 0x21, 0x99, 0x70, - 0x55, 0x6f, 0x16, 0x99, 0x5d, 0x87, 0x56, 0x38, 0x1d, 0xf7, 0xa7, 0x93, 0xa1, 0x8f, 0x46, 0xcc, - 0x22, 0x19, 0x97, 0x26, 0xc4, 0x3e, 0x04, 0x65, 0xa7, 0x49, 0xeb, 0x71, 0xc9, 0xd2, 0x70, 0xc8, - 0xbd, 0x9e, 0x9d, 0x03, 0x19, 0x33, 0x33, 0x49, 0x3b, 0x72, 0xa3, 0xa7, 0x00, 0x92, 0x93, 0x38, - 0x38, 0xf3, 0x53, 0xde, 0x5d, 0x16, 0x4a, 0x5d, 0x26, 0xf1, 0xbb, 0x20, 0x0c, 0xd2, 0xc0, 0x4f, - 0xa3, 0xb8, 0xcb, 0x88, 0x96, 0x01, 0x38, 0x88, 0xc4, 0x1f, 0x49, 0xea, 0xa7, 0xd3, 0x44, 0x5a, - 0xa8, 0x2b, 0xc4, 0x5c, 0x45, 0x02, 0xfb, 0x08, 0xd6, 0x04, 0x47, 0x10, 0x49, 0xda, 0xde, 0x64, - 0x2a, 0xac, 0xd2, 0x88, 0xcc, 0xa0, 0xe2, 0x50, 0x4a, 0x16, 0x29, 0x7c, 0x78, 0x59, 0x0c, 0xe5, - 0x0c, 0x32, 0xb6, 0x0f, 0x5b, 0x10, 0x0c, 0xfa, 0x32, 0x07, 0x8a, 0xc8, 0x1a, 0xf5, 0xa2, 0x48, - 0x40, 0x16, 0x1f, 0x05, 0xc7, 0x3c, 0x0d, 0xc6, 0xbc, 0xbb, 0x2e, 0x58, 0x5c, 0xa5, 0x51, 0x00, - 0xa7, 0x13, 0xa2, 0x74, 0x85, 0xc0, 0x8b, 0x94, 0xfb, 0x07, 0x8e, 0x58, 0x7c, 0xa4, 0xa0, 0x26, - 0xc6, 0xb6, 0x4a, 0x88, 0x68, 0x3f, 0x0a, 0x47, 0xe7, 0x52, 0x6a, 0x41, 0x40, 0x4f, 0xc3, 0xd1, - 0x39, 0x1a, 0xf6, 0x41, 0x68, 0x66, 0x11, 0x7a, 0xae, 0xad, 0x40, 0xca, 0xf4, 0x1e, 0xb4, 0x26, - 0xd3, 0xa3, 0x51, 0x30, 0x10, 0x59, 0xaa, 0xa2, 0x14, 0x01, 0x51, 0x06, 0xdc, 0x57, 0x8a, 0x99, - 0x12, 0x39, 0x6a, 0x94, 0xa3, 0x25, 0x31, 0xcc, 0xe2, 0x3e, 0x80, 0x55, 0xbb, 0x81, 0x52, 0xa1, - 0xdf, 0x81, 0x86, 0x94, 0xff, 0x44, 0x6e, 0xee, 0x17, 0x0d, 0x3f, 0x2b, 0x6e, 0x83, 0x34, 0xdd, - 0xfd, 0xb7, 0x35, 0x58, 0x91, 0xe8, 0xd6, 0x28, 0x4a, 0xf8, 0xe1, 0x74, 0x3c, 0xf6, 0xe3, 0x12, - 0xc5, 0xe2, 0x5c, 0xa0, 0x58, 0x2a, 0x45, 0xc5, 0x72, 0xcd, 0xda, 0x5f, 0x0a, 0xcd, 0x64, 0x20, - 0xec, 0x36, 0x2c, 0x0d, 0x46, 0x51, 0x22, 0xcc, 0x7d, 0xd3, 0xd5, 0x97, 0x87, 0x8b, 0xca, 0xb0, - 0x5e, 0xa6, 0x0c, 0x4d, 0x45, 0x36, 0x97, 0x53, 0x64, 0x2e, 0xb4, 0xb1, 0x50, 0xae, 0x74, 0xf3, - 0xbc, 0xdc, 0x6c, 0x19, 0x18, 0xb6, 0x27, 0xaf, 0x36, 0x84, 0x8e, 0x5a, 0x2a, 0x53, 0x1a, 0xc1, - 0x98, 0x93, 0xee, 0x37, 0x72, 0x37, 0xa5, 0xd2, 0x28, 0x92, 0xd8, 0x43, 0x00, 0x51, 0x17, 0x19, - 0x20, 0x40, 0x06, 0xc8, 0x4d, 0x7b, 0x56, 0xcc, 0xf1, 0xbf, 0x8b, 0x89, 0x69, 0xcc, 0xc9, 0x28, - 0x31, 0xbe, 0x74, 0xff, 0x8e, 0x03, 0x2d, 0x83, 0xc6, 0x2e, 0xc3, 0xf2, 0xd6, 0xd3, 0xa7, 0x07, - 0x3b, 0xde, 0xe6, 0xb3, 0xc7, 0xdf, 0xdb, 0xe9, 0x6f, 0xed, 0x3d, 0x3d, 0xdc, 0xe9, 0x5c, 0x42, - 0x78, 0xef, 0xe9, 0xd6, 0xe6, 0x5e, 0xff, 0xe1, 0x53, 0x6f, 0x4b, 0xc1, 0x0e, 0x5b, 0x03, 0xe6, - 0xed, 0x3c, 0x79, 0xfa, 0x6c, 0xc7, 0xc2, 0x2b, 0xac, 0x03, 0xed, 0x07, 0xde, 0xce, 0xe6, 0xd6, - 0xae, 0x44, 0xaa, 0x6c, 0x15, 0x3a, 0x0f, 0x9f, 0xef, 0x6f, 0x3f, 0xde, 0x7f, 0xd4, 0xdf, 0xda, - 0xdc, 0xdf, 0xda, 0xd9, 0xdb, 0xd9, 0xee, 0xd4, 0xd8, 0x02, 0x34, 0x37, 0x1f, 0x6c, 0xee, 0x6f, - 0x3f, 0xdd, 0xdf, 0xd9, 0xee, 0xd4, 0xdd, 0xff, 0xe6, 0xc0, 0x65, 0x6a, 0xf5, 0x30, 0x2f, 0x24, - 0xd7, 0xa1, 0x35, 0x88, 0xa2, 0x09, 0x1a, 0xfe, 0xd9, 0xd2, 0x66, 0x42, 0x28, 0x00, 0x42, 0x29, - 0x1c, 0x47, 0xf1, 0x80, 0x4b, 0x19, 0x01, 0x82, 0x1e, 0x22, 0x82, 0x02, 0x20, 0xa7, 0x57, 0xe4, - 0x10, 0x22, 0xd2, 0x12, 0x98, 0xc8, 0xb2, 0x06, 0x73, 0x47, 0x31, 0xf7, 0x07, 0xa7, 0x52, 0x3a, - 0x64, 0x8a, 0x7d, 0x3d, 0xdb, 0x99, 0x0e, 0x70, 0xf4, 0x47, 0x7c, 0x48, 0x1c, 0xd3, 0xf0, 0x96, - 0x24, 0xbe, 0x25, 0x61, 0xd4, 0x82, 0xfe, 0x91, 0x1f, 0x0e, 0xa3, 0x90, 0x0f, 0xa5, 0xd9, 0x9b, - 0x01, 0xee, 0x01, 0xac, 0xe5, 0xfb, 0x27, 0x65, 0xec, 0x23, 0x43, 0xc6, 0x84, 0x15, 0xda, 0x9b, - 0x3d, 0x9b, 0x86, 0xbc, 0xfd, 0xa2, 0x02, 0x35, 0x34, 0x4a, 0x66, 0x1b, 0x30, 0xa6, 0x9d, 0x59, - 0x2d, 0x9c, 0x0b, 0xd0, 0x66, 0x57, 0x2c, 0x51, 0xd2, 0xd1, 0x92, 0x21, 0x19, 0x3d, 0xe6, 0x83, - 0x33, 0xe9, 0x6a, 0x31, 0x10, 0x14, 0x10, 0xdc, 0x04, 0xd0, 0xd7, 0x52, 0x40, 0x54, 0x5a, 0xd1, - 0xe8, 0xcb, 0xf9, 0x8c, 0x46, 0xdf, 0x75, 0x61, 0x3e, 0x08, 0x8f, 0xa2, 0x69, 0x38, 0x24, 0x81, - 0x68, 0x78, 0x2a, 0x49, 0x27, 0x11, 0x24, 0xa8, 0xa8, 0x3f, 0x05, 0xfb, 0x67, 0x00, 0xdb, 0x80, - 0x66, 0x72, 0x1e, 0x0e, 0x4c, 0x9e, 0x5f, 0x95, 0xa3, 0x84, 0x63, 0x70, 0xf7, 0xf0, 0x3c, 0x1c, - 0x10, 0x87, 0x67, 0xd9, 0xdc, 0xdf, 0x85, 0x86, 0x82, 0x91, 0x2d, 0x9f, 0xef, 0x7f, 0xbe, 0xff, - 0xf4, 0xc5, 0x7e, 0xff, 0xf0, 0xfb, 0xfb, 0x5b, 0x9d, 0x4b, 0x6c, 0x09, 0x5a, 0x9b, 0x5b, 0xc4, - 0xe9, 0x04, 0x38, 0x98, 0xe5, 0x60, 0xf3, 0xf0, 0x50, 0x23, 0x15, 0x97, 0xe1, 0x46, 0x3e, 0x21, - 0xcb, 0x4f, 0x7b, 0xda, 0x3f, 0x82, 0x65, 0x03, 0xcb, 0x76, 0x11, 0x13, 0x04, 0x72, 0xbb, 0x08, - 0x32, 0x19, 0x05, 0xc5, 0xed, 0xc0, 0xe2, 0x23, 0x9e, 0x3e, 0x0e, 0x8f, 0x23, 0x55, 0xd2, 0xff, - 0xaa, 0xc1, 0x92, 0x86, 0x64, 0x41, 0xb7, 0x61, 0x29, 0x18, 0xf2, 0x30, 0x0d, 0xd2, 0xf3, 0xbe, - 0xe5, 0x2f, 0xc8, 0xc3, 0x68, 0x6a, 0xfb, 0xa3, 0xc0, 0x57, 0x07, 0x3e, 0x22, 0x81, 0xfb, 0x67, - 0xb4, 0x01, 0x4c, 0xbf, 0x0d, 0xf1, 0x95, 0x70, 0x53, 0x94, 0xd2, 0x50, 0x03, 0x21, 0x2e, 0x97, - 0x19, 0xfd, 0x89, 0x30, 0x39, 0xcb, 0x48, 0x38, 0x55, 0xa2, 0x24, 0xec, 0x72, 0x5d, 0xd8, 0x09, - 0x1a, 0x28, 0x9c, 0xa8, 0xcc, 0x09, 0xfd, 0x98, 0x3f, 0x51, 0x31, 0x4e, 0x65, 0x1a, 0x85, 0x53, - 0x19, 0xd4, 0x9f, 0xe7, 0xe1, 0x80, 0x0f, 0xfb, 0x69, 0xd4, 0x27, 0x3d, 0x4f, 0x2c, 0xd1, 0xf0, - 0xf2, 0x30, 0xae, 0x1b, 0x29, 0x4f, 0xd2, 0x90, 0x0b, 0xd7, 0x74, 0x83, 0xbc, 0xa0, 0x0a, 0xc2, - 0xfd, 0xc1, 0x34, 0x0e, 0x92, 0x6e, 0x9b, 0xce, 0x5b, 0xe8, 0x37, 0xfb, 0x36, 0x5c, 0x3e, 0xe2, - 0x49, 0xda, 0x3f, 0xe5, 0xfe, 0x90, 0xc7, 0xc4, 0x5e, 0xe2, 0x60, 0x47, 0x98, 0x5c, 0xe5, 0x44, - 0x64, 0xdc, 0x33, 0x1e, 0x27, 0x41, 0x14, 0x92, 0xb1, 0xd5, 0xf4, 0x54, 0x12, 0xcb, 0xc3, 0xce, - 0xeb, 0x85, 0x5a, 0x8f, 0xe0, 0x12, 0x75, 0xbc, 0x9c, 0xc8, 0x6e, 0xc0, 0x1c, 0x75, 0x20, 0xe9, - 0x76, 0x88, 0x67, 0xda, 0x99, 0xcc, 0x07, 0xa1, 0x27, 0x69, 0x38, 0xcb, 0x83, 0x68, 0x14, 0xc5, - 0x64, 0x71, 0x35, 0x3d, 0x91, 0xb0, 0x47, 0xe7, 0x24, 0xf6, 0x27, 0xa7, 0xd2, 0xea, 0xca, 0xc3, - 0x9f, 0xd5, 0x1a, 0xad, 0x4e, 0xdb, 0xfd, 0x0b, 0x50, 0xa7, 0x62, 0xa9, 0x38, 0x1a, 0x4c, 0x47, - 0x16, 0x47, 0x68, 0x17, 0xe6, 0x43, 0x9e, 0xbe, 0x8a, 0xe2, 0x97, 0xea, 0xf4, 0x50, 0x26, 0xdd, - 0x9f, 0xd2, 0x0e, 0x4d, 0x9f, 0xa6, 0x3d, 0x27, 0xd3, 0x12, 0xf7, 0xd9, 0x62, 0xaa, 0x92, 0x53, - 0x5f, 0x6e, 0x1a, 0x1b, 0x04, 0x1c, 0x9e, 0xfa, 0xa8, 0x6b, 0xad, 0xd9, 0x17, 0xfb, 0xf0, 0x16, - 0x61, 0xbb, 0x62, 0xf2, 0x6f, 0xc0, 0xa2, 0x3a, 0xa7, 0x4b, 0xfa, 0x23, 0x7e, 0x9c, 0x2a, 0x2f, - 0x5a, 0x38, 0x1d, 0xd3, 0x66, 0x7d, 0x8f, 0x1f, 0xa7, 0xee, 0x3e, 0x2c, 0x4b, 0xfd, 0xf7, 0x74, - 0xc2, 0x55, 0xd5, 0xbf, 0x5d, 0x66, 0x4b, 0xb4, 0x36, 0x56, 0x6c, 0x85, 0x29, 0x4e, 0x26, 0xed, - 0x9c, 0xae, 0x07, 0xcc, 0xd4, 0xa7, 0xb2, 0x40, 0xb9, 0x98, 0x2b, 0x3f, 0xa1, 0xec, 0x8e, 0x85, - 0xe1, 0xf8, 0x24, 0xd3, 0xc1, 0x40, 0x9d, 0xae, 0x36, 0x3c, 0x95, 0x74, 0xff, 0xc8, 0x81, 0x15, - 0x2a, 0x4d, 0x59, 0x43, 0x72, 0xcd, 0xfa, 0xf8, 0x2b, 0x34, 0x53, 0x79, 0x69, 0x85, 0x6f, 0x72, - 0x15, 0xea, 0xe6, 0x2a, 0x26, 0x12, 0x5f, 0xdd, 0x27, 0x53, 0xcb, 0xfb, 0x64, 0xdc, 0x7f, 0xe8, - 0xc0, 0xb2, 0x58, 0x48, 0xc8, 0xda, 0x96, 0xdd, 0xff, 0x8b, 0xb0, 0x20, 0x2c, 0x02, 0xa9, 0x15, - 0x64, 0x43, 0x33, 0xd5, 0x4a, 0xa8, 0xc8, 0xbc, 0x7b, 0xc9, 0xb3, 0x33, 0xb3, 0x4f, 0xc9, 0x2a, - 0x0b, 0xfb, 0x84, 0x96, 0x9c, 0xc3, 0xdb, 0x63, 0xbd, 0x7b, 0xc9, 0x33, 0xb2, 0x3f, 0x68, 0xa0, - 0xb1, 0x8c, 0xb8, 0xfb, 0x08, 0x16, 0xac, 0x8a, 0x2c, 0x7f, 0x50, 0x5b, 0xf8, 0x83, 0x0a, 0x8e, - 0xd7, 0x4a, 0x89, 0xe3, 0xf5, 0x5f, 0x57, 0x81, 0x21, 0xb3, 0xe4, 0x66, 0xe3, 0xba, 0x7d, 0x7a, - 0xa1, 0x8e, 0xe4, 0x33, 0x88, 0x6d, 0x00, 0x33, 0x92, 0xea, 0x54, 0xa5, 0xaa, 0x4f, 0x55, 0x4a, - 0xa8, 0xa8, 0x6a, 0xa5, 0xd5, 0xa1, 0x4f, 0x2c, 0x68, 0xaf, 0x2f, 0x86, 0xbe, 0x94, 0x86, 0x2b, - 0x23, 0x1d, 0x5f, 0xe0, 0xae, 0x44, 0xee, 0x8f, 0x55, 0x3a, 0x3f, 0xc7, 0x73, 0x17, 0xce, 0xf1, - 0x7c, 0xc1, 0xef, 0x66, 0xec, 0xd0, 0x1a, 0xf6, 0x0e, 0xed, 0x06, 0x2c, 0xa8, 0x53, 0x0a, 0x71, - 0x22, 0x2a, 0xb7, 0xc3, 0x16, 0xc8, 0xee, 0x40, 0x47, 0x6d, 0x92, 0xf4, 0x36, 0x50, 0x9c, 0xf7, - 0x15, 0x70, 0x5c, 0x03, 0x32, 0x4f, 0x5c, 0x8b, 0x1a, 0x9b, 0x01, 0xb4, 0xa7, 0x42, 0x2e, 0xe9, - 0x4f, 0x43, 0x79, 0x1c, 0xcf, 0x87, 0xb4, 0x11, 0xc6, 0x3d, 0x55, 0x9e, 0xe0, 0xfe, 0x3d, 0x07, - 0x3a, 0x38, 0x6f, 0x16, 0x6b, 0x7e, 0x02, 0x24, 0x19, 0x6f, 0xc9, 0x99, 0x56, 0x5e, 0xf6, 0x31, - 0x34, 0x29, 0x1d, 0x4d, 0x78, 0x28, 0xf9, 0xb2, 0x6b, 0xf3, 0x65, 0xa6, 0x53, 0x76, 0x2f, 0x79, - 0x59, 0x66, 0x83, 0x2b, 0xff, 0x93, 0x03, 0x2d, 0x59, 0xcb, 0xaf, 0xec, 0xe9, 0xe9, 0x19, 0xf1, - 0x13, 0xc2, 0x00, 0xcb, 0xc2, 0x25, 0x6e, 0xc3, 0xd2, 0xd8, 0x4f, 0xa7, 0x31, 0xae, 0xe9, 0x96, - 0x97, 0x27, 0x0f, 0xe3, 0x02, 0x4d, 0xea, 0x33, 0xe9, 0xa7, 0xc1, 0xa8, 0xaf, 0xa8, 0x32, 0x52, - 0xa1, 0x8c, 0x84, 0x5a, 0x24, 0x49, 0xfd, 0x13, 0x2e, 0xd7, 0x5e, 0x91, 0x70, 0xbb, 0xb0, 0x76, - 0x90, 0x9d, 0xdc, 0x18, 0x36, 0xb6, 0xfb, 0x2f, 0x17, 0x60, 0xbd, 0x40, 0xd2, 0x71, 0x55, 0xd2, - 0x75, 0x31, 0x0a, 0xc6, 0x47, 0x91, 0xde, 0xa0, 0x38, 0xa6, 0x57, 0xc3, 0x22, 0xb1, 0x13, 0xb8, - 0xac, 0x8c, 0x0c, 0x1c, 0xd3, 0x6c, 0x41, 0xac, 0xd0, 0x4a, 0xf7, 0xa1, 0x3d, 0x85, 0xf9, 0x0a, - 0x15, 0x6e, 0x0a, 0x72, 0x79, 0x79, 0xec, 0x14, 0xba, 0xda, 0x9a, 0x91, 0x0a, 0xdb, 0xb0, 0x78, - 0xb0, 0xae, 0x0f, 0x2e, 0xa8, 0xcb, 0x32, 0xc9, 0xbd, 0x99, 0xa5, 0xb1, 0x73, 0xb8, 0xa6, 0x68, - 0xa4, 0x91, 0x8b, 0xf5, 0xd5, 0xde, 0xaa, 0x6f, 0xb4, 0xd9, 0xb0, 0x2b, 0xbd, 0xa0, 0x60, 0xf6, - 0x63, 0x58, 0x7b, 0xe5, 0x07, 0xa9, 0x6a, 0x96, 0x61, 0x5f, 0xd4, 0xa9, 0xca, 0x8d, 0x0b, 0xaa, - 0x7c, 0x21, 0x3e, 0xb6, 0x96, 0xa9, 0x19, 0x25, 0xf6, 0xfe, 0xb4, 0x02, 0x8b, 0x76, 0x39, 0xc8, - 0xa6, 0x52, 0xf6, 0x95, 0x0e, 0x54, 0x16, 0x69, 0x0e, 0x2e, 0xee, 0xf3, 0x2b, 0x65, 0xfb, 0x7c, - 0x73, 0x67, 0x5d, 0xbd, 0xc8, 0x45, 0x58, 0x7b, 0x3b, 0x17, 0x61, 0xbd, 0xd4, 0x45, 0x38, 0xdb, - 0x93, 0x34, 0xf7, 0xab, 0x7a, 0x92, 0xe6, 0xdf, 0xe8, 0x49, 0xea, 0xfd, 0x5f, 0x07, 0x58, 0x91, - 0x7b, 0xd9, 0x23, 0xe1, 0xda, 0x08, 0xf9, 0x48, 0x2a, 0xb1, 0x6f, 0xbe, 0x9d, 0x04, 0xa8, 0xd9, - 0x52, 0x5f, 0xa3, 0x28, 0x9a, 0xc1, 0x4d, 0xa6, 0x89, 0xb5, 0xe0, 0x95, 0x91, 0x72, 0x6e, 0xd2, - 0xda, 0xc5, 0x6e, 0xd2, 0xfa, 0xc5, 0x6e, 0xd2, 0xb9, 0xbc, 0x9b, 0xb4, 0xf7, 0x37, 0x1d, 0x58, - 0x29, 0x61, 0xb3, 0xdf, 0x5c, 0xc7, 0x91, 0x31, 0x2c, 0xed, 0x53, 0x91, 0x8c, 0x61, 0x82, 0xbd, - 0xbf, 0x0a, 0x0b, 0x96, 0x68, 0xfd, 0xe6, 0xea, 0xcf, 0x5b, 0x89, 0x82, 0xb3, 0x2d, 0xac, 0xf7, - 0xbf, 0x2b, 0xc0, 0x8a, 0xe2, 0xfd, 0xe7, 0xda, 0x86, 0xe2, 0x38, 0x55, 0x4b, 0xc6, 0xe9, 0xff, - 0xeb, 0xca, 0xf3, 0x01, 0x2c, 0xcb, 0x88, 0x4d, 0xc3, 0x99, 0x25, 0x38, 0xa6, 0x48, 0x40, 0x3b, - 0xd9, 0xf6, 0x51, 0x37, 0xac, 0x08, 0x35, 0x63, 0xf9, 0xcd, 0xb9, 0xaa, 0xdd, 0x1e, 0x74, 0xe5, - 0x08, 0xed, 0x9c, 0xf1, 0x30, 0x3d, 0x9c, 0x1e, 0x89, 0x90, 0xc5, 0x20, 0x0a, 0xc9, 0x0c, 0x34, - 0x89, 0xd2, 0xa0, 0xf8, 0x36, 0xb4, 0xcd, 0xe5, 0x43, 0x4e, 0x47, 0xce, 0x9f, 0x89, 0xa6, 0x84, - 0x99, 0x8b, 0x6d, 0xc3, 0x22, 0x29, 0xc9, 0xa1, 0xfe, 0xae, 0x42, 0xdf, 0xbd, 0xc1, 0x47, 0xb3, - 0x7b, 0xc9, 0xcb, 0x7d, 0xc3, 0x7e, 0x07, 0x16, 0xed, 0x0d, 0xa0, 0xb4, 0x4a, 0xca, 0x76, 0x04, - 0xf8, 0xb9, 0x9d, 0x99, 0x6d, 0x42, 0x27, 0xbf, 0x83, 0x94, 0xd1, 0x3c, 0x33, 0x0a, 0x28, 0x64, - 0x67, 0x1f, 0xcb, 0x03, 0xcb, 0x3a, 0xf9, 0x4e, 0x6e, 0xd8, 0x9f, 0x19, 0xc3, 0x74, 0x57, 0xfc, - 0x31, 0x8e, 0x30, 0x7f, 0x0f, 0x20, 0xc3, 0x58, 0x07, 0xda, 0x4f, 0x0f, 0x76, 0xf6, 0xfb, 0x5b, - 0xbb, 0x9b, 0xfb, 0xfb, 0x3b, 0x7b, 0x9d, 0x4b, 0x8c, 0xc1, 0x22, 0xb9, 0xfa, 0xb6, 0x35, 0xe6, - 0x20, 0x26, 0x9d, 0x2b, 0x0a, 0xab, 0xb0, 0x55, 0xe8, 0x3c, 0xde, 0xcf, 0xa1, 0xd5, 0x07, 0x4d, - 0x2d, 0x1f, 0xee, 0x1a, 0xac, 0x8a, 0x88, 0xdc, 0x07, 0x82, 0x3d, 0x94, 0x75, 0xf2, 0x4f, 0x1d, - 0xb8, 0x9c, 0x23, 0x64, 0x21, 0x5f, 0xc2, 0x00, 0xb1, 0xad, 0x12, 0x1b, 0xa4, 0x03, 0x08, 0x65, - 0x6b, 0xe6, 0x34, 0x48, 0x91, 0x80, 0x3c, 0x6f, 0xd8, 0xa6, 0x39, 0x49, 0x2a, 0x23, 0xb9, 0xeb, - 0x3a, 0xb2, 0x26, 0xd7, 0xf0, 0x63, 0x11, 0xe9, 0x6b, 0x12, 0xb2, 0x03, 0x60, 0xbb, 0xc9, 0x2a, - 0x89, 0xdb, 0x0a, 0xcb, 0xd8, 0xb1, 0xdb, 0x5b, 0x4a, 0x73, 0xff, 0x7d, 0x15, 0xd8, 0x77, 0xa7, - 0x3c, 0x3e, 0xa7, 0x98, 0x2e, 0xed, 0x39, 0x5d, 0xcf, 0xfb, 0x05, 0xe7, 0x26, 0xd3, 0xa3, 0xcf, - 0xf9, 0xb9, 0x0a, 0x96, 0xac, 0xbc, 0x55, 0xb0, 0x64, 0x59, 0xb0, 0x62, 0xed, 0xe2, 0x60, 0xc5, - 0xfa, 0x45, 0xc1, 0x8a, 0x5f, 0x83, 0x85, 0xe0, 0x24, 0x8c, 0x50, 0x1d, 0xa0, 0x09, 0x91, 0x74, - 0xe7, 0xae, 0x57, 0x71, 0xeb, 0x2d, 0xc1, 0x7d, 0xc4, 0xd8, 0xa7, 0x59, 0x26, 0x3e, 0x3c, 0xa1, - 0xe0, 0x5a, 0x53, 0x41, 0xec, 0x0c, 0x4f, 0xf8, 0x5e, 0x34, 0xf0, 0xd3, 0x28, 0xa6, 0x7d, 0x9a, - 0xfa, 0x18, 0xf1, 0x84, 0xdd, 0x80, 0xc5, 0x24, 0x9a, 0xa2, 0x51, 0xa5, 0x86, 0x41, 0x38, 0x9a, - 0xda, 0x02, 0x3d, 0x10, 0x83, 0x71, 0x17, 0x56, 0xa6, 0x09, 0xef, 0x8f, 0x83, 0x24, 0xc1, 0x85, - 0x73, 0x10, 0x85, 0x69, 0x1c, 0x8d, 0xa4, 0xbb, 0x69, 0x79, 0x9a, 0xf0, 0x27, 0x82, 0xb2, 0x25, - 0x08, 0xec, 0xdb, 0x59, 0x93, 0x26, 0x7e, 0x10, 0x27, 0x5d, 0xa0, 0x26, 0xa9, 0x9e, 0x62, 0xbb, - 0x0f, 0xfc, 0x20, 0xd6, 0x6d, 0xc1, 0x44, 0x92, 0x0b, 0xa2, 0x6c, 0xe5, 0x82, 0x28, 0x65, 0xfc, - 0xdd, 0x5d, 0x68, 0xa8, 0xcf, 0x71, 0x0f, 0x7c, 0x1c, 0x47, 0x63, 0xb5, 0x07, 0xc6, 0xdf, 0x6c, - 0x11, 0x2a, 0x69, 0x24, 0xf7, 0xaf, 0x95, 0x34, 0x72, 0x7f, 0x1f, 0x5a, 0xc6, 0x08, 0xb0, 0xf7, - 0xc5, 0x76, 0x1c, 0x6d, 0x2d, 0xb9, 0x79, 0x16, 0xa7, 0x28, 0x4d, 0x89, 0x3e, 0x1e, 0xb2, 0x6f, - 0xc0, 0xf2, 0x30, 0x88, 0x39, 0xc5, 0xf9, 0xf6, 0x63, 0x7e, 0xc6, 0xe3, 0x44, 0xb9, 0x1a, 0x3a, - 0x9a, 0xe0, 0x09, 0xdc, 0xed, 0xc3, 0x8a, 0xc5, 0x55, 0x5a, 0xe8, 0xe6, 0x28, 0x68, 0x50, 0x79, - 0x3b, 0xed, 0x80, 0x42, 0x49, 0xc3, 0xe5, 0x4a, 0x7a, 0x49, 0xfa, 0x93, 0x38, 0x3a, 0xa2, 0x4a, - 0x1c, 0xcf, 0xc2, 0xdc, 0x5f, 0x54, 0xa0, 0xba, 0x1b, 0x4d, 0xcc, 0xb3, 0x1f, 0xa7, 0x78, 0xf6, - 0x23, 0xed, 0xca, 0xbe, 0x36, 0x1b, 0xe5, 0xe2, 0x6f, 0x81, 0xec, 0x0e, 0x2c, 0x22, 0x07, 0xa7, - 0x11, 0xda, 0xd1, 0xaf, 0xfc, 0x58, 0x44, 0x18, 0x56, 0x89, 0x2d, 0x72, 0x14, 0xb6, 0x0a, 0x55, - 0x6d, 0x0e, 0x51, 0x06, 0x4c, 0xe2, 0x26, 0x8e, 0xce, 0xd7, 0xcf, 0xa5, 0x4b, 0x53, 0xa6, 0x50, - 0x21, 0xd8, 0xdf, 0x0b, 0x31, 0x11, 0x8b, 0x5a, 0x19, 0x09, 0x6d, 0x5c, 0x14, 0x84, 0x71, 0x66, - 0x32, 0xea, 0xb4, 0xe9, 0xac, 0x6f, 0xd8, 0xce, 0xfa, 0xeb, 0xd0, 0x4a, 0x47, 0x67, 0xfd, 0x89, - 0x7f, 0x3e, 0x8a, 0xfc, 0xa1, 0x64, 0x40, 0x13, 0x62, 0xf7, 0x01, 0xc6, 0x93, 0x49, 0x1f, 0xd7, - 0xd1, 0x78, 0x48, 0x3b, 0xf3, 0xd6, 0x46, 0x47, 0x8e, 0xfe, 0x93, 0x83, 0x03, 0x8f, 0x70, 0xcf, - 0xc8, 0xe3, 0xbe, 0x80, 0xa6, 0x26, 0x98, 0xa1, 0xa9, 0x14, 0x61, 0xd1, 0xb2, 0x43, 0x53, 0x29, - 0xa0, 0xe2, 0x26, 0x2c, 0x0a, 0xe5, 0xa9, 0xd5, 0x81, 0x38, 0x15, 0xcf, 0xa1, 0xee, 0x2f, 0x1d, - 0xa8, 0xd3, 0x84, 0xa3, 0x35, 0x21, 0x68, 0xfa, 0xac, 0x8a, 0x26, 0x71, 0xc1, 0xcb, 0xc3, 0xcc, - 0xb5, 0xc2, 0xe4, 0x2b, 0x7a, 0xf4, 0xcd, 0x50, 0xf9, 0xeb, 0xd0, 0xd4, 0x35, 0x19, 0x33, 0x98, - 0x81, 0xec, 0x1a, 0xd4, 0x4e, 0xa3, 0x89, 0xda, 0x70, 0x81, 0x3a, 0xce, 0x8e, 0x26, 0x1e, 0xe1, - 0x59, 0x7b, 0xb0, 0x3c, 0xd1, 0x05, 0x61, 0xd4, 0xe6, 0xe1, 0x92, 0xbe, 0xce, 0x95, 0xf6, 0xf5, - 0x39, 0x2c, 0xa1, 0x58, 0x1a, 0xbe, 0xfb, 0xd9, 0xaa, 0xf5, 0xeb, 0xb8, 0x52, 0x0f, 0x46, 0xd3, - 0x21, 0x37, 0xb7, 0xbd, 0xe4, 0x9b, 0x95, 0xb8, 0x32, 0xf8, 0xdc, 0x7f, 0xe5, 0x08, 0x71, 0xc7, - 0x72, 0xd9, 0x6d, 0xa8, 0xa1, 0x16, 0xcc, 0x79, 0x39, 0x74, 0xd4, 0x0b, 0xe6, 0xf3, 0x28, 0x07, - 0xce, 0x22, 0x79, 0x4f, 0xcd, 0xd2, 0x85, 0xef, 0x34, 0xdb, 0x33, 0xea, 0x9e, 0xe5, 0xb6, 0x5a, - 0x39, 0x94, 0xdd, 0x35, 0x8e, 0x9e, 0x6a, 0x96, 0x66, 0x55, 0x86, 0xc1, 0xf0, 0x84, 0x1b, 0x47, - 0x4e, 0x7f, 0xec, 0xc0, 0x82, 0xd5, 0x26, 0x64, 0x5a, 0x0a, 0x22, 0x17, 0x4e, 0x13, 0x39, 0xf3, - 0x26, 0x64, 0x32, 0x7c, 0xc5, 0x66, 0x78, 0x7d, 0x84, 0x51, 0x35, 0x8f, 0x30, 0xee, 0x43, 0x33, - 0xbb, 0x27, 0x61, 0x37, 0x0a, 0x6b, 0x54, 0xf1, 0x3f, 0x59, 0xa6, 0xcc, 0x49, 0x5e, 0x37, 0x9c, - 0xe4, 0xee, 0xa7, 0xd0, 0x32, 0xf2, 0x9b, 0x4e, 0x6e, 0xc7, 0x72, 0x72, 0xeb, 0xe0, 0xb8, 0x4a, - 0x16, 0x1c, 0xe7, 0xfe, 0xac, 0x02, 0x0b, 0xc8, 0xde, 0x41, 0x78, 0x72, 0x10, 0x8d, 0x82, 0xc1, - 0x39, 0xb1, 0x95, 0xe2, 0x64, 0xb9, 0x0a, 0x2a, 0x36, 0xb7, 0x61, 0x94, 0x7e, 0x1d, 0x11, 0x2c, - 0x54, 0x95, 0x4e, 0xa3, 0x2e, 0x43, 0x4d, 0x70, 0xe4, 0x27, 0xdc, 0xb8, 0x38, 0xe1, 0xd9, 0x20, - 0x6a, 0x1c, 0x04, 0x28, 0xd4, 0x71, 0x1c, 0x8c, 0x46, 0x81, 0xc8, 0x2b, 0xb6, 0x6f, 0x65, 0x24, - 0xac, 0x73, 0x18, 0x24, 0xfe, 0x51, 0x76, 0x3c, 0xa9, 0xd3, 0xe4, 0xfb, 0xf3, 0x5f, 0x1b, 0xbe, - 0x3f, 0x11, 0x1b, 0x6d, 0x83, 0xf9, 0x89, 0x9c, 0x2f, 0x4c, 0xa4, 0xfb, 0xef, 0x2a, 0xd0, 0x32, - 0xd8, 0x02, 0xc5, 0xb9, 0x74, 0xb9, 0x31, 0x50, 0x79, 0x6e, 0x1f, 0x5a, 0x0e, 0x01, 0x03, 0x61, - 0x37, 0xec, 0x5a, 0xe9, 0x1c, 0x80, 0x04, 0xde, 0x62, 0xa1, 0xab, 0xd0, 0x44, 0xd6, 0xff, 0x90, - 0xbc, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x14, 0x75, 0x83, 0xa8, 0xf5, 0x8c, 0x4a, 0xc0, 0x1b, 0x4f, - 0xf2, 0x3f, 0x86, 0xb6, 0x2c, 0x86, 0xe6, 0x98, 0x3a, 0x9d, 0x09, 0x9f, 0x35, 0xff, 0x9e, 0x95, - 0x53, 0x7d, 0xb9, 0xa1, 0xbe, 0x6c, 0x5c, 0xf4, 0xa5, 0xca, 0xe9, 0x3e, 0xd2, 0x41, 0x12, 0x8f, - 0x62, 0x7f, 0x72, 0xaa, 0x14, 0xca, 0x7d, 0x58, 0x51, 0x7a, 0x63, 0x1a, 0xfa, 0x61, 0x18, 0x4d, - 0xc3, 0x01, 0x57, 0x71, 0x74, 0x65, 0x24, 0x77, 0xa8, 0xa3, 0xae, 0xa9, 0x20, 0x76, 0x07, 0xea, - 0xc2, 0x8e, 0x12, 0xab, 0x72, 0xb9, 0x0a, 0x11, 0x59, 0xd8, 0x6d, 0xa8, 0x0b, 0x73, 0xaa, 0x32, - 0x53, 0xe8, 0x45, 0x06, 0xf7, 0x2e, 0x2c, 0x51, 0x98, 0xb7, 0xa1, 0xfb, 0xde, 0x29, 0x5b, 0xad, - 0xe7, 0x06, 0x22, 0x18, 0x7c, 0x15, 0xd8, 0xbe, 0x90, 0x2b, 0xf3, 0xa8, 0xf3, 0x97, 0x55, 0x68, - 0x19, 0x30, 0xea, 0x27, 0x3a, 0x9f, 0xea, 0x0f, 0x03, 0x7f, 0xcc, 0x53, 0x1e, 0x4b, 0x59, 0xca, - 0xa1, 0x98, 0xcf, 0x3f, 0x3b, 0xe9, 0x47, 0xd3, 0xb4, 0x3f, 0xe4, 0x27, 0x31, 0xe7, 0xd2, 0x8c, - 0xc8, 0xa1, 0x98, 0x0f, 0xb9, 0xd9, 0xc8, 0x27, 0x4e, 0x94, 0x72, 0xa8, 0x3a, 0xb8, 0x14, 0xe3, - 0x54, 0xcb, 0x0e, 0x2e, 0xc5, 0xa8, 0xe4, 0x35, 0x6b, 0xbd, 0x44, 0xb3, 0x7e, 0x04, 0x6b, 0x42, - 0x87, 0x4a, 0xed, 0xd1, 0xcf, 0x31, 0xd7, 0x0c, 0x2a, 0xbb, 0x03, 0x1d, 0x6c, 0xb3, 0x12, 0x8d, - 0x24, 0xf8, 0xa9, 0x90, 0x31, 0xc7, 0x2b, 0xe0, 0x98, 0x97, 0x3c, 0xe9, 0x66, 0x5e, 0x11, 0x3d, - 0x52, 0xc0, 0x29, 0xaf, 0xff, 0xda, 0xce, 0xdb, 0x94, 0x79, 0x73, 0x38, 0xfb, 0x18, 0xd6, 0xc7, - 0x7c, 0x18, 0xf8, 0x76, 0x11, 0xfd, 0x6c, 0x91, 0x9f, 0x45, 0xc6, 0x5a, 0x70, 0x14, 0x7e, 0x1a, - 0x8d, 0x8f, 0x02, 0xb1, 0xb0, 0x09, 0x9f, 0x7f, 0xcd, 0x2b, 0xe0, 0xee, 0x02, 0xb4, 0x0e, 0xd3, - 0x68, 0xa2, 0xa6, 0x7e, 0x11, 0xda, 0x22, 0x29, 0x23, 0x27, 0xdf, 0x81, 0x2b, 0xc4, 0xaf, 0xcf, - 0xa2, 0x49, 0x34, 0x8a, 0x4e, 0xce, 0xad, 0x9d, 0xfb, 0x7f, 0x74, 0x60, 0xc5, 0xa2, 0x66, 0x5b, - 0x77, 0x72, 0x33, 0xaa, 0x70, 0x37, 0xc1, 0xe2, 0xcb, 0xc6, 0xb2, 0x20, 0x32, 0x8a, 0x53, 0x9d, - 0xe7, 0x32, 0x02, 0x6e, 0x33, 0xbb, 0xc3, 0xa1, 0x3e, 0x14, 0xfc, 0xde, 0x2d, 0xf2, 0xbb, 0xfc, - 0x5e, 0xdd, 0xee, 0x50, 0x45, 0xfc, 0x8e, 0x8c, 0xf5, 0x19, 0xca, 0x4e, 0x57, 0xed, 0xf8, 0x0c, - 0xd3, 0xd3, 0xa3, 0x5a, 0x30, 0xd0, 0x60, 0xe2, 0xfe, 0xdc, 0x01, 0xc8, 0x5a, 0x47, 0x11, 0x22, - 0x7a, 0x69, 0x13, 0xf7, 0x92, 0x8d, 0x65, 0xec, 0x7d, 0x68, 0xeb, 0x43, 0xfe, 0x6c, 0xb5, 0x6c, - 0x29, 0x0c, 0xad, 0x8b, 0x5b, 0xb0, 0x74, 0x32, 0x8a, 0x8e, 0xc8, 0x8a, 0xa1, 0x50, 0xdc, 0x44, - 0xc6, 0x8f, 0x2e, 0x0a, 0xf8, 0xa1, 0x44, 0xb3, 0xa5, 0xb5, 0x66, 0x2e, 0xad, 0xe5, 0x0b, 0xe5, - 0xcf, 0x2a, 0xfa, 0xa4, 0x35, 0x1b, 0x89, 0x37, 0x4a, 0x39, 0xdb, 0x28, 0xa8, 0xf5, 0x19, 0x87, - 0x9b, 0xb4, 0xf5, 0x38, 0xb8, 0xd0, 0xf1, 0xfb, 0x29, 0x2c, 0xc6, 0x42, 0x67, 0x2a, 0x85, 0x5a, - 0x7b, 0x83, 0x42, 0x5d, 0x88, 0xad, 0x95, 0xf9, 0xeb, 0xd0, 0xf1, 0x87, 0x67, 0x3c, 0x4e, 0x03, - 0x72, 0x84, 0x91, 0x19, 0x25, 0x3a, 0xb8, 0x64, 0xe0, 0x64, 0xad, 0xdc, 0x82, 0x25, 0x19, 0xcd, - 0xab, 0x73, 0xca, 0x1b, 0x7a, 0x19, 0x8c, 0x19, 0xdd, 0x7f, 0xae, 0x0e, 0x76, 0xed, 0xd9, 0x7d, - 0xf3, 0xa8, 0x98, 0x3d, 0xac, 0xe4, 0x7a, 0xf8, 0x35, 0x79, 0xd0, 0x3a, 0x54, 0x1e, 0xb7, 0xaa, - 0x11, 0x35, 0x36, 0x94, 0x07, 0xe3, 0xf6, 0xb0, 0xd6, 0xde, 0x66, 0x58, 0xdd, 0xff, 0xe2, 0xc0, - 0xfc, 0x6e, 0x34, 0xd9, 0xc5, 0x21, 0x46, 0x1b, 0x07, 0xc5, 0x44, 0x87, 0xd2, 0xab, 0xe4, 0x05, - 0xd1, 0x75, 0xa5, 0x56, 0xc9, 0x42, 0xde, 0x2a, 0xf9, 0xcb, 0xf0, 0x0e, 0xf9, 0x7c, 0xe3, 0x68, - 0x12, 0xc5, 0x28, 0xae, 0xfe, 0x48, 0x98, 0x20, 0x51, 0x98, 0x9e, 0x2a, 0x75, 0xfa, 0xa6, 0x2c, - 0xe4, 0x88, 0xc1, 0x4d, 0xb0, 0xd8, 0x58, 0x49, 0x2b, 0x4a, 0x68, 0xd9, 0x22, 0xc1, 0xfd, 0x6d, - 0x68, 0xd2, 0x0e, 0x83, 0xba, 0xf6, 0x01, 0x34, 0x4f, 0xa3, 0x49, 0xff, 0x34, 0x08, 0x53, 0x25, - 0xfe, 0x8b, 0x99, 0xe9, 0xbf, 0x4b, 0x83, 0xa2, 0x33, 0xb8, 0x7f, 0x36, 0x07, 0xf3, 0x8f, 0xc3, - 0xb3, 0x28, 0x18, 0xd0, 0x61, 0xf2, 0x98, 0x8f, 0x23, 0x75, 0xb9, 0x00, 0x7f, 0xd3, 0x45, 0xdb, - 0xec, 0xfa, 0x9f, 0x10, 0x21, 0x03, 0xc1, 0xad, 0x60, 0x6c, 0x5e, 0xdf, 0x93, 0xa9, 0xec, 0x7a, - 0x46, 0xdd, 0xb8, 0x9e, 0x81, 0xa5, 0x89, 0x6b, 0x65, 0x34, 0x76, 0x22, 0x28, 0xd4, 0x40, 0x70, - 0xf0, 0x65, 0xd4, 0x9f, 0x08, 0x0b, 0x13, 0x21, 0x2a, 0x12, 0xa2, 0xed, 0x6d, 0xcc, 0x85, 0xd7, - 0x5e, 0x9b, 0x5e, 0xb8, 0xbd, 0x35, 0x41, 0x34, 0xcf, 0xc4, 0x07, 0x22, 0x8f, 0x58, 0x0e, 0x4c, - 0x08, 0x0d, 0xd4, 0xfc, 0xed, 0x53, 0x71, 0x83, 0x38, 0x0f, 0xa3, 0x36, 0x1f, 0x72, 0xad, 0x74, - 0x45, 0x3f, 0x41, 0x5c, 0x81, 0xcc, 0xe3, 0xc6, 0xa6, 0x58, 0x84, 0x3d, 0xab, 0x4d, 0x31, 0xb2, - 0x8c, 0x3f, 0x1a, 0x1d, 0xf9, 0x83, 0x97, 0x62, 0x33, 0xd9, 0x16, 0x87, 0x3d, 0x16, 0x48, 0xb1, - 0x7b, 0xd9, 0xbc, 0x52, 0x80, 0x4d, 0xcd, 0x33, 0x21, 0xb6, 0x01, 0x2d, 0x72, 0x18, 0xc8, 0x99, - 0x5d, 0xa4, 0x99, 0xed, 0x98, 0x1e, 0x05, 0x9a, 0x5b, 0x33, 0x93, 0x79, 0xcc, 0xbd, 0x54, 0x08, - 0x44, 0xf6, 0x87, 0x43, 0x19, 0x21, 0xd0, 0x11, 0x57, 0x00, 0x35, 0x40, 0x2e, 0x09, 0x31, 0x60, - 0x22, 0xc3, 0x32, 0x65, 0xb0, 0x30, 0x76, 0x4d, 0x38, 0xc2, 0x26, 0x7e, 0x30, 0xa4, 0x98, 0x1a, - 0xb1, 0xfd, 0xd4, 0x18, 0x96, 0xa1, 0x7e, 0xd3, 0xc2, 0xb9, 0x42, 0xa3, 0x62, 0x61, 0x38, 0x36, - 0x3a, 0x3d, 0xce, 0x22, 0x97, 0x6d, 0x90, 0x7d, 0x48, 0x67, 0xb4, 0x29, 0xa7, 0xf0, 0xe4, 0xc5, - 0x8d, 0x77, 0x64, 0x9f, 0x25, 0xdb, 0xaa, 0xbf, 0x87, 0x98, 0xc5, 0x13, 0x39, 0xd1, 0x6c, 0x13, - 0x6e, 0xf2, 0x35, 0xcb, 0x6c, 0x93, 0x59, 0xc9, 0x4d, 0x2e, 0x32, 0xb8, 0x9b, 0xd0, 0x36, 0x0b, - 0x60, 0x0d, 0xa8, 0x3d, 0x3d, 0xd8, 0xd9, 0xef, 0x5c, 0x62, 0x2d, 0x98, 0x3f, 0xdc, 0x79, 0xf6, - 0x6c, 0x6f, 0x67, 0xbb, 0xe3, 0xb0, 0x36, 0x34, 0x74, 0x48, 0x66, 0x05, 0x53, 0x9b, 0x5b, 0x5b, - 0x3b, 0x07, 0xcf, 0x76, 0xb6, 0x3b, 0xd5, 0xcf, 0x6a, 0x8d, 0x4a, 0xa7, 0xea, 0xfe, 0x51, 0x05, - 0x5a, 0x46, 0xf9, 0x17, 0xb8, 0x6a, 0xae, 0x01, 0xd0, 0x8e, 0x22, 0x0b, 0xd1, 0xa8, 0x79, 0x06, - 0x82, 0x1a, 0x52, 0xef, 0xb5, 0xab, 0xe2, 0x3e, 0xa4, 0x4a, 0xd3, 0xa8, 0xd1, 0xc5, 0x43, 0xf3, - 0x4c, 0xa2, 0xee, 0xd9, 0x20, 0x72, 0x94, 0x04, 0x28, 0x4e, 0x50, 0xc8, 0xa1, 0x09, 0xe1, 0x0c, - 0xc5, 0x3c, 0x89, 0x46, 0x67, 0x5c, 0x64, 0x11, 0x76, 0x99, 0x85, 0x61, 0x5d, 0x52, 0xd5, 0x18, - 0x31, 0xbc, 0x75, 0xcf, 0x06, 0xd9, 0x37, 0xd5, 0x0c, 0x35, 0x68, 0x86, 0xd6, 0x8b, 0xc3, 0x6d, - 0xce, 0x8e, 0x9b, 0x02, 0xdb, 0x1c, 0x0e, 0x25, 0xd5, 0xbc, 0x5d, 0x19, 0x9b, 0xd7, 0x79, 0x95, - 0x2a, 0x29, 0x11, 0xd7, 0x4a, 0xb9, 0xb8, 0xbe, 0x91, 0xa9, 0xdd, 0xc7, 0xd0, 0x3a, 0x30, 0x2e, - 0x08, 0xbb, 0xa8, 0xd9, 0xd4, 0xd5, 0x60, 0xa1, 0xf3, 0x84, 0x8f, 0x25, 0x43, 0x8d, 0x26, 0x55, - 0xcc, 0x26, 0xb9, 0xff, 0xcc, 0x11, 0x77, 0xae, 0x74, 0x17, 0x44, 0xfd, 0x2e, 0xb4, 0xb5, 0xd7, - 0x39, 0x0b, 0x53, 0xb7, 0x30, 0xcc, 0x43, 0xcd, 0xe9, 0x47, 0xc7, 0xc7, 0x09, 0x57, 0x01, 0xa5, - 0x16, 0xa6, 0x8c, 0x48, 0x34, 0x4b, 0x03, 0x51, 0x43, 0x22, 0x03, 0x4b, 0x0b, 0x38, 0x32, 0x8a, - 0xf4, 0x4e, 0xaa, 0x50, 0x5a, 0x9d, 0xd6, 0xd1, 0xf4, 0xf9, 0x91, 0xbe, 0x03, 0x0d, 0x5d, 0xae, - 0xbd, 0x42, 0xa8, 0x9c, 0x9a, 0x8e, 0x2b, 0x11, 0x6d, 0x30, 0xad, 0x46, 0x0b, 0x7e, 0x2d, 0x12, - 0xd8, 0x5d, 0x60, 0xc7, 0x41, 0x9c, 0xcf, 0x2e, 0x18, 0xb8, 0x84, 0xe2, 0xbe, 0x80, 0x15, 0x25, - 0x7d, 0x86, 0x75, 0x6b, 0x4f, 0xa4, 0x73, 0x91, 0x76, 0xaa, 0x14, 0xb5, 0x93, 0xfb, 0x8b, 0x2a, - 0xcc, 0xcb, 0xd9, 0x2e, 0x5c, 0x34, 0x17, 0xeb, 0x9b, 0x85, 0xb1, 0xae, 0x75, 0x9d, 0x90, 0x18, - 0x41, 0xae, 0x59, 0x85, 0x55, 0xa7, 0x5a, 0xb6, 0xea, 0x30, 0xa8, 0x4d, 0xfc, 0xf4, 0x94, 0xdc, - 0x30, 0x4d, 0x8f, 0x7e, 0x2b, 0xe7, 0x69, 0xdd, 0x76, 0x9e, 0x96, 0x5d, 0xab, 0x17, 0xa6, 0x55, - 0xf1, 0x5a, 0xfd, 0x55, 0x68, 0x8a, 0xd5, 0x31, 0xf3, 0x8f, 0x66, 0x40, 0x6e, 0x35, 0x6d, 0x14, - 0x56, 0xd3, 0xb7, 0x5f, 0xe7, 0xbe, 0x0d, 0x73, 0xe2, 0x6a, 0x89, 0x0c, 0x18, 0xbe, 0xaa, 0x8e, - 0x15, 0x45, 0x3e, 0xf5, 0x57, 0x44, 0x1d, 0x79, 0x32, 0xaf, 0x79, 0x39, 0xb5, 0x65, 0x5f, 0x4e, - 0x35, 0xdd, 0xba, 0x6d, 0xdb, 0xad, 0xeb, 0x3e, 0x84, 0x05, 0xab, 0x38, 0xd4, 0xb3, 0x32, 0xe0, - 0xb8, 0x73, 0x89, 0x2d, 0x40, 0xf3, 0xf1, 0x7e, 0xff, 0xe1, 0xde, 0xe3, 0x47, 0xbb, 0xcf, 0x3a, - 0x0e, 0x26, 0x0f, 0x9f, 0x6f, 0x6d, 0xed, 0xec, 0x6c, 0x93, 0xde, 0x05, 0x98, 0x7b, 0xb8, 0xf9, - 0x18, 0x75, 0x70, 0xd5, 0xdd, 0x16, 0xbc, 0x2d, 0xcb, 0xd2, 0x47, 0x39, 0xdf, 0x04, 0xa6, 0x7c, - 0x00, 0x14, 0x74, 0x34, 0x19, 0xf1, 0x54, 0xc5, 0xc2, 0x2f, 0x4b, 0xca, 0x63, 0x4d, 0x50, 0xd7, - 0x39, 0xb2, 0x52, 0x32, 0x11, 0x91, 0x83, 0x94, 0x17, 0x11, 0x99, 0xd5, 0xd3, 0x74, 0xb7, 0x07, - 0xdd, 0x6d, 0x8e, 0xa5, 0x6d, 0x8e, 0x46, 0xb9, 0xe6, 0xe0, 0x26, 0xae, 0x84, 0x26, 0x77, 0x78, - 0xdf, 0x85, 0xcb, 0x9b, 0x22, 0xec, 0xfd, 0x37, 0x15, 0x15, 0xe9, 0x76, 0x61, 0x2d, 0x5f, 0xa4, - 0xac, 0xec, 0x21, 0x2c, 0x6f, 0xf3, 0xa3, 0xe9, 0xc9, 0x1e, 0x3f, 0xcb, 0x2a, 0x62, 0x50, 0x4b, - 0x4e, 0xa3, 0x57, 0x72, 0x7c, 0xe8, 0x37, 0x7b, 0x17, 0x60, 0x84, 0x79, 0xfa, 0xc9, 0x84, 0x0f, - 0xd4, 0x95, 0x46, 0x42, 0x0e, 0x27, 0x7c, 0xe0, 0x7e, 0x04, 0xcc, 0x2c, 0x47, 0x8e, 0x17, 0x5a, - 0x5d, 0xd3, 0xa3, 0x7e, 0x72, 0x9e, 0xa4, 0x7c, 0xac, 0xee, 0x6a, 0x9a, 0x90, 0x7b, 0x0b, 0xda, - 0x07, 0xfe, 0xb9, 0xc7, 0x7f, 0x22, 0x1f, 0x5b, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x8e, 0x2c, 0xa8, - 0x1d, 0xc3, 0x44, 0x76, 0xff, 0x4f, 0x05, 0xe6, 0x44, 0x4e, 0x2c, 0x75, 0xc8, 0x93, 0x34, 0x08, - 0x49, 0xd2, 0x54, 0xa9, 0x06, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0x4b, 0x6f, 0x85, 0xba, 0x1a, - 0x26, 0x05, 0xd8, 0xc2, 0x50, 0xd2, 0xb2, 0xf0, 0x66, 0xe1, 0x3e, 0xcc, 0x80, 0xdc, 0x81, 0x47, - 0x66, 0xdb, 0x89, 0xf6, 0x29, 0xb5, 0x25, 0xc5, 0xd8, 0x84, 0x4a, 0x2d, 0xc8, 0x79, 0x21, 0xed, - 0x05, 0x0b, 0xb2, 0x60, 0x29, 0x36, 0xde, 0xc2, 0x52, 0x14, 0x2e, 0x8c, 0x37, 0x59, 0x8a, 0xf0, - 0x16, 0x96, 0xa2, 0xcb, 0xa0, 0x43, 0xf7, 0xce, 0x71, 0x37, 0xa2, 0x78, 0xf7, 0x1f, 0x39, 0xd0, - 0x91, 0x5c, 0xa4, 0x69, 0xea, 0xe8, 0xec, 0x4d, 0x17, 0x94, 0x6e, 0xc0, 0x02, 0xed, 0x85, 0xb4, - 0x0a, 0x90, 0xc7, 0x50, 0x16, 0x88, 0xfd, 0x50, 0x81, 0x31, 0xe3, 0x60, 0x24, 0x27, 0xc5, 0x84, - 0x94, 0x16, 0x89, 0x7d, 0x19, 0xa6, 0xeb, 0x78, 0x3a, 0xed, 0xfe, 0xa9, 0x03, 0xcb, 0x46, 0x83, - 0x25, 0x17, 0x7e, 0x0a, 0x6d, 0xfd, 0xbc, 0x03, 0xd7, 0x8b, 0xdb, 0xba, 0x2d, 0x36, 0xd9, 0x67, - 0x56, 0x66, 0x9a, 0x4c, 0xff, 0x9c, 0x1a, 0x98, 0x4c, 0xc7, 0x72, 0x55, 0x31, 0x21, 0x64, 0xa4, - 0x57, 0x9c, 0xbf, 0xd4, 0x59, 0xc4, 0xba, 0x66, 0x61, 0xe4, 0x43, 0xc6, 0x3d, 0x9c, 0xce, 0x54, - 0x93, 0x3e, 0x64, 0x13, 0x74, 0xff, 0x7a, 0x05, 0x56, 0xc4, 0xa6, 0x5c, 0x3a, 0x43, 0xf4, 0x0d, - 0xdb, 0x39, 0xe1, 0x9f, 0x10, 0x12, 0xb9, 0x7b, 0xc9, 0x93, 0x69, 0xf6, 0x9d, 0xb7, 0x74, 0x24, - 0xe8, 0xd8, 0xe1, 0x19, 0x73, 0x51, 0x2d, 0x9b, 0x8b, 0x37, 0x8c, 0x74, 0x99, 0x3b, 0xbf, 0x5e, - 0xee, 0xce, 0x7f, 0x2b, 0xf7, 0xf9, 0x83, 0x79, 0xa8, 0x27, 0x83, 0x68, 0xc2, 0xdd, 0x35, 0x58, - 0xb5, 0x87, 0x40, 0x2a, 0xaa, 0x9f, 0x3b, 0xd0, 0x7d, 0x28, 0x0e, 0x09, 0x83, 0xf0, 0x64, 0x37, - 0x48, 0xd2, 0x28, 0xd6, 0xcf, 0x15, 0x5c, 0x03, 0x48, 0x52, 0x3f, 0x96, 0x46, 0xad, 0x30, 0x0d, - 0x0c, 0x04, 0x7b, 0xc2, 0xc3, 0xa1, 0xa0, 0x8a, 0x19, 0xd4, 0xe9, 0x82, 0xe9, 0x25, 0x1d, 0x0b, - 0x96, 0x01, 0x73, 0x53, 0x44, 0xdc, 0x63, 0x93, 0xf9, 0x19, 0x69, 0x7f, 0xb1, 0x5b, 0xcf, 0xa1, - 0xee, 0x1f, 0x54, 0x60, 0x29, 0x6b, 0x24, 0x45, 0x85, 0xd8, 0x3a, 0x44, 0x5a, 0x2d, 0x99, 0x0e, - 0x91, 0x87, 0x00, 0xfd, 0x00, 0xcd, 0x18, 0xc3, 0xb7, 0x60, 0xa0, 0xec, 0x06, 0xb4, 0x54, 0x2a, - 0x9a, 0xa6, 0xc6, 0xbd, 0x61, 0x13, 0x16, 0x31, 0xb4, 0x68, 0x48, 0x49, 0xa3, 0x50, 0xa6, 0xe8, - 0x0e, 0xd3, 0x38, 0xa5, 0x2f, 0xc5, 0xc8, 0xab, 0x24, 0xeb, 0x08, 0x4b, 0x44, 0x3c, 0xe1, 0x42, - 0x56, 0x88, 0xb9, 0x42, 0x37, 0xf4, 0x7b, 0x2b, 0x5a, 0x32, 0x45, 0x89, 0x59, 0x00, 0x74, 0xcd, - 0x33, 0x21, 0xb5, 0xb7, 0x8b, 0xa6, 0xc6, 0xc9, 0x67, 0xcd, 0xb3, 0x30, 0xf7, 0xef, 0x3a, 0x70, - 0xa5, 0x64, 0x1a, 0xa5, 0xa4, 0x6e, 0xc3, 0xf2, 0xb1, 0x26, 0xaa, 0xa1, 0x16, 0xe2, 0xba, 0xa6, - 0x22, 0x21, 0xec, 0xe1, 0xf5, 0x8a, 0x1f, 0x68, 0xe3, 0x54, 0x4c, 0x9e, 0x15, 0xef, 0x5e, 0x24, - 0xb8, 0x07, 0xd0, 0xdb, 0x79, 0x8d, 0x82, 0xbf, 0x65, 0xbe, 0x72, 0xa7, 0x38, 0x6b, 0xa3, 0xa0, - 0xd8, 0x2e, 0x76, 0x29, 0x1d, 0xc3, 0x82, 0x55, 0x16, 0xfb, 0xd6, 0xdb, 0x16, 0x62, 0xca, 0xe8, - 0x75, 0x39, 0xeb, 0xe2, 0x99, 0x3e, 0x15, 0x75, 0x6f, 0x40, 0xee, 0x19, 0x2c, 0x3d, 0x99, 0x8e, - 0xd2, 0x20, 0x7b, 0xb2, 0x8f, 0x7d, 0x47, 0x7e, 0x44, 0x45, 0xa8, 0xa1, 0x2b, 0xad, 0xca, 0xcc, - 0x87, 0x23, 0x36, 0xc6, 0x92, 0xfa, 0xc5, 0x1a, 0x8b, 0x04, 0xf7, 0x0a, 0xac, 0x67, 0x55, 0x8a, - 0xb1, 0x53, 0x8b, 0xc3, 0x1f, 0x3a, 0x22, 0x74, 0xcc, 0x7e, 0x41, 0x90, 0x3d, 0x82, 0x95, 0x24, - 0x08, 0x4f, 0x46, 0xdc, 0x2c, 0x27, 0x91, 0x23, 0x71, 0xd9, 0x6e, 0x9e, 0x7c, 0x65, 0xd0, 0x2b, - 0xfb, 0x02, 0x19, 0xa4, 0xbc, 0xa1, 0x19, 0x83, 0xe4, 0x86, 0xa4, 0xac, 0x03, 0x9f, 0xc1, 0xa2, - 0x5d, 0x19, 0xfb, 0x58, 0x06, 0xcb, 0x67, 0x2d, 0x33, 0xcf, 0x80, 0x6c, 0xce, 0xb0, 0x72, 0xba, - 0x3f, 0x73, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x54, 0x2a, 0xb9, 0xe7, 0xd3, 0x42, 0xb1, 0xb3, - 0x3b, 0xac, 0x83, 0xf0, 0x55, 0x5f, 0xef, 0xce, 0x9c, 0x94, 0xdd, 0x4b, 0x25, 0xbd, 0x7a, 0xd0, - 0x80, 0x39, 0xd9, 0xbf, 0x75, 0xb8, 0x2c, 0x9b, 0xa4, 0x9a, 0x93, 0x1d, 0x1e, 0x58, 0x95, 0x5a, - 0x87, 0x07, 0x3d, 0xe8, 0x8a, 0x57, 0x29, 0xcc, 0x7e, 0xc8, 0x0f, 0xb7, 0x81, 0x3d, 0xf1, 0x07, - 0x7e, 0x1c, 0x45, 0xe1, 0x01, 0x8f, 0x65, 0xac, 0x0f, 0x19, 0x40, 0xe4, 0x5b, 0x57, 0xb6, 0x9a, - 0x48, 0xa9, 0x87, 0x14, 0xa2, 0x50, 0x3d, 0x58, 0x21, 0x52, 0xae, 0x07, 0x2b, 0x0f, 0xfc, 0x97, - 0x5c, 0x95, 0x94, 0x8d, 0x52, 0x6b, 0xa2, 0x0b, 0x55, 0x63, 0xaf, 0xee, 0xc1, 0x14, 0xab, 0xf5, - 0xcc, 0xdc, 0xee, 0x06, 0xac, 0xda, 0x65, 0x4a, 0x55, 0xd2, 0x83, 0xc6, 0x58, 0x62, 0xb2, 0x75, - 0x3a, 0x7d, 0xe7, 0x4b, 0x68, 0x19, 0x2f, 0x8d, 0xb0, 0x75, 0x58, 0x79, 0xf1, 0xf8, 0xd9, 0xfe, - 0xce, 0xe1, 0x61, 0xff, 0xe0, 0xf9, 0x83, 0xcf, 0x77, 0xbe, 0xdf, 0xdf, 0xdd, 0x3c, 0xdc, 0xed, - 0x5c, 0x62, 0x6b, 0xc0, 0xf6, 0x77, 0x0e, 0x9f, 0xed, 0x6c, 0x5b, 0xb8, 0xc3, 0xae, 0x41, 0xef, - 0xf9, 0xfe, 0xf3, 0xc3, 0x9d, 0xed, 0x7e, 0xd9, 0x77, 0x15, 0xf6, 0x2e, 0x5c, 0x91, 0xf4, 0x92, - 0xcf, 0xab, 0x77, 0x3e, 0x85, 0x4e, 0xde, 0x07, 0x62, 0xf9, 0x8e, 0xde, 0xe4, 0x64, 0xda, 0xf8, - 0x59, 0x15, 0x16, 0x45, 0x30, 0x9f, 0x78, 0x83, 0x93, 0xc7, 0xec, 0x09, 0xcc, 0xcb, 0xc7, 0x5c, - 0x99, 0x62, 0x2d, 0xfb, 0xf9, 0xd8, 0xde, 0x5a, 0x1e, 0x96, 0xd3, 0xba, 0xf2, 0x37, 0xfe, 0xf3, - 0xff, 0xfc, 0xfb, 0x95, 0x05, 0xd6, 0xba, 0x77, 0xf6, 0xe1, 0xbd, 0x13, 0x1e, 0x26, 0x58, 0xc6, - 0xef, 0x01, 0x64, 0x4f, 0x94, 0xb2, 0xae, 0xf6, 0x01, 0xe4, 0xde, 0x6f, 0xed, 0x5d, 0x29, 0xa1, - 0xc8, 0x72, 0xaf, 0x50, 0xb9, 0x2b, 0xee, 0x22, 0x96, 0x1b, 0x84, 0x41, 0x2a, 0x9e, 0x2b, 0xfd, - 0xc4, 0xb9, 0xc3, 0x86, 0xd0, 0x36, 0x1f, 0x0f, 0x65, 0xea, 0x2c, 0xa8, 0xe4, 0xf9, 0xd3, 0xde, - 0x3b, 0xa5, 0x34, 0xc5, 0xcb, 0x54, 0xc7, 0x65, 0xb7, 0x83, 0x75, 0x4c, 0x29, 0x47, 0x56, 0xcb, - 0x48, 0x48, 0x78, 0xf6, 0x46, 0x28, 0xbb, 0x6a, 0x08, 0x5d, 0xe1, 0x85, 0xd2, 0xde, 0xbb, 0x33, - 0xa8, 0xb2, 0xae, 0x77, 0xa9, 0xae, 0x75, 0x97, 0x61, 0x5d, 0x03, 0xca, 0xa3, 0x5e, 0x28, 0xfd, - 0xc4, 0xb9, 0xb3, 0xf1, 0x1f, 0x6e, 0x41, 0x53, 0x9f, 0x13, 0xb3, 0x1f, 0xc3, 0x82, 0x15, 0x6d, - 0xc9, 0x54, 0x37, 0xca, 0x82, 0x33, 0x7b, 0x57, 0xcb, 0x89, 0xb2, 0xe2, 0x6b, 0x54, 0x71, 0x97, - 0xad, 0x61, 0xc5, 0x32, 0x5c, 0xf1, 0x1e, 0xc5, 0x0d, 0x8b, 0xab, 0x87, 0x2f, 0x0d, 0x4d, 0x26, - 0x2a, 0xbb, 0x9a, 0x57, 0x2e, 0x56, 0x6d, 0xef, 0xce, 0xa0, 0xca, 0xea, 0xae, 0x52, 0x75, 0x6b, - 0x6c, 0xd5, 0xac, 0x4e, 0x9f, 0xdd, 0x72, 0xba, 0x6f, 0x6b, 0x3e, 0x9f, 0xc9, 0xde, 0xd5, 0x8c, - 0x55, 0xf6, 0xac, 0xa6, 0x66, 0x91, 0xe2, 0xdb, 0x9a, 0x6e, 0x97, 0xaa, 0x62, 0x8c, 0xa6, 0xcf, - 0x7c, 0x3d, 0x93, 0x1d, 0x41, 0xcb, 0x78, 0xf4, 0x8a, 0x5d, 0x99, 0xf9, 0x40, 0x57, 0xaf, 0x57, - 0x46, 0x2a, 0xeb, 0x8a, 0x59, 0xfe, 0x3d, 0x34, 0x74, 0x7e, 0x08, 0x4d, 0xfd, 0x8c, 0x12, 0x5b, - 0x37, 0x9e, 0xb5, 0x32, 0x9f, 0x7d, 0xea, 0x75, 0x8b, 0x84, 0x32, 0xe6, 0x33, 0x4b, 0x47, 0xe6, - 0x7b, 0x01, 0x2d, 0xe3, 0xa9, 0x24, 0xdd, 0x81, 0xe2, 0x73, 0x4c, 0xba, 0x03, 0x25, 0x2f, 0x2b, - 0xb9, 0xcb, 0x54, 0x45, 0x8b, 0x35, 0x89, 0xbf, 0xd3, 0xd7, 0x51, 0xc2, 0xf6, 0xe0, 0xb2, 0xd4, - 0xd8, 0x47, 0xfc, 0xab, 0x4c, 0x43, 0xc9, 0x8b, 0xa5, 0xf7, 0x1d, 0xf6, 0x29, 0x34, 0xd4, 0x8b, - 0x58, 0x6c, 0xad, 0xfc, 0x65, 0xaf, 0xde, 0x7a, 0x01, 0x97, 0xea, 0xf5, 0xfb, 0x00, 0xd9, 0xbb, - 0x4c, 0x5a, 0x49, 0x14, 0xde, 0x79, 0xd2, 0x1c, 0x50, 0x7c, 0xc4, 0xc9, 0x5d, 0xa3, 0x0e, 0x76, - 0x18, 0x29, 0x89, 0x90, 0xbf, 0x52, 0x57, 0xeb, 0x7f, 0x04, 0x2d, 0xe3, 0x69, 0x26, 0x3d, 0x7c, - 0xc5, 0x67, 0x9d, 0xf4, 0xf0, 0x95, 0xbc, 0xe4, 0xe4, 0xf6, 0xa8, 0xf4, 0x55, 0x77, 0x09, 0x4b, - 0x4f, 0x82, 0x93, 0x70, 0x2c, 0x32, 0xe0, 0x04, 0x9d, 0xc2, 0x82, 0xf5, 0xfe, 0x92, 0x96, 0xd0, - 0xb2, 0xd7, 0x9d, 0xb4, 0x84, 0x96, 0x3e, 0xd9, 0xa4, 0xf8, 0xcc, 0x5d, 0xc6, 0x7a, 0xce, 0x28, - 0x8b, 0x51, 0xd3, 0x0f, 0xa0, 0x65, 0xbc, 0xa5, 0xa4, 0xfb, 0x52, 0x7c, 0xb6, 0x49, 0xf7, 0xa5, - 0xec, 0xe9, 0xa5, 0x55, 0xaa, 0x63, 0xd1, 0x25, 0x56, 0xa0, 0x4b, 0xe2, 0x58, 0xf6, 0x8f, 0x61, - 0xd1, 0x7e, 0x5d, 0x49, 0xcb, 0x7e, 0xe9, 0x3b, 0x4d, 0x5a, 0xf6, 0x67, 0x3c, 0xc9, 0x24, 0x59, - 0xfa, 0xce, 0x8a, 0xae, 0xe4, 0xde, 0x17, 0x32, 0xd2, 0xec, 0x4b, 0xf6, 0x5d, 0x54, 0x70, 0xf2, - 0xd6, 0x3e, 0x5b, 0x37, 0xb8, 0xd6, 0xbc, 0xdb, 0xaf, 0xe5, 0xa5, 0x70, 0xc1, 0xdf, 0x66, 0x66, - 0x71, 0xcd, 0x9d, 0x56, 0x2d, 0xba, 0xbd, 0x6f, 0xac, 0x5a, 0xe6, 0x05, 0x7f, 0x63, 0xd5, 0xb2, - 0x2e, 0xf9, 0xe7, 0x57, 0xad, 0x34, 0xc0, 0x32, 0x42, 0x58, 0xca, 0xdd, 0x08, 0xd1, 0x52, 0x51, - 0x7e, 0x69, 0xaf, 0x77, 0xed, 0xcd, 0x17, 0x49, 0x6c, 0x0d, 0xa2, 0x94, 0xe0, 0x3d, 0x75, 0x45, - 0xf2, 0xf7, 0xa1, 0x6d, 0xbe, 0xf8, 0xc2, 0x4c, 0x51, 0xce, 0xd7, 0xf4, 0x4e, 0x29, 0xcd, 0x9e, - 0x5c, 0xd6, 0x36, 0xab, 0x61, 0xdf, 0x83, 0x35, 0x2d, 0xea, 0xe6, 0x25, 0x83, 0x84, 0xbd, 0x57, - 0x72, 0xf5, 0xc0, 0xb4, 0xe3, 0x7a, 0x57, 0x66, 0xde, 0x4d, 0xb8, 0xef, 0x20, 0xd3, 0xd8, 0xcf, - 0x68, 0x64, 0x0b, 0x46, 0xd9, 0xeb, 0x21, 0xd9, 0x82, 0x51, 0xfa, 0xf6, 0x86, 0x62, 0x1a, 0xb6, - 0x62, 0x8d, 0x91, 0x38, 0x94, 0x67, 0x3f, 0x80, 0x25, 0xe3, 0x1a, 0xd7, 0xe1, 0x79, 0x38, 0xd0, - 0x02, 0x50, 0xbc, 0x65, 0xdc, 0x2b, 0xdb, 0xa5, 0xb8, 0xeb, 0x54, 0xfe, 0xb2, 0x6b, 0x0d, 0x0e, - 0x32, 0xff, 0x16, 0xb4, 0xcc, 0x2b, 0x62, 0x6f, 0x28, 0x77, 0xdd, 0x20, 0x99, 0x17, 0x64, 0xef, - 0x3b, 0xec, 0x40, 0x04, 0x67, 0xe9, 0x27, 0x3d, 0xa3, 0x38, 0xbf, 0x7c, 0xda, 0x4f, 0x7d, 0xea, - 0x89, 0x2c, 0x7b, 0xe4, 0xf5, 0xb6, 0x73, 0xdf, 0x61, 0xff, 0xd8, 0x81, 0xb6, 0x75, 0x85, 0xcb, - 0x0a, 0x75, 0xc9, 0xb5, 0xac, 0x6b, 0xd2, 0xcc, 0xa6, 0xb9, 0x1e, 0x75, 0x7b, 0xef, 0xce, 0x67, - 0xd6, 0xb0, 0x7e, 0x61, 0x39, 0xd4, 0xee, 0xe6, 0xdf, 0xf5, 0xfc, 0x32, 0x9f, 0xc1, 0xbc, 0xdb, - 0xfd, 0xe5, 0x7d, 0x87, 0xfd, 0xb1, 0x03, 0x8b, 0xb6, 0x1b, 0x58, 0x77, 0xb7, 0xd4, 0xe1, 0xac, - 0x27, 0x7f, 0x86, 0xef, 0xf8, 0x07, 0xd4, 0xca, 0x67, 0x77, 0x3c, 0xab, 0x95, 0xf2, 0xc9, 0x96, - 0x5f, 0xaf, 0xb5, 0xec, 0x13, 0xf1, 0xae, 0xb5, 0x3a, 0xac, 0x61, 0xc5, 0x27, 0x91, 0x35, 0xc3, - 0x98, 0x8f, 0x18, 0xd3, 0x24, 0xfc, 0x48, 0xbc, 0x67, 0xa9, 0xce, 0x13, 0x90, 0xef, 0xde, 0xf6, - 0x7b, 0xf7, 0x06, 0xf5, 0xe9, 0x9a, 0x7b, 0xc5, 0xea, 0x53, 0x7e, 0x85, 0xdf, 0x14, 0xad, 0x93, - 0xef, 0x0f, 0x67, 0x4b, 0x54, 0xe1, 0x4d, 0xe2, 0xd9, 0x8d, 0x1c, 0x8b, 0x46, 0xca, 0xec, 0x96, - 0x70, 0xbc, 0x65, 0x31, 0xee, 0x1d, 0x6a, 0xeb, 0x0d, 0xf7, 0xbd, 0x99, 0x6d, 0xbd, 0x47, 0xce, - 0x5c, 0x6c, 0xf1, 0x01, 0x40, 0x76, 0xb8, 0xca, 0x72, 0x07, 0x7b, 0x5a, 0x65, 0x14, 0xcf, 0x5f, - 0x6d, 0x09, 0x54, 0xe7, 0x7f, 0x58, 0xe2, 0x0f, 0x85, 0x02, 0x7c, 0xac, 0x8e, 0x04, 0x4d, 0x33, - 0xc7, 0x3e, 0x01, 0xb5, 0xcc, 0x9c, 0x7c, 0xf9, 0x96, 0xfa, 0xd3, 0xe7, 0x8b, 0xcf, 0x61, 0x61, - 0x2f, 0x8a, 0x5e, 0x4e, 0x27, 0x3a, 0x0a, 0xc5, 0x3e, 0x67, 0xd9, 0xf5, 0x93, 0xd3, 0x5e, 0xae, - 0x17, 0xee, 0x75, 0x2a, 0xaa, 0xc7, 0xba, 0x46, 0x51, 0xf7, 0xbe, 0xc8, 0x0e, 0x6e, 0xbf, 0x64, - 0x3e, 0x2c, 0x6b, 0xad, 0xaa, 0x1b, 0xde, 0xb3, 0x8b, 0xb1, 0x74, 0x69, 0xbe, 0x0a, 0xcb, 0x1e, - 0x57, 0xad, 0xbd, 0x97, 0xa8, 0x32, 0x49, 0xa7, 0xb4, 0xb7, 0xf9, 0x80, 0x6e, 0xa1, 0xd0, 0x61, - 0xc5, 0x4a, 0xd6, 0x70, 0x7d, 0xca, 0xd1, 0x5b, 0xb0, 0x40, 0x7b, 0xa5, 0x99, 0xf8, 0xe7, 0x31, - 0xff, 0xc9, 0xbd, 0x2f, 0xe4, 0x31, 0xc8, 0x97, 0x6a, 0xa5, 0x51, 0xe7, 0x44, 0xd6, 0x4a, 0x93, - 0x3b, 0x58, 0xb2, 0x56, 0x9a, 0xc2, 0xc1, 0x92, 0x35, 0xd4, 0xea, 0x9c, 0x8a, 0x8d, 0x60, 0xb9, - 0x70, 0x16, 0xa5, 0x17, 0x99, 0x59, 0x27, 0x58, 0xbd, 0xeb, 0xb3, 0x33, 0xd8, 0xb5, 0xdd, 0xb1, - 0x6b, 0x3b, 0x84, 0x85, 0x6d, 0x2e, 0x06, 0x4b, 0x84, 0xdd, 0xe6, 0xee, 0x01, 0x9a, 0x41, 0xbd, - 0xf9, 0x25, 0x81, 0x68, 0xb6, 0x29, 0x41, 0xf1, 0xae, 0xec, 0x87, 0xd0, 0x7a, 0xc4, 0x53, 0x15, - 0x67, 0xab, 0x8d, 0xd9, 0x5c, 0xe0, 0x6d, 0xaf, 0x24, 0x4c, 0xd7, 0xe6, 0x19, 0x2a, 0xed, 0x1e, - 0x1f, 0x9e, 0x70, 0xa1, 0x9c, 0xfa, 0xc1, 0xf0, 0x4b, 0xf6, 0x57, 0xa8, 0x70, 0x7d, 0xd1, 0x60, - 0xcd, 0x08, 0x9a, 0x34, 0x0b, 0x5f, 0xca, 0xe1, 0x65, 0x25, 0x87, 0xd1, 0x90, 0x1b, 0x46, 0x55, - 0x08, 0x2d, 0xe3, 0x7e, 0x90, 0x16, 0xa0, 0xe2, 0x4d, 0x34, 0x2d, 0x40, 0x25, 0xd7, 0x89, 0xdc, - 0xdb, 0x54, 0x8f, 0xcb, 0xae, 0x67, 0xf5, 0x88, 0x2b, 0x44, 0x59, 0x4d, 0xf7, 0xbe, 0xf0, 0xc7, - 0xe9, 0x97, 0xec, 0x05, 0x3d, 0xa1, 0x64, 0xc6, 0x11, 0x67, 0xd6, 0x79, 0x3e, 0xe4, 0x58, 0x0f, - 0x96, 0x41, 0xb2, 0x2d, 0x76, 0x51, 0x15, 0xd9, 0x5e, 0xdf, 0x01, 0x38, 0x4c, 0xa3, 0xc9, 0xb6, - 0xcf, 0xc7, 0x51, 0x98, 0xe9, 0xda, 0x2c, 0x8a, 0x35, 0xd3, 0x5f, 0x46, 0x28, 0x2b, 0x7b, 0x61, - 0x6c, 0x67, 0xac, 0x50, 0x6c, 0xc5, 0x5c, 0x33, 0x03, 0x5d, 0xf5, 0x80, 0x94, 0x04, 0xbb, 0xde, - 0x77, 0xd8, 0x26, 0x40, 0x76, 0x18, 0xa9, 0x37, 0x27, 0x85, 0x73, 0x4e, 0xad, 0xf6, 0x4a, 0x4e, - 0x2e, 0x0f, 0xa0, 0x99, 0x9d, 0x6e, 0xad, 0x67, 0xb7, 0xf0, 0xac, 0xb3, 0x30, 0xbd, 0x82, 0x17, - 0xce, 0x9c, 0xdc, 0x0e, 0x0d, 0x15, 0xb0, 0x06, 0x0e, 0x15, 0x1d, 0x24, 0x05, 0xb0, 0x22, 0x1a, - 0xa8, 0x0d, 0x1c, 0x8a, 0xbe, 0x54, 0x3d, 0x29, 0x39, 0xf7, 0xd1, 0xd2, 0x5c, 0x7a, 0x20, 0x62, - 0xf9, 0x58, 0x90, 0x5b, 0x45, 0xe4, 0x27, 0xaa, 0xe6, 0x31, 0x2c, 0x17, 0x7c, 0xec, 0x5a, 0xa4, - 0x67, 0x1d, 0xa2, 0x68, 0x91, 0x9e, 0xe9, 0x9e, 0x77, 0x2f, 0x53, 0x95, 0x4b, 0x2e, 0xd0, 0x9e, - 0xea, 0x55, 0x90, 0x0e, 0x4e, 0xb1, 0xba, 0x3f, 0x74, 0x60, 0xa5, 0xc4, 0x85, 0xce, 0xde, 0x57, - 0xdb, 0xf3, 0x99, 0xee, 0xf5, 0x5e, 0xa9, 0x87, 0xd5, 0x3d, 0xa4, 0x7a, 0x9e, 0xb0, 0xcf, 0xad, - 0x85, 0x4d, 0x38, 0x37, 0xa5, 0x64, 0xbe, 0xd1, 0xa8, 0x28, 0xb5, 0x28, 0x7e, 0x02, 0xeb, 0xa2, - 0x21, 0x9b, 0xa3, 0x51, 0xce, 0xfb, 0x7b, 0xad, 0xf0, 0xbf, 0x6f, 0x2c, 0xaf, 0x76, 0x6f, 0xf6, - 0xff, 0xc6, 0x99, 0x61, 0x00, 0x8b, 0xa6, 0xb2, 0x29, 0x74, 0xf2, 0x1e, 0x55, 0x36, 0xbb, 0xac, - 0xde, 0x7b, 0xd6, 0x46, 0xb3, 0xc4, 0x0b, 0xfb, 0x5b, 0x54, 0xd9, 0x7b, 0x6e, 0xaf, 0x6c, 0x5c, - 0xc4, 0xde, 0x13, 0xe7, 0xe3, 0xaf, 0x69, 0xf7, 0x6f, 0xae, 0x9f, 0xaa, 0x82, 0x59, 0xfe, 0x6a, - 0xbd, 0xd5, 0x2d, 0xf7, 0x1e, 0xdf, 0xa4, 0xea, 0xaf, 0xbb, 0xef, 0x94, 0x55, 0x1f, 0x8b, 0x4f, - 0xc4, 0xa6, 0x77, 0x3d, 0x2f, 0xd7, 0xaa, 0x05, 0xd7, 0xcb, 0xe6, 0x7b, 0xe6, 0xee, 0x25, 0x37, - 0xd6, 0x97, 0xc8, 0xb6, 0x6b, 0x9b, 0xee, 0x5e, 0x2d, 0x3e, 0x25, 0x7e, 0x65, 0x2d, 0x3e, 0x65, - 0xfe, 0x61, 0xdb, 0xae, 0x51, 0x9e, 0xe1, 0x4f, 0x9c, 0x3b, 0x0f, 0x6e, 0xfd, 0xe0, 0xb7, 0x4e, - 0x82, 0xf4, 0x74, 0x7a, 0x74, 0x77, 0x10, 0x8d, 0xef, 0x8d, 0x94, 0x5b, 0x4f, 0xde, 0x48, 0xb8, - 0x37, 0x0a, 0x87, 0xf7, 0xa8, 0xd8, 0xa3, 0x39, 0xfa, 0x67, 0x5d, 0xdf, 0xfa, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x8f, 0xe0, 0xfe, 0x46, 0xde, 0x6b, 0x00, 0x00, + // 8783 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x4d, 0x6c, 0x1c, 0x49, + 0x96, 0x1f, 0xae, 0xac, 0x0f, 0xb2, 0xea, 0x55, 0x91, 0x2c, 0x06, 0x29, 0xb2, 0x54, 0xad, 0x56, + 0xab, 0x73, 0xb4, 0x92, 0x46, 0xd3, 0x23, 0xa9, 0x39, 0x33, 0xfd, 0xef, 0xed, 0xfe, 0xaf, 0xd7, + 0x14, 0x49, 0x89, 0xea, 0xa6, 0x28, 0x4e, 0x52, 0x1a, 0x79, 0x66, 0x76, 0x51, 0x93, 0xac, 0x0a, + 0x92, 0x39, 0xaa, 0xca, 0xac, 0xce, 0xcc, 0xa2, 0xc4, 0x69, 0xb7, 0x01, 0x1b, 0x86, 0x61, 0xf8, + 0x62, 0x8c, 0x0d, 0x03, 0xb6, 0x61, 0x7b, 0x81, 0x59, 0x03, 0xde, 0x85, 0x0f, 0xf6, 0xc5, 0xc0, + 0xda, 0xd8, 0x9b, 0x61, 0x2c, 0x60, 0xc0, 0xf0, 0xc1, 0x07, 0x03, 0x3e, 0x78, 0x60, 0xd8, 0x80, + 0xb1, 0xf0, 0xd9, 0x77, 0xe3, 0xbd, 0xf8, 0xc8, 0x88, 0xcc, 0x2c, 0x51, 0x3d, 0x33, 0xf6, 0x89, + 0x15, 0xbf, 0x17, 0x19, 0x9f, 0xef, 0xbd, 0x78, 0xf1, 0xe2, 0x45, 0x10, 0x9a, 0xf1, 0x64, 0x70, + 0x77, 0x12, 0x47, 0x69, 0xc4, 0xea, 0xa3, 0x30, 0x9e, 0x0c, 0x7a, 0x57, 0x4f, 0xa2, 0xe8, 0x64, + 0xc4, 0xef, 0xf9, 0x93, 0xe0, 0x9e, 0x1f, 0x86, 0x51, 0xea, 0xa7, 0x41, 0x14, 0x26, 0x22, 0x93, + 0xfb, 0x13, 0x58, 0x7c, 0xc4, 0xc3, 0x43, 0xce, 0x87, 0x1e, 0xff, 0x62, 0xca, 0x93, 0x94, 0x7d, + 0x0b, 0x96, 0x7d, 0xfe, 0x33, 0xce, 0x87, 0xfd, 0x89, 0x9f, 0x24, 0x93, 0xd3, 0xd8, 0x4f, 0x78, + 0xd7, 0xb9, 0xee, 0xdc, 0x6e, 0x7b, 0x1d, 0x41, 0x38, 0xd0, 0x38, 0x7b, 0x1f, 0xda, 0x09, 0x66, + 0xe5, 0x61, 0x1a, 0x47, 0x93, 0xf3, 0x6e, 0x85, 0xf2, 0xb5, 0x10, 0xdb, 0x11, 0x90, 0x3b, 0x82, + 0x25, 0x5d, 0x43, 0x32, 0x89, 0xc2, 0x84, 0xb3, 0xfb, 0xb0, 0x3a, 0x08, 0x26, 0xa7, 0x3c, 0xee, + 0xd3, 0xc7, 0xe3, 0x90, 0x8f, 0xa3, 0x30, 0x18, 0x74, 0x9d, 0xeb, 0xd5, 0xdb, 0x4d, 0x8f, 0x09, + 0x1a, 0x7e, 0xf1, 0x44, 0x52, 0xd8, 0x2d, 0x58, 0xe2, 0xa1, 0xc0, 0xf9, 0x90, 0xbe, 0x92, 0x55, + 0x2d, 0x66, 0x30, 0x7e, 0xe0, 0xfe, 0xcd, 0x0a, 0x2c, 0x3f, 0x0e, 0x83, 0xf4, 0x85, 0x3f, 0x1a, + 0xf1, 0x54, 0xf5, 0xe9, 0x16, 0x2c, 0xbd, 0x22, 0x80, 0xfa, 0xf4, 0x2a, 0x8a, 0x87, 0xb2, 0x47, + 0x8b, 0x02, 0x3e, 0x90, 0xe8, 0xcc, 0x96, 0x55, 0x66, 0xb6, 0xac, 0x74, 0xb8, 0xaa, 0x33, 0x86, + 0xeb, 0x16, 0x2c, 0xc5, 0x7c, 0x10, 0x9d, 0xf1, 0xf8, 0xbc, 0xff, 0x2a, 0x08, 0x87, 0xd1, 0xab, + 0x6e, 0xed, 0xba, 0x73, 0xbb, 0xee, 0x2d, 0x2a, 0xf8, 0x05, 0xa1, 0xec, 0x01, 0x2c, 0x0d, 0x4e, + 0xfd, 0x30, 0xe4, 0xa3, 0xfe, 0x91, 0x3f, 0x78, 0x39, 0x9d, 0x24, 0xdd, 0xfa, 0x75, 0xe7, 0x76, + 0x6b, 0xe3, 0xca, 0x5d, 0x9a, 0xd5, 0xbb, 0x5b, 0xa7, 0x7e, 0xf8, 0x80, 0x28, 0x87, 0xa1, 0x3f, + 0x49, 0x4e, 0xa3, 0xd4, 0x5b, 0x94, 0x5f, 0x08, 0x38, 0x71, 0x57, 0x81, 0x99, 0x23, 0x21, 0xc6, + 0xde, 0xfd, 0xe7, 0x0e, 0xac, 0x3c, 0x0f, 0x47, 0xd1, 0xe0, 0xe5, 0xaf, 0x38, 0x44, 0x25, 0x7d, + 0xa8, 0xbc, 0x6d, 0x1f, 0xaa, 0x5f, 0xb7, 0x0f, 0x6b, 0xb0, 0x6a, 0x37, 0x56, 0xf6, 0x82, 0xc3, + 0x65, 0xfc, 0xfa, 0x84, 0xab, 0x66, 0xa9, 0x6e, 0x7c, 0x13, 0x3a, 0x83, 0x69, 0x1c, 0xf3, 0xb0, + 0xd0, 0x8f, 0x25, 0x89, 0xeb, 0x8e, 0xbc, 0x0f, 0xed, 0x90, 0xbf, 0xca, 0xb2, 0x49, 0xde, 0x0d, + 0xf9, 0x2b, 0x95, 0xc5, 0xed, 0xc2, 0x5a, 0xbe, 0x1a, 0xd9, 0x80, 0xff, 0xe6, 0x40, 0xed, 0x79, + 0xfa, 0x3a, 0x62, 0x77, 0xa1, 0x96, 0x9e, 0x4f, 0x84, 0x84, 0x2c, 0x6e, 0x30, 0xd9, 0xb5, 0xcd, + 0xe1, 0x30, 0xe6, 0x49, 0xf2, 0xec, 0x7c, 0xc2, 0xbd, 0xb6, 0x2f, 0x12, 0x7d, 0xcc, 0xc7, 0xba, + 0x30, 0x2f, 0xd3, 0x54, 0x61, 0xd3, 0x53, 0x49, 0x76, 0x0d, 0xc0, 0x1f, 0x47, 0xd3, 0x30, 0xed, + 0x27, 0x7e, 0x4a, 0x43, 0x55, 0xf5, 0x0c, 0x84, 0x5d, 0x85, 0xe6, 0xe4, 0x65, 0x3f, 0x19, 0xc4, + 0xc1, 0x24, 0x25, 0xb6, 0x69, 0x7a, 0x19, 0xc0, 0xbe, 0x05, 0x8d, 0x68, 0x9a, 0x4e, 0xa2, 0x20, + 0x4c, 0x25, 0xab, 0x2c, 0xc9, 0xb6, 0x3c, 0x9d, 0xa6, 0x07, 0x08, 0x7b, 0x3a, 0x03, 0xbb, 0x01, + 0x0b, 0x83, 0x28, 0x3c, 0x0e, 0xe2, 0xb1, 0x50, 0x06, 0xdd, 0x39, 0xaa, 0xcd, 0x06, 0xdd, 0x7f, + 0x5d, 0x81, 0xd6, 0xb3, 0xd8, 0x0f, 0x13, 0x7f, 0x80, 0x00, 0x36, 0x3d, 0x7d, 0xdd, 0x3f, 0xf5, + 0x93, 0x53, 0xea, 0x6d, 0xd3, 0x53, 0x49, 0xb6, 0x06, 0x73, 0xa2, 0xa1, 0xd4, 0xa7, 0xaa, 0x27, + 0x53, 0xec, 0x03, 0x58, 0x0e, 0xa7, 0xe3, 0xbe, 0x5d, 0x57, 0x95, 0xb8, 0xa5, 0x48, 0xc0, 0x01, + 0x38, 0xc2, 0xb9, 0x16, 0x55, 0x88, 0x1e, 0x1a, 0x08, 0x73, 0xa1, 0x2d, 0x53, 0x3c, 0x38, 0x39, + 0x15, 0xdd, 0xac, 0x7b, 0x16, 0x86, 0x65, 0xa4, 0xc1, 0x98, 0xf7, 0x93, 0xd4, 0x1f, 0x4f, 0x64, + 0xb7, 0x0c, 0x84, 0xe8, 0x51, 0xea, 0x8f, 0xfa, 0xc7, 0x9c, 0x27, 0xdd, 0x79, 0x49, 0xd7, 0x08, + 0xbb, 0x09, 0x8b, 0x43, 0x9e, 0xa4, 0x7d, 0x39, 0x29, 0x3c, 0xe9, 0x36, 0x48, 0xf4, 0x73, 0x28, + 0x96, 0x13, 0xfb, 0xaf, 0xfa, 0x38, 0x00, 0xfc, 0x75, 0xb7, 0x29, 0xda, 0x9a, 0x21, 0xc8, 0x39, + 0x8f, 0x78, 0x6a, 0x8c, 0x5e, 0x22, 0x39, 0xd4, 0xdd, 0x03, 0x66, 0xc0, 0xdb, 0x3c, 0xf5, 0x83, + 0x51, 0xc2, 0x3e, 0x82, 0x76, 0x6a, 0x64, 0x26, 0x55, 0xd8, 0xd2, 0xec, 0x64, 0x7c, 0xe0, 0x59, + 0xf9, 0xdc, 0x53, 0x68, 0x3c, 0xe4, 0x7c, 0x2f, 0x18, 0x07, 0x29, 0x5b, 0x83, 0xfa, 0x71, 0xf0, + 0x9a, 0x0b, 0x86, 0xaf, 0xee, 0x5e, 0xf2, 0x44, 0x92, 0xbd, 0x07, 0x40, 0x3f, 0xfa, 0x63, 0xcd, + 0x58, 0xbb, 0x97, 0xbc, 0x26, 0x61, 0x4f, 0x90, 0xb3, 0x7a, 0x30, 0x3f, 0xe1, 0xf1, 0x80, 0xab, + 0xf9, 0xdb, 0xbd, 0xe4, 0x29, 0xe0, 0xc1, 0x3c, 0xd4, 0x47, 0x58, 0xba, 0xfb, 0x27, 0x35, 0x68, + 0x1d, 0xf2, 0x50, 0x4b, 0x1a, 0x83, 0x1a, 0x8e, 0x89, 0x94, 0x2e, 0xfa, 0xcd, 0xbe, 0x01, 0x2d, + 0x1a, 0xa7, 0x24, 0x8d, 0x83, 0xf0, 0x44, 0x30, 0xf8, 0x83, 0x4a, 0xd7, 0xf1, 0x00, 0xe1, 0x43, + 0x42, 0x59, 0x07, 0xaa, 0xfe, 0x58, 0x31, 0x38, 0xfe, 0x64, 0x57, 0xa0, 0xe1, 0x8f, 0x53, 0xd1, + 0xbc, 0x36, 0xc1, 0xf3, 0xfe, 0x38, 0xa5, 0xa6, 0xbd, 0x0f, 0xed, 0x89, 0x7f, 0x3e, 0x46, 0x79, + 0xd6, 0x5c, 0xd1, 0xf6, 0x5a, 0x12, 0xdb, 0x45, 0xb6, 0xd8, 0x80, 0x15, 0x33, 0x8b, 0xaa, 0xbc, + 0xae, 0x2b, 0x5f, 0x36, 0x72, 0xcb, 0x36, 0xdc, 0x82, 0x25, 0xf5, 0x4d, 0x2c, 0xfa, 0x43, 0xbc, + 0xd2, 0xf4, 0x16, 0x25, 0xac, 0x7a, 0x79, 0x1b, 0x3a, 0xc7, 0x41, 0xe8, 0x8f, 0xfa, 0x83, 0x51, + 0x7a, 0xd6, 0x1f, 0xf2, 0x51, 0xea, 0x13, 0xd7, 0xd4, 0xbd, 0x45, 0xc2, 0xb7, 0x46, 0xe9, 0xd9, + 0x36, 0xa2, 0xec, 0x03, 0x68, 0x1e, 0x73, 0xde, 0xa7, 0xc1, 0xea, 0x36, 0x2c, 0x09, 0x54, 0x33, + 0xe4, 0x35, 0x8e, 0xd5, 0x5c, 0x7d, 0x00, 0x9d, 0x68, 0x9a, 0x9e, 0x44, 0x41, 0x78, 0xd2, 0x47, + 0x9d, 0xd7, 0x0f, 0x86, 0xc4, 0x45, 0xb5, 0x07, 0x95, 0xfb, 0x8e, 0xb7, 0xa8, 0x68, 0xa8, 0x7d, + 0x1e, 0x0f, 0xd9, 0x4d, 0x58, 0x1a, 0xf9, 0x49, 0xda, 0x3f, 0x8d, 0x26, 0xfd, 0xc9, 0xf4, 0xe8, + 0x25, 0x3f, 0xef, 0x2e, 0xd0, 0x40, 0x2c, 0x20, 0xbc, 0x1b, 0x4d, 0x0e, 0x08, 0x64, 0xef, 0x02, + 0x50, 0x3b, 0x45, 0x23, 0xe0, 0xba, 0x73, 0x7b, 0xc1, 0x6b, 0x22, 0x22, 0x2a, 0xfd, 0x04, 0x1a, + 0x34, 0x3d, 0xe9, 0xe8, 0xac, 0xdb, 0x22, 0x06, 0x7b, 0x4f, 0xb6, 0xd0, 0x98, 0xd8, 0xbb, 0xdb, + 0x3c, 0x49, 0x9f, 0x8d, 0xce, 0x70, 0xfd, 0x3e, 0xf7, 0xe6, 0x87, 0x22, 0xd5, 0xfb, 0x04, 0xda, + 0x26, 0x01, 0x67, 0x11, 0x9b, 0x81, 0xb3, 0x5f, 0xf3, 0xf0, 0x27, 0x5b, 0x85, 0xfa, 0x99, 0x3f, + 0x9a, 0x72, 0xa9, 0x48, 0x45, 0xe2, 0x93, 0xca, 0xc7, 0x8e, 0xfb, 0x27, 0x0e, 0xb4, 0x45, 0x0d, + 0xd2, 0x00, 0xb8, 0x01, 0x0b, 0x6a, 0xf8, 0x79, 0x1c, 0x47, 0xb1, 0xd4, 0x27, 0x36, 0xc8, 0xee, + 0x40, 0x47, 0x01, 0x93, 0x98, 0x07, 0x63, 0xff, 0x44, 0x95, 0x5d, 0xc0, 0xd9, 0x46, 0x56, 0x62, + 0x1c, 0x4d, 0x53, 0x2e, 0x97, 0x9a, 0xb6, 0xec, 0x9f, 0x87, 0x98, 0x67, 0x67, 0x41, 0x7d, 0x52, + 0xc2, 0x5b, 0x16, 0xe6, 0xfe, 0x3d, 0x07, 0x18, 0x36, 0xfd, 0x59, 0x24, 0x8a, 0x90, 0x6c, 0x91, + 0x67, 0x4b, 0xe7, 0xad, 0xd9, 0xb2, 0xf2, 0x26, 0xb6, 0x74, 0xa1, 0x2e, 0x5a, 0x5f, 0x2b, 0x69, + 0xbd, 0x20, 0x7d, 0x56, 0x6b, 0x54, 0x3b, 0x35, 0xf7, 0xbf, 0x54, 0x61, 0x75, 0x4b, 0xac, 0x95, + 0x9b, 0x83, 0x01, 0x9f, 0x68, 0x86, 0x7d, 0x0f, 0x5a, 0x61, 0x34, 0xe4, 0x8a, 0x4d, 0x44, 0xc3, + 0x00, 0x21, 0x83, 0x47, 0x4e, 0xfd, 0x20, 0x14, 0x0d, 0x17, 0xe3, 0xd9, 0x24, 0x84, 0x9a, 0x7d, + 0x13, 0x96, 0x26, 0x3c, 0x1c, 0x9a, 0x7c, 0x29, 0xac, 0x99, 0x05, 0x09, 0x4b, 0x96, 0x7c, 0x0f, + 0x5a, 0xc7, 0x53, 0x91, 0x0f, 0xa5, 0xb9, 0x46, 0x7c, 0x00, 0x12, 0xda, 0x14, 0x42, 0x3d, 0x99, + 0x26, 0xa7, 0x44, 0xad, 0x13, 0x75, 0x1e, 0xd3, 0x48, 0x7a, 0x17, 0x60, 0x38, 0x4d, 0x52, 0xc9, + 0xa6, 0x73, 0x44, 0x6c, 0x22, 0x22, 0xd8, 0xf4, 0xdb, 0xb0, 0x32, 0xf6, 0x5f, 0xf7, 0x89, 0x7f, + 0xfa, 0x41, 0xd8, 0x3f, 0x1e, 0x91, 0xba, 0x9f, 0xa7, 0x7c, 0x9d, 0xb1, 0xff, 0xfa, 0x07, 0x48, + 0x79, 0x1c, 0x3e, 0x24, 0x1c, 0x65, 0x59, 0xd9, 0x19, 0x31, 0x4f, 0x78, 0x7c, 0xc6, 0x49, 0xfc, + 0x6a, 0xda, 0x98, 0xf0, 0x04, 0x8a, 0x2d, 0x1a, 0x63, 0xbf, 0xd3, 0xd1, 0x40, 0xc8, 0x9a, 0x37, + 0x3f, 0x0e, 0xc2, 0xdd, 0x74, 0x34, 0x60, 0x57, 0x01, 0x50, 0x78, 0x27, 0x3c, 0xee, 0xbf, 0x7c, + 0x45, 0x82, 0x53, 0x23, 0x61, 0x3d, 0xe0, 0xf1, 0xe7, 0xaf, 0xd8, 0x3b, 0xd0, 0x1c, 0x24, 0x24, + 0xfd, 0xfe, 0x79, 0xb7, 0x45, 0x52, 0xd5, 0x18, 0x24, 0x28, 0xf7, 0xfe, 0x39, 0xfb, 0x00, 0x18, + 0xb6, 0xd6, 0xa7, 0x59, 0xe0, 0x43, 0x2a, 0x3e, 0x21, 0x35, 0xb6, 0x40, 0x8d, 0xdd, 0x94, 0x04, + 0xac, 0x27, 0x61, 0xdf, 0x80, 0x05, 0xd5, 0xd8, 0xe3, 0x91, 0x7f, 0x92, 0x90, 0x1c, 0x2f, 0x78, + 0x6d, 0x09, 0x3e, 0x44, 0xcc, 0x7d, 0x21, 0xac, 0x1b, 0x63, 0x6e, 0xa5, 0xdc, 0xe0, 0x3a, 0x4b, + 0x08, 0xcd, 0x6b, 0xc3, 0x93, 0xa9, 0xb2, 0x49, 0xab, 0x94, 0x4c, 0x9a, 0xfb, 0x0b, 0x07, 0xda, + 0xb2, 0x64, 0x32, 0x09, 0xd8, 0x7d, 0x60, 0x6a, 0x16, 0xd3, 0xd7, 0xc1, 0xb0, 0x7f, 0x74, 0x9e, + 0xf2, 0x44, 0x30, 0xcd, 0xee, 0x25, 0xaf, 0x84, 0x86, 0x8a, 0xcb, 0x42, 0x93, 0x34, 0x16, 0x3c, + 0xbd, 0x7b, 0xc9, 0x2b, 0x50, 0x50, 0xc4, 0xd0, 0xe8, 0x98, 0xa6, 0xfd, 0x20, 0x1c, 0xf2, 0xd7, + 0xc4, 0x4a, 0x0b, 0x9e, 0x85, 0x3d, 0x58, 0x84, 0xb6, 0xf9, 0x9d, 0xfb, 0x53, 0x68, 0x28, 0x93, + 0x85, 0x96, 0xeb, 0x5c, 0xbb, 0x3c, 0x03, 0x61, 0x3d, 0x68, 0xd8, 0xad, 0xf0, 0x1a, 0x5f, 0xa7, + 0x6e, 0xf7, 0x2f, 0x40, 0x67, 0x0f, 0x99, 0x28, 0x44, 0xa6, 0x95, 0x76, 0xd8, 0x1a, 0xcc, 0x19, + 0xc2, 0xd3, 0xf4, 0x64, 0x0a, 0x17, 0xbc, 0xd3, 0x28, 0x49, 0x65, 0x3d, 0xf4, 0xdb, 0xfd, 0x33, + 0x07, 0xd8, 0x4e, 0x92, 0x06, 0x63, 0x3f, 0xe5, 0x0f, 0xb9, 0x56, 0x0f, 0x4f, 0xa1, 0x8d, 0xa5, + 0x3d, 0x8b, 0x36, 0x85, 0x55, 0x24, 0x56, 0xf3, 0x6f, 0x49, 0x71, 0x2e, 0x7e, 0x70, 0xd7, 0xcc, + 0x2d, 0x14, 0xaf, 0x55, 0x00, 0x4a, 0x5b, 0xea, 0xc7, 0x27, 0x3c, 0x25, 0x93, 0x49, 0x1a, 0xdc, + 0x20, 0xa0, 0xad, 0x28, 0x3c, 0xee, 0xfd, 0x2e, 0x2c, 0x17, 0xca, 0x30, 0x75, 0x74, 0xb3, 0x44, + 0x47, 0x57, 0x4d, 0x1d, 0x3d, 0x80, 0x15, 0xab, 0x5d, 0x92, 0xe3, 0xba, 0x30, 0x8f, 0x82, 0x81, + 0x2b, 0xb3, 0x23, 0x56, 0x66, 0x99, 0x64, 0x1b, 0xb0, 0x7a, 0xcc, 0x79, 0xec, 0xa7, 0x94, 0x24, + 0xd1, 0xc1, 0x39, 0x91, 0x25, 0x97, 0xd2, 0xdc, 0xff, 0xee, 0xc0, 0x12, 0x6a, 0xd3, 0x27, 0x7e, + 0x78, 0xae, 0xc6, 0x6a, 0xaf, 0x74, 0xac, 0x6e, 0x1b, 0x0b, 0x93, 0x91, 0xfb, 0xeb, 0x0e, 0x54, + 0x35, 0x3f, 0x50, 0xec, 0x3a, 0xb4, 0xad, 0xe6, 0xd6, 0x85, 0x09, 0x98, 0xf8, 0xe9, 0x01, 0x8f, + 0x1f, 0x9c, 0xa7, 0xfc, 0xd7, 0x1f, 0xca, 0x9b, 0xd0, 0xc9, 0x9a, 0x2d, 0xc7, 0x91, 0x41, 0x0d, + 0x19, 0x53, 0x16, 0x40, 0xbf, 0xdd, 0x7f, 0xe4, 0x88, 0x8c, 0x5b, 0x51, 0xa0, 0xcd, 0x43, 0xcc, + 0x88, 0x56, 0xa6, 0xca, 0x88, 0xbf, 0x67, 0x9a, 0xd7, 0xbf, 0x7e, 0x67, 0x51, 0x27, 0x26, 0x3c, + 0x1c, 0xf6, 0xfd, 0xd1, 0x88, 0x14, 0x71, 0xc3, 0x9b, 0xc7, 0xf4, 0xe6, 0x68, 0xe4, 0xde, 0x82, + 0x65, 0xa3, 0x75, 0x6f, 0xe8, 0xc7, 0x3e, 0xb0, 0xbd, 0x20, 0x49, 0x9f, 0x87, 0xc9, 0xc4, 0xb0, + 0x9c, 0xde, 0x81, 0x26, 0x6a, 0x5b, 0x6c, 0x99, 0x90, 0xdc, 0xba, 0x87, 0xea, 0x17, 0xdb, 0x95, + 0x10, 0xd1, 0x7f, 0x2d, 0x89, 0x15, 0x49, 0xf4, 0x5f, 0x13, 0xd1, 0xfd, 0x18, 0x56, 0xac, 0xf2, + 0x64, 0xd5, 0xef, 0x43, 0x7d, 0x9a, 0xbe, 0x8e, 0x94, 0x6d, 0xdc, 0x92, 0x1c, 0x82, 0xbb, 0x30, + 0x4f, 0x50, 0xdc, 0x4f, 0x61, 0x79, 0x9f, 0xbf, 0x92, 0x82, 0xac, 0x1a, 0x72, 0xf3, 0xc2, 0x1d, + 0x1a, 0xd1, 0xdd, 0xbb, 0xc0, 0xcc, 0x8f, 0x33, 0x01, 0x50, 0xfb, 0x35, 0xc7, 0xda, 0xaf, 0xb9, + 0x37, 0x81, 0x1d, 0x06, 0x27, 0xe1, 0x13, 0x9e, 0x24, 0xfe, 0x89, 0x16, 0xfd, 0x0e, 0x54, 0xc7, + 0xc9, 0x89, 0x54, 0x55, 0xf8, 0xd3, 0xfd, 0x0e, 0xac, 0x58, 0xf9, 0x64, 0xc1, 0x57, 0xa1, 0x99, + 0x04, 0x27, 0xa1, 0x9f, 0x4e, 0x63, 0x2e, 0x8b, 0xce, 0x00, 0xf7, 0x21, 0xac, 0xfe, 0x80, 0xc7, + 0xc1, 0xf1, 0xf9, 0x45, 0xc5, 0xdb, 0xe5, 0x54, 0xf2, 0xe5, 0xec, 0xc0, 0xe5, 0x5c, 0x39, 0xb2, + 0x7a, 0xc1, 0xbe, 0x72, 0x26, 0x1b, 0x9e, 0x48, 0x18, 0xba, 0xaf, 0x62, 0xea, 0x3e, 0xf7, 0x39, + 0xb0, 0xad, 0x28, 0x0c, 0xf9, 0x20, 0x3d, 0xe0, 0x3c, 0xce, 0x5c, 0x45, 0x19, 0xaf, 0xb6, 0x36, + 0xd6, 0xe5, 0xc8, 0xe6, 0x15, 0xaa, 0x64, 0x62, 0x06, 0xb5, 0x09, 0x8f, 0xc7, 0x54, 0x70, 0xc3, + 0xa3, 0xdf, 0xee, 0x65, 0x58, 0xb1, 0x8a, 0x95, 0x9b, 0xeb, 0x0f, 0xe1, 0xf2, 0x76, 0x90, 0x0c, + 0x8a, 0x15, 0x76, 0x61, 0x7e, 0x32, 0x3d, 0xea, 0x67, 0x92, 0xa8, 0x92, 0xb8, 0xdf, 0xca, 0x7f, + 0x22, 0x0b, 0xfb, 0x1b, 0x0e, 0xd4, 0x76, 0x9f, 0xed, 0x6d, 0xe1, 0x5a, 0x11, 0x84, 0x83, 0x68, + 0x8c, 0x56, 0x98, 0xe8, 0xb4, 0x4e, 0xcf, 0x94, 0xb0, 0xab, 0xd0, 0x24, 0xe3, 0x0d, 0xb7, 0x98, + 0xd2, 0x0e, 0xca, 0x00, 0xdc, 0xde, 0xf2, 0xd7, 0x93, 0x20, 0xa6, 0xfd, 0xab, 0xda, 0x95, 0xd6, + 0x68, 0x99, 0x29, 0x12, 0xdc, 0x5f, 0xcc, 0xc3, 0xbc, 0x5c, 0x7c, 0xc5, 0x42, 0x9e, 0x06, 0x67, + 0x3c, 0x5b, 0xc8, 0x31, 0x85, 0x86, 0x71, 0xcc, 0xc7, 0x51, 0xaa, 0xed, 0x37, 0x31, 0x0d, 0x36, + 0x48, 0xdb, 0x77, 0x69, 0x44, 0x88, 0x0d, 0x7f, 0x55, 0xe4, 0xb2, 0x40, 0x76, 0x15, 0xe6, 0x95, + 0x31, 0x50, 0xd3, 0x3b, 0x0b, 0x05, 0xe1, 0x68, 0x0c, 0xfc, 0x89, 0x3f, 0x08, 0xd2, 0x73, 0xa9, + 0x16, 0x74, 0x1a, 0xcb, 0x1f, 0x45, 0x03, 0x7f, 0xd4, 0x3f, 0xf2, 0x47, 0x7e, 0x38, 0xe0, 0xca, + 0x3d, 0x60, 0x81, 0xb8, 0x55, 0x96, 0xcd, 0x52, 0xd9, 0xc4, 0x76, 0x3a, 0x87, 0xe2, 0x1a, 0x3e, + 0x88, 0xc6, 0xe3, 0x20, 0xc5, 0x1d, 0x36, 0x99, 0x66, 0x55, 0xcf, 0x40, 0x84, 0x33, 0x82, 0x52, + 0xaf, 0xc4, 0x08, 0x36, 0x95, 0x33, 0xc2, 0x00, 0xb1, 0x94, 0x9c, 0x85, 0x56, 0xf5, 0x0c, 0x04, + 0xe7, 0x62, 0x1a, 0x26, 0x3c, 0x4d, 0x47, 0x7c, 0xa8, 0x1b, 0xd4, 0xa2, 0x6c, 0x45, 0x02, 0xbb, + 0x0f, 0x2b, 0x62, 0xd3, 0x9f, 0xf8, 0x69, 0x94, 0x9c, 0x06, 0x49, 0x3f, 0xc1, 0xdd, 0xaf, 0xd8, + 0x7c, 0x96, 0x91, 0xd8, 0xc7, 0xb0, 0x9e, 0x83, 0x63, 0x3e, 0xe0, 0xc1, 0x19, 0x1f, 0x92, 0x09, + 0x57, 0xf5, 0x66, 0x91, 0xd9, 0x75, 0x68, 0x85, 0xd3, 0x71, 0x7f, 0x3a, 0x19, 0xfa, 0x68, 0xc4, + 0x2c, 0x92, 0x71, 0x69, 0x42, 0xec, 0x43, 0x50, 0x76, 0x9a, 0xb4, 0x1e, 0x97, 0x2c, 0x0d, 0x87, + 0xdc, 0xeb, 0xd9, 0x39, 0x90, 0x31, 0x33, 0x93, 0xb4, 0x23, 0x37, 0x7a, 0x0a, 0x20, 0x39, 0x89, + 0x83, 0x33, 0x3f, 0xe5, 0xdd, 0x65, 0xa1, 0xd4, 0x65, 0x12, 0xbf, 0x0b, 0xc2, 0x20, 0x0d, 0xfc, + 0x34, 0x8a, 0xbb, 0x8c, 0x68, 0x19, 0x80, 0x83, 0x48, 0xfc, 0x91, 0xa4, 0x7e, 0x3a, 0x4d, 0xa4, + 0x85, 0xba, 0x42, 0xcc, 0x55, 0x24, 0xb0, 0x8f, 0x60, 0x4d, 0x70, 0x04, 0x91, 0xa4, 0xed, 0x4d, + 0xa6, 0xc2, 0x2a, 0x8d, 0xc8, 0x0c, 0x2a, 0x0e, 0xa5, 0x64, 0x91, 0xc2, 0x87, 0x97, 0xc5, 0x50, + 0xce, 0x20, 0x63, 0xfb, 0xb0, 0x05, 0xc1, 0xa0, 0x2f, 0x73, 0xa0, 0x88, 0xac, 0x51, 0x2f, 0x8a, + 0x04, 0x64, 0xf1, 0x51, 0x70, 0xcc, 0xd3, 0x60, 0xcc, 0xbb, 0xeb, 0x82, 0xc5, 0x55, 0x1a, 0x05, + 0x70, 0x3a, 0x21, 0x4a, 0x57, 0x08, 0xbc, 0x48, 0xb9, 0x7f, 0xe0, 0x88, 0xc5, 0x47, 0x0a, 0x6a, + 0x62, 0x6c, 0xab, 0x84, 0x88, 0xf6, 0xa3, 0x70, 0x74, 0x2e, 0xa5, 0x16, 0x04, 0xf4, 0x34, 0x1c, + 0x9d, 0xa3, 0x61, 0x1f, 0x84, 0x66, 0x16, 0xa1, 0xe7, 0xda, 0x0a, 0xa4, 0x4c, 0xef, 0x41, 0x6b, + 0x32, 0x3d, 0x1a, 0x05, 0x03, 0x91, 0xa5, 0x2a, 0x4a, 0x11, 0x10, 0x65, 0xc0, 0x7d, 0xa5, 0x98, + 0x29, 0x91, 0xa3, 0x46, 0x39, 0x5a, 0x12, 0xc3, 0x2c, 0xee, 0x03, 0x58, 0xb5, 0x1b, 0x28, 0x15, + 0xfa, 0x1d, 0x68, 0x48, 0xf9, 0x4f, 0xe4, 0xe6, 0x7e, 0xd1, 0xf0, 0xb3, 0xe2, 0x36, 0x48, 0xd3, + 0xdd, 0x7f, 0x53, 0x83, 0x15, 0x89, 0x6e, 0x8d, 0xa2, 0x84, 0x1f, 0x4e, 0xc7, 0x63, 0x3f, 0x2e, + 0x51, 0x2c, 0xce, 0x05, 0x8a, 0xa5, 0x52, 0x54, 0x2c, 0xd7, 0xac, 0xfd, 0xa5, 0xd0, 0x4c, 0x06, + 0xc2, 0x6e, 0xc3, 0xd2, 0x60, 0x14, 0x25, 0xc2, 0xdc, 0x37, 0x5d, 0x7d, 0x79, 0xb8, 0xa8, 0x0c, + 0xeb, 0x65, 0xca, 0xd0, 0x54, 0x64, 0x73, 0x39, 0x45, 0xe6, 0x42, 0x1b, 0x0b, 0xe5, 0x4a, 0x37, + 0xcf, 0xcb, 0xcd, 0x96, 0x81, 0x61, 0x7b, 0xf2, 0x6a, 0x43, 0xe8, 0xa8, 0xa5, 0x32, 0xa5, 0x11, + 0x8c, 0x39, 0xe9, 0x7e, 0x23, 0x77, 0x53, 0x2a, 0x8d, 0x22, 0x89, 0x3d, 0x04, 0x10, 0x75, 0x91, + 0x01, 0x02, 0x64, 0x80, 0xdc, 0xb4, 0x67, 0xc5, 0x1c, 0xff, 0xbb, 0x98, 0x98, 0xc6, 0x9c, 0x8c, + 0x12, 0xe3, 0x4b, 0xf7, 0x6f, 0x39, 0xd0, 0x32, 0x68, 0xec, 0x32, 0x2c, 0x6f, 0x3d, 0x7d, 0x7a, + 0xb0, 0xe3, 0x6d, 0x3e, 0x7b, 0xfc, 0x83, 0x9d, 0xfe, 0xd6, 0xde, 0xd3, 0xc3, 0x9d, 0xce, 0x25, + 0x84, 0xf7, 0x9e, 0x6e, 0x6d, 0xee, 0xf5, 0x1f, 0x3e, 0xf5, 0xb6, 0x14, 0xec, 0xb0, 0x35, 0x60, + 0xde, 0xce, 0x93, 0xa7, 0xcf, 0x76, 0x2c, 0xbc, 0xc2, 0x3a, 0xd0, 0x7e, 0xe0, 0xed, 0x6c, 0x6e, + 0xed, 0x4a, 0xa4, 0xca, 0x56, 0xa1, 0xf3, 0xf0, 0xf9, 0xfe, 0xf6, 0xe3, 0xfd, 0x47, 0xfd, 0xad, + 0xcd, 0xfd, 0xad, 0x9d, 0xbd, 0x9d, 0xed, 0x4e, 0x8d, 0x2d, 0x40, 0x73, 0xf3, 0xc1, 0xe6, 0xfe, + 0xf6, 0xd3, 0xfd, 0x9d, 0xed, 0x4e, 0xdd, 0xfd, 0xaf, 0x0e, 0x5c, 0xa6, 0x56, 0x0f, 0xf3, 0x42, + 0x72, 0x1d, 0x5a, 0x83, 0x28, 0x9a, 0xa0, 0xe1, 0x9f, 0x2d, 0x6d, 0x26, 0x84, 0x02, 0x20, 0x94, + 0xc2, 0x71, 0x14, 0x0f, 0xb8, 0x94, 0x11, 0x20, 0xe8, 0x21, 0x22, 0x28, 0x00, 0x72, 0x7a, 0x45, + 0x0e, 0x21, 0x22, 0x2d, 0x81, 0x89, 0x2c, 0x6b, 0x30, 0x77, 0x14, 0x73, 0x7f, 0x70, 0x2a, 0xa5, + 0x43, 0xa6, 0xd8, 0x37, 0xb3, 0x9d, 0xe9, 0x00, 0x47, 0x7f, 0xc4, 0x87, 0xc4, 0x31, 0x0d, 0x6f, + 0x49, 0xe2, 0x5b, 0x12, 0x46, 0x2d, 0xe8, 0x1f, 0xf9, 0xe1, 0x30, 0x0a, 0xf9, 0x50, 0x9a, 0xbd, + 0x19, 0xe0, 0x1e, 0xc0, 0x5a, 0xbe, 0x7f, 0x52, 0xc6, 0x3e, 0x32, 0x64, 0x4c, 0x58, 0xa1, 0xbd, + 0xd9, 0xb3, 0x69, 0xc8, 0xdb, 0x2f, 0x2b, 0x50, 0x43, 0xa3, 0x64, 0xb6, 0x01, 0x63, 0xda, 0x99, + 0xd5, 0xc2, 0xb9, 0x00, 0x6d, 0x76, 0xc5, 0x12, 0x25, 0x1d, 0x2d, 0x19, 0x92, 0xd1, 0x63, 0x3e, + 0x38, 0x93, 0xae, 0x16, 0x03, 0x41, 0x01, 0xc1, 0x4d, 0x00, 0x7d, 0x2d, 0x05, 0x44, 0xa5, 0x15, + 0x8d, 0xbe, 0x9c, 0xcf, 0x68, 0xf4, 0x5d, 0x17, 0xe6, 0x83, 0xf0, 0x28, 0x9a, 0x86, 0x43, 0x12, + 0x88, 0x86, 0xa7, 0x92, 0x74, 0x12, 0x41, 0x82, 0x8a, 0xfa, 0x53, 0xb0, 0x7f, 0x06, 0xb0, 0x0d, + 0x68, 0x26, 0xe7, 0xe1, 0xc0, 0xe4, 0xf9, 0x55, 0x39, 0x4a, 0x38, 0x06, 0x77, 0x0f, 0xcf, 0xc3, + 0x01, 0x71, 0x78, 0x96, 0xcd, 0xfd, 0x5d, 0x68, 0x28, 0x18, 0xd9, 0xf2, 0xf9, 0xfe, 0xe7, 0xfb, + 0x4f, 0x5f, 0xec, 0xf7, 0x0f, 0x7f, 0xb8, 0xbf, 0xd5, 0xb9, 0xc4, 0x96, 0xa0, 0xb5, 0xb9, 0x45, + 0x9c, 0x4e, 0x80, 0x83, 0x59, 0x0e, 0x36, 0x0f, 0x0f, 0x35, 0x52, 0x71, 0x19, 0x6e, 0xe4, 0x13, + 0xb2, 0xfc, 0xb4, 0xa7, 0xfd, 0x23, 0x58, 0x36, 0xb0, 0x6c, 0x17, 0x31, 0x41, 0x20, 0xb7, 0x8b, + 0x20, 0x93, 0x51, 0x50, 0xdc, 0x0e, 0x2c, 0x3e, 0xe2, 0xe9, 0xe3, 0xf0, 0x38, 0x52, 0x25, 0xfd, + 0xcf, 0x1a, 0x2c, 0x69, 0x48, 0x16, 0x74, 0x1b, 0x96, 0x82, 0x21, 0x0f, 0xd3, 0x20, 0x3d, 0xef, + 0x5b, 0xfe, 0x82, 0x3c, 0x8c, 0xa6, 0xb6, 0x3f, 0x0a, 0x7c, 0x75, 0xe0, 0x23, 0x12, 0xb8, 0x7f, + 0x46, 0x1b, 0xc0, 0xf4, 0xdb, 0x10, 0x5f, 0x09, 0x37, 0x45, 0x29, 0x0d, 0x35, 0x10, 0xe2, 0x72, + 0x99, 0xd1, 0x9f, 0x08, 0x93, 0xb3, 0x8c, 0x84, 0x53, 0x25, 0x4a, 0xc2, 0x2e, 0xd7, 0x85, 0x9d, + 0xa0, 0x81, 0xc2, 0x89, 0xca, 0x9c, 0xd0, 0x8f, 0xf9, 0x13, 0x15, 0xe3, 0x54, 0xa6, 0x51, 0x38, + 0x95, 0x41, 0xfd, 0x79, 0x1e, 0x0e, 0xf8, 0xb0, 0x9f, 0x46, 0x7d, 0xd2, 0xf3, 0xc4, 0x12, 0x0d, + 0x2f, 0x0f, 0xe3, 0xba, 0x91, 0xf2, 0x24, 0x0d, 0xb9, 0x70, 0x4d, 0x37, 0xc8, 0x0b, 0xaa, 0x20, + 0xdc, 0x1f, 0x4c, 0xe3, 0x20, 0xe9, 0xb6, 0xe9, 0xbc, 0x85, 0x7e, 0xb3, 0xef, 0xc2, 0xe5, 0x23, + 0x9e, 0xa4, 0xfd, 0x53, 0xee, 0x0f, 0x79, 0x4c, 0xec, 0x25, 0x0e, 0x76, 0x84, 0xc9, 0x55, 0x4e, + 0x44, 0xc6, 0x3d, 0xe3, 0x71, 0x12, 0x44, 0x21, 0x19, 0x5b, 0x4d, 0x4f, 0x25, 0xb1, 0x3c, 0xec, + 0xbc, 0x5e, 0xa8, 0xf5, 0x08, 0x2e, 0x51, 0xc7, 0xcb, 0x89, 0xec, 0x06, 0xcc, 0x51, 0x07, 0x92, + 0x6e, 0x87, 0x78, 0xa6, 0x9d, 0xc9, 0x7c, 0x10, 0x7a, 0x92, 0x86, 0xb3, 0x3c, 0x88, 0x46, 0x51, + 0x4c, 0x16, 0x57, 0xd3, 0x13, 0x09, 0x7b, 0x74, 0x4e, 0x62, 0x7f, 0x72, 0x2a, 0xad, 0xae, 0x3c, + 0xfc, 0x59, 0xad, 0xd1, 0xea, 0xb4, 0xdd, 0xff, 0x0f, 0xea, 0x54, 0x2c, 0x15, 0x47, 0x83, 0xe9, + 0xc8, 0xe2, 0x08, 0xed, 0xc2, 0x7c, 0xc8, 0xd3, 0x57, 0x51, 0xfc, 0x52, 0x9d, 0x1e, 0xca, 0xa4, + 0xfb, 0x33, 0xda, 0xa1, 0xe9, 0xd3, 0xb4, 0xe7, 0x64, 0x5a, 0xe2, 0x3e, 0x5b, 0x4c, 0x55, 0x72, + 0xea, 0xcb, 0x4d, 0x63, 0x83, 0x80, 0xc3, 0x53, 0x1f, 0x75, 0xad, 0x35, 0xfb, 0x62, 0x1f, 0xde, + 0x22, 0x6c, 0x57, 0x4c, 0xfe, 0x0d, 0x58, 0x54, 0xe7, 0x74, 0x49, 0x7f, 0xc4, 0x8f, 0x53, 0xe5, + 0x45, 0x0b, 0xa7, 0x63, 0xda, 0xac, 0xef, 0xf1, 0xe3, 0xd4, 0xdd, 0x87, 0x65, 0xa9, 0xff, 0x9e, + 0x4e, 0xb8, 0xaa, 0xfa, 0xb7, 0xcb, 0x6c, 0x89, 0xd6, 0xc6, 0x8a, 0xad, 0x30, 0xc5, 0xc9, 0xa4, + 0x9d, 0xd3, 0xf5, 0x80, 0x99, 0xfa, 0x54, 0x16, 0x28, 0x17, 0x73, 0xe5, 0x27, 0x94, 0xdd, 0xb1, + 0x30, 0x1c, 0x9f, 0x64, 0x3a, 0x18, 0xa8, 0xd3, 0xd5, 0x86, 0xa7, 0x92, 0xee, 0x1f, 0x39, 0xb0, + 0x42, 0xa5, 0x29, 0x6b, 0x48, 0xae, 0x59, 0x1f, 0x7f, 0x8d, 0x66, 0x2a, 0x2f, 0xad, 0xf0, 0x4d, + 0xae, 0x42, 0xdd, 0x5c, 0xc5, 0x44, 0xe2, 0xeb, 0xfb, 0x64, 0x6a, 0x79, 0x9f, 0x8c, 0xfb, 0xf7, + 0x1d, 0x58, 0x16, 0x0b, 0x09, 0x59, 0xdb, 0xb2, 0xfb, 0xff, 0x3f, 0x2c, 0x08, 0x8b, 0x40, 0x6a, + 0x05, 0xd9, 0xd0, 0x4c, 0xb5, 0x12, 0x2a, 0x32, 0xef, 0x5e, 0xf2, 0xec, 0xcc, 0xec, 0x53, 0xb2, + 0xca, 0xc2, 0x3e, 0xa1, 0x25, 0xe7, 0xf0, 0xf6, 0x58, 0xef, 0x5e, 0xf2, 0x8c, 0xec, 0x0f, 0x1a, + 0x68, 0x2c, 0x23, 0xee, 0x3e, 0x82, 0x05, 0xab, 0x22, 0xcb, 0x1f, 0xd4, 0x16, 0xfe, 0xa0, 0x82, + 0xe3, 0xb5, 0x52, 0xe2, 0x78, 0xfd, 0x57, 0x55, 0x60, 0xc8, 0x2c, 0xb9, 0xd9, 0xb8, 0x6e, 0x9f, + 0x5e, 0xa8, 0x23, 0xf9, 0x0c, 0x62, 0x1b, 0xc0, 0x8c, 0xa4, 0x3a, 0x55, 0xa9, 0xea, 0x53, 0x95, + 0x12, 0x2a, 0xaa, 0x5a, 0x69, 0x75, 0xe8, 0x13, 0x0b, 0xda, 0xeb, 0x8b, 0xa1, 0x2f, 0xa5, 0xe1, + 0xca, 0x48, 0xc7, 0x17, 0xb8, 0x2b, 0x91, 0xfb, 0x63, 0x95, 0xce, 0xcf, 0xf1, 0xdc, 0x85, 0x73, + 0x3c, 0x5f, 0xf0, 0xbb, 0x19, 0x3b, 0xb4, 0x86, 0xbd, 0x43, 0xbb, 0x01, 0x0b, 0xea, 0x94, 0x42, + 0x9c, 0x88, 0xca, 0xed, 0xb0, 0x05, 0xb2, 0x3b, 0xd0, 0x51, 0x9b, 0x24, 0xbd, 0x0d, 0x14, 0xe7, + 0x7d, 0x05, 0x1c, 0xd7, 0x80, 0xcc, 0x13, 0xd7, 0xa2, 0xc6, 0x66, 0x00, 0xed, 0xa9, 0x90, 0x4b, + 0xfa, 0xd3, 0x50, 0x1e, 0xc7, 0xf3, 0x21, 0x6d, 0x84, 0x71, 0x4f, 0x95, 0x27, 0xb8, 0x7f, 0xc7, + 0x81, 0x0e, 0xce, 0x9b, 0xc5, 0x9a, 0x9f, 0x00, 0x49, 0xc6, 0x5b, 0x72, 0xa6, 0x95, 0x97, 0x7d, + 0x0c, 0x4d, 0x4a, 0x47, 0x13, 0x1e, 0x4a, 0xbe, 0xec, 0xda, 0x7c, 0x99, 0xe9, 0x94, 0xdd, 0x4b, + 0x5e, 0x96, 0xd9, 0xe0, 0xca, 0xff, 0xe8, 0x40, 0x4b, 0xd6, 0xf2, 0x2b, 0x7b, 0x7a, 0x7a, 0x46, + 0xfc, 0x84, 0x30, 0xc0, 0xb2, 0x70, 0x89, 0xdb, 0xb0, 0x34, 0xf6, 0xd3, 0x69, 0x8c, 0x6b, 0xba, + 0xe5, 0xe5, 0xc9, 0xc3, 0xb8, 0x40, 0x93, 0xfa, 0x4c, 0xfa, 0x69, 0x30, 0xea, 0x2b, 0xaa, 0x8c, + 0x54, 0x28, 0x23, 0xa1, 0x16, 0x49, 0x52, 0xff, 0x84, 0xcb, 0xb5, 0x57, 0x24, 0xdc, 0x2e, 0xac, + 0x1d, 0x64, 0x27, 0x37, 0x86, 0x8d, 0xed, 0xfe, 0x8b, 0x05, 0x58, 0x2f, 0x90, 0x74, 0x5c, 0x95, + 0x74, 0x5d, 0x8c, 0x82, 0xf1, 0x51, 0xa4, 0x37, 0x28, 0x8e, 0xe9, 0xd5, 0xb0, 0x48, 0xec, 0x04, + 0x2e, 0x2b, 0x23, 0x03, 0xc7, 0x34, 0x5b, 0x10, 0x2b, 0xb4, 0xd2, 0x7d, 0x68, 0x4f, 0x61, 0xbe, + 0x42, 0x85, 0x9b, 0x82, 0x5c, 0x5e, 0x1e, 0x3b, 0x85, 0xae, 0xb6, 0x66, 0xa4, 0xc2, 0x36, 0x2c, + 0x1e, 0xac, 0xeb, 0x83, 0x0b, 0xea, 0xb2, 0x4c, 0x72, 0x6f, 0x66, 0x69, 0xec, 0x1c, 0xae, 0x29, + 0x1a, 0x69, 0xe4, 0x62, 0x7d, 0xb5, 0xb7, 0xea, 0x1b, 0x6d, 0x36, 0xec, 0x4a, 0x2f, 0x28, 0x98, + 0xfd, 0x14, 0xd6, 0x5e, 0xf9, 0x41, 0xaa, 0x9a, 0x65, 0xd8, 0x17, 0x75, 0xaa, 0x72, 0xe3, 0x82, + 0x2a, 0x5f, 0x88, 0x8f, 0xad, 0x65, 0x6a, 0x46, 0x89, 0xbd, 0x3f, 0xad, 0xc0, 0xa2, 0x5d, 0x0e, + 0xb2, 0xa9, 0x94, 0x7d, 0xa5, 0x03, 0x95, 0x45, 0x9a, 0x83, 0x8b, 0xfb, 0xfc, 0x4a, 0xd9, 0x3e, + 0xdf, 0xdc, 0x59, 0x57, 0x2f, 0x72, 0x11, 0xd6, 0xde, 0xce, 0x45, 0x58, 0x2f, 0x75, 0x11, 0xce, + 0xf6, 0x24, 0xcd, 0xfd, 0xaa, 0x9e, 0xa4, 0xf9, 0x37, 0x7a, 0x92, 0x7a, 0xff, 0xdb, 0x01, 0x56, + 0xe4, 0x5e, 0xf6, 0x48, 0xb8, 0x36, 0x42, 0x3e, 0x92, 0x4a, 0xec, 0xdb, 0x6f, 0x27, 0x01, 0x6a, + 0xb6, 0xd4, 0xd7, 0x28, 0x8a, 0x66, 0x70, 0x93, 0x69, 0x62, 0x2d, 0x78, 0x65, 0xa4, 0x9c, 0x9b, + 0xb4, 0x76, 0xb1, 0x9b, 0xb4, 0x7e, 0xb1, 0x9b, 0x74, 0x2e, 0xef, 0x26, 0xed, 0xfd, 0x75, 0x07, + 0x56, 0x4a, 0xd8, 0xec, 0x37, 0xd7, 0x71, 0x64, 0x0c, 0x4b, 0xfb, 0x54, 0x24, 0x63, 0x98, 0x60, + 0xef, 0x2f, 0xc3, 0x82, 0x25, 0x5a, 0xbf, 0xb9, 0xfa, 0xf3, 0x56, 0xa2, 0xe0, 0x6c, 0x0b, 0xeb, + 0xfd, 0xaf, 0x0a, 0xb0, 0xa2, 0x78, 0xff, 0x3f, 0x6d, 0x43, 0x71, 0x9c, 0xaa, 0x25, 0xe3, 0xf4, + 0x7f, 0x75, 0xe5, 0xf9, 0x00, 0x96, 0x65, 0xc4, 0xa6, 0xe1, 0xcc, 0x12, 0x1c, 0x53, 0x24, 0xa0, + 0x9d, 0x6c, 0xfb, 0xa8, 0x1b, 0x56, 0x84, 0x9a, 0xb1, 0xfc, 0xe6, 0x5c, 0xd5, 0x6e, 0x0f, 0xba, + 0x72, 0x84, 0x76, 0xce, 0x78, 0x98, 0x1e, 0x4e, 0x8f, 0x44, 0xc8, 0x62, 0x10, 0x85, 0x64, 0x06, + 0x9a, 0x44, 0x69, 0x50, 0x7c, 0x17, 0xda, 0xe6, 0xf2, 0x21, 0xa7, 0x23, 0xe7, 0xcf, 0x44, 0x53, + 0xc2, 0xcc, 0xc5, 0xb6, 0x61, 0x91, 0x94, 0xe4, 0x50, 0x7f, 0x57, 0xa1, 0xef, 0xde, 0xe0, 0xa3, + 0xd9, 0xbd, 0xe4, 0xe5, 0xbe, 0x61, 0xbf, 0x03, 0x8b, 0xf6, 0x06, 0x50, 0x5a, 0x25, 0x65, 0x3b, + 0x02, 0xfc, 0xdc, 0xce, 0xcc, 0x36, 0xa1, 0x93, 0xdf, 0x41, 0xca, 0x68, 0x9e, 0x19, 0x05, 0x14, + 0xb2, 0xb3, 0x8f, 0xe5, 0x81, 0x65, 0x9d, 0x7c, 0x27, 0x37, 0xec, 0xcf, 0x8c, 0x61, 0xba, 0x2b, + 0xfe, 0x18, 0x47, 0x98, 0xbf, 0x07, 0x90, 0x61, 0xac, 0x03, 0xed, 0xa7, 0x07, 0x3b, 0xfb, 0xfd, + 0xad, 0xdd, 0xcd, 0xfd, 0xfd, 0x9d, 0xbd, 0xce, 0x25, 0xc6, 0x60, 0x91, 0x5c, 0x7d, 0xdb, 0x1a, + 0x73, 0x10, 0x93, 0xce, 0x15, 0x85, 0x55, 0xd8, 0x2a, 0x74, 0x1e, 0xef, 0xe7, 0xd0, 0xea, 0x83, + 0xa6, 0x96, 0x0f, 0x77, 0x0d, 0x56, 0x45, 0x44, 0xee, 0x03, 0xc1, 0x1e, 0xca, 0x3a, 0xf9, 0xc7, + 0x0e, 0x5c, 0xce, 0x11, 0xb2, 0x90, 0x2f, 0x61, 0x80, 0xd8, 0x56, 0x89, 0x0d, 0xd2, 0x01, 0x84, + 0xb2, 0x35, 0x73, 0x1a, 0xa4, 0x48, 0x40, 0x9e, 0x37, 0x6c, 0xd3, 0x9c, 0x24, 0x95, 0x91, 0xdc, + 0x75, 0x1d, 0x59, 0x93, 0x6b, 0xf8, 0xb1, 0x88, 0xf4, 0x35, 0x09, 0xd9, 0x01, 0xb0, 0xdd, 0x64, + 0x95, 0xc4, 0x6d, 0x85, 0x65, 0xec, 0xd8, 0xed, 0x2d, 0xa5, 0xb9, 0xff, 0xae, 0x0a, 0xec, 0xfb, + 0x53, 0x1e, 0x9f, 0x53, 0x4c, 0x97, 0xf6, 0x9c, 0xae, 0xe7, 0xfd, 0x82, 0x73, 0x93, 0xe9, 0xd1, + 0xe7, 0xfc, 0x5c, 0x05, 0x4b, 0x56, 0xde, 0x2a, 0x58, 0xb2, 0x2c, 0x58, 0xb1, 0x76, 0x71, 0xb0, + 0x62, 0xfd, 0xa2, 0x60, 0xc5, 0x6f, 0xc0, 0x42, 0x70, 0x12, 0x46, 0xa8, 0x0e, 0xd0, 0x84, 0x48, + 0xba, 0x73, 0xd7, 0xab, 0xb8, 0xf5, 0x96, 0xe0, 0x3e, 0x62, 0xec, 0xd3, 0x2c, 0x13, 0x1f, 0x9e, + 0x50, 0x70, 0xad, 0xa9, 0x20, 0x76, 0x86, 0x27, 0x7c, 0x2f, 0x1a, 0xf8, 0x69, 0x14, 0xd3, 0x3e, + 0x4d, 0x7d, 0x8c, 0x78, 0xc2, 0x6e, 0xc0, 0x62, 0x12, 0x4d, 0xd1, 0xa8, 0x52, 0xc3, 0x20, 0x1c, + 0x4d, 0x6d, 0x81, 0x1e, 0x88, 0xc1, 0xb8, 0x0b, 0x2b, 0xd3, 0x84, 0xf7, 0xc7, 0x41, 0x92, 0xe0, + 0xc2, 0x39, 0x88, 0xc2, 0x34, 0x8e, 0x46, 0xd2, 0xdd, 0xb4, 0x3c, 0x4d, 0xf8, 0x13, 0x41, 0xd9, + 0x12, 0x04, 0xf6, 0xdd, 0xac, 0x49, 0x13, 0x3f, 0x88, 0x93, 0x2e, 0x50, 0x93, 0x54, 0x4f, 0xb1, + 0xdd, 0x07, 0x7e, 0x10, 0xeb, 0xb6, 0x60, 0x22, 0xc9, 0x05, 0x51, 0xb6, 0x72, 0x41, 0x94, 0x32, + 0xfe, 0xee, 0x2e, 0x34, 0xd4, 0xe7, 0xb8, 0x07, 0x3e, 0x8e, 0xa3, 0xb1, 0xda, 0x03, 0xe3, 0x6f, + 0xb6, 0x08, 0x95, 0x34, 0x92, 0xfb, 0xd7, 0x4a, 0x1a, 0xb9, 0xbf, 0x0f, 0x2d, 0x63, 0x04, 0xd8, + 0xfb, 0x62, 0x3b, 0x8e, 0xb6, 0x96, 0xdc, 0x3c, 0x8b, 0x53, 0x94, 0xa6, 0x44, 0x1f, 0x0f, 0xd9, + 0xb7, 0x60, 0x79, 0x18, 0xc4, 0x9c, 0xe2, 0x7c, 0xfb, 0x31, 0x3f, 0xe3, 0x71, 0xa2, 0x5c, 0x0d, + 0x1d, 0x4d, 0xf0, 0x04, 0xee, 0xf6, 0x61, 0xc5, 0xe2, 0x2a, 0x2d, 0x74, 0x73, 0x14, 0x34, 0xa8, + 0xbc, 0x9d, 0x76, 0x40, 0xa1, 0xa4, 0xe1, 0x72, 0x25, 0xbd, 0x24, 0xfd, 0x49, 0x1c, 0x1d, 0x51, + 0x25, 0x8e, 0x67, 0x61, 0xee, 0x2f, 0x2b, 0x50, 0xdd, 0x8d, 0x26, 0xe6, 0xd9, 0x8f, 0x53, 0x3c, + 0xfb, 0x91, 0x76, 0x65, 0x5f, 0x9b, 0x8d, 0x72, 0xf1, 0xb7, 0x40, 0x76, 0x07, 0x16, 0x91, 0x83, + 0xd3, 0x08, 0xed, 0xe8, 0x57, 0x7e, 0x2c, 0x22, 0x0c, 0xab, 0xc4, 0x16, 0x39, 0x0a, 0x5b, 0x85, + 0xaa, 0x36, 0x87, 0x28, 0x03, 0x26, 0x71, 0x13, 0x47, 0xe7, 0xeb, 0xe7, 0xd2, 0xa5, 0x29, 0x53, + 0xa8, 0x10, 0xec, 0xef, 0x85, 0x98, 0x88, 0x45, 0xad, 0x8c, 0x84, 0x36, 0x2e, 0x0a, 0xc2, 0x38, + 0x33, 0x19, 0x75, 0xda, 0x74, 0xd6, 0x37, 0x6c, 0x67, 0xfd, 0x75, 0x68, 0xa5, 0xa3, 0xb3, 0xfe, + 0xc4, 0x3f, 0x1f, 0x45, 0xfe, 0x50, 0x32, 0xa0, 0x09, 0xb1, 0xfb, 0x00, 0xe3, 0xc9, 0xa4, 0x8f, + 0xeb, 0x68, 0x3c, 0xa4, 0x9d, 0x79, 0x6b, 0xa3, 0x23, 0x47, 0xff, 0xc9, 0xc1, 0x81, 0x47, 0xb8, + 0x67, 0xe4, 0x71, 0x5f, 0x40, 0x53, 0x13, 0xcc, 0xd0, 0x54, 0x8a, 0xb0, 0x68, 0xd9, 0xa1, 0xa9, + 0x14, 0x50, 0x71, 0x13, 0x16, 0x85, 0xf2, 0xd4, 0xea, 0x40, 0x9c, 0x8a, 0xe7, 0x50, 0xf7, 0xcf, + 0x1d, 0xa8, 0xd3, 0x84, 0xa3, 0x35, 0x21, 0x68, 0xfa, 0xac, 0x8a, 0x26, 0x71, 0xc1, 0xcb, 0xc3, + 0xcc, 0xb5, 0xc2, 0xe4, 0x2b, 0x7a, 0xf4, 0xcd, 0x50, 0xf9, 0xeb, 0xd0, 0xd4, 0x35, 0x19, 0x33, + 0x98, 0x81, 0xec, 0x1a, 0xd4, 0x4e, 0xa3, 0x89, 0xda, 0x70, 0x81, 0x3a, 0xce, 0x8e, 0x26, 0x1e, + 0xe1, 0x59, 0x7b, 0xb0, 0x3c, 0xd1, 0x05, 0x61, 0xd4, 0xe6, 0xe1, 0x92, 0xbe, 0xce, 0x95, 0xf6, + 0xf5, 0x39, 0x2c, 0xa1, 0x58, 0x1a, 0xbe, 0xfb, 0xd9, 0xaa, 0xf5, 0x9b, 0xb8, 0x52, 0x0f, 0x46, + 0xd3, 0x21, 0x37, 0xb7, 0xbd, 0xe4, 0x9b, 0x95, 0xb8, 0x32, 0xf8, 0xdc, 0x7f, 0xe9, 0x08, 0x71, + 0xc7, 0x72, 0xd9, 0x6d, 0xa8, 0xa1, 0x16, 0xcc, 0x79, 0x39, 0x74, 0xd4, 0x0b, 0xe6, 0xf3, 0x28, + 0x07, 0xce, 0x22, 0x79, 0x4f, 0xcd, 0xd2, 0x85, 0xef, 0x34, 0xdb, 0x33, 0xea, 0x9e, 0xe5, 0xb6, + 0x5a, 0x39, 0x94, 0xdd, 0x35, 0x8e, 0x9e, 0x6a, 0x96, 0x66, 0x55, 0x86, 0xc1, 0xf0, 0x84, 0x1b, + 0x47, 0x4e, 0x7f, 0xec, 0xc0, 0x82, 0xd5, 0x26, 0x64, 0x5a, 0x0a, 0x22, 0x17, 0x4e, 0x13, 0x39, + 0xf3, 0x26, 0x64, 0x32, 0x7c, 0xc5, 0x66, 0x78, 0x7d, 0x84, 0x51, 0x35, 0x8f, 0x30, 0xee, 0x43, + 0x33, 0xbb, 0x27, 0x61, 0x37, 0x0a, 0x6b, 0x54, 0xf1, 0x3f, 0x59, 0xa6, 0xcc, 0x49, 0x5e, 0x37, + 0x9c, 0xe4, 0xee, 0xa7, 0xd0, 0x32, 0xf2, 0x9b, 0x4e, 0x6e, 0xc7, 0x72, 0x72, 0xeb, 0xe0, 0xb8, + 0x4a, 0x16, 0x1c, 0xe7, 0xfe, 0xbc, 0x02, 0x0b, 0xc8, 0xde, 0x41, 0x78, 0x72, 0x10, 0x8d, 0x82, + 0xc1, 0x39, 0xb1, 0x95, 0xe2, 0x64, 0xb9, 0x0a, 0x2a, 0x36, 0xb7, 0x61, 0x94, 0x7e, 0x1d, 0x11, + 0x2c, 0x54, 0x95, 0x4e, 0xa3, 0x2e, 0x43, 0x4d, 0x70, 0xe4, 0x27, 0xdc, 0xb8, 0x38, 0xe1, 0xd9, + 0x20, 0x6a, 0x1c, 0x04, 0x28, 0xd4, 0x71, 0x1c, 0x8c, 0x46, 0x81, 0xc8, 0x2b, 0xb6, 0x6f, 0x65, + 0x24, 0xac, 0x73, 0x18, 0x24, 0xfe, 0x51, 0x76, 0x3c, 0xa9, 0xd3, 0xe4, 0xfb, 0xf3, 0x5f, 0x1b, + 0xbe, 0x3f, 0x11, 0x1b, 0x6d, 0x83, 0xf9, 0x89, 0x9c, 0x2f, 0x4c, 0xa4, 0xfb, 0x6f, 0x2b, 0xd0, + 0x32, 0xd8, 0x02, 0xc5, 0xb9, 0x74, 0xb9, 0x31, 0x50, 0x79, 0x6e, 0x1f, 0x5a, 0x0e, 0x01, 0x03, + 0x61, 0x37, 0xec, 0x5a, 0xe9, 0x1c, 0x80, 0x04, 0xde, 0x62, 0xa1, 0xab, 0xd0, 0x44, 0xd6, 0xff, + 0x90, 0xbc, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x14, 0x75, 0x83, 0xa8, 0xf5, 0x8c, 0x4a, 0xc0, 0x1b, + 0x4f, 0xf2, 0x3f, 0x86, 0xb6, 0x2c, 0x86, 0xe6, 0x98, 0x3a, 0x9d, 0x09, 0x9f, 0x35, 0xff, 0x9e, + 0x95, 0x53, 0x7d, 0xb9, 0xa1, 0xbe, 0x6c, 0x5c, 0xf4, 0xa5, 0xca, 0xe9, 0x3e, 0xd2, 0x41, 0x12, + 0x8f, 0x62, 0x7f, 0x72, 0xaa, 0x14, 0xca, 0x7d, 0x58, 0x51, 0x7a, 0x63, 0x1a, 0xfa, 0x61, 0x18, + 0x4d, 0xc3, 0x01, 0x57, 0x71, 0x74, 0x65, 0x24, 0x77, 0xa8, 0xa3, 0xae, 0xa9, 0x20, 0x76, 0x07, + 0xea, 0xc2, 0x8e, 0x12, 0xab, 0x72, 0xb9, 0x0a, 0x11, 0x59, 0xd8, 0x6d, 0xa8, 0x0b, 0x73, 0xaa, + 0x32, 0x53, 0xe8, 0x45, 0x06, 0xf7, 0x2e, 0x2c, 0x51, 0x98, 0xb7, 0xa1, 0xfb, 0xde, 0x29, 0x5b, + 0xad, 0xe7, 0x06, 0x22, 0x18, 0x7c, 0x15, 0xd8, 0xbe, 0x90, 0x2b, 0xf3, 0xa8, 0xf3, 0xcf, 0xab, + 0xd0, 0x32, 0x60, 0xd4, 0x4f, 0x74, 0x3e, 0xd5, 0x1f, 0x06, 0xfe, 0x98, 0xa7, 0x3c, 0x96, 0xb2, + 0x94, 0x43, 0x31, 0x9f, 0x7f, 0x76, 0xd2, 0x8f, 0xa6, 0x69, 0x7f, 0xc8, 0x4f, 0x62, 0xce, 0xa5, + 0x19, 0x91, 0x43, 0x31, 0x1f, 0x72, 0xb3, 0x91, 0x4f, 0x9c, 0x28, 0xe5, 0x50, 0x75, 0x70, 0x29, + 0xc6, 0xa9, 0x96, 0x1d, 0x5c, 0x8a, 0x51, 0xc9, 0x6b, 0xd6, 0x7a, 0x89, 0x66, 0xfd, 0x08, 0xd6, + 0x84, 0x0e, 0x95, 0xda, 0xa3, 0x9f, 0x63, 0xae, 0x19, 0x54, 0x76, 0x07, 0x3a, 0xd8, 0x66, 0x25, + 0x1a, 0x49, 0xf0, 0x33, 0x21, 0x63, 0x8e, 0x57, 0xc0, 0x31, 0x2f, 0x79, 0xd2, 0xcd, 0xbc, 0x22, + 0x7a, 0xa4, 0x80, 0x53, 0x5e, 0xff, 0xb5, 0x9d, 0xb7, 0x29, 0xf3, 0xe6, 0x70, 0xf6, 0x31, 0xac, + 0x8f, 0xf9, 0x30, 0xf0, 0xed, 0x22, 0xfa, 0xd9, 0x22, 0x3f, 0x8b, 0x8c, 0xb5, 0xe0, 0x28, 0xfc, + 0x2c, 0x1a, 0x1f, 0x05, 0x62, 0x61, 0x13, 0x3e, 0xff, 0x9a, 0x57, 0xc0, 0xdd, 0x05, 0x68, 0x1d, + 0xa6, 0xd1, 0x44, 0x4d, 0xfd, 0x22, 0xb4, 0x45, 0x52, 0x46, 0x4e, 0xbe, 0x03, 0x57, 0x88, 0x5f, + 0x9f, 0x45, 0x93, 0x68, 0x14, 0x9d, 0x9c, 0x5b, 0x3b, 0xf7, 0xff, 0xe0, 0xc0, 0x8a, 0x45, 0xcd, + 0xb6, 0xee, 0xe4, 0x66, 0x54, 0xe1, 0x6e, 0x82, 0xc5, 0x97, 0x8d, 0x65, 0x41, 0x64, 0x14, 0xa7, + 0x3a, 0xcf, 0x65, 0x04, 0xdc, 0x66, 0x76, 0x87, 0x43, 0x7d, 0x28, 0xf8, 0xbd, 0x5b, 0xe4, 0x77, + 0xf9, 0xbd, 0xba, 0xdd, 0xa1, 0x8a, 0xf8, 0x1d, 0x19, 0xeb, 0x33, 0x94, 0x9d, 0xae, 0xda, 0xf1, + 0x19, 0xa6, 0xa7, 0x47, 0xb5, 0x60, 0xa0, 0xc1, 0xc4, 0xfd, 0x85, 0x03, 0x90, 0xb5, 0x8e, 0x22, + 0x44, 0xf4, 0xd2, 0x26, 0xee, 0x25, 0x1b, 0xcb, 0xd8, 0xfb, 0xd0, 0xd6, 0x87, 0xfc, 0xd9, 0x6a, + 0xd9, 0x52, 0x18, 0x5a, 0x17, 0xb7, 0x60, 0xe9, 0x64, 0x14, 0x1d, 0x91, 0x15, 0x43, 0xa1, 0xb8, + 0x89, 0x8c, 0x1f, 0x5d, 0x14, 0xf0, 0x43, 0x89, 0x66, 0x4b, 0x6b, 0xcd, 0x5c, 0x5a, 0xcb, 0x17, + 0xca, 0x9f, 0x57, 0xf4, 0x49, 0x6b, 0x36, 0x12, 0x6f, 0x94, 0x72, 0xb6, 0x51, 0x50, 0xeb, 0x33, + 0x0e, 0x37, 0x69, 0xeb, 0x71, 0x70, 0xa1, 0xe3, 0xf7, 0x53, 0x58, 0x8c, 0x85, 0xce, 0x54, 0x0a, + 0xb5, 0xf6, 0x06, 0x85, 0xba, 0x10, 0x5b, 0x2b, 0xf3, 0x37, 0xa1, 0xe3, 0x0f, 0xcf, 0x78, 0x9c, + 0x06, 0xe4, 0x08, 0x23, 0x33, 0x4a, 0x74, 0x70, 0xc9, 0xc0, 0xc9, 0x5a, 0xb9, 0x05, 0x4b, 0x32, + 0x9a, 0x57, 0xe7, 0x94, 0x37, 0xf4, 0x32, 0x18, 0x33, 0xba, 0xff, 0x4c, 0x1d, 0xec, 0xda, 0xb3, + 0xfb, 0xe6, 0x51, 0x31, 0x7b, 0x58, 0xc9, 0xf5, 0xf0, 0x1b, 0xf2, 0xa0, 0x75, 0xa8, 0x3c, 0x6e, + 0x55, 0x23, 0x6a, 0x6c, 0x28, 0x0f, 0xc6, 0xed, 0x61, 0xad, 0xbd, 0xcd, 0xb0, 0xba, 0xff, 0xd9, + 0x81, 0xf9, 0xdd, 0x68, 0xb2, 0x8b, 0x43, 0x8c, 0x36, 0x0e, 0x8a, 0x89, 0x0e, 0xa5, 0x57, 0xc9, + 0x0b, 0xa2, 0xeb, 0x4a, 0xad, 0x92, 0x85, 0xbc, 0x55, 0xf2, 0x17, 0xe1, 0x1d, 0xf2, 0xf9, 0xc6, + 0xd1, 0x24, 0x8a, 0x51, 0x5c, 0xfd, 0x91, 0x30, 0x41, 0xa2, 0x30, 0x3d, 0x55, 0xea, 0xf4, 0x4d, + 0x59, 0xc8, 0x11, 0x83, 0x9b, 0x60, 0xb1, 0xb1, 0x92, 0x56, 0x94, 0xd0, 0xb2, 0x45, 0x82, 0xfb, + 0xdb, 0xd0, 0xa4, 0x1d, 0x06, 0x75, 0xed, 0x03, 0x68, 0x9e, 0x46, 0x93, 0xfe, 0x69, 0x10, 0xa6, + 0x4a, 0xfc, 0x17, 0x33, 0xd3, 0x7f, 0x97, 0x06, 0x45, 0x67, 0x70, 0xff, 0x6c, 0x0e, 0xe6, 0x1f, + 0x87, 0x67, 0x51, 0x30, 0xa0, 0xc3, 0xe4, 0x31, 0x1f, 0x47, 0xea, 0x72, 0x01, 0xfe, 0xa6, 0x8b, + 0xb6, 0xd9, 0xf5, 0x3f, 0x21, 0x42, 0x06, 0x82, 0x5b, 0xc1, 0xd8, 0xbc, 0xbe, 0x27, 0x53, 0xd9, + 0xf5, 0x8c, 0xba, 0x71, 0x3d, 0x03, 0x4b, 0x13, 0xd7, 0xca, 0x68, 0xec, 0x44, 0x50, 0xa8, 0x81, + 0xe0, 0xe0, 0xcb, 0xa8, 0x3f, 0x11, 0x16, 0x26, 0x42, 0x54, 0x24, 0x44, 0xdb, 0xdb, 0x98, 0x0b, + 0xaf, 0xbd, 0x36, 0xbd, 0x70, 0x7b, 0x6b, 0x82, 0x68, 0x9e, 0x89, 0x0f, 0x44, 0x1e, 0xb1, 0x1c, + 0x98, 0x10, 0x1a, 0xa8, 0xf9, 0xdb, 0xa7, 0xe2, 0x06, 0x71, 0x1e, 0x46, 0x6d, 0x3e, 0xe4, 0x5a, + 0xe9, 0x8a, 0x7e, 0x82, 0xb8, 0x02, 0x99, 0xc7, 0x8d, 0x4d, 0xb1, 0x08, 0x7b, 0x56, 0x9b, 0x62, + 0x64, 0x19, 0x7f, 0x34, 0x3a, 0xf2, 0x07, 0x2f, 0xc5, 0x66, 0xb2, 0x2d, 0x0e, 0x7b, 0x2c, 0x90, + 0x62, 0xf7, 0xb2, 0x79, 0xa5, 0x00, 0x9b, 0x9a, 0x67, 0x42, 0x6c, 0x03, 0x5a, 0xe4, 0x30, 0x90, + 0x33, 0xbb, 0x48, 0x33, 0xdb, 0x31, 0x3d, 0x0a, 0x34, 0xb7, 0x66, 0x26, 0xf3, 0x98, 0x7b, 0xa9, + 0x10, 0x88, 0xec, 0x0f, 0x87, 0x32, 0x42, 0xa0, 0x23, 0xae, 0x00, 0x6a, 0x80, 0x5c, 0x12, 0x62, + 0xc0, 0x44, 0x86, 0x65, 0xca, 0x60, 0x61, 0xec, 0x9a, 0x70, 0x84, 0x4d, 0xfc, 0x60, 0x48, 0x31, + 0x35, 0x62, 0xfb, 0xa9, 0x31, 0x2c, 0x43, 0xfd, 0xa6, 0x85, 0x73, 0x85, 0x46, 0xc5, 0xc2, 0x70, + 0x6c, 0x74, 0x7a, 0x9c, 0x45, 0x2e, 0xdb, 0x20, 0xfb, 0x90, 0xce, 0x68, 0x53, 0x4e, 0xe1, 0xc9, + 0x8b, 0x1b, 0xef, 0xc8, 0x3e, 0x4b, 0xb6, 0x55, 0x7f, 0x0f, 0x31, 0x8b, 0x27, 0x72, 0xa2, 0xd9, + 0x26, 0xdc, 0xe4, 0x6b, 0x96, 0xd9, 0x26, 0xb3, 0x92, 0x9b, 0x5c, 0x64, 0x70, 0x37, 0xa1, 0x6d, + 0x16, 0xc0, 0x1a, 0x50, 0x7b, 0x7a, 0xb0, 0xb3, 0xdf, 0xb9, 0xc4, 0x5a, 0x30, 0x7f, 0xb8, 0xf3, + 0xec, 0xd9, 0xde, 0xce, 0x76, 0xc7, 0x61, 0x6d, 0x68, 0xe8, 0x90, 0xcc, 0x0a, 0xa6, 0x36, 0xb7, + 0xb6, 0x76, 0x0e, 0x9e, 0xed, 0x6c, 0x77, 0xaa, 0x9f, 0xd5, 0x1a, 0x95, 0x4e, 0xd5, 0xfd, 0xa3, + 0x0a, 0xb4, 0x8c, 0xf2, 0x2f, 0x70, 0xd5, 0x5c, 0x03, 0xa0, 0x1d, 0x45, 0x16, 0xa2, 0x51, 0xf3, + 0x0c, 0x04, 0x35, 0xa4, 0xde, 0x6b, 0x57, 0xc5, 0x7d, 0x48, 0x95, 0xa6, 0x51, 0xa3, 0x8b, 0x87, + 0xe6, 0x99, 0x44, 0xdd, 0xb3, 0x41, 0xe4, 0x28, 0x09, 0x50, 0x9c, 0xa0, 0x90, 0x43, 0x13, 0xc2, + 0x19, 0x8a, 0x79, 0x12, 0x8d, 0xce, 0xb8, 0xc8, 0x22, 0xec, 0x32, 0x0b, 0xc3, 0xba, 0xa4, 0xaa, + 0x31, 0x62, 0x78, 0xeb, 0x9e, 0x0d, 0xb2, 0x6f, 0xab, 0x19, 0x6a, 0xd0, 0x0c, 0xad, 0x17, 0x87, + 0xdb, 0x9c, 0x1d, 0x37, 0x05, 0xb6, 0x39, 0x1c, 0x4a, 0xaa, 0x79, 0xbb, 0x32, 0x36, 0xaf, 0xf3, + 0x2a, 0x55, 0x52, 0x22, 0xae, 0x95, 0x72, 0x71, 0x7d, 0x23, 0x53, 0xbb, 0x8f, 0xa1, 0x75, 0x60, + 0x5c, 0x10, 0x76, 0x51, 0xb3, 0xa9, 0xab, 0xc1, 0x42, 0xe7, 0x09, 0x1f, 0x4b, 0x86, 0x1a, 0x4d, + 0xaa, 0x98, 0x4d, 0x72, 0xff, 0xa9, 0x23, 0xee, 0x5c, 0xe9, 0x2e, 0x88, 0xfa, 0x5d, 0x68, 0x6b, + 0xaf, 0x73, 0x16, 0xa6, 0x6e, 0x61, 0x98, 0x87, 0x9a, 0xd3, 0x8f, 0x8e, 0x8f, 0x13, 0xae, 0x02, + 0x4a, 0x2d, 0x4c, 0x19, 0x91, 0x68, 0x96, 0x06, 0xa2, 0x86, 0x44, 0x06, 0x96, 0x16, 0x70, 0x64, + 0x14, 0xe9, 0x9d, 0x54, 0xa1, 0xb4, 0x3a, 0xad, 0xa3, 0xe9, 0xf3, 0x23, 0x7d, 0x07, 0x1a, 0xba, + 0x5c, 0x7b, 0x85, 0x50, 0x39, 0x35, 0x1d, 0x57, 0x22, 0xda, 0x60, 0x5a, 0x8d, 0x16, 0xfc, 0x5a, + 0x24, 0xb0, 0xbb, 0xc0, 0x8e, 0x83, 0x38, 0x9f, 0x5d, 0x30, 0x70, 0x09, 0xc5, 0x7d, 0x01, 0x2b, + 0x4a, 0xfa, 0x0c, 0xeb, 0xd6, 0x9e, 0x48, 0xe7, 0x22, 0xed, 0x54, 0x29, 0x6a, 0x27, 0xf7, 0x97, + 0x55, 0x98, 0x97, 0xb3, 0x5d, 0xb8, 0x68, 0x2e, 0xd6, 0x37, 0x0b, 0x63, 0x5d, 0xeb, 0x3a, 0x21, + 0x31, 0x82, 0x5c, 0xb3, 0x0a, 0xab, 0x4e, 0xb5, 0x6c, 0xd5, 0x61, 0x50, 0x9b, 0xf8, 0xe9, 0x29, + 0xb9, 0x61, 0x9a, 0x1e, 0xfd, 0x56, 0xce, 0xd3, 0xba, 0xed, 0x3c, 0x2d, 0xbb, 0x56, 0x2f, 0x4c, + 0xab, 0xe2, 0xb5, 0xfa, 0xab, 0xd0, 0x14, 0xab, 0x63, 0xe6, 0x1f, 0xcd, 0x80, 0xdc, 0x6a, 0xda, + 0x28, 0xac, 0xa6, 0x6f, 0xbf, 0xce, 0x7d, 0x17, 0xe6, 0xc4, 0xd5, 0x12, 0x19, 0x30, 0x7c, 0x55, + 0x1d, 0x2b, 0x8a, 0x7c, 0xea, 0xaf, 0x88, 0x3a, 0xf2, 0x64, 0x5e, 0xf3, 0x72, 0x6a, 0xcb, 0xbe, + 0x9c, 0x6a, 0xba, 0x75, 0xdb, 0xb6, 0x5b, 0xd7, 0x7d, 0x08, 0x0b, 0x56, 0x71, 0xa8, 0x67, 0x65, + 0xc0, 0x71, 0xe7, 0x12, 0x5b, 0x80, 0xe6, 0xe3, 0xfd, 0xfe, 0xc3, 0xbd, 0xc7, 0x8f, 0x76, 0x9f, + 0x75, 0x1c, 0x4c, 0x1e, 0x3e, 0xdf, 0xda, 0xda, 0xd9, 0xd9, 0x26, 0xbd, 0x0b, 0x30, 0xf7, 0x70, + 0xf3, 0x31, 0xea, 0xe0, 0xaa, 0xbb, 0x2d, 0x78, 0x5b, 0x96, 0xa5, 0x8f, 0x72, 0xbe, 0x0d, 0x4c, + 0xf9, 0x00, 0x28, 0xe8, 0x68, 0x32, 0xe2, 0xa9, 0x8a, 0x85, 0x5f, 0x96, 0x94, 0xc7, 0x9a, 0xa0, + 0xae, 0x73, 0x64, 0xa5, 0x64, 0x22, 0x22, 0x07, 0x29, 0x2f, 0x22, 0x32, 0xab, 0xa7, 0xe9, 0x6e, + 0x0f, 0xba, 0xdb, 0x1c, 0x4b, 0xdb, 0x1c, 0x8d, 0x72, 0xcd, 0xc1, 0x4d, 0x5c, 0x09, 0x4d, 0xee, + 0xf0, 0xbe, 0x0f, 0x97, 0x37, 0x45, 0xd8, 0xfb, 0x6f, 0x2a, 0x2a, 0xd2, 0xed, 0xc2, 0x5a, 0xbe, + 0x48, 0x59, 0xd9, 0x43, 0x58, 0xde, 0xe6, 0x47, 0xd3, 0x93, 0x3d, 0x7e, 0x96, 0x55, 0xc4, 0xa0, + 0x96, 0x9c, 0x46, 0xaf, 0xe4, 0xf8, 0xd0, 0x6f, 0xf6, 0x2e, 0xc0, 0x08, 0xf3, 0xf4, 0x93, 0x09, + 0x1f, 0xa8, 0x2b, 0x8d, 0x84, 0x1c, 0x4e, 0xf8, 0xc0, 0xfd, 0x08, 0x98, 0x59, 0x8e, 0x1c, 0x2f, + 0xb4, 0xba, 0xa6, 0x47, 0xfd, 0xe4, 0x3c, 0x49, 0xf9, 0x58, 0xdd, 0xd5, 0x34, 0x21, 0xf7, 0x16, + 0xb4, 0x0f, 0xfc, 0x73, 0x8f, 0x7f, 0x21, 0x1f, 0x5b, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x8e, 0x2c, + 0xa8, 0x1d, 0xc3, 0x44, 0x76, 0xff, 0x49, 0x15, 0xe6, 0x44, 0x4e, 0x2c, 0x75, 0xc8, 0x93, 0x34, + 0x08, 0x49, 0xd2, 0x54, 0xa9, 0x06, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0x4b, 0x6f, 0x85, 0xba, + 0x1a, 0x26, 0x05, 0xd8, 0xc2, 0x50, 0xd2, 0xb2, 0xf0, 0x66, 0xe1, 0x3e, 0xcc, 0x80, 0xdc, 0x81, + 0x47, 0x66, 0xdb, 0x89, 0xf6, 0x29, 0xb5, 0x25, 0xc5, 0xd8, 0x84, 0x4a, 0x2d, 0xc8, 0x79, 0x21, + 0xed, 0x05, 0x0b, 0xb2, 0x60, 0x29, 0x36, 0xde, 0xc2, 0x52, 0x14, 0x2e, 0x8c, 0x37, 0x59, 0x8a, + 0xf0, 0x36, 0x96, 0xe2, 0x1d, 0x94, 0x58, 0xb9, 0x51, 0xb6, 0xaf, 0x2f, 0xc9, 0x9d, 0xb2, 0xa7, + 0xe9, 0xee, 0xf7, 0x61, 0x5e, 0x82, 0xac, 0x03, 0xd5, 0xa3, 0x20, 0x95, 0x3e, 0x29, 0xfc, 0x89, + 0x1c, 0x15, 0xfa, 0x63, 0x75, 0x15, 0x96, 0x7e, 0x63, 0x93, 0xe9, 0x46, 0xde, 0x17, 0xd3, 0x20, + 0xe6, 0x43, 0x75, 0xa9, 0xc4, 0x80, 0x5c, 0x06, 0x1d, 0xba, 0xf6, 0x8e, 0x9b, 0x21, 0x25, 0x3a, + 0xff, 0xc0, 0x81, 0x8e, 0x64, 0x62, 0x4d, 0x53, 0x27, 0x77, 0x6f, 0xba, 0x1f, 0x75, 0x03, 0x16, + 0x68, 0x2b, 0xa6, 0x35, 0x90, 0x3c, 0x05, 0xb3, 0x40, 0x6c, 0x93, 0x8a, 0xcb, 0x19, 0x07, 0x23, + 0xc9, 0x13, 0x26, 0xa4, 0x94, 0x58, 0xec, 0xcb, 0x28, 0x61, 0xc7, 0xd3, 0x69, 0xf7, 0x4f, 0x1d, + 0x58, 0x36, 0x1a, 0x2c, 0x85, 0xe0, 0x53, 0x68, 0xeb, 0xd7, 0x25, 0xb8, 0x5e, 0x5b, 0xd7, 0x6d, + 0xa9, 0xcd, 0x3e, 0xb3, 0x32, 0x13, 0x2f, 0xf9, 0xe7, 0xd4, 0xc0, 0x64, 0x3a, 0x96, 0x8b, 0x9a, + 0x09, 0x21, 0x1f, 0xbf, 0xe2, 0xfc, 0xa5, 0xce, 0x22, 0x96, 0x55, 0x0b, 0x23, 0x17, 0x36, 0x6e, + 0x21, 0x75, 0xa6, 0x9a, 0x74, 0x61, 0x9b, 0xa0, 0xfb, 0x57, 0x2b, 0xb0, 0x22, 0x7c, 0x02, 0xd2, + 0x17, 0xa3, 0x2f, 0xf8, 0xce, 0x09, 0xf7, 0x88, 0x50, 0x08, 0xbb, 0x97, 0x3c, 0x99, 0x66, 0xdf, + 0x7b, 0x4b, 0x3f, 0x86, 0x0e, 0x5d, 0x9e, 0x31, 0x17, 0xd5, 0xb2, 0xb9, 0x78, 0xc3, 0x48, 0x97, + 0x9d, 0x26, 0xd4, 0xcb, 0x4f, 0x13, 0xde, 0xca, 0x7b, 0xff, 0x60, 0x1e, 0xea, 0xc9, 0x20, 0x9a, + 0x70, 0x77, 0x0d, 0x56, 0xed, 0x21, 0x90, 0x7a, 0xf2, 0x17, 0x0e, 0x74, 0x1f, 0x8a, 0x33, 0xca, + 0x20, 0x3c, 0xd9, 0x0d, 0x92, 0x34, 0x8a, 0xf5, 0x6b, 0x09, 0xd7, 0x00, 0x92, 0xd4, 0x8f, 0xa5, + 0x4d, 0x2d, 0x2c, 0x13, 0x03, 0xc1, 0x9e, 0xf0, 0x70, 0x28, 0xa8, 0x62, 0x06, 0x75, 0xba, 0x60, + 0xf9, 0x49, 0xbf, 0x86, 0x65, 0x3f, 0xdd, 0x14, 0x01, 0xff, 0xd8, 0x64, 0x7e, 0x46, 0x8b, 0x8f, + 0x70, 0x16, 0xe4, 0x50, 0xf7, 0x0f, 0x2a, 0xb0, 0x94, 0x35, 0x92, 0x82, 0x52, 0x6c, 0x15, 0x26, + 0x8d, 0xa6, 0x4c, 0x85, 0xc9, 0x33, 0x88, 0x7e, 0x80, 0x56, 0x94, 0xe1, 0xda, 0x30, 0x50, 0x76, + 0x03, 0x5a, 0x2a, 0x15, 0x4d, 0x53, 0xe3, 0xda, 0xb2, 0x09, 0x8b, 0x10, 0x5e, 0xb4, 0xe3, 0xa4, + 0x4d, 0x2a, 0x53, 0x74, 0x85, 0x6a, 0x9c, 0xd2, 0x97, 0x62, 0xe4, 0x55, 0x12, 0xb5, 0x04, 0x1a, + 0x42, 0xe2, 0x05, 0x19, 0x32, 0x82, 0x4c, 0x03, 0xa1, 0xa1, 0x9f, 0x7b, 0xd1, 0x92, 0x29, 0x4a, + 0xcc, 0xe2, 0xaf, 0x6b, 0x9e, 0x09, 0xa9, 0xad, 0x65, 0x34, 0x35, 0x0e, 0x5e, 0x6b, 0x9e, 0x85, + 0xb9, 0x7f, 0xdb, 0x81, 0x2b, 0x25, 0xd3, 0x28, 0x25, 0x75, 0x1b, 0x96, 0x8f, 0x35, 0x51, 0x0d, + 0xb5, 0x10, 0xd7, 0x35, 0xa5, 0xf7, 0xec, 0xe1, 0xf5, 0x8a, 0x1f, 0x68, 0xdb, 0x58, 0x4c, 0x9e, + 0x15, 0x6e, 0x5f, 0x24, 0xb8, 0x07, 0xd0, 0xdb, 0x79, 0x8d, 0x82, 0xbf, 0x65, 0x3e, 0xb2, 0xa7, + 0x38, 0x6b, 0xa3, 0xa0, 0xd8, 0x2e, 0xf6, 0x68, 0x1d, 0xc3, 0x82, 0x55, 0x16, 0xfb, 0xce, 0xdb, + 0x16, 0x62, 0xca, 0xe8, 0x75, 0x39, 0xeb, 0xe2, 0x95, 0x40, 0x15, 0xf4, 0x6f, 0x40, 0xee, 0x19, + 0x2c, 0x3d, 0x99, 0x8e, 0xd2, 0x20, 0x7b, 0x31, 0x90, 0x7d, 0x4f, 0x7e, 0x44, 0x45, 0xa8, 0xa1, + 0x2b, 0xad, 0xca, 0xcc, 0x87, 0x23, 0x36, 0xc6, 0x92, 0xfa, 0xc5, 0x1a, 0x8b, 0x04, 0xf7, 0x0a, + 0xac, 0x67, 0x55, 0x8a, 0xb1, 0x53, 0x8b, 0xc3, 0x1f, 0x3a, 0x22, 0x72, 0xcd, 0x7e, 0xc0, 0x90, + 0x3d, 0x82, 0x95, 0x24, 0x08, 0x4f, 0x46, 0xdc, 0x2c, 0x27, 0x91, 0x23, 0x71, 0xd9, 0x6e, 0x9e, + 0x7c, 0xe4, 0xd0, 0x2b, 0xfb, 0x02, 0x19, 0xa4, 0xbc, 0xa1, 0x19, 0x83, 0xe4, 0x86, 0xa4, 0xac, + 0x03, 0x9f, 0xc1, 0xa2, 0x5d, 0x19, 0xfb, 0x58, 0xc6, 0xea, 0x67, 0x2d, 0x33, 0x8f, 0xa0, 0x6c, + 0xce, 0xb0, 0x72, 0xba, 0x3f, 0x77, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x54, 0x2a, 0xb9, 0xe7, + 0xd3, 0x42, 0xb1, 0xb3, 0x3b, 0xac, 0xef, 0x00, 0xa8, 0xbe, 0xde, 0x9d, 0x39, 0x29, 0xbb, 0x97, + 0x4a, 0x7a, 0xf5, 0xa0, 0x01, 0x73, 0xb2, 0x7f, 0xeb, 0x70, 0x59, 0x36, 0x49, 0x35, 0x27, 0x3b, + 0xbb, 0xb0, 0x2a, 0xb5, 0xce, 0x2e, 0x7a, 0xd0, 0x15, 0x8f, 0x62, 0x98, 0xfd, 0x90, 0x1f, 0x6e, + 0x03, 0x7b, 0xe2, 0x0f, 0xfc, 0x38, 0x8a, 0xc2, 0x03, 0x1e, 0xcb, 0x50, 0x23, 0xb2, 0xbf, 0xc8, + 0xb5, 0xaf, 0x4c, 0x45, 0x91, 0x52, 0xef, 0x38, 0x44, 0xa1, 0x7a, 0x2f, 0x43, 0xa4, 0x5c, 0x0f, + 0x56, 0x1e, 0xf8, 0x2f, 0xb9, 0x2a, 0x29, 0x1b, 0xa5, 0xd6, 0x44, 0x17, 0xaa, 0xc6, 0x5e, 0x5d, + 0xc3, 0x29, 0x56, 0xeb, 0x99, 0xb9, 0xdd, 0x0d, 0x58, 0xb5, 0xcb, 0x94, 0xaa, 0xa4, 0x07, 0x8d, + 0xb1, 0xc4, 0x64, 0xeb, 0x74, 0xfa, 0xce, 0x57, 0xd0, 0x32, 0x1e, 0x3a, 0x61, 0xeb, 0xb0, 0xf2, + 0xe2, 0xf1, 0xb3, 0xfd, 0x9d, 0xc3, 0xc3, 0xfe, 0xc1, 0xf3, 0x07, 0x9f, 0xef, 0xfc, 0xb0, 0xbf, + 0xbb, 0x79, 0xb8, 0xdb, 0xb9, 0xc4, 0xd6, 0x80, 0xed, 0xef, 0x1c, 0x3e, 0xdb, 0xd9, 0xb6, 0x70, + 0x87, 0x5d, 0x83, 0xde, 0xf3, 0xfd, 0xe7, 0x87, 0x3b, 0xdb, 0xfd, 0xb2, 0xef, 0x2a, 0xec, 0x5d, + 0xb8, 0x22, 0xe9, 0x25, 0x9f, 0x57, 0xef, 0x7c, 0x0a, 0x9d, 0xbc, 0x0b, 0xc6, 0x72, 0x5d, 0xbd, + 0xc9, 0xc7, 0xb5, 0xf1, 0xf3, 0x2a, 0x2c, 0x8a, 0x58, 0x42, 0xf1, 0x04, 0x28, 0x8f, 0xd9, 0x13, + 0x98, 0x97, 0x6f, 0xc9, 0x32, 0xc5, 0x5a, 0xf6, 0xeb, 0xb5, 0xbd, 0xb5, 0x3c, 0x2c, 0xa7, 0x75, + 0xe5, 0xaf, 0xfd, 0xa7, 0xff, 0xf1, 0x77, 0x2b, 0x0b, 0xac, 0x75, 0xef, 0xec, 0xc3, 0x7b, 0x27, + 0x3c, 0x4c, 0xb0, 0x8c, 0xdf, 0x03, 0xc8, 0x5e, 0x48, 0x65, 0x5d, 0xed, 0x82, 0xc8, 0x3d, 0x1f, + 0xdb, 0xbb, 0x52, 0x42, 0x91, 0xe5, 0x5e, 0xa1, 0x72, 0x57, 0xdc, 0x45, 0x2c, 0x37, 0x08, 0x83, + 0x54, 0xbc, 0x96, 0xfa, 0x89, 0x73, 0x87, 0x0d, 0xa1, 0x6d, 0xbe, 0x5d, 0xca, 0xd4, 0x51, 0x54, + 0xc9, 0xeb, 0xab, 0xbd, 0x77, 0x4a, 0x69, 0x8a, 0x97, 0xa9, 0x8e, 0xcb, 0x6e, 0x07, 0xeb, 0x98, + 0x52, 0x8e, 0xac, 0x96, 0x91, 0x90, 0xf0, 0xec, 0x89, 0x52, 0x76, 0xd5, 0x10, 0xba, 0xc2, 0x03, + 0xa9, 0xbd, 0x77, 0x67, 0x50, 0x65, 0x5d, 0xef, 0x52, 0x5d, 0xeb, 0x2e, 0xc3, 0xba, 0x06, 0x94, + 0x47, 0x3d, 0x90, 0xfa, 0x89, 0x73, 0x67, 0xe3, 0xdf, 0xdf, 0x82, 0xa6, 0x3e, 0xa6, 0x66, 0x3f, + 0x85, 0x05, 0x2b, 0xd8, 0x93, 0xa9, 0x6e, 0x94, 0xc5, 0x86, 0xf6, 0xae, 0x96, 0x13, 0x65, 0xc5, + 0xd7, 0xa8, 0xe2, 0x2e, 0x5b, 0xc3, 0x8a, 0x65, 0xb4, 0xe4, 0x3d, 0x0a, 0x5b, 0x16, 0x37, 0x1f, + 0x5f, 0x1a, 0x9a, 0x4c, 0x54, 0x76, 0x35, 0xaf, 0x5c, 0xac, 0xda, 0xde, 0x9d, 0x41, 0x95, 0xd5, + 0x5d, 0xa5, 0xea, 0xd6, 0xd8, 0xaa, 0x59, 0x9d, 0x3e, 0x3a, 0xe6, 0x74, 0xdd, 0xd7, 0x7c, 0xbd, + 0x93, 0xbd, 0xab, 0x19, 0xab, 0xec, 0x55, 0x4f, 0xcd, 0x22, 0xc5, 0xa7, 0x3d, 0xdd, 0x2e, 0x55, + 0xc5, 0x18, 0x4d, 0x9f, 0xf9, 0x78, 0x27, 0x3b, 0x82, 0x96, 0xf1, 0xe6, 0x16, 0xbb, 0x32, 0xf3, + 0x7d, 0xb0, 0x5e, 0xaf, 0x8c, 0x54, 0xd6, 0x15, 0xb3, 0xfc, 0x7b, 0x68, 0xe8, 0xfc, 0x18, 0x9a, + 0xfa, 0x15, 0x27, 0xb6, 0x6e, 0xbc, 0xaa, 0x65, 0xbe, 0x3a, 0xd5, 0xeb, 0x16, 0x09, 0x65, 0xcc, + 0x67, 0x96, 0x8e, 0xcc, 0xf7, 0x02, 0x5a, 0xc6, 0x4b, 0x4d, 0xba, 0x03, 0xc5, 0xd7, 0xa0, 0x74, + 0x07, 0x4a, 0x1e, 0x76, 0x72, 0x97, 0xa9, 0x8a, 0x16, 0x6b, 0x12, 0x7f, 0xa7, 0xaf, 0xa3, 0x84, + 0xed, 0xc1, 0x65, 0xa9, 0xb1, 0x8f, 0xf8, 0xd7, 0x99, 0x86, 0x92, 0x07, 0x53, 0xef, 0x3b, 0xec, + 0x53, 0x68, 0xa8, 0x07, 0xb9, 0xd8, 0x5a, 0xf9, 0xc3, 0x62, 0xbd, 0xf5, 0x02, 0x2e, 0xd5, 0xeb, + 0x0f, 0x01, 0xb2, 0x67, 0xa1, 0xb4, 0x92, 0x28, 0x3c, 0x33, 0xa5, 0x39, 0xa0, 0xf8, 0x86, 0x94, + 0xbb, 0x46, 0x1d, 0xec, 0x30, 0x52, 0x12, 0x21, 0x7f, 0xa5, 0x6e, 0xf6, 0xff, 0x04, 0x5a, 0xc6, + 0xcb, 0x50, 0x7a, 0xf8, 0x8a, 0xaf, 0x4a, 0xe9, 0xe1, 0x2b, 0x79, 0x48, 0xca, 0xed, 0x51, 0xe9, + 0xab, 0xee, 0x12, 0x96, 0x9e, 0x04, 0x27, 0xe1, 0x58, 0x64, 0xc0, 0x09, 0x3a, 0x85, 0x05, 0xeb, + 0xf9, 0x27, 0x2d, 0xa1, 0x65, 0x8f, 0x4b, 0x69, 0x09, 0x2d, 0x7d, 0x31, 0x4a, 0xf1, 0x99, 0xbb, + 0x8c, 0xf5, 0x9c, 0x51, 0x16, 0xa3, 0xa6, 0x1f, 0x41, 0xcb, 0x78, 0xca, 0x49, 0xf7, 0xa5, 0xf8, + 0x6a, 0x94, 0xee, 0x4b, 0xd9, 0xcb, 0x4f, 0xab, 0x54, 0xc7, 0xa2, 0x4b, 0xac, 0x40, 0x77, 0xd4, + 0xb1, 0xec, 0x9f, 0xc2, 0xa2, 0xfd, 0xb8, 0x93, 0x96, 0xfd, 0xd2, 0x67, 0xa2, 0xb4, 0xec, 0xcf, + 0x78, 0x11, 0x4a, 0xb2, 0xf4, 0x9d, 0x15, 0x5d, 0xc9, 0xbd, 0x2f, 0x65, 0xa0, 0xdb, 0x57, 0xec, + 0xfb, 0xa8, 0xe0, 0xe4, 0xa3, 0x01, 0x6c, 0xdd, 0xe0, 0x5a, 0xf3, 0x69, 0x01, 0x2d, 0x2f, 0x85, + 0xf7, 0x05, 0x6c, 0x66, 0x16, 0xb7, 0xec, 0x69, 0xd5, 0xa2, 0xc7, 0x03, 0x8c, 0x55, 0xcb, 0x7c, + 0x5f, 0xc0, 0x58, 0xb5, 0xac, 0x37, 0x06, 0xf2, 0xab, 0x56, 0x1a, 0x60, 0x19, 0x21, 0x2c, 0xe5, + 0x2e, 0xa4, 0x68, 0xa9, 0x28, 0xbf, 0x33, 0xd8, 0xbb, 0xf6, 0xe6, 0x7b, 0x2c, 0xb6, 0x06, 0x51, + 0x4a, 0xf0, 0x9e, 0xba, 0xa1, 0xf9, 0xfb, 0xd0, 0x36, 0x1f, 0x9c, 0x61, 0xa6, 0x28, 0xe7, 0x6b, + 0x7a, 0xa7, 0x94, 0x66, 0x4f, 0x2e, 0x6b, 0x9b, 0xd5, 0xb0, 0x1f, 0xc0, 0x9a, 0x16, 0x75, 0xf3, + 0x8e, 0x43, 0xc2, 0xde, 0x2b, 0xb9, 0xf9, 0x60, 0xda, 0x71, 0xbd, 0x2b, 0x33, 0xaf, 0x46, 0xdc, + 0x77, 0x90, 0x69, 0xec, 0x57, 0x3c, 0xb2, 0x05, 0xa3, 0xec, 0xf1, 0x92, 0x6c, 0xc1, 0x28, 0x7d, + 0xfa, 0x43, 0x31, 0x0d, 0x5b, 0xb1, 0xc6, 0x48, 0xc4, 0x04, 0xb0, 0x1f, 0xc1, 0x92, 0x71, 0x8b, + 0xec, 0xf0, 0x3c, 0x1c, 0x68, 0x01, 0x28, 0x5e, 0x72, 0xee, 0x95, 0xed, 0x52, 0xdc, 0x75, 0x2a, + 0x7f, 0xd9, 0xb5, 0x06, 0x07, 0x99, 0x7f, 0x0b, 0x5a, 0xe6, 0x0d, 0xb5, 0x37, 0x94, 0xbb, 0x6e, + 0x90, 0xcc, 0xfb, 0xb9, 0xf7, 0x1d, 0x76, 0x20, 0x62, 0xc3, 0xf4, 0x8b, 0xa2, 0x51, 0x9c, 0x5f, + 0x3e, 0xed, 0x97, 0x46, 0xf5, 0x44, 0x96, 0xbd, 0x31, 0x7b, 0xdb, 0xb9, 0xef, 0xb0, 0x7f, 0xe8, + 0x40, 0xdb, 0xba, 0x41, 0x66, 0x45, 0xda, 0xe4, 0x5a, 0xd6, 0x35, 0x69, 0x66, 0xd3, 0x5c, 0x8f, + 0xba, 0xbd, 0x77, 0xe7, 0x33, 0x6b, 0x58, 0xbf, 0xb4, 0x1c, 0x6a, 0x77, 0xf3, 0xcf, 0x8a, 0x7e, + 0x95, 0xcf, 0x60, 0x5e, 0x2d, 0xff, 0xea, 0xbe, 0xc3, 0xfe, 0xd8, 0x81, 0x45, 0xdb, 0x0b, 0xad, + 0xbb, 0x5b, 0xea, 0xef, 0xd6, 0x93, 0x3f, 0xc3, 0x75, 0xfd, 0x23, 0x6a, 0xe5, 0xb3, 0x3b, 0x9e, + 0xd5, 0x4a, 0xf9, 0x62, 0xcc, 0xaf, 0xd7, 0x5a, 0xf6, 0x89, 0x78, 0x56, 0x5b, 0x9d, 0x15, 0xb1, + 0xe2, 0x8b, 0xcc, 0x9a, 0x61, 0xcc, 0x37, 0x94, 0x69, 0x12, 0x7e, 0x22, 0x9e, 0xd3, 0x54, 0xc7, + 0x19, 0xc8, 0x77, 0x6f, 0xfb, 0xbd, 0x7b, 0x83, 0xfa, 0x74, 0xcd, 0xbd, 0x62, 0xf5, 0x29, 0xbf, + 0xc2, 0x6f, 0x8a, 0xd6, 0xc9, 0xe7, 0x8f, 0xb3, 0x25, 0xaa, 0xf0, 0x24, 0xf2, 0xec, 0x46, 0x8e, + 0x45, 0x23, 0x65, 0x76, 0x4b, 0x38, 0xde, 0xb2, 0x18, 0xf7, 0x0e, 0xb5, 0xf5, 0x86, 0xfb, 0xde, + 0xcc, 0xb6, 0xde, 0x23, 0x5f, 0x32, 0xb6, 0xf8, 0x00, 0x20, 0x3b, 0xdb, 0x65, 0xb9, 0x73, 0x45, + 0xad, 0x32, 0x8a, 0xc7, 0xbf, 0xb6, 0x04, 0xaa, 0xe3, 0x47, 0x2c, 0xf1, 0xc7, 0x42, 0x01, 0x3e, + 0x56, 0x27, 0x92, 0xa6, 0x99, 0x63, 0x1f, 0xc0, 0x5a, 0x66, 0x4e, 0xbe, 0x7c, 0x4b, 0xfd, 0xe9, + 0xe3, 0xcd, 0xe7, 0xb0, 0xb0, 0x17, 0x45, 0x2f, 0xa7, 0x13, 0x1d, 0x04, 0x63, 0x1f, 0xf3, 0xec, + 0xfa, 0xc9, 0x69, 0x2f, 0xd7, 0x0b, 0xf7, 0x3a, 0x15, 0xd5, 0x63, 0x5d, 0xa3, 0xa8, 0x7b, 0x5f, + 0x66, 0xe7, 0xc6, 0x5f, 0x31, 0x1f, 0x96, 0xb5, 0x56, 0xd5, 0x0d, 0xef, 0xd9, 0xc5, 0x58, 0xba, + 0x34, 0x5f, 0x85, 0x65, 0x8f, 0xab, 0xd6, 0xde, 0x4b, 0x54, 0x99, 0xa4, 0x53, 0xda, 0xdb, 0x7c, + 0x40, 0x97, 0x60, 0xe8, 0xac, 0x64, 0x25, 0x6b, 0xb8, 0x3e, 0x64, 0xe9, 0x2d, 0x58, 0xa0, 0xbd, + 0xd2, 0x4c, 0xfc, 0xf3, 0x98, 0x7f, 0x71, 0xef, 0x4b, 0x79, 0x0a, 0xf3, 0x95, 0x5a, 0x69, 0xd4, + 0x31, 0x95, 0xb5, 0xd2, 0xe4, 0xce, 0xb5, 0xac, 0x95, 0xa6, 0x70, 0xae, 0x65, 0x0d, 0xb5, 0x3a, + 0x26, 0x63, 0x23, 0x58, 0x2e, 0x1c, 0x85, 0xe9, 0x45, 0x66, 0xd6, 0x01, 0x5a, 0xef, 0xfa, 0xec, + 0x0c, 0x76, 0x6d, 0x77, 0xec, 0xda, 0x0e, 0x61, 0x61, 0x9b, 0x8b, 0xc1, 0x12, 0x51, 0xbf, 0xb9, + 0x6b, 0x88, 0x66, 0x4c, 0x71, 0x7e, 0x49, 0x20, 0x9a, 0x6d, 0x4a, 0x50, 0xb8, 0x2d, 0xfb, 0x31, + 0xb4, 0x1e, 0xf1, 0x54, 0x85, 0xf9, 0x6a, 0x63, 0x36, 0x17, 0xf7, 0xdb, 0x2b, 0x89, 0x12, 0xb6, + 0x79, 0x86, 0x4a, 0xbb, 0xc7, 0x87, 0x27, 0x5c, 0x28, 0xa7, 0x7e, 0x30, 0xfc, 0x8a, 0xfd, 0x25, + 0x2a, 0x5c, 0xdf, 0x73, 0x58, 0x33, 0x62, 0x36, 0xcd, 0xc2, 0x97, 0x72, 0x78, 0x59, 0xc9, 0x61, + 0x34, 0xe4, 0x86, 0x51, 0x15, 0x42, 0xcb, 0xb8, 0x9e, 0xa4, 0x05, 0xa8, 0x78, 0x11, 0x4e, 0x0b, + 0x50, 0xc9, 0x6d, 0x26, 0xf7, 0x36, 0xd5, 0xe3, 0xb2, 0xeb, 0x59, 0x3d, 0xe2, 0x06, 0x53, 0x56, + 0xd3, 0xbd, 0x2f, 0xfd, 0x71, 0xfa, 0x15, 0x7b, 0x41, 0x2f, 0x38, 0x99, 0x61, 0xcc, 0x99, 0x75, + 0x9e, 0x8f, 0x78, 0xd6, 0x83, 0x65, 0x90, 0x6c, 0x8b, 0x5d, 0x54, 0x45, 0xb6, 0xd7, 0xf7, 0x00, + 0x0e, 0xd3, 0x68, 0xb2, 0xed, 0xf3, 0x71, 0x14, 0x66, 0xba, 0x36, 0x0b, 0xa2, 0xcd, 0xf4, 0x97, + 0x11, 0x49, 0xcb, 0x5e, 0x18, 0xdb, 0x19, 0x2b, 0x12, 0x5c, 0x31, 0xd7, 0xcc, 0x38, 0x5b, 0x3d, + 0x20, 0x25, 0xb1, 0xb6, 0xf7, 0x1d, 0xb6, 0x09, 0x90, 0x9d, 0x85, 0xea, 0xcd, 0x49, 0xe1, 0x98, + 0x55, 0xab, 0xbd, 0x92, 0x83, 0xd3, 0x03, 0x68, 0x66, 0xa7, 0x5b, 0xeb, 0xd9, 0x25, 0x40, 0xeb, + 0x2c, 0x4c, 0xaf, 0xe0, 0x85, 0x33, 0x27, 0xb7, 0x43, 0x43, 0x05, 0xac, 0x81, 0x43, 0x45, 0x07, + 0x49, 0x01, 0xac, 0x88, 0x06, 0x6a, 0x03, 0x87, 0x82, 0x3f, 0x55, 0x4f, 0x4a, 0xce, 0x7d, 0xb4, + 0x34, 0x97, 0x1e, 0x88, 0x58, 0x3e, 0x16, 0xe4, 0x56, 0x11, 0x78, 0x8a, 0xaa, 0x79, 0x0c, 0xcb, + 0x05, 0x1f, 0xbb, 0x16, 0xe9, 0x59, 0x87, 0x28, 0x5a, 0xa4, 0x67, 0xba, 0xe7, 0xdd, 0xcb, 0x54, + 0xe5, 0x92, 0x0b, 0xb4, 0xa7, 0x7a, 0x15, 0xa4, 0x83, 0x53, 0xac, 0xee, 0x0f, 0x1d, 0x58, 0x29, + 0x71, 0xa1, 0xb3, 0xf7, 0xd5, 0xf6, 0x7c, 0xa6, 0x7b, 0xbd, 0x57, 0xea, 0x61, 0x75, 0x0f, 0xa9, + 0x9e, 0x27, 0xec, 0x73, 0x6b, 0x61, 0x13, 0xce, 0x4d, 0x29, 0x99, 0x6f, 0x34, 0x2a, 0x4a, 0x2d, + 0x8a, 0x2f, 0x60, 0x5d, 0x34, 0x64, 0x73, 0x34, 0xca, 0x79, 0x7f, 0xaf, 0x15, 0xfe, 0xf5, 0x8e, + 0xe5, 0xd5, 0xee, 0xcd, 0xfe, 0xd7, 0x3c, 0x33, 0x0c, 0x60, 0xd1, 0x54, 0x36, 0x85, 0x4e, 0xde, + 0xa3, 0xca, 0x66, 0x97, 0xd5, 0x7b, 0xcf, 0xda, 0x68, 0x96, 0x78, 0x61, 0x7f, 0x8b, 0x2a, 0x7b, + 0xcf, 0xed, 0x95, 0x8d, 0x8b, 0xd8, 0x7b, 0xe2, 0x7c, 0xfc, 0x15, 0xed, 0xfe, 0xcd, 0xf5, 0x53, + 0x55, 0x30, 0xcb, 0x5f, 0xad, 0xb7, 0xba, 0xe5, 0xde, 0xe3, 0x9b, 0x54, 0xfd, 0x75, 0xf7, 0x9d, + 0xb2, 0xea, 0x63, 0xf1, 0x89, 0xd8, 0xf4, 0xae, 0xe7, 0xe5, 0x5a, 0xb5, 0xe0, 0x7a, 0xd9, 0x7c, + 0xcf, 0xdc, 0xbd, 0xe4, 0xc6, 0xfa, 0x12, 0xd9, 0x76, 0x6d, 0xd3, 0xdd, 0xab, 0xc5, 0xa7, 0xc4, + 0xaf, 0xac, 0xc5, 0xa7, 0xcc, 0x3f, 0x6c, 0xdb, 0x35, 0xca, 0x33, 0xfc, 0x89, 0x73, 0xe7, 0xc1, + 0xad, 0x1f, 0xfd, 0xd6, 0x49, 0x90, 0x9e, 0x4e, 0x8f, 0xee, 0x0e, 0xa2, 0xf1, 0xbd, 0x91, 0x72, + 0xeb, 0xc9, 0x0b, 0x11, 0xf7, 0x46, 0xe1, 0xf0, 0x1e, 0x15, 0x7b, 0x34, 0x47, 0xff, 0x2b, 0xec, + 0x3b, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x60, 0xd6, 0x92, 0xa4, 0x5d, 0x6c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index e7094a17d6ec..c6c97b55e137 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -2564,6 +2564,13 @@ message PayReq { string fallback_addr = 8 [json_name = "fallback_addr"]; int64 cltv_expiry = 9 [json_name = "cltv_expiry"]; repeated RouteHint route_hints = 10 [json_name = "route_hints"]; + repeated Feature features = 11 [json_name = "features"]; +} + +message Feature { + uint32 bit = 1 [json_name = "bit"]; + string name = 2 [json_name = "name"]; + bool is_required = 3 [json_name = "is_required"]; } message FeeReportRequest {} diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 0dcce3012d42..847df0ad2450 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -2227,6 +2227,22 @@ } } }, + "lnrpcFeature": { + "type": "object", + "properties": { + "bit": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "is_required": { + "type": "boolean", + "format": "boolean" + } + } + }, "lnrpcFeeLimit": { "type": "object", "properties": { @@ -3208,6 +3224,12 @@ "items": { "$ref": "#/definitions/lnrpcRouteHint" } + }, + "features": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcFeature" + } } } }, From 8361057124d6f555e53305d8e74561cc63983f2f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:03:37 -0800 Subject: [PATCH 11/25] lnwire+rpcserver: populate feature bits on decodepayreq --- lnwire/features.go | 14 ++++++++++++++ rpcserver.go | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lnwire/features.go b/lnwire/features.go index 79beef64453e..eb78103409fd 100644 --- a/lnwire/features.go +++ b/lnwire/features.go @@ -84,6 +84,11 @@ const ( maxAllowedSize = 32764 ) +// IsRequired returns true if the feature bit is even, and false otherwise. +func (b FeatureBit) IsRequired() bool { + return b&0x01 == 0x00 +} + // Features is a mapping of known feature bits to a descriptive name. All known // feature bits must be assigned a name in this mapping, and feature bit pairs // must be assigned together for correct behavior. @@ -371,6 +376,15 @@ func (fv *FeatureVector) isFeatureBitPair(bit FeatureBit) bool { return known1 && known2 && name1 == name2 } +// Features returns the set of raw features contained in the feature vector. +func (fv *FeatureVector) Features() map[FeatureBit]struct{} { + fs := make(map[FeatureBit]struct{}, len(fv.RawFeatureVector.features)) + for b := range fv.RawFeatureVector.features { + fs[b] = struct{}{} + } + return fs +} + // Clone copies a feature vector, carrying over its feature bits. The feature // names are not copied. func (fv *FeatureVector) Clone() *FeatureVector { diff --git a/rpcserver.go b/rpcserver.go index bea756998b7a..0e0696bfccd7 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4502,6 +4502,22 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, amt = int64(payReq.MilliSat.ToSatoshis()) } + // Convert any features on the payment request into a descriptive format + // for the rpc. + var features []*lnrpc.Feature + if payReq.Features != nil { + payFeatures := payReq.Features.Features() + + features = make([]*lnrpc.Feature, 0, len(payFeatures)) + for bit := range payFeatures { + features = append(features, &lnrpc.Feature{ + Bit: uint32(bit), + Name: payReq.Features.Name(bit), + IsRequired: bit.IsRequired(), + }) + } + } + dest := payReq.Destination.SerializeCompressed() return &lnrpc.PayReq{ Destination: hex.EncodeToString(dest), @@ -4514,6 +4530,7 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, Expiry: expiry, CltvExpiry: int64(payReq.MinFinalCLTVExpiry()), RouteHints: routeHints, + Features: features, }, nil } From e894c724e3bcb7331c21d277ce7cc623e69ab726 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:03:49 -0800 Subject: [PATCH 12/25] multi: set invoice feature bits using feature manager --- lnrpc/invoicesrpc/addinvoice.go | 11 ++++++----- lnrpc/invoicesrpc/config_active.go | 4 ++++ lnrpc/invoicesrpc/invoices_server.go | 15 ++++++++------- rpcserver.go | 10 +++++++++- subrpcserver_config.go | 7 ++++++- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/lnrpc/invoicesrpc/addinvoice.go b/lnrpc/invoicesrpc/addinvoice.go index e99e94179ec2..1ca601f118ef 100644 --- a/lnrpc/invoicesrpc/addinvoice.go +++ b/lnrpc/invoicesrpc/addinvoice.go @@ -47,6 +47,10 @@ type AddInvoiceConfig struct { // ChanDB is a global boltdb instance which is needed to access the // channel graph. ChanDB *channeldb.DB + + // GenInvoiceFeatures returns a feature containing feature bits that + // should be advertised on freshly generated invoices. + GenInvoiceFeatures func() *lnwire.FeatureVector } // AddInvoiceData contains the required data to create a new invoice. @@ -363,11 +367,8 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, } - // Set a blank feature vector, as our invoice generation forbids nil - // features. - invoiceFeatures := lnwire.NewFeatureVector( - lnwire.NewRawFeatureVector(), lnwire.Features, - ) + // Set our desired invoice features and add them to our list of options. + invoiceFeatures := cfg.GenInvoiceFeatures() options = append(options, zpay32.Features(invoiceFeatures)) // Create and encode the payment request as a bech32 (zpay32) string. diff --git a/lnrpc/invoicesrpc/config_active.go b/lnrpc/invoicesrpc/config_active.go index 0bb311a1879e..b347ecd54db1 100644 --- a/lnrpc/invoicesrpc/config_active.go +++ b/lnrpc/invoicesrpc/config_active.go @@ -50,4 +50,8 @@ type Config struct { // ChanDB is a global boltdb instance which is needed to access the // channel graph. ChanDB *channeldb.DB + + // GenInvoiceFeatures returns a feature containing feature bits that + // should be advertised on freshly generated invoices. + GenInvoiceFeatures func() *lnwire.FeatureVector } diff --git a/lnrpc/invoicesrpc/invoices_server.go b/lnrpc/invoicesrpc/invoices_server.go index 9aff9a330568..87cdc0261028 100644 --- a/lnrpc/invoicesrpc/invoices_server.go +++ b/lnrpc/invoicesrpc/invoices_server.go @@ -246,13 +246,14 @@ func (s *Server) AddHoldInvoice(ctx context.Context, invoice *AddHoldInvoiceRequest) (*AddHoldInvoiceResp, error) { addInvoiceCfg := &AddInvoiceConfig{ - AddInvoice: s.cfg.InvoiceRegistry.AddInvoice, - IsChannelActive: s.cfg.IsChannelActive, - ChainParams: s.cfg.ChainParams, - NodeSigner: s.cfg.NodeSigner, - MaxPaymentMSat: s.cfg.MaxPaymentMSat, - DefaultCLTVExpiry: s.cfg.DefaultCLTVExpiry, - ChanDB: s.cfg.ChanDB, + AddInvoice: s.cfg.InvoiceRegistry.AddInvoice, + IsChannelActive: s.cfg.IsChannelActive, + ChainParams: s.cfg.ChainParams, + NodeSigner: s.cfg.NodeSigner, + MaxPaymentMSat: s.cfg.MaxPaymentMSat, + DefaultCLTVExpiry: s.cfg.DefaultCLTVExpiry, + ChanDB: s.cfg.ChanDB, + GenInvoiceFeatures: s.cfg.GenInvoiceFeatures, } hash, err := lntypes.MakeHash(invoice.Hash) diff --git a/rpcserver.go b/rpcserver.go index 0e0696bfccd7..aaed6e75596d 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -36,6 +36,7 @@ import ( "github.com/lightningnetwork/lnd/channelnotifier" "github.com/lightningnetwork/lnd/contractcourt" "github.com/lightningnetwork/lnd/discovery" + "github.com/lightningnetwork/lnd/feature" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/invoices" @@ -546,6 +547,10 @@ func newRPCServer(s *server, macService *macaroons.Service, MaxTotalTimelock: cfg.MaxOutgoingCltvExpiry, } + genInvoiceFeatures := func() *lnwire.FeatureVector { + return s.featureMgr.Get(feature.SetInvoice) + } + var ( subServers []lnrpc.SubServer subServerPerms []lnrpc.MacaroonPerms @@ -558,7 +563,7 @@ func newRPCServer(s *server, macService *macaroons.Service, s.cc, networkDir, macService, atpl, invoiceRegistry, s.htlcSwitch, activeNetParams.Params, s.chanRouter, routerBackend, s.nodeSigner, s.chanDB, s.sweeper, tower, - s.towerClient, cfg.net.ResolveTCPAddr, + s.towerClient, cfg.net.ResolveTCPAddr, genInvoiceFeatures, ) if err != nil { return nil, err @@ -3540,6 +3545,9 @@ func (r *rpcServer) AddInvoice(ctx context.Context, MaxPaymentMSat: MaxPaymentMSat, DefaultCLTVExpiry: defaultDelta, ChanDB: r.server.chanDB, + GenInvoiceFeatures: func() *lnwire.FeatureVector { + return r.server.featureMgr.Get(feature.SetInvoice) + }, } value, err := lnrpc.UnmarshallAmt(invoice.Value, invoice.ValueMsat) diff --git a/subrpcserver_config.go b/subrpcserver_config.go index d00e3a43d846..ff7a0be7cd31 100644 --- a/subrpcserver_config.go +++ b/subrpcserver_config.go @@ -18,6 +18,7 @@ import ( "github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc" "github.com/lightningnetwork/lnd/lnrpc/wtclientrpc" + "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/macaroons" "github.com/lightningnetwork/lnd/netann" "github.com/lightningnetwork/lnd/routing" @@ -92,7 +93,8 @@ func (s *subRPCServerConfigs) PopulateDependencies(cc *chainControl, sweeper *sweep.UtxoSweeper, tower *watchtower.Standalone, towerClient wtclient.Client, - tcpResolver lncfg.TCPResolver) error { + tcpResolver lncfg.TCPResolver, + genInvoiceFeatures func() *lnwire.FeatureVector) error { // First, we'll use reflect to obtain a version of the config struct // that allows us to programmatically inspect its fields. @@ -210,6 +212,9 @@ func (s *subRPCServerConfigs) PopulateDependencies(cc *chainControl, subCfgValue.FieldByName("ChanDB").Set( reflect.ValueOf(chanDB), ) + subCfgValue.FieldByName("GenInvoiceFeatures").Set( + reflect.ValueOf(genInvoiceFeatures), + ) case *routerrpc.Config: subCfgValue := extractReflectValue(subCfg) From 6e0c1f81bcca0dcfd58d2de549a0e4cc3377797c Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:04:08 -0800 Subject: [PATCH 13/25] zpay32/invoice: consolidate 32-byte array parsing and encoding logic This commit also consolidates the existing code duplication in parsing payment hashes and description hashes into a single, combined method for parsing 32-byte values. A similar change is made for encoding 32-byte values. zpay32/invoice: consolidate 32-byte encoding logic --- zpay32/invoice.go | 74 ++++++++++----------------------- zpay32/invoice_internal_test.go | 56 ++----------------------- 2 files changed, 25 insertions(+), 105 deletions(-) diff --git a/zpay32/invoice.go b/zpay32/invoice.go index d36b31ca4306..d59fe59ad7b5 100644 --- a/zpay32/invoice.go +++ b/zpay32/invoice.go @@ -632,7 +632,7 @@ func parseTaggedFields(invoice *Invoice, fields []byte, net *chaincfg.Params) er continue } - invoice.PaymentHash, err = parsePaymentHash(base32Data) + invoice.PaymentHash, err = parse32Bytes(base32Data) case fieldTypeD: if invoice.Description != nil { // We skip the field if we have already seen a @@ -656,7 +656,7 @@ func parseTaggedFields(invoice *Invoice, fields []byte, net *chaincfg.Params) er continue } - invoice.DescriptionHash, err = parseDescriptionHash(base32Data) + invoice.DescriptionHash, err = parse32Bytes(base32Data) case fieldTypeX: if invoice.expiry != nil { // We skip the field if we have already seen a @@ -723,12 +723,12 @@ func parseFieldDataLength(data []byte) (uint16, error) { return uint16(data[0])<<5 | uint16(data[1]), nil } -// parsePaymentHash converts a 256-bit payment hash (encoded in base32) -// to *[32]byte. -func parsePaymentHash(data []byte) (*[32]byte, error) { +// parse32Bytes converts a 256-bit value (encoded in base32) to *[32]byte. This +// can be used for payment hashes, description hashes, payment addresses, etc. +func parse32Bytes(data []byte) (*[32]byte, error) { var paymentHash [32]byte - // As BOLT-11 states, a reader must skip over the payment hash field if + // As BOLT-11 states, a reader must skip over the 32-byte fields if // it does not have a length of 52, so avoid returning an error. if len(data) != hashBase32Len { return nil, nil @@ -774,27 +774,6 @@ func parseDestination(data []byte) (*btcec.PublicKey, error) { return btcec.ParsePubKey(base256Data, btcec.S256()) } -// parseDescriptionHash converts a 256-bit description hash (encoded in base32) -// to *[32]byte. -func parseDescriptionHash(data []byte) (*[32]byte, error) { - var descriptionHash [32]byte - - // As BOLT-11 states, a reader must skip over the description hash field - // if it does not have a length of 52, so avoid returning an error. - if len(data) != hashBase32Len { - return nil, nil - } - - hash, err := bech32.ConvertBits(data, 5, 8, false) - if err != nil { - return nil, err - } - - copy(descriptionHash[:], hash[:]) - - return &descriptionHash, nil -} - // parseExpiry converts the data (encoded in base32) into the expiry time. func parseExpiry(data []byte) (*time.Duration, error) { expiry, err := base32ToUint64(data) @@ -934,18 +913,7 @@ func parseFeatures(data []byte) (*lnwire.FeatureVector, error) { // base32 buffer. func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error { if invoice.PaymentHash != nil { - // Convert 32 byte hash to 52 5-bit groups. - base32, err := bech32.ConvertBits(invoice.PaymentHash[:], 8, 5, - true) - if err != nil { - return err - } - if len(base32) != hashBase32Len { - return fmt.Errorf("invalid payment hash length: %d", - len(invoice.PaymentHash)) - } - - err = writeTaggedField(bufferBase32, fieldTypeP, base32) + err := writeBytes32(bufferBase32, fieldTypeP, *invoice.PaymentHash) if err != nil { return err } @@ -964,19 +932,9 @@ func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error { } if invoice.DescriptionHash != nil { - // Convert 32 byte hash to 52 5-bit groups. - descBase32, err := bech32.ConvertBits( - invoice.DescriptionHash[:], 8, 5, true) - if err != nil { - return err - } - - if len(descBase32) != hashBase32Len { - return fmt.Errorf("invalid description hash length: %d", - len(invoice.DescriptionHash)) - } - - err = writeTaggedField(bufferBase32, fieldTypeH, descBase32) + err := writeBytes32( + bufferBase32, fieldTypeH, *invoice.DescriptionHash, + ) if err != nil { return err } @@ -1096,6 +1054,18 @@ func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error { return nil } +// writeBytes32 encodes a 32-byte array as base32 and writes it to bufferBase32 +// under the passed fieldType. +func writeBytes32(bufferBase32 *bytes.Buffer, fieldType byte, b [32]byte) error { + // Convert 32 byte hash to 52 5-bit groups. + base32, err := bech32.ConvertBits(b[:], 8, 5, true) + if err != nil { + return err + } + + return writeTaggedField(bufferBase32, fieldType, base32) +} + // writeTaggedField takes the type of a tagged data field, and the data of // the tagged field (encoded in base32), and writes the type, length and data // to the buffer. diff --git a/zpay32/invoice_internal_test.go b/zpay32/invoice_internal_test.go index 5d0c2cf17784..8b2cda4ed00e 100644 --- a/zpay32/invoice_internal_test.go +++ b/zpay32/invoice_internal_test.go @@ -314,10 +314,10 @@ func TestParseFieldDataLength(t *testing.T) { } } -// TestParsePaymentHash checks that the payment hash is properly parsed. +// TestParse32Bytes checks that the payment hash is properly parsed. // If the data does not have a length of 52 bytes, we skip over parsing the // field and do not return an error. -func TestParsePaymentHash(t *testing.T) { +func TestParse32Bytes(t *testing.T) { t.Parallel() testPaymentHashData, _ := bech32.ConvertBits(testPaymentHash[:], 8, 5, true) @@ -350,7 +350,7 @@ func TestParsePaymentHash(t *testing.T) { } for i, test := range tests { - paymentHash, err := parsePaymentHash(test.data) + paymentHash, err := parse32Bytes(test.data) if (err == nil) != test.valid { t.Errorf("payment hash decoding test %d failed: %v", i, err) return @@ -458,56 +458,6 @@ func TestParseDestination(t *testing.T) { } } -// TestParseDescriptionHash checks that the description hash is properly parsed. -// If the data does not have a length of 52 bytes, we skip over parsing the -// field and do not return an error. -func TestParseDescriptionHash(t *testing.T) { - t.Parallel() - - testDescriptionHashData, _ := bech32.ConvertBits(testDescriptionHash[:], 8, 5, true) - - tests := []struct { - data []byte - valid bool - result *[32]byte - }{ - { - data: []byte{}, - valid: true, - result: nil, // skip unknown length, not 52 bytes - }, - { - data: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, - valid: true, - result: nil, // skip unknown length, not 52 bytes - }, - { - data: testDescriptionHashData, - valid: true, - result: &testDescriptionHash, - }, - { - data: append(testDescriptionHashData, 0x0), - valid: true, - result: nil, // skip unknown length, not 52 bytes - }, - } - - for i, test := range tests { - descriptionHash, err := parseDescriptionHash(test.data) - if (err == nil) != test.valid { - t.Errorf("description hash decoding test %d failed: %v", i, err) - return - } - if test.valid && !compareHashes(descriptionHash, test.result) { - t.Fatalf("test %d failed decoding description hash: "+ - "expected %x, got %x", - i, *test.result, *descriptionHash) - return - } - } -} - // TestParseExpiry checks that the expiry is properly parsed. func TestParseExpiry(t *testing.T) { t.Parallel() From dcb81531b88d884948bc3ad84104537fa6c60abf Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:04:28 -0800 Subject: [PATCH 14/25] zpay32/invoice: parse payment address as type s --- zpay32/invoice.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/zpay32/invoice.go b/zpay32/invoice.go index d59fe59ad7b5..07eca2c9b0e7 100644 --- a/zpay32/invoice.go +++ b/zpay32/invoice.go @@ -73,6 +73,11 @@ const ( // supported or required by the receiver. fieldType9 = 5 + // fieldTypeS contains a 32-byte payment address, which is a nonce + // included in the final hop's payload to prevent intermediaries from + // probing the recipient. + fieldTypeS = 16 + // maxInvoiceLength is the maximum total length an invoice can have. // This is chosen to be the maximum number of bytes that can fit into a // single QR code: https://en.wikipedia.org/wiki/QR_code#Storage @@ -118,6 +123,10 @@ type Invoice struct { // invoice. PaymentHash *[32]byte + // PaymentAddr is the payment address to be used by payments to prevent + // probing of the destination. + PaymentAddr *[32]byte + // Destination is the public key of the target node. This will always // be set after decoding, and can optionally be set before encoding to // include the pubkey as an 'n' field. If this is not set before @@ -633,6 +642,14 @@ func parseTaggedFields(invoice *Invoice, fields []byte, net *chaincfg.Params) er } invoice.PaymentHash, err = parse32Bytes(base32Data) + case fieldTypeS: + if invoice.PaymentAddr != nil { + // We skip the field if we have already seen a + // supported one. + continue + } + + invoice.PaymentAddr, err = parse32Bytes(base32Data) case fieldTypeD: if invoice.Description != nil { // We skip the field if we have already seen a @@ -1050,6 +1067,14 @@ func writeTaggedFields(bufferBase32 *bytes.Buffer, invoice *Invoice) error { return err } } + if invoice.PaymentAddr != nil { + err := writeBytes32( + bufferBase32, fieldTypeS, *invoice.PaymentAddr, + ) + if err != nil { + return err + } + } return nil } From baeaf21a99c932686c22815fb3543c3c8cc18448 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:04:47 -0800 Subject: [PATCH 15/25] lnwire+zpay32: add tlv onion feature to InvoiceFeatures This commit adds the tlv onion feature to the set of known InvoiceFeatures. During parsing, this will prevent nodes requiring TLV onion payloads from causing an UnknownRequiredFeature error. --- zpay32/invoice.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zpay32/invoice.go b/zpay32/invoice.go index 07eca2c9b0e7..75e3b3123c87 100644 --- a/zpay32/invoice.go +++ b/zpay32/invoice.go @@ -87,7 +87,10 @@ const ( var ( // InvoiceFeatures holds the set of all known feature bits that are // exposed as BOLT 11 features. - InvoiceFeatures = map[lnwire.FeatureBit]string{} + InvoiceFeatures = map[lnwire.FeatureBit]string{ + lnwire.TLVOnionPayloadRequired: "tlv-onion", + lnwire.TLVOnionPayloadOptional: "tlv-onion", + } // ErrInvoiceTooLarge is returned when an invoice exceeds maxInvoiceLength. ErrInvoiceTooLarge = errors.New("invoice is too large") From ae4da2f3d3153f4784ec92b7deb489fa54afc25e Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:05:02 -0800 Subject: [PATCH 16/25] routing: consolidate final hop params for newRoute This commit creates a wrapper struct, grouping all parameters that influence the final hop during route construction. This is a preliminary step for passing in the receiver's invoice feature bits, which will be used to select an appropriate payment or payload type. --- routing/pathfind.go | 25 +++++++++++++++-------- routing/pathfind_test.go | 41 ++++++++++++++++++++++++++++---------- routing/payment_session.go | 8 ++++++-- routing/router.go | 16 +++++++++++---- 4 files changed, 65 insertions(+), 25 deletions(-) diff --git a/routing/pathfind.go b/routing/pathfind.go index e2f1b4475685..aacb0535cb4f 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -73,6 +73,16 @@ type edgePolicyWithSource struct { edge *channeldb.ChannelEdgePolicy } +// finalHopParams encapsulates various parameters for route construction that +// apply to the final hop in a route. These features include basic payment data +// such as amounts and cltvs, as well as more complex features like destination +// TLV records. +type finalHopParams struct { + amt lnwire.MilliSatoshi + cltvDelta uint16 + records []tlv.Record +} + // newRoute returns a fully valid route between the source and target that's // capable of supporting a payment of `amtToSend` after fees are fully // computed. If the route is too long, or the selected path cannot support the @@ -80,10 +90,9 @@ type edgePolicyWithSource struct { // // NOTE: The passed slice of ChannelHops MUST be sorted in forward order: from // the source to the target node of the path finding attempt. -func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex route.Vertex, +func newRoute(sourceVertex route.Vertex, pathEdges []*channeldb.ChannelEdgePolicy, currentHeight uint32, - finalCLTVDelta uint16, - finalDestRecords []tlv.Record) (*route.Route, error) { + finalHop finalHopParams) (*route.Route, error) { var ( hops []*route.Hop @@ -109,7 +118,7 @@ func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex route.Vertex, // If this is the last hop, then the hop payload will contain // the exact amount. In BOLT #4: Onion Routing // Protocol / "Payload for the Last Node", this is detailed. - amtToForward := amtToSend + amtToForward := finalHop.amt // Fee is not part of the hop payload, but only used for // reporting through RPC. Set to zero for the final hop. @@ -138,9 +147,9 @@ func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex route.Vertex, // As this is the last hop, we'll use the specified // final CLTV delta value instead of the value from the // last link in the route. - totalTimeLock += uint32(finalCLTVDelta) + totalTimeLock += uint32(finalHop.cltvDelta) - outgoingTimeLock = currentHeight + uint32(finalCLTVDelta) + outgoingTimeLock = currentHeight + uint32(finalHop.cltvDelta) } else { // Next, increment the total timelock of the entire // route such that each hops time lock increases as we @@ -181,8 +190,8 @@ func newRoute(amtToSend lnwire.MilliSatoshi, sourceVertex route.Vertex, // If this is the last hop, then we'll populate any TLV records // destined for it. - if i == len(pathEdges)-1 && len(finalDestRecords) != 0 { - currentHop.TLVRecords = finalDestRecords + if i == len(pathEdges)-1 && len(finalHop.records) != 0 { + currentHop.TLVRecords = finalHop.records } hops = append([]*route.Hop{currentHop}, hops...) diff --git a/routing/pathfind_test.go b/routing/pathfind_test.go index dd477548a311..1c69adf61b4d 100644 --- a/routing/pathfind_test.go +++ b/routing/pathfind_test.go @@ -637,8 +637,12 @@ func TestFindLowestFeePath(t *testing.T) { t.Fatalf("unable to find path: %v", err) } route, err := newRoute( - paymentAmt, ctx.source, path, startingHeight, - finalHopCLTV, nil, + ctx.source, path, startingHeight, + finalHopParams{ + amt: paymentAmt, + cltvDelta: finalHopCLTV, + records: nil, + }, ) if err != nil { t.Fatalf("unable to create path: %v", err) @@ -787,8 +791,12 @@ func testBasicGraphPathFindingCase(t *testing.T, graphInstance *testGraphInstanc } route, err := newRoute( - paymentAmt, sourceVertex, path, startingHeight, - finalHopCLTV, nil, + sourceVertex, path, startingHeight, + finalHopParams{ + amt: paymentAmt, + cltvDelta: finalHopCLTV, + records: nil, + }, ) if err != nil { t.Fatalf("unable to create path: %v", err) @@ -1162,9 +1170,12 @@ func TestNewRoute(t *testing.T) { t.Run(testCase.name, func(t *testing.T) { route, err := newRoute( - testCase.paymentAmount, sourceVertex, - testCase.hops, startingHeight, finalHopCLTV, - nil, + sourceVertex, testCase.hops, startingHeight, + finalHopParams{ + amt: testCase.paymentAmount, + cltvDelta: finalHopCLTV, + records: nil, + }, ) if testCase.expectError { @@ -1859,8 +1870,12 @@ func TestRestrictOutgoingChannel(t *testing.T) { t.Fatalf("unable to find path: %v", err) } route, err := newRoute( - paymentAmt, ctx.source, path, startingHeight, - finalHopCLTV, nil, + ctx.source, path, startingHeight, + finalHopParams{ + amt: paymentAmt, + cltvDelta: finalHopCLTV, + records: nil, + }, ) if err != nil { t.Fatalf("unable to create path: %v", err) @@ -1985,8 +2000,12 @@ func testCltvLimit(t *testing.T, limit uint32, expectedChannel uint64) { finalHopCLTV = 1 ) route, err := newRoute( - paymentAmt, ctx.source, path, startingHeight, finalHopCLTV, - nil, + ctx.source, path, startingHeight, + finalHopParams{ + amt: paymentAmt, + cltvDelta: finalHopCLTV, + records: nil, + }, ) if err != nil { t.Fatalf("unable to create path: %v", err) diff --git a/routing/payment_session.go b/routing/payment_session.go index 3b27db422626..e809bcafa092 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -122,8 +122,12 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, // a route by applying the time-lock and fee requirements. sourceVertex := route.Vertex(ss.SelfNode.PubKeyBytes) route, err := newRoute( - payment.Amount, sourceVertex, path, height, finalCltvDelta, - payment.FinalDestRecords, + sourceVertex, path, height, + finalHopParams{ + amt: payment.Amount, + cltvDelta: finalCltvDelta, + records: payment.FinalDestRecords, + }, ) if err != nil { // TODO(roasbeef): return which edge/vertex didn't work diff --git a/routing/router.go b/routing/router.go index ad38d10621a2..6cb509e7e678 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1450,8 +1450,12 @@ func (r *ChannelRouter) FindRoute(source, target route.Vertex, // Create the route with absolute time lock values. route, err := newRoute( - amt, source, path, uint32(currentHeight), finalCLTVDelta, - destTlvRecords, + source, path, uint32(currentHeight), + finalHopParams{ + amt: amt, + cltvDelta: finalCLTVDelta, + records: destTlvRecords, + }, ) if err != nil { return nil, err @@ -2406,7 +2410,11 @@ func (r *ChannelRouter) BuildRoute(amt *lnwire.MilliSatoshi, } return newRoute( - receiverAmt, source, pathEdges, uint32(height), - uint16(finalCltvDelta), nil, + source, pathEdges, uint32(height), + finalHopParams{ + amt: receiverAmt, + cltvDelta: uint16(finalCltvDelta), + records: nil, + }, ) } From cc26776013a7a52953413867ea4ae8bd2b1fcc17 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:05:17 -0800 Subject: [PATCH 17/25] routing/pathfind: consolidate final vs non-final hop processing --- routing/pathfind.go | 53 ++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/routing/pathfind.go b/routing/pathfind.go index aacb0535cb4f..a51c11686a0c 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -115,18 +115,34 @@ func newRoute(sourceVertex route.Vertex, // payload for the hop this edge is leading to. edge := pathEdges[i] - // If this is the last hop, then the hop payload will contain - // the exact amount. In BOLT #4: Onion Routing - // Protocol / "Payload for the Last Node", this is detailed. - amtToForward := finalHop.amt - - // Fee is not part of the hop payload, but only used for - // reporting through RPC. Set to zero for the final hop. - fee := lnwire.MilliSatoshi(0) - - // If the current hop isn't the last hop, then add enough funds - // to pay for transit over the next link. - if i != len(pathEdges)-1 { + // We'll calculate the amounts, timelocks, and fees for each hop + // in the route. The base case is the final hop which includes + // their amount and timelocks. These values will accumulate + // contributions from the preceding hops back to the sender as + // we compute the route in reverse. + var ( + amtToForward lnwire.MilliSatoshi + fee lnwire.MilliSatoshi + outgoingTimeLock uint32 + ) + if i == len(pathEdges)-1 { + // If this is the last hop, then the hop payload will + // contain the exact amount. In BOLT #4: Onion Routing + // Protocol / "Payload for the Last Node", this is + // detailed. + amtToForward = finalHop.amt + + // Fee is not part of the hop payload, but only used for + // reporting through RPC. Set to zero for the final hop. + fee = lnwire.MilliSatoshi(0) + + // As this is the last hop, we'll use the specified + // final CLTV delta value instead of the value from the + // last link in the route. + totalTimeLock += uint32(finalHop.cltvDelta) + + outgoingTimeLock = currentHeight + uint32(finalHop.cltvDelta) + } else { // The amount that the current hop needs to forward is // equal to the incoming amount of the next hop. amtToForward = nextIncomingAmount @@ -137,20 +153,7 @@ func newRoute(sourceVertex route.Vertex, // is stored as part of the incoming channel of // the next hop. fee = pathEdges[i+1].ComputeFee(amtToForward) - } - - // If this is the last hop, then for verification purposes, the - // value of the outgoing time-lock should be _exactly_ the - // absolute time out they'd expect in the HTLC. - var outgoingTimeLock uint32 - if i == len(pathEdges)-1 { - // As this is the last hop, we'll use the specified - // final CLTV delta value instead of the value from the - // last link in the route. - totalTimeLock += uint32(finalHop.cltvDelta) - outgoingTimeLock = currentHeight + uint32(finalHop.cltvDelta) - } else { // Next, increment the total timelock of the entire // route such that each hops time lock increases as we // walk backwards in the route, using the delta of the From 93c689da7f4cd660e1193b3d6f91ef4381971b2b Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:05:32 -0800 Subject: [PATCH 18/25] routing/pathfind: select TLV payload based on invoice features --- routing/pathfind.go | 42 ++++++++++++++++++++++++++-------------- routing/pathfind_test.go | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 14 deletions(-) diff --git a/routing/pathfind.go b/routing/pathfind.go index a51c11686a0c..8c8a81283382 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -76,11 +76,12 @@ type edgePolicyWithSource struct { // finalHopParams encapsulates various parameters for route construction that // apply to the final hop in a route. These features include basic payment data // such as amounts and cltvs, as well as more complex features like destination -// TLV records. +// TLV records and invoice features. type finalHopParams struct { amt lnwire.MilliSatoshi cltvDelta uint16 records []tlv.Record + features *lnwire.FeatureVector } // newRoute returns a fully valid route between the source and target that's @@ -124,7 +125,20 @@ func newRoute(sourceVertex route.Vertex, amtToForward lnwire.MilliSatoshi fee lnwire.MilliSatoshi outgoingTimeLock uint32 + tlvPayload bool ) + + // We start out above by assuming that this node needs the + // legacy payload, as if we don't have the full + // NodeAnnouncement information for this node, then we can't + // assume it knows the latest features. If we do have a feature + // vector for this node, then we'll update the info now. + if edge.Node.Features != nil { + tlvPayload = edge.Node.Features.HasFeature( + lnwire.TLVOnionPayloadOptional, + ) + } + if i == len(pathEdges)-1 { // If this is the last hop, then the hop payload will // contain the exact amount. In BOLT #4: Onion Routing @@ -142,6 +156,18 @@ func newRoute(sourceVertex route.Vertex, totalTimeLock += uint32(finalHop.cltvDelta) outgoingTimeLock = currentHeight + uint32(finalHop.cltvDelta) + + // If we have a feature vector for the final hop, we'll + // determine if they support TLV onion payloads by + // checking if a var_onion_optin feature is set. + // Regardless of what the graph suggests, if the invoice + // has feature bits we will assume those override + // anything on a node announcement. + if finalHop.features != nil { + tlvPayload = finalHop.features.HasFeature( + lnwire.TLVOnionPayloadOptional, + ) + } } else { // The amount that the current hop needs to forward is // equal to the incoming amount of the next hop. @@ -176,19 +202,7 @@ func newRoute(sourceVertex route.Vertex, ChannelID: edge.ChannelID, AmtToForward: amtToForward, OutgoingTimeLock: outgoingTimeLock, - LegacyPayload: true, - } - - // We start out above by assuming that this node needs the - // legacy payload, as if we don't have the full - // NodeAnnouncement information for this node, then we can't - // assume it knows the latest features. If we do have a feature - // vector for this node, then we'll update the info now. - if edge.Node.Features != nil { - features := edge.Node.Features - currentHop.LegacyPayload = !features.HasFeature( - lnwire.TLVOnionPayloadOptional, - ) + LegacyPayload: !tlvPayload, } // If this is the last hop, then we'll populate any TLV records diff --git a/routing/pathfind_test.go b/routing/pathfind_test.go index 1c69adf61b4d..76a689790b0d 100644 --- a/routing/pathfind_test.go +++ b/routing/pathfind_test.go @@ -1001,6 +1001,10 @@ func TestNewRoute(t *testing.T) { } } + tlvOnionFeatures := lnwire.NewFeatureVector( + lnwire.NewRawFeatureVector(lnwire.TLVOnionPayloadOptional), nil, + ) + testCases := []struct { // name identifies the test case in the test output. name string @@ -1013,6 +1017,8 @@ func TestNewRoute(t *testing.T) { // indicated by hops. paymentAmount lnwire.MilliSatoshi + features *lnwire.FeatureVector + // expectedFees is a list of fees that every hop is expected // to charge for forwarding. expectedFees []lnwire.MilliSatoshi @@ -1041,6 +1047,8 @@ func TestNewRoute(t *testing.T) { // expectedErrorCode indicates the expected error code when // expectError is true. expectedErrorCode errorCode + + expectedTLVPayload bool }{ { // For a single hop payment, no fees are expected to be paid. @@ -1067,6 +1075,22 @@ func TestNewRoute(t *testing.T) { expectedTimeLocks: []uint32{1, 1}, expectedTotalAmount: 100130, expectedTotalTimeLock: 6, + }, { + // For a two hop payment, only the fee for the first hop + // needs to be paid. The destination hop does not require + // a fee to receive the payment. + name: "two hop tlv onion feature", + features: tlvOnionFeatures, + paymentAmount: 100000, + hops: []*channeldb.ChannelEdgePolicy{ + createHop(0, 1000, 1000000, 10), + createHop(30, 1000, 1000000, 5), + }, + expectedFees: []lnwire.MilliSatoshi{130, 0}, + expectedTimeLocks: []uint32{1, 1}, + expectedTotalAmount: 100130, + expectedTotalTimeLock: 6, + expectedTLVPayload: true, }, { // A three hop payment where the first and second hop // will both charge 1 msat. The fee for the first hop @@ -1123,6 +1147,8 @@ func TestNewRoute(t *testing.T) { }} for _, testCase := range testCases { + testCase := testCase + assertRoute := func(t *testing.T, route *route.Route) { if route.TotalAmount != testCase.expectedTotalAmount { t.Errorf("Expected total amount is be %v"+ @@ -1166,6 +1192,16 @@ func TestNewRoute(t *testing.T) { route.Hops[i].OutgoingTimeLock) } } + + finalHop := route.Hops[len(route.Hops)-1] + if !finalHop.LegacyPayload != + testCase.expectedTLVPayload { + + t.Errorf("Expected tlv payload: %t, "+ + "but got: %t instead", + testCase.expectedTLVPayload, + !finalHop.LegacyPayload) + } } t.Run(testCase.name, func(t *testing.T) { @@ -1175,6 +1211,7 @@ func TestNewRoute(t *testing.T) { amt: testCase.paymentAmount, cltvDelta: finalHopCLTV, records: nil, + features: testCase.features, }, ) From a77673085d4e6d0e658949e34dbfab8378801b0c Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:05:47 -0800 Subject: [PATCH 19/25] rpcserver+routerrpc: feed invoice features into SendPayment --- lnrpc/routerrpc/router_backend.go | 1 + routing/payment_session.go | 1 + routing/router.go | 5 +++++ rpcserver.go | 3 +++ 4 files changed, 10 insertions(+) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 9c55881fc84d..7b9e0453ab57 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -621,6 +621,7 @@ func (r *RouterBackend) extractIntentFromSendRequest( payIntent.RouteHints = append( payIntent.RouteHints, payReq.RouteHints..., ) + payIntent.InvoiceFeatures = payReq.Features } else { // Otherwise, If the payment request field was not specified // (and a custom route wasn't specified), construct the payment diff --git a/routing/payment_session.go b/routing/payment_session.go index e809bcafa092..79111dadca96 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -127,6 +127,7 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, amt: payment.Amount, cltvDelta: finalCltvDelta, records: payment.FinalDestRecords, + features: payment.InvoiceFeatures, }, ) if err != nil { diff --git a/routing/router.go b/routing/router.go index 6cb509e7e678..a8f82799efdf 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1604,6 +1604,11 @@ type LightningPayment struct { // is reached. If nil, any node may be used. LastHop *route.Vertex + // InvoiceFeatures specifies the optional or required features parsed + // from the receiver's invoice. These features impact the exact payment + // type or payload type delivered to the final hop. + InvoiceFeatures *lnwire.FeatureVector + // PaymentRequest is an optional payment request that this payment is // attempting to complete. PaymentRequest []byte diff --git a/rpcserver.go b/rpcserver.go index aaed6e75596d..ddfc280cbd57 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -3023,6 +3023,7 @@ type rpcPaymentIntent struct { routeHints [][]zpay32.HopHint outgoingChannelID *uint64 lastHop *route.Vertex + invoiceFeatures *lnwire.FeatureVector payReq []byte destTLV []tlv.Record @@ -3144,6 +3145,7 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error payIntent.cltvDelta = uint16(payReq.MinFinalCLTVExpiry()) payIntent.routeHints = payReq.RouteHints payIntent.payReq = []byte(rpcPayReq.PaymentRequest) + payIntent.invoiceFeatures = payReq.Features return payIntent, nil } @@ -3257,6 +3259,7 @@ func (r *rpcServer) dispatchPaymentIntent( LastHop: payIntent.lastHop, PaymentRequest: payIntent.payReq, PayAttemptTimeout: routing.DefaultPayAttemptTimeout, + InvoiceFeatures: payIntent.invoiceFeatures, FinalDestRecords: payIntent.destTLV, } From 3657f31db207ab65010189309fd1667b72476cf8 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:06:05 -0800 Subject: [PATCH 20/25] routing/pathfind: set single-shot MPP if payment addr is known --- routing/pathfind.go | 22 +++++++++++++++---- routing/pathfind_test.go | 47 +++++++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/routing/pathfind.go b/routing/pathfind.go index 8c8a81283382..49b4a79ee466 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -11,6 +11,7 @@ import ( "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/record" "github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/tlv" ) @@ -78,10 +79,11 @@ type edgePolicyWithSource struct { // such as amounts and cltvs, as well as more complex features like destination // TLV records and invoice features. type finalHopParams struct { - amt lnwire.MilliSatoshi - cltvDelta uint16 - records []tlv.Record - features *lnwire.FeatureVector + amt lnwire.MilliSatoshi + cltvDelta uint16 + records []tlv.Record + features *lnwire.FeatureVector + paymentAddr *[32]byte } // newRoute returns a fully valid route between the source and target that's @@ -126,6 +128,7 @@ func newRoute(sourceVertex route.Vertex, fee lnwire.MilliSatoshi outgoingTimeLock uint32 tlvPayload bool + mpp *record.MPP ) // We start out above by assuming that this node needs the @@ -168,6 +171,16 @@ func newRoute(sourceVertex route.Vertex, lnwire.TLVOnionPayloadOptional, ) } + + // If the receiver supports TLV onion payloads and we + // have a payment address from the invoice, we'll go + // ahead and include an MPP record to gain the + // additional protections offered by MPP. + if tlvPayload && finalHop.paymentAddr != nil { + mpp = record.NewMPP( + finalHop.amt, *finalHop.paymentAddr, + ) + } } else { // The amount that the current hop needs to forward is // equal to the incoming amount of the next hop. @@ -203,6 +216,7 @@ func newRoute(sourceVertex route.Vertex, AmtToForward: amtToForward, OutgoingTimeLock: outgoingTimeLock, LegacyPayload: !tlvPayload, + MPP: mpp, } // If this is the last hop, then we'll populate any TLV records diff --git a/routing/pathfind_test.go b/routing/pathfind_test.go index 76a689790b0d..eb785abf350a 100644 --- a/routing/pathfind_test.go +++ b/routing/pathfind_test.go @@ -13,6 +13,7 @@ import ( "math/big" "net" "os" + "reflect" "strings" "testing" "time" @@ -23,6 +24,7 @@ import ( "github.com/btcsuite/btcutil" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/record" "github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/zpay32" ) @@ -979,6 +981,8 @@ func TestNewRoute(t *testing.T) { var sourceKey [33]byte sourceVertex := route.Vertex(sourceKey) + testPaymentAddr := [32]byte{0x01, 0x02, 0x03} + const ( startingHeight = 100 finalHopCLTV = 1 @@ -1019,6 +1023,8 @@ func TestNewRoute(t *testing.T) { features *lnwire.FeatureVector + paymentAddr *[32]byte + // expectedFees is a list of fees that every hop is expected // to charge for forwarding. expectedFees []lnwire.MilliSatoshi @@ -1049,6 +1055,8 @@ func TestNewRoute(t *testing.T) { expectedErrorCode errorCode expectedTLVPayload bool + + expectedMPP *record.MPP }{ { // For a single hop payment, no fees are expected to be paid. @@ -1091,6 +1099,26 @@ func TestNewRoute(t *testing.T) { expectedTotalAmount: 100130, expectedTotalTimeLock: 6, expectedTLVPayload: true, + }, { + // For a two hop payment, only the fee for the first hop + // needs to be paid. The destination hop does not require + // a fee to receive the payment. + name: "two hop single shot mpp", + features: tlvOnionFeatures, + paymentAddr: &testPaymentAddr, + paymentAmount: 100000, + hops: []*channeldb.ChannelEdgePolicy{ + createHop(0, 1000, 1000000, 10), + createHop(30, 1000, 1000000, 5), + }, + expectedFees: []lnwire.MilliSatoshi{130, 0}, + expectedTimeLocks: []uint32{1, 1}, + expectedTotalAmount: 100130, + expectedTotalTimeLock: 6, + expectedTLVPayload: true, + expectedMPP: record.NewMPP( + 100000, testPaymentAddr, + ), }, { // A three hop payment where the first and second hop // will both charge 1 msat. The fee for the first hop @@ -1197,21 +1225,30 @@ func TestNewRoute(t *testing.T) { if !finalHop.LegacyPayload != testCase.expectedTLVPayload { - t.Errorf("Expected tlv payload: %t, "+ + t.Errorf("Expected final hop tlv payload: %t, "+ "but got: %t instead", testCase.expectedTLVPayload, !finalHop.LegacyPayload) } + + if !reflect.DeepEqual( + finalHop.MPP, testCase.expectedMPP, + ) { + t.Errorf("Expected final hop mpp field: %v, "+ + " but got: %v instead", + testCase.expectedMPP, finalHop.MPP) + } } t.Run(testCase.name, func(t *testing.T) { route, err := newRoute( sourceVertex, testCase.hops, startingHeight, finalHopParams{ - amt: testCase.paymentAmount, - cltvDelta: finalHopCLTV, - records: nil, - features: testCase.features, + amt: testCase.paymentAmount, + cltvDelta: finalHopCLTV, + records: nil, + features: testCase.features, + paymentAddr: testCase.paymentAddr, }, ) From b4a434978fdc60f1b58ab0d427bb6eb2a7d6778f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:06:20 -0800 Subject: [PATCH 21/25] rpcserver+routerrpc: thread payment addr into SendPayment --- lnrpc/routerrpc/router_backend.go | 1 + routing/payment_session.go | 9 +++++---- routing/router.go | 5 +++++ rpcserver.go | 3 +++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 7b9e0453ab57..48ce2476415e 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -622,6 +622,7 @@ func (r *RouterBackend) extractIntentFromSendRequest( payIntent.RouteHints, payReq.RouteHints..., ) payIntent.InvoiceFeatures = payReq.Features + payIntent.PaymentAddr = payReq.PaymentAddr } else { // Otherwise, If the payment request field was not specified // (and a custom route wasn't specified), construct the payment diff --git a/routing/payment_session.go b/routing/payment_session.go index 79111dadca96..247a7bcd4f78 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -124,10 +124,11 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, route, err := newRoute( sourceVertex, path, height, finalHopParams{ - amt: payment.Amount, - cltvDelta: finalCltvDelta, - records: payment.FinalDestRecords, - features: payment.InvoiceFeatures, + amt: payment.Amount, + cltvDelta: finalCltvDelta, + records: payment.FinalDestRecords, + features: payment.InvoiceFeatures, + paymentAddr: payment.PaymentAddr, }, ) if err != nil { diff --git a/routing/router.go b/routing/router.go index a8f82799efdf..ada7afaa5f08 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1609,6 +1609,11 @@ type LightningPayment struct { // type or payload type delivered to the final hop. InvoiceFeatures *lnwire.FeatureVector + // PaymentAddr is the payment address specified by the receiver. This + // field should be a random 32-byte nonce presented in the receiver's + // invoice to prevent probing of the destination. + PaymentAddr *[32]byte + // PaymentRequest is an optional payment request that this payment is // attempting to complete. PaymentRequest []byte diff --git a/rpcserver.go b/rpcserver.go index ddfc280cbd57..47ee47a52db8 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -3024,6 +3024,7 @@ type rpcPaymentIntent struct { outgoingChannelID *uint64 lastHop *route.Vertex invoiceFeatures *lnwire.FeatureVector + paymentAddr *[32]byte payReq []byte destTLV []tlv.Record @@ -3146,6 +3147,7 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error payIntent.routeHints = payReq.RouteHints payIntent.payReq = []byte(rpcPayReq.PaymentRequest) payIntent.invoiceFeatures = payReq.Features + payIntent.paymentAddr = payReq.PaymentAddr return payIntent, nil } @@ -3260,6 +3262,7 @@ func (r *rpcServer) dispatchPaymentIntent( PaymentRequest: payIntent.payReq, PayAttemptTimeout: routing.DefaultPayAttemptTimeout, InvoiceFeatures: payIntent.invoiceFeatures, + PaymentAddr: payIntent.paymentAddr, FinalDestRecords: payIntent.destTLV, } From c7b3e45bafc00e5bf52d5794e938b32f15e3a83f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:06:41 -0800 Subject: [PATCH 22/25] rpcserver+invoicesrpc: set tlv onion payload invoice features This commit modifies Lighting.AddInvoice and InvoicesRPC.AddHoldInvoice to include the node's supported feature bits on the invoice. For now this only includes the optional TLV Onion Payload bit. --- lnrpc/invoicesrpc/addinvoice.go | 10 ++++++++++ zpay32/invoice.go | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/lnrpc/invoicesrpc/addinvoice.go b/lnrpc/invoicesrpc/addinvoice.go index 1ca601f118ef..e735c9de216c 100644 --- a/lnrpc/invoicesrpc/addinvoice.go +++ b/lnrpc/invoicesrpc/addinvoice.go @@ -371,6 +371,15 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, invoiceFeatures := cfg.GenInvoiceFeatures() options = append(options, zpay32.Features(invoiceFeatures)) + // Generate and set a random payment address for this invoice. If the + // sender understands payment addresses, this can be used to avoid + // intermediaries probing the receiver. + var paymentAddr [32]byte + if _, err := rand.Read(paymentAddr[:]); err != nil { + return nil, nil, err + } + options = append(options, zpay32.PaymentAddr(&paymentAddr)) + // Create and encode the payment request as a bech32 (zpay32) string. creationDate := time.Now() payReq, err := zpay32.NewInvoice( @@ -398,6 +407,7 @@ func AddInvoice(ctx context.Context, cfg *AddInvoiceConfig, Expiry: payReq.Expiry(), Value: amtMSat, PaymentPreimage: paymentPreimage, + PaymentAddr: paymentAddr, Features: invoiceFeatures, }, } diff --git a/zpay32/invoice.go b/zpay32/invoice.go index 75e3b3123c87..493604e471ba 100644 --- a/zpay32/invoice.go +++ b/zpay32/invoice.go @@ -262,6 +262,14 @@ func Features(features *lnwire.FeatureVector) func(*Invoice) { } } +// PaymentAddr is a functional option that allows callers of NewInvoice to set +// the desired payment address tht is advertised on the invoice. +func PaymentAddr(addr *[32]byte) func(*Invoice) { + return func(i *Invoice) { + i.PaymentAddr = addr + } +} + // NewInvoice creates a new Invoice object. The last parameter is a set of // variadic arguments for setting optional fields of the invoice. // From 91d386a2971a7a26ab4abecd3467ec46c088e21f Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:06:55 -0800 Subject: [PATCH 23/25] lntest+wait: replace sleeps in assertAmountSent This commit constructs a helper closure assertAmountSent that can be reused by other functions. The closure returns an error so that it can be used with wait.NoError or the new wait.InvariantNoError. The latter is added since the predicate could otherwise pass immediately for the sphinx_replay_persistence tests, but change shortly after. It also rounds out the wait package so that we offer all combinations of predicate and no-error style waits. --- lntest/itest/lnd_test.go | 129 +++++++++++++++++++++------------------ lntest/wait/wait.go | 20 ++++++ 2 files changed, 88 insertions(+), 61 deletions(-) diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index 5817e85db355..7041491adb48 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -3545,6 +3545,48 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) { } } +// assertAmountSent generates a closure which queries listchannels for sndr and +// rcvr, and asserts that sndr sent amt satoshis, and that rcvr received amt +// satoshis. +// +// NOTE: This method assumes that each node only has one channel, and it is the +// channel used to send the payment. +func assertAmountSent(amt btcutil.Amount, sndr, rcvr *lntest.HarnessNode) func() error { + return func() error { + // Both channels should also have properly accounted from the + // amount that has been sent/received over the channel. + listReq := &lnrpc.ListChannelsRequest{} + ctxb := context.Background() + ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) + sndrListChannels, err := sndr.ListChannels(ctxt, listReq) + if err != nil { + return fmt.Errorf("unable to query for %s's channel "+ + "list: %v", sndr.Name(), err) + } + sndrSatoshisSent := sndrListChannels.Channels[0].TotalSatoshisSent + if sndrSatoshisSent != int64(amt) { + return fmt.Errorf("%s's satoshis sent is incorrect "+ + "got %v, expected %v", sndr.Name(), + sndrSatoshisSent, amt) + } + + ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) + rcvrListChannels, err := rcvr.ListChannels(ctxt, listReq) + if err != nil { + return fmt.Errorf("unable to query for %s's channel "+ + "list: %v", rcvr.Name(), err) + } + rcvrSatoshisReceived := rcvrListChannels.Channels[0].TotalSatoshisReceived + if rcvrSatoshisReceived != int64(amt) { + return fmt.Errorf("%s's satoshis received is "+ + "incorrect got %v, expected %v", rcvr.Name(), + rcvrSatoshisReceived, amt) + } + + return nil + } +} + // testSphinxReplayPersistence verifies that replayed onion packets are rejected // by a remote peer after a restart. We use a combination of unsafe // configuration arguments to force Carol to replay the same sphinx packet after @@ -3595,33 +3637,6 @@ func testSphinxReplayPersistence(net *lntest.NetworkHarness, t *harnessTest) { }, ) - assertAmountSent := func(amt btcutil.Amount) { - // Both channels should also have properly accounted from the - // amount that has been sent/received over the channel. - listReq := &lnrpc.ListChannelsRequest{} - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - carolListChannels, err := carol.ListChannels(ctxt, listReq) - if err != nil { - t.Fatalf("unable to query for alice's channel list: %v", err) - } - carolSatoshisSent := carolListChannels.Channels[0].TotalSatoshisSent - if carolSatoshisSent != int64(amt) { - t.Fatalf("Carol's satoshis sent is incorrect got %v, expected %v", - carolSatoshisSent, amt) - } - - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - daveListChannels, err := dave.ListChannels(ctxt, listReq) - if err != nil { - t.Fatalf("unable to query for Dave's channel list: %v", err) - } - daveSatoshisReceived := daveListChannels.Channels[0].TotalSatoshisReceived - if daveSatoshisReceived != int64(amt) { - t.Fatalf("Dave's satoshis received is incorrect got %v, expected %v", - daveSatoshisReceived, amt) - } - } - // Now that the channel is open, create an invoice for Dave which // expects a payment of 1000 satoshis from Carol paid via a particular // preimage. @@ -3686,8 +3701,12 @@ func testSphinxReplayPersistence(net *lntest.NetworkHarness, t *harnessTest) { // With the payment sent but hedl, all balance related stats should not // have changed. - time.Sleep(time.Millisecond * 200) - assertAmountSent(0) + err = wait.InvariantNoError( + assertAmountSent(0, carol, dave), 3*time.Second, + ) + if err != nil { + t.Fatalf(err.Error()) + } // With the first payment sent, restart dave to make sure he is // persisting the information required to detect replayed sphinx @@ -3716,7 +3735,12 @@ func testSphinxReplayPersistence(net *lntest.NetworkHarness, t *harnessTest) { // Since the payment failed, the balance should still be left // unaltered. - assertAmountSent(0) + err = wait.InvariantNoError( + assertAmountSent(0, carol, dave), 3*time.Second, + ) + if err != nil { + t.Fatalf(err.Error()) + } ctxt, _ = context.WithTimeout(ctxb, channelCloseTimeout) closeChannelAndAssert(ctxt, t, net, carol, chanPoint, true) @@ -3739,33 +3763,6 @@ func testSingleHopInvoice(net *lntest.NetworkHarness, t *harnessTest) { }, ) - assertAmountSent := func(amt btcutil.Amount) { - // Both channels should also have properly accounted from the - // amount that has been sent/received over the channel. - listReq := &lnrpc.ListChannelsRequest{} - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - aliceListChannels, err := net.Alice.ListChannels(ctxt, listReq) - if err != nil { - t.Fatalf("unable to query for alice's channel list: %v", err) - } - aliceSatoshisSent := aliceListChannels.Channels[0].TotalSatoshisSent - if aliceSatoshisSent != int64(amt) { - t.Fatalf("Alice's satoshis sent is incorrect got %v, expected %v", - aliceSatoshisSent, amt) - } - - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - bobListChannels, err := net.Bob.ListChannels(ctxt, listReq) - if err != nil { - t.Fatalf("unable to query for bob's channel list: %v", err) - } - bobSatoshisReceived := bobListChannels.Channels[0].TotalSatoshisReceived - if bobSatoshisReceived != int64(amt) { - t.Fatalf("Bob's satoshis received is incorrect got %v, expected %v", - bobSatoshisReceived, amt) - } - } - // Now that the channel is open, create an invoice for Bob which // expects a payment of 1000 satoshis from Alice paid via a particular // preimage. @@ -3831,8 +3828,13 @@ func testSingleHopInvoice(net *lntest.NetworkHarness, t *harnessTest) { // With the payment completed all balance related stats should be // properly updated. - time.Sleep(time.Millisecond * 200) - assertAmountSent(paymentAmt) + err = wait.NoError( + assertAmountSent(paymentAmt, net.Alice, net.Bob), + 3*time.Second, + ) + if err != nil { + t.Fatalf(err.Error()) + } // Create another invoice for Bob, this time leaving off the preimage // to one will be randomly generated. We'll test the proper @@ -3863,8 +3865,13 @@ func testSingleHopInvoice(net *lntest.NetworkHarness, t *harnessTest) { // The second payment should also have succeeded, with the balances // being update accordingly. - time.Sleep(time.Millisecond * 200) - assertAmountSent(paymentAmt * 2) + err = wait.NoError( + assertAmountSent(2*paymentAmt, net.Alice, net.Bob), + 3*time.Second, + ) + if err != nil { + t.Fatalf(err.Error()) + } ctxt, _ = context.WithTimeout(ctxb, channelCloseTimeout) closeChannelAndAssert(ctxt, t, net, net.Alice, chanPoint, false) diff --git a/lntest/wait/wait.go b/lntest/wait/wait.go index 1ff16914f236..88cdb27d5f65 100644 --- a/lntest/wait/wait.go +++ b/lntest/wait/wait.go @@ -76,3 +76,23 @@ func Invariant(statement func() bool, timeout time.Duration) error { } } } + +// InvariantNoError is a wrapper around Invariant that waits out the duration +// specified by timeout. It fails if the predicate ever returns an error during +// that time. +func InvariantNoError(f func() error, timeout time.Duration) error { + var predErr error + pred := func() bool { + if err := f(); err != nil { + predErr = err + return false + } + return true + } + + if err := Invariant(pred, timeout); err != nil { + return predErr + } + + return nil +} From 786ee94f270c05e8d26580bc890f0a1a241ae3d8 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:07:11 -0800 Subject: [PATCH 24/25] lnrpc: add payment_addr field to PayReq --- lnrpc/rpc.pb.go | 1099 ++++++++++++++++++++-------------------- lnrpc/rpc.proto | 1 + lnrpc/rpc.swagger.json | 4 + 3 files changed, 559 insertions(+), 545 deletions(-) diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 8bf807b9befc..d537d16868ff 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -8135,6 +8135,7 @@ type PayReq struct { CltvExpiry int64 `protobuf:"varint,9,opt,name=cltv_expiry,proto3" json:"cltv_expiry,omitempty"` RouteHints []*RouteHint `protobuf:"bytes,10,rep,name=route_hints,proto3" json:"route_hints,omitempty"` Features []*Feature `protobuf:"bytes,11,rep,name=features,proto3" json:"features,omitempty"` + PaymentAddr []byte `protobuf:"bytes,12,opt,name=payment_addr,proto3" json:"payment_addr,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -8242,6 +8243,13 @@ func (m *PayReq) GetFeatures() []*Feature { return nil } +func (m *PayReq) GetPaymentAddr() []byte { + if m != nil { + return m.PaymentAddr + } + return nil +} + type Feature struct { Bit uint32 `protobuf:"varint,1,opt,name=bit,proto3" json:"bit,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` @@ -9569,556 +9577,557 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 8783 bytes of a gzipped FileDescriptorProto + // 8791 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x4d, 0x6c, 0x1c, 0x49, 0x96, 0x1f, 0xae, 0xac, 0x0f, 0xb2, 0xea, 0x55, 0x91, 0x2c, 0x06, 0x29, 0xb2, 0x54, 0xad, 0x56, 0xab, 0x73, 0xb4, 0x92, 0x46, 0xd3, 0x23, 0xa9, 0x39, 0x33, 0xfd, 0xef, 0xed, 0xfe, 0xaf, 0xd7, 0x14, 0x49, 0x89, 0xea, 0xa6, 0x28, 0x4e, 0x52, 0x1a, 0x79, 0x66, 0x76, 0x51, 0x93, 0xac, 0x0a, 0x92, 0x39, 0xaa, 0xca, 0xac, 0xce, 0xcc, 0xa2, 0xc4, 0x69, 0xb7, 0x01, 0x1b, 0x86, 0x61, 0xf8, - 0x62, 0x8c, 0x0d, 0x03, 0xb6, 0x61, 0x7b, 0x81, 0x59, 0x03, 0xde, 0x85, 0x0f, 0xf6, 0xc5, 0xc0, - 0xda, 0xd8, 0x9b, 0x61, 0x2c, 0x60, 0xc0, 0xf0, 0xc1, 0x07, 0x03, 0x3e, 0x78, 0x60, 0xd8, 0x80, - 0xb1, 0xf0, 0xd9, 0x77, 0xe3, 0xbd, 0xf8, 0xc8, 0x88, 0xcc, 0x2c, 0x51, 0x3d, 0x33, 0xf6, 0x89, - 0x15, 0xbf, 0x17, 0x19, 0x9f, 0xef, 0xbd, 0x78, 0xf1, 0xe2, 0x45, 0x10, 0x9a, 0xf1, 0x64, 0x70, - 0x77, 0x12, 0x47, 0x69, 0xc4, 0xea, 0xa3, 0x30, 0x9e, 0x0c, 0x7a, 0x57, 0x4f, 0xa2, 0xe8, 0x64, - 0xc4, 0xef, 0xf9, 0x93, 0xe0, 0x9e, 0x1f, 0x86, 0x51, 0xea, 0xa7, 0x41, 0x14, 0x26, 0x22, 0x93, - 0xfb, 0x13, 0x58, 0x7c, 0xc4, 0xc3, 0x43, 0xce, 0x87, 0x1e, 0xff, 0x62, 0xca, 0x93, 0x94, 0x7d, - 0x0b, 0x96, 0x7d, 0xfe, 0x33, 0xce, 0x87, 0xfd, 0x89, 0x9f, 0x24, 0x93, 0xd3, 0xd8, 0x4f, 0x78, - 0xd7, 0xb9, 0xee, 0xdc, 0x6e, 0x7b, 0x1d, 0x41, 0x38, 0xd0, 0x38, 0x7b, 0x1f, 0xda, 0x09, 0x66, - 0xe5, 0x61, 0x1a, 0x47, 0x93, 0xf3, 0x6e, 0x85, 0xf2, 0xb5, 0x10, 0xdb, 0x11, 0x90, 0x3b, 0x82, - 0x25, 0x5d, 0x43, 0x32, 0x89, 0xc2, 0x84, 0xb3, 0xfb, 0xb0, 0x3a, 0x08, 0x26, 0xa7, 0x3c, 0xee, - 0xd3, 0xc7, 0xe3, 0x90, 0x8f, 0xa3, 0x30, 0x18, 0x74, 0x9d, 0xeb, 0xd5, 0xdb, 0x4d, 0x8f, 0x09, - 0x1a, 0x7e, 0xf1, 0x44, 0x52, 0xd8, 0x2d, 0x58, 0xe2, 0xa1, 0xc0, 0xf9, 0x90, 0xbe, 0x92, 0x55, - 0x2d, 0x66, 0x30, 0x7e, 0xe0, 0xfe, 0xcd, 0x0a, 0x2c, 0x3f, 0x0e, 0x83, 0xf4, 0x85, 0x3f, 0x1a, - 0xf1, 0x54, 0xf5, 0xe9, 0x16, 0x2c, 0xbd, 0x22, 0x80, 0xfa, 0xf4, 0x2a, 0x8a, 0x87, 0xb2, 0x47, - 0x8b, 0x02, 0x3e, 0x90, 0xe8, 0xcc, 0x96, 0x55, 0x66, 0xb6, 0xac, 0x74, 0xb8, 0xaa, 0x33, 0x86, - 0xeb, 0x16, 0x2c, 0xc5, 0x7c, 0x10, 0x9d, 0xf1, 0xf8, 0xbc, 0xff, 0x2a, 0x08, 0x87, 0xd1, 0xab, - 0x6e, 0xed, 0xba, 0x73, 0xbb, 0xee, 0x2d, 0x2a, 0xf8, 0x05, 0xa1, 0xec, 0x01, 0x2c, 0x0d, 0x4e, - 0xfd, 0x30, 0xe4, 0xa3, 0xfe, 0x91, 0x3f, 0x78, 0x39, 0x9d, 0x24, 0xdd, 0xfa, 0x75, 0xe7, 0x76, - 0x6b, 0xe3, 0xca, 0x5d, 0x9a, 0xd5, 0xbb, 0x5b, 0xa7, 0x7e, 0xf8, 0x80, 0x28, 0x87, 0xa1, 0x3f, - 0x49, 0x4e, 0xa3, 0xd4, 0x5b, 0x94, 0x5f, 0x08, 0x38, 0x71, 0x57, 0x81, 0x99, 0x23, 0x21, 0xc6, - 0xde, 0xfd, 0xe7, 0x0e, 0xac, 0x3c, 0x0f, 0x47, 0xd1, 0xe0, 0xe5, 0xaf, 0x38, 0x44, 0x25, 0x7d, - 0xa8, 0xbc, 0x6d, 0x1f, 0xaa, 0x5f, 0xb7, 0x0f, 0x6b, 0xb0, 0x6a, 0x37, 0x56, 0xf6, 0x82, 0xc3, - 0x65, 0xfc, 0xfa, 0x84, 0xab, 0x66, 0xa9, 0x6e, 0x7c, 0x13, 0x3a, 0x83, 0x69, 0x1c, 0xf3, 0xb0, - 0xd0, 0x8f, 0x25, 0x89, 0xeb, 0x8e, 0xbc, 0x0f, 0xed, 0x90, 0xbf, 0xca, 0xb2, 0x49, 0xde, 0x0d, - 0xf9, 0x2b, 0x95, 0xc5, 0xed, 0xc2, 0x5a, 0xbe, 0x1a, 0xd9, 0x80, 0xff, 0xe6, 0x40, 0xed, 0x79, - 0xfa, 0x3a, 0x62, 0x77, 0xa1, 0x96, 0x9e, 0x4f, 0x84, 0x84, 0x2c, 0x6e, 0x30, 0xd9, 0xb5, 0xcd, - 0xe1, 0x30, 0xe6, 0x49, 0xf2, 0xec, 0x7c, 0xc2, 0xbd, 0xb6, 0x2f, 0x12, 0x7d, 0xcc, 0xc7, 0xba, - 0x30, 0x2f, 0xd3, 0x54, 0x61, 0xd3, 0x53, 0x49, 0x76, 0x0d, 0xc0, 0x1f, 0x47, 0xd3, 0x30, 0xed, - 0x27, 0x7e, 0x4a, 0x43, 0x55, 0xf5, 0x0c, 0x84, 0x5d, 0x85, 0xe6, 0xe4, 0x65, 0x3f, 0x19, 0xc4, - 0xc1, 0x24, 0x25, 0xb6, 0x69, 0x7a, 0x19, 0xc0, 0xbe, 0x05, 0x8d, 0x68, 0x9a, 0x4e, 0xa2, 0x20, - 0x4c, 0x25, 0xab, 0x2c, 0xc9, 0xb6, 0x3c, 0x9d, 0xa6, 0x07, 0x08, 0x7b, 0x3a, 0x03, 0xbb, 0x01, - 0x0b, 0x83, 0x28, 0x3c, 0x0e, 0xe2, 0xb1, 0x50, 0x06, 0xdd, 0x39, 0xaa, 0xcd, 0x06, 0xdd, 0x7f, - 0x5d, 0x81, 0xd6, 0xb3, 0xd8, 0x0f, 0x13, 0x7f, 0x80, 0x00, 0x36, 0x3d, 0x7d, 0xdd, 0x3f, 0xf5, - 0x93, 0x53, 0xea, 0x6d, 0xd3, 0x53, 0x49, 0xb6, 0x06, 0x73, 0xa2, 0xa1, 0xd4, 0xa7, 0xaa, 0x27, - 0x53, 0xec, 0x03, 0x58, 0x0e, 0xa7, 0xe3, 0xbe, 0x5d, 0x57, 0x95, 0xb8, 0xa5, 0x48, 0xc0, 0x01, - 0x38, 0xc2, 0xb9, 0x16, 0x55, 0x88, 0x1e, 0x1a, 0x08, 0x73, 0xa1, 0x2d, 0x53, 0x3c, 0x38, 0x39, - 0x15, 0xdd, 0xac, 0x7b, 0x16, 0x86, 0x65, 0xa4, 0xc1, 0x98, 0xf7, 0x93, 0xd4, 0x1f, 0x4f, 0x64, - 0xb7, 0x0c, 0x84, 0xe8, 0x51, 0xea, 0x8f, 0xfa, 0xc7, 0x9c, 0x27, 0xdd, 0x79, 0x49, 0xd7, 0x08, - 0xbb, 0x09, 0x8b, 0x43, 0x9e, 0xa4, 0x7d, 0x39, 0x29, 0x3c, 0xe9, 0x36, 0x48, 0xf4, 0x73, 0x28, - 0x96, 0x13, 0xfb, 0xaf, 0xfa, 0x38, 0x00, 0xfc, 0x75, 0xb7, 0x29, 0xda, 0x9a, 0x21, 0xc8, 0x39, - 0x8f, 0x78, 0x6a, 0x8c, 0x5e, 0x22, 0x39, 0xd4, 0xdd, 0x03, 0x66, 0xc0, 0xdb, 0x3c, 0xf5, 0x83, - 0x51, 0xc2, 0x3e, 0x82, 0x76, 0x6a, 0x64, 0x26, 0x55, 0xd8, 0xd2, 0xec, 0x64, 0x7c, 0xe0, 0x59, - 0xf9, 0xdc, 0x53, 0x68, 0x3c, 0xe4, 0x7c, 0x2f, 0x18, 0x07, 0x29, 0x5b, 0x83, 0xfa, 0x71, 0xf0, - 0x9a, 0x0b, 0x86, 0xaf, 0xee, 0x5e, 0xf2, 0x44, 0x92, 0xbd, 0x07, 0x40, 0x3f, 0xfa, 0x63, 0xcd, - 0x58, 0xbb, 0x97, 0xbc, 0x26, 0x61, 0x4f, 0x90, 0xb3, 0x7a, 0x30, 0x3f, 0xe1, 0xf1, 0x80, 0xab, - 0xf9, 0xdb, 0xbd, 0xe4, 0x29, 0xe0, 0xc1, 0x3c, 0xd4, 0x47, 0x58, 0xba, 0xfb, 0x27, 0x35, 0x68, - 0x1d, 0xf2, 0x50, 0x4b, 0x1a, 0x83, 0x1a, 0x8e, 0x89, 0x94, 0x2e, 0xfa, 0xcd, 0xbe, 0x01, 0x2d, - 0x1a, 0xa7, 0x24, 0x8d, 0x83, 0xf0, 0x44, 0x30, 0xf8, 0x83, 0x4a, 0xd7, 0xf1, 0x00, 0xe1, 0x43, - 0x42, 0x59, 0x07, 0xaa, 0xfe, 0x58, 0x31, 0x38, 0xfe, 0x64, 0x57, 0xa0, 0xe1, 0x8f, 0x53, 0xd1, - 0xbc, 0x36, 0xc1, 0xf3, 0xfe, 0x38, 0xa5, 0xa6, 0xbd, 0x0f, 0xed, 0x89, 0x7f, 0x3e, 0x46, 0x79, - 0xd6, 0x5c, 0xd1, 0xf6, 0x5a, 0x12, 0xdb, 0x45, 0xb6, 0xd8, 0x80, 0x15, 0x33, 0x8b, 0xaa, 0xbc, - 0xae, 0x2b, 0x5f, 0x36, 0x72, 0xcb, 0x36, 0xdc, 0x82, 0x25, 0xf5, 0x4d, 0x2c, 0xfa, 0x43, 0xbc, - 0xd2, 0xf4, 0x16, 0x25, 0xac, 0x7a, 0x79, 0x1b, 0x3a, 0xc7, 0x41, 0xe8, 0x8f, 0xfa, 0x83, 0x51, - 0x7a, 0xd6, 0x1f, 0xf2, 0x51, 0xea, 0x13, 0xd7, 0xd4, 0xbd, 0x45, 0xc2, 0xb7, 0x46, 0xe9, 0xd9, - 0x36, 0xa2, 0xec, 0x03, 0x68, 0x1e, 0x73, 0xde, 0xa7, 0xc1, 0xea, 0x36, 0x2c, 0x09, 0x54, 0x33, - 0xe4, 0x35, 0x8e, 0xd5, 0x5c, 0x7d, 0x00, 0x9d, 0x68, 0x9a, 0x9e, 0x44, 0x41, 0x78, 0xd2, 0x47, - 0x9d, 0xd7, 0x0f, 0x86, 0xc4, 0x45, 0xb5, 0x07, 0x95, 0xfb, 0x8e, 0xb7, 0xa8, 0x68, 0xa8, 0x7d, - 0x1e, 0x0f, 0xd9, 0x4d, 0x58, 0x1a, 0xf9, 0x49, 0xda, 0x3f, 0x8d, 0x26, 0xfd, 0xc9, 0xf4, 0xe8, - 0x25, 0x3f, 0xef, 0x2e, 0xd0, 0x40, 0x2c, 0x20, 0xbc, 0x1b, 0x4d, 0x0e, 0x08, 0x64, 0xef, 0x02, - 0x50, 0x3b, 0x45, 0x23, 0xe0, 0xba, 0x73, 0x7b, 0xc1, 0x6b, 0x22, 0x22, 0x2a, 0xfd, 0x04, 0x1a, - 0x34, 0x3d, 0xe9, 0xe8, 0xac, 0xdb, 0x22, 0x06, 0x7b, 0x4f, 0xb6, 0xd0, 0x98, 0xd8, 0xbb, 0xdb, - 0x3c, 0x49, 0x9f, 0x8d, 0xce, 0x70, 0xfd, 0x3e, 0xf7, 0xe6, 0x87, 0x22, 0xd5, 0xfb, 0x04, 0xda, - 0x26, 0x01, 0x67, 0x11, 0x9b, 0x81, 0xb3, 0x5f, 0xf3, 0xf0, 0x27, 0x5b, 0x85, 0xfa, 0x99, 0x3f, - 0x9a, 0x72, 0xa9, 0x48, 0x45, 0xe2, 0x93, 0xca, 0xc7, 0x8e, 0xfb, 0x27, 0x0e, 0xb4, 0x45, 0x0d, - 0xd2, 0x00, 0xb8, 0x01, 0x0b, 0x6a, 0xf8, 0x79, 0x1c, 0x47, 0xb1, 0xd4, 0x27, 0x36, 0xc8, 0xee, - 0x40, 0x47, 0x01, 0x93, 0x98, 0x07, 0x63, 0xff, 0x44, 0x95, 0x5d, 0xc0, 0xd9, 0x46, 0x56, 0x62, - 0x1c, 0x4d, 0x53, 0x2e, 0x97, 0x9a, 0xb6, 0xec, 0x9f, 0x87, 0x98, 0x67, 0x67, 0x41, 0x7d, 0x52, - 0xc2, 0x5b, 0x16, 0xe6, 0xfe, 0x3d, 0x07, 0x18, 0x36, 0xfd, 0x59, 0x24, 0x8a, 0x90, 0x6c, 0x91, - 0x67, 0x4b, 0xe7, 0xad, 0xd9, 0xb2, 0xf2, 0x26, 0xb6, 0x74, 0xa1, 0x2e, 0x5a, 0x5f, 0x2b, 0x69, - 0xbd, 0x20, 0x7d, 0x56, 0x6b, 0x54, 0x3b, 0x35, 0xf7, 0xbf, 0x54, 0x61, 0x75, 0x4b, 0xac, 0x95, - 0x9b, 0x83, 0x01, 0x9f, 0x68, 0x86, 0x7d, 0x0f, 0x5a, 0x61, 0x34, 0xe4, 0x8a, 0x4d, 0x44, 0xc3, - 0x00, 0x21, 0x83, 0x47, 0x4e, 0xfd, 0x20, 0x14, 0x0d, 0x17, 0xe3, 0xd9, 0x24, 0x84, 0x9a, 0x7d, - 0x13, 0x96, 0x26, 0x3c, 0x1c, 0x9a, 0x7c, 0x29, 0xac, 0x99, 0x05, 0x09, 0x4b, 0x96, 0x7c, 0x0f, - 0x5a, 0xc7, 0x53, 0x91, 0x0f, 0xa5, 0xb9, 0x46, 0x7c, 0x00, 0x12, 0xda, 0x14, 0x42, 0x3d, 0x99, - 0x26, 0xa7, 0x44, 0xad, 0x13, 0x75, 0x1e, 0xd3, 0x48, 0x7a, 0x17, 0x60, 0x38, 0x4d, 0x52, 0xc9, - 0xa6, 0x73, 0x44, 0x6c, 0x22, 0x22, 0xd8, 0xf4, 0xdb, 0xb0, 0x32, 0xf6, 0x5f, 0xf7, 0x89, 0x7f, - 0xfa, 0x41, 0xd8, 0x3f, 0x1e, 0x91, 0xba, 0x9f, 0xa7, 0x7c, 0x9d, 0xb1, 0xff, 0xfa, 0x07, 0x48, - 0x79, 0x1c, 0x3e, 0x24, 0x1c, 0x65, 0x59, 0xd9, 0x19, 0x31, 0x4f, 0x78, 0x7c, 0xc6, 0x49, 0xfc, - 0x6a, 0xda, 0x98, 0xf0, 0x04, 0x8a, 0x2d, 0x1a, 0x63, 0xbf, 0xd3, 0xd1, 0x40, 0xc8, 0x9a, 0x37, - 0x3f, 0x0e, 0xc2, 0xdd, 0x74, 0x34, 0x60, 0x57, 0x01, 0x50, 0x78, 0x27, 0x3c, 0xee, 0xbf, 0x7c, - 0x45, 0x82, 0x53, 0x23, 0x61, 0x3d, 0xe0, 0xf1, 0xe7, 0xaf, 0xd8, 0x3b, 0xd0, 0x1c, 0x24, 0x24, - 0xfd, 0xfe, 0x79, 0xb7, 0x45, 0x52, 0xd5, 0x18, 0x24, 0x28, 0xf7, 0xfe, 0x39, 0xfb, 0x00, 0x18, - 0xb6, 0xd6, 0xa7, 0x59, 0xe0, 0x43, 0x2a, 0x3e, 0x21, 0x35, 0xb6, 0x40, 0x8d, 0xdd, 0x94, 0x04, - 0xac, 0x27, 0x61, 0xdf, 0x80, 0x05, 0xd5, 0xd8, 0xe3, 0x91, 0x7f, 0x92, 0x90, 0x1c, 0x2f, 0x78, - 0x6d, 0x09, 0x3e, 0x44, 0xcc, 0x7d, 0x21, 0xac, 0x1b, 0x63, 0x6e, 0xa5, 0xdc, 0xe0, 0x3a, 0x4b, - 0x08, 0xcd, 0x6b, 0xc3, 0x93, 0xa9, 0xb2, 0x49, 0xab, 0x94, 0x4c, 0x9a, 0xfb, 0x0b, 0x07, 0xda, - 0xb2, 0x64, 0x32, 0x09, 0xd8, 0x7d, 0x60, 0x6a, 0x16, 0xd3, 0xd7, 0xc1, 0xb0, 0x7f, 0x74, 0x9e, - 0xf2, 0x44, 0x30, 0xcd, 0xee, 0x25, 0xaf, 0x84, 0x86, 0x8a, 0xcb, 0x42, 0x93, 0x34, 0x16, 0x3c, - 0xbd, 0x7b, 0xc9, 0x2b, 0x50, 0x50, 0xc4, 0xd0, 0xe8, 0x98, 0xa6, 0xfd, 0x20, 0x1c, 0xf2, 0xd7, - 0xc4, 0x4a, 0x0b, 0x9e, 0x85, 0x3d, 0x58, 0x84, 0xb6, 0xf9, 0x9d, 0xfb, 0x53, 0x68, 0x28, 0x93, - 0x85, 0x96, 0xeb, 0x5c, 0xbb, 0x3c, 0x03, 0x61, 0x3d, 0x68, 0xd8, 0xad, 0xf0, 0x1a, 0x5f, 0xa7, - 0x6e, 0xf7, 0x2f, 0x40, 0x67, 0x0f, 0x99, 0x28, 0x44, 0xa6, 0x95, 0x76, 0xd8, 0x1a, 0xcc, 0x19, - 0xc2, 0xd3, 0xf4, 0x64, 0x0a, 0x17, 0xbc, 0xd3, 0x28, 0x49, 0x65, 0x3d, 0xf4, 0xdb, 0xfd, 0x33, - 0x07, 0xd8, 0x4e, 0x92, 0x06, 0x63, 0x3f, 0xe5, 0x0f, 0xb9, 0x56, 0x0f, 0x4f, 0xa1, 0x8d, 0xa5, - 0x3d, 0x8b, 0x36, 0x85, 0x55, 0x24, 0x56, 0xf3, 0x6f, 0x49, 0x71, 0x2e, 0x7e, 0x70, 0xd7, 0xcc, - 0x2d, 0x14, 0xaf, 0x55, 0x00, 0x4a, 0x5b, 0xea, 0xc7, 0x27, 0x3c, 0x25, 0x93, 0x49, 0x1a, 0xdc, - 0x20, 0xa0, 0xad, 0x28, 0x3c, 0xee, 0xfd, 0x2e, 0x2c, 0x17, 0xca, 0x30, 0x75, 0x74, 0xb3, 0x44, - 0x47, 0x57, 0x4d, 0x1d, 0x3d, 0x80, 0x15, 0xab, 0x5d, 0x92, 0xe3, 0xba, 0x30, 0x8f, 0x82, 0x81, - 0x2b, 0xb3, 0x23, 0x56, 0x66, 0x99, 0x64, 0x1b, 0xb0, 0x7a, 0xcc, 0x79, 0xec, 0xa7, 0x94, 0x24, - 0xd1, 0xc1, 0x39, 0x91, 0x25, 0x97, 0xd2, 0xdc, 0xff, 0xee, 0xc0, 0x12, 0x6a, 0xd3, 0x27, 0x7e, - 0x78, 0xae, 0xc6, 0x6a, 0xaf, 0x74, 0xac, 0x6e, 0x1b, 0x0b, 0x93, 0x91, 0xfb, 0xeb, 0x0e, 0x54, - 0x35, 0x3f, 0x50, 0xec, 0x3a, 0xb4, 0xad, 0xe6, 0xd6, 0x85, 0x09, 0x98, 0xf8, 0xe9, 0x01, 0x8f, - 0x1f, 0x9c, 0xa7, 0xfc, 0xd7, 0x1f, 0xca, 0x9b, 0xd0, 0xc9, 0x9a, 0x2d, 0xc7, 0x91, 0x41, 0x0d, - 0x19, 0x53, 0x16, 0x40, 0xbf, 0xdd, 0x7f, 0xe4, 0x88, 0x8c, 0x5b, 0x51, 0xa0, 0xcd, 0x43, 0xcc, - 0x88, 0x56, 0xa6, 0xca, 0x88, 0xbf, 0x67, 0x9a, 0xd7, 0xbf, 0x7e, 0x67, 0x51, 0x27, 0x26, 0x3c, - 0x1c, 0xf6, 0xfd, 0xd1, 0x88, 0x14, 0x71, 0xc3, 0x9b, 0xc7, 0xf4, 0xe6, 0x68, 0xe4, 0xde, 0x82, - 0x65, 0xa3, 0x75, 0x6f, 0xe8, 0xc7, 0x3e, 0xb0, 0xbd, 0x20, 0x49, 0x9f, 0x87, 0xc9, 0xc4, 0xb0, - 0x9c, 0xde, 0x81, 0x26, 0x6a, 0x5b, 0x6c, 0x99, 0x90, 0xdc, 0xba, 0x87, 0xea, 0x17, 0xdb, 0x95, - 0x10, 0xd1, 0x7f, 0x2d, 0x89, 0x15, 0x49, 0xf4, 0x5f, 0x13, 0xd1, 0xfd, 0x18, 0x56, 0xac, 0xf2, - 0x64, 0xd5, 0xef, 0x43, 0x7d, 0x9a, 0xbe, 0x8e, 0x94, 0x6d, 0xdc, 0x92, 0x1c, 0x82, 0xbb, 0x30, - 0x4f, 0x50, 0xdc, 0x4f, 0x61, 0x79, 0x9f, 0xbf, 0x92, 0x82, 0xac, 0x1a, 0x72, 0xf3, 0xc2, 0x1d, - 0x1a, 0xd1, 0xdd, 0xbb, 0xc0, 0xcc, 0x8f, 0x33, 0x01, 0x50, 0xfb, 0x35, 0xc7, 0xda, 0xaf, 0xb9, - 0x37, 0x81, 0x1d, 0x06, 0x27, 0xe1, 0x13, 0x9e, 0x24, 0xfe, 0x89, 0x16, 0xfd, 0x0e, 0x54, 0xc7, - 0xc9, 0x89, 0x54, 0x55, 0xf8, 0xd3, 0xfd, 0x0e, 0xac, 0x58, 0xf9, 0x64, 0xc1, 0x57, 0xa1, 0x99, - 0x04, 0x27, 0xa1, 0x9f, 0x4e, 0x63, 0x2e, 0x8b, 0xce, 0x00, 0xf7, 0x21, 0xac, 0xfe, 0x80, 0xc7, - 0xc1, 0xf1, 0xf9, 0x45, 0xc5, 0xdb, 0xe5, 0x54, 0xf2, 0xe5, 0xec, 0xc0, 0xe5, 0x5c, 0x39, 0xb2, - 0x7a, 0xc1, 0xbe, 0x72, 0x26, 0x1b, 0x9e, 0x48, 0x18, 0xba, 0xaf, 0x62, 0xea, 0x3e, 0xf7, 0x39, - 0xb0, 0xad, 0x28, 0x0c, 0xf9, 0x20, 0x3d, 0xe0, 0x3c, 0xce, 0x5c, 0x45, 0x19, 0xaf, 0xb6, 0x36, - 0xd6, 0xe5, 0xc8, 0xe6, 0x15, 0xaa, 0x64, 0x62, 0x06, 0xb5, 0x09, 0x8f, 0xc7, 0x54, 0x70, 0xc3, - 0xa3, 0xdf, 0xee, 0x65, 0x58, 0xb1, 0x8a, 0x95, 0x9b, 0xeb, 0x0f, 0xe1, 0xf2, 0x76, 0x90, 0x0c, - 0x8a, 0x15, 0x76, 0x61, 0x7e, 0x32, 0x3d, 0xea, 0x67, 0x92, 0xa8, 0x92, 0xb8, 0xdf, 0xca, 0x7f, - 0x22, 0x0b, 0xfb, 0x1b, 0x0e, 0xd4, 0x76, 0x9f, 0xed, 0x6d, 0xe1, 0x5a, 0x11, 0x84, 0x83, 0x68, - 0x8c, 0x56, 0x98, 0xe8, 0xb4, 0x4e, 0xcf, 0x94, 0xb0, 0xab, 0xd0, 0x24, 0xe3, 0x0d, 0xb7, 0x98, - 0xd2, 0x0e, 0xca, 0x00, 0xdc, 0xde, 0xf2, 0xd7, 0x93, 0x20, 0xa6, 0xfd, 0xab, 0xda, 0x95, 0xd6, - 0x68, 0x99, 0x29, 0x12, 0xdc, 0x5f, 0xcc, 0xc3, 0xbc, 0x5c, 0x7c, 0xc5, 0x42, 0x9e, 0x06, 0x67, - 0x3c, 0x5b, 0xc8, 0x31, 0x85, 0x86, 0x71, 0xcc, 0xc7, 0x51, 0xaa, 0xed, 0x37, 0x31, 0x0d, 0x36, - 0x48, 0xdb, 0x77, 0x69, 0x44, 0x88, 0x0d, 0x7f, 0x55, 0xe4, 0xb2, 0x40, 0x76, 0x15, 0xe6, 0x95, - 0x31, 0x50, 0xd3, 0x3b, 0x0b, 0x05, 0xe1, 0x68, 0x0c, 0xfc, 0x89, 0x3f, 0x08, 0xd2, 0x73, 0xa9, - 0x16, 0x74, 0x1a, 0xcb, 0x1f, 0x45, 0x03, 0x7f, 0xd4, 0x3f, 0xf2, 0x47, 0x7e, 0x38, 0xe0, 0xca, - 0x3d, 0x60, 0x81, 0xb8, 0x55, 0x96, 0xcd, 0x52, 0xd9, 0xc4, 0x76, 0x3a, 0x87, 0xe2, 0x1a, 0x3e, - 0x88, 0xc6, 0xe3, 0x20, 0xc5, 0x1d, 0x36, 0x99, 0x66, 0x55, 0xcf, 0x40, 0x84, 0x33, 0x82, 0x52, - 0xaf, 0xc4, 0x08, 0x36, 0x95, 0x33, 0xc2, 0x00, 0xb1, 0x94, 0x9c, 0x85, 0x56, 0xf5, 0x0c, 0x04, - 0xe7, 0x62, 0x1a, 0x26, 0x3c, 0x4d, 0x47, 0x7c, 0xa8, 0x1b, 0xd4, 0xa2, 0x6c, 0x45, 0x02, 0xbb, - 0x0f, 0x2b, 0x62, 0xd3, 0x9f, 0xf8, 0x69, 0x94, 0x9c, 0x06, 0x49, 0x3f, 0xc1, 0xdd, 0xaf, 0xd8, - 0x7c, 0x96, 0x91, 0xd8, 0xc7, 0xb0, 0x9e, 0x83, 0x63, 0x3e, 0xe0, 0xc1, 0x19, 0x1f, 0x92, 0x09, - 0x57, 0xf5, 0x66, 0x91, 0xd9, 0x75, 0x68, 0x85, 0xd3, 0x71, 0x7f, 0x3a, 0x19, 0xfa, 0x68, 0xc4, - 0x2c, 0x92, 0x71, 0x69, 0x42, 0xec, 0x43, 0x50, 0x76, 0x9a, 0xb4, 0x1e, 0x97, 0x2c, 0x0d, 0x87, - 0xdc, 0xeb, 0xd9, 0x39, 0x90, 0x31, 0x33, 0x93, 0xb4, 0x23, 0x37, 0x7a, 0x0a, 0x20, 0x39, 0x89, - 0x83, 0x33, 0x3f, 0xe5, 0xdd, 0x65, 0xa1, 0xd4, 0x65, 0x12, 0xbf, 0x0b, 0xc2, 0x20, 0x0d, 0xfc, - 0x34, 0x8a, 0xbb, 0x8c, 0x68, 0x19, 0x80, 0x83, 0x48, 0xfc, 0x91, 0xa4, 0x7e, 0x3a, 0x4d, 0xa4, - 0x85, 0xba, 0x42, 0xcc, 0x55, 0x24, 0xb0, 0x8f, 0x60, 0x4d, 0x70, 0x04, 0x91, 0xa4, 0xed, 0x4d, - 0xa6, 0xc2, 0x2a, 0x8d, 0xc8, 0x0c, 0x2a, 0x0e, 0xa5, 0x64, 0x91, 0xc2, 0x87, 0x97, 0xc5, 0x50, - 0xce, 0x20, 0x63, 0xfb, 0xb0, 0x05, 0xc1, 0xa0, 0x2f, 0x73, 0xa0, 0x88, 0xac, 0x51, 0x2f, 0x8a, - 0x04, 0x64, 0xf1, 0x51, 0x70, 0xcc, 0xd3, 0x60, 0xcc, 0xbb, 0xeb, 0x82, 0xc5, 0x55, 0x1a, 0x05, - 0x70, 0x3a, 0x21, 0x4a, 0x57, 0x08, 0xbc, 0x48, 0xb9, 0x7f, 0xe0, 0x88, 0xc5, 0x47, 0x0a, 0x6a, - 0x62, 0x6c, 0xab, 0x84, 0x88, 0xf6, 0xa3, 0x70, 0x74, 0x2e, 0xa5, 0x16, 0x04, 0xf4, 0x34, 0x1c, - 0x9d, 0xa3, 0x61, 0x1f, 0x84, 0x66, 0x16, 0xa1, 0xe7, 0xda, 0x0a, 0xa4, 0x4c, 0xef, 0x41, 0x6b, - 0x32, 0x3d, 0x1a, 0x05, 0x03, 0x91, 0xa5, 0x2a, 0x4a, 0x11, 0x10, 0x65, 0xc0, 0x7d, 0xa5, 0x98, - 0x29, 0x91, 0xa3, 0x46, 0x39, 0x5a, 0x12, 0xc3, 0x2c, 0xee, 0x03, 0x58, 0xb5, 0x1b, 0x28, 0x15, - 0xfa, 0x1d, 0x68, 0x48, 0xf9, 0x4f, 0xe4, 0xe6, 0x7e, 0xd1, 0xf0, 0xb3, 0xe2, 0x36, 0x48, 0xd3, - 0xdd, 0x7f, 0x53, 0x83, 0x15, 0x89, 0x6e, 0x8d, 0xa2, 0x84, 0x1f, 0x4e, 0xc7, 0x63, 0x3f, 0x2e, - 0x51, 0x2c, 0xce, 0x05, 0x8a, 0xa5, 0x52, 0x54, 0x2c, 0xd7, 0xac, 0xfd, 0xa5, 0xd0, 0x4c, 0x06, - 0xc2, 0x6e, 0xc3, 0xd2, 0x60, 0x14, 0x25, 0xc2, 0xdc, 0x37, 0x5d, 0x7d, 0x79, 0xb8, 0xa8, 0x0c, - 0xeb, 0x65, 0xca, 0xd0, 0x54, 0x64, 0x73, 0x39, 0x45, 0xe6, 0x42, 0x1b, 0x0b, 0xe5, 0x4a, 0x37, - 0xcf, 0xcb, 0xcd, 0x96, 0x81, 0x61, 0x7b, 0xf2, 0x6a, 0x43, 0xe8, 0xa8, 0xa5, 0x32, 0xa5, 0x11, - 0x8c, 0x39, 0xe9, 0x7e, 0x23, 0x77, 0x53, 0x2a, 0x8d, 0x22, 0x89, 0x3d, 0x04, 0x10, 0x75, 0x91, - 0x01, 0x02, 0x64, 0x80, 0xdc, 0xb4, 0x67, 0xc5, 0x1c, 0xff, 0xbb, 0x98, 0x98, 0xc6, 0x9c, 0x8c, - 0x12, 0xe3, 0x4b, 0xf7, 0x6f, 0x39, 0xd0, 0x32, 0x68, 0xec, 0x32, 0x2c, 0x6f, 0x3d, 0x7d, 0x7a, - 0xb0, 0xe3, 0x6d, 0x3e, 0x7b, 0xfc, 0x83, 0x9d, 0xfe, 0xd6, 0xde, 0xd3, 0xc3, 0x9d, 0xce, 0x25, - 0x84, 0xf7, 0x9e, 0x6e, 0x6d, 0xee, 0xf5, 0x1f, 0x3e, 0xf5, 0xb6, 0x14, 0xec, 0xb0, 0x35, 0x60, - 0xde, 0xce, 0x93, 0xa7, 0xcf, 0x76, 0x2c, 0xbc, 0xc2, 0x3a, 0xd0, 0x7e, 0xe0, 0xed, 0x6c, 0x6e, - 0xed, 0x4a, 0xa4, 0xca, 0x56, 0xa1, 0xf3, 0xf0, 0xf9, 0xfe, 0xf6, 0xe3, 0xfd, 0x47, 0xfd, 0xad, - 0xcd, 0xfd, 0xad, 0x9d, 0xbd, 0x9d, 0xed, 0x4e, 0x8d, 0x2d, 0x40, 0x73, 0xf3, 0xc1, 0xe6, 0xfe, - 0xf6, 0xd3, 0xfd, 0x9d, 0xed, 0x4e, 0xdd, 0xfd, 0xaf, 0x0e, 0x5c, 0xa6, 0x56, 0x0f, 0xf3, 0x42, - 0x72, 0x1d, 0x5a, 0x83, 0x28, 0x9a, 0xa0, 0xe1, 0x9f, 0x2d, 0x6d, 0x26, 0x84, 0x02, 0x20, 0x94, - 0xc2, 0x71, 0x14, 0x0f, 0xb8, 0x94, 0x11, 0x20, 0xe8, 0x21, 0x22, 0x28, 0x00, 0x72, 0x7a, 0x45, - 0x0e, 0x21, 0x22, 0x2d, 0x81, 0x89, 0x2c, 0x6b, 0x30, 0x77, 0x14, 0x73, 0x7f, 0x70, 0x2a, 0xa5, - 0x43, 0xa6, 0xd8, 0x37, 0xb3, 0x9d, 0xe9, 0x00, 0x47, 0x7f, 0xc4, 0x87, 0xc4, 0x31, 0x0d, 0x6f, - 0x49, 0xe2, 0x5b, 0x12, 0x46, 0x2d, 0xe8, 0x1f, 0xf9, 0xe1, 0x30, 0x0a, 0xf9, 0x50, 0x9a, 0xbd, - 0x19, 0xe0, 0x1e, 0xc0, 0x5a, 0xbe, 0x7f, 0x52, 0xc6, 0x3e, 0x32, 0x64, 0x4c, 0x58, 0xa1, 0xbd, - 0xd9, 0xb3, 0x69, 0xc8, 0xdb, 0x2f, 0x2b, 0x50, 0x43, 0xa3, 0x64, 0xb6, 0x01, 0x63, 0xda, 0x99, - 0xd5, 0xc2, 0xb9, 0x00, 0x6d, 0x76, 0xc5, 0x12, 0x25, 0x1d, 0x2d, 0x19, 0x92, 0xd1, 0x63, 0x3e, - 0x38, 0x93, 0xae, 0x16, 0x03, 0x41, 0x01, 0xc1, 0x4d, 0x00, 0x7d, 0x2d, 0x05, 0x44, 0xa5, 0x15, - 0x8d, 0xbe, 0x9c, 0xcf, 0x68, 0xf4, 0x5d, 0x17, 0xe6, 0x83, 0xf0, 0x28, 0x9a, 0x86, 0x43, 0x12, - 0x88, 0x86, 0xa7, 0x92, 0x74, 0x12, 0x41, 0x82, 0x8a, 0xfa, 0x53, 0xb0, 0x7f, 0x06, 0xb0, 0x0d, - 0x68, 0x26, 0xe7, 0xe1, 0xc0, 0xe4, 0xf9, 0x55, 0x39, 0x4a, 0x38, 0x06, 0x77, 0x0f, 0xcf, 0xc3, - 0x01, 0x71, 0x78, 0x96, 0xcd, 0xfd, 0x5d, 0x68, 0x28, 0x18, 0xd9, 0xf2, 0xf9, 0xfe, 0xe7, 0xfb, - 0x4f, 0x5f, 0xec, 0xf7, 0x0f, 0x7f, 0xb8, 0xbf, 0xd5, 0xb9, 0xc4, 0x96, 0xa0, 0xb5, 0xb9, 0x45, - 0x9c, 0x4e, 0x80, 0x83, 0x59, 0x0e, 0x36, 0x0f, 0x0f, 0x35, 0x52, 0x71, 0x19, 0x6e, 0xe4, 0x13, - 0xb2, 0xfc, 0xb4, 0xa7, 0xfd, 0x23, 0x58, 0x36, 0xb0, 0x6c, 0x17, 0x31, 0x41, 0x20, 0xb7, 0x8b, - 0x20, 0x93, 0x51, 0x50, 0xdc, 0x0e, 0x2c, 0x3e, 0xe2, 0xe9, 0xe3, 0xf0, 0x38, 0x52, 0x25, 0xfd, - 0xcf, 0x1a, 0x2c, 0x69, 0x48, 0x16, 0x74, 0x1b, 0x96, 0x82, 0x21, 0x0f, 0xd3, 0x20, 0x3d, 0xef, - 0x5b, 0xfe, 0x82, 0x3c, 0x8c, 0xa6, 0xb6, 0x3f, 0x0a, 0x7c, 0x75, 0xe0, 0x23, 0x12, 0xb8, 0x7f, - 0x46, 0x1b, 0xc0, 0xf4, 0xdb, 0x10, 0x5f, 0x09, 0x37, 0x45, 0x29, 0x0d, 0x35, 0x10, 0xe2, 0x72, - 0x99, 0xd1, 0x9f, 0x08, 0x93, 0xb3, 0x8c, 0x84, 0x53, 0x25, 0x4a, 0xc2, 0x2e, 0xd7, 0x85, 0x9d, - 0xa0, 0x81, 0xc2, 0x89, 0xca, 0x9c, 0xd0, 0x8f, 0xf9, 0x13, 0x15, 0xe3, 0x54, 0xa6, 0x51, 0x38, - 0x95, 0x41, 0xfd, 0x79, 0x1e, 0x0e, 0xf8, 0xb0, 0x9f, 0x46, 0x7d, 0xd2, 0xf3, 0xc4, 0x12, 0x0d, - 0x2f, 0x0f, 0xe3, 0xba, 0x91, 0xf2, 0x24, 0x0d, 0xb9, 0x70, 0x4d, 0x37, 0xc8, 0x0b, 0xaa, 0x20, - 0xdc, 0x1f, 0x4c, 0xe3, 0x20, 0xe9, 0xb6, 0xe9, 0xbc, 0x85, 0x7e, 0xb3, 0xef, 0xc2, 0xe5, 0x23, - 0x9e, 0xa4, 0xfd, 0x53, 0xee, 0x0f, 0x79, 0x4c, 0xec, 0x25, 0x0e, 0x76, 0x84, 0xc9, 0x55, 0x4e, - 0x44, 0xc6, 0x3d, 0xe3, 0x71, 0x12, 0x44, 0x21, 0x19, 0x5b, 0x4d, 0x4f, 0x25, 0xb1, 0x3c, 0xec, - 0xbc, 0x5e, 0xa8, 0xf5, 0x08, 0x2e, 0x51, 0xc7, 0xcb, 0x89, 0xec, 0x06, 0xcc, 0x51, 0x07, 0x92, - 0x6e, 0x87, 0x78, 0xa6, 0x9d, 0xc9, 0x7c, 0x10, 0x7a, 0x92, 0x86, 0xb3, 0x3c, 0x88, 0x46, 0x51, - 0x4c, 0x16, 0x57, 0xd3, 0x13, 0x09, 0x7b, 0x74, 0x4e, 0x62, 0x7f, 0x72, 0x2a, 0xad, 0xae, 0x3c, - 0xfc, 0x59, 0xad, 0xd1, 0xea, 0xb4, 0xdd, 0xff, 0x0f, 0xea, 0x54, 0x2c, 0x15, 0x47, 0x83, 0xe9, - 0xc8, 0xe2, 0x08, 0xed, 0xc2, 0x7c, 0xc8, 0xd3, 0x57, 0x51, 0xfc, 0x52, 0x9d, 0x1e, 0xca, 0xa4, - 0xfb, 0x33, 0xda, 0xa1, 0xe9, 0xd3, 0xb4, 0xe7, 0x64, 0x5a, 0xe2, 0x3e, 0x5b, 0x4c, 0x55, 0x72, - 0xea, 0xcb, 0x4d, 0x63, 0x83, 0x80, 0xc3, 0x53, 0x1f, 0x75, 0xad, 0x35, 0xfb, 0x62, 0x1f, 0xde, - 0x22, 0x6c, 0x57, 0x4c, 0xfe, 0x0d, 0x58, 0x54, 0xe7, 0x74, 0x49, 0x7f, 0xc4, 0x8f, 0x53, 0xe5, - 0x45, 0x0b, 0xa7, 0x63, 0xda, 0xac, 0xef, 0xf1, 0xe3, 0xd4, 0xdd, 0x87, 0x65, 0xa9, 0xff, 0x9e, - 0x4e, 0xb8, 0xaa, 0xfa, 0xb7, 0xcb, 0x6c, 0x89, 0xd6, 0xc6, 0x8a, 0xad, 0x30, 0xc5, 0xc9, 0xa4, - 0x9d, 0xd3, 0xf5, 0x80, 0x99, 0xfa, 0x54, 0x16, 0x28, 0x17, 0x73, 0xe5, 0x27, 0x94, 0xdd, 0xb1, - 0x30, 0x1c, 0x9f, 0x64, 0x3a, 0x18, 0xa8, 0xd3, 0xd5, 0x86, 0xa7, 0x92, 0xee, 0x1f, 0x39, 0xb0, - 0x42, 0xa5, 0x29, 0x6b, 0x48, 0xae, 0x59, 0x1f, 0x7f, 0x8d, 0x66, 0x2a, 0x2f, 0xad, 0xf0, 0x4d, - 0xae, 0x42, 0xdd, 0x5c, 0xc5, 0x44, 0xe2, 0xeb, 0xfb, 0x64, 0x6a, 0x79, 0x9f, 0x8c, 0xfb, 0xf7, - 0x1d, 0x58, 0x16, 0x0b, 0x09, 0x59, 0xdb, 0xb2, 0xfb, 0xff, 0x3f, 0x2c, 0x08, 0x8b, 0x40, 0x6a, - 0x05, 0xd9, 0xd0, 0x4c, 0xb5, 0x12, 0x2a, 0x32, 0xef, 0x5e, 0xf2, 0xec, 0xcc, 0xec, 0x53, 0xb2, - 0xca, 0xc2, 0x3e, 0xa1, 0x25, 0xe7, 0xf0, 0xf6, 0x58, 0xef, 0x5e, 0xf2, 0x8c, 0xec, 0x0f, 0x1a, - 0x68, 0x2c, 0x23, 0xee, 0x3e, 0x82, 0x05, 0xab, 0x22, 0xcb, 0x1f, 0xd4, 0x16, 0xfe, 0xa0, 0x82, - 0xe3, 0xb5, 0x52, 0xe2, 0x78, 0xfd, 0x57, 0x55, 0x60, 0xc8, 0x2c, 0xb9, 0xd9, 0xb8, 0x6e, 0x9f, - 0x5e, 0xa8, 0x23, 0xf9, 0x0c, 0x62, 0x1b, 0xc0, 0x8c, 0xa4, 0x3a, 0x55, 0xa9, 0xea, 0x53, 0x95, - 0x12, 0x2a, 0xaa, 0x5a, 0x69, 0x75, 0xe8, 0x13, 0x0b, 0xda, 0xeb, 0x8b, 0xa1, 0x2f, 0xa5, 0xe1, - 0xca, 0x48, 0xc7, 0x17, 0xb8, 0x2b, 0x91, 0xfb, 0x63, 0x95, 0xce, 0xcf, 0xf1, 0xdc, 0x85, 0x73, - 0x3c, 0x5f, 0xf0, 0xbb, 0x19, 0x3b, 0xb4, 0x86, 0xbd, 0x43, 0xbb, 0x01, 0x0b, 0xea, 0x94, 0x42, - 0x9c, 0x88, 0xca, 0xed, 0xb0, 0x05, 0xb2, 0x3b, 0xd0, 0x51, 0x9b, 0x24, 0xbd, 0x0d, 0x14, 0xe7, - 0x7d, 0x05, 0x1c, 0xd7, 0x80, 0xcc, 0x13, 0xd7, 0xa2, 0xc6, 0x66, 0x00, 0xed, 0xa9, 0x90, 0x4b, - 0xfa, 0xd3, 0x50, 0x1e, 0xc7, 0xf3, 0x21, 0x6d, 0x84, 0x71, 0x4f, 0x95, 0x27, 0xb8, 0x7f, 0xc7, - 0x81, 0x0e, 0xce, 0x9b, 0xc5, 0x9a, 0x9f, 0x00, 0x49, 0xc6, 0x5b, 0x72, 0xa6, 0x95, 0x97, 0x7d, - 0x0c, 0x4d, 0x4a, 0x47, 0x13, 0x1e, 0x4a, 0xbe, 0xec, 0xda, 0x7c, 0x99, 0xe9, 0x94, 0xdd, 0x4b, - 0x5e, 0x96, 0xd9, 0xe0, 0xca, 0xff, 0xe8, 0x40, 0x4b, 0xd6, 0xf2, 0x2b, 0x7b, 0x7a, 0x7a, 0x46, - 0xfc, 0x84, 0x30, 0xc0, 0xb2, 0x70, 0x89, 0xdb, 0xb0, 0x34, 0xf6, 0xd3, 0x69, 0x8c, 0x6b, 0xba, - 0xe5, 0xe5, 0xc9, 0xc3, 0xb8, 0x40, 0x93, 0xfa, 0x4c, 0xfa, 0x69, 0x30, 0xea, 0x2b, 0xaa, 0x8c, - 0x54, 0x28, 0x23, 0xa1, 0x16, 0x49, 0x52, 0xff, 0x84, 0xcb, 0xb5, 0x57, 0x24, 0xdc, 0x2e, 0xac, - 0x1d, 0x64, 0x27, 0x37, 0x86, 0x8d, 0xed, 0xfe, 0x8b, 0x05, 0x58, 0x2f, 0x90, 0x74, 0x5c, 0x95, - 0x74, 0x5d, 0x8c, 0x82, 0xf1, 0x51, 0xa4, 0x37, 0x28, 0x8e, 0xe9, 0xd5, 0xb0, 0x48, 0xec, 0x04, - 0x2e, 0x2b, 0x23, 0x03, 0xc7, 0x34, 0x5b, 0x10, 0x2b, 0xb4, 0xd2, 0x7d, 0x68, 0x4f, 0x61, 0xbe, - 0x42, 0x85, 0x9b, 0x82, 0x5c, 0x5e, 0x1e, 0x3b, 0x85, 0xae, 0xb6, 0x66, 0xa4, 0xc2, 0x36, 0x2c, - 0x1e, 0xac, 0xeb, 0x83, 0x0b, 0xea, 0xb2, 0x4c, 0x72, 0x6f, 0x66, 0x69, 0xec, 0x1c, 0xae, 0x29, - 0x1a, 0x69, 0xe4, 0x62, 0x7d, 0xb5, 0xb7, 0xea, 0x1b, 0x6d, 0x36, 0xec, 0x4a, 0x2f, 0x28, 0x98, - 0xfd, 0x14, 0xd6, 0x5e, 0xf9, 0x41, 0xaa, 0x9a, 0x65, 0xd8, 0x17, 0x75, 0xaa, 0x72, 0xe3, 0x82, - 0x2a, 0x5f, 0x88, 0x8f, 0xad, 0x65, 0x6a, 0x46, 0x89, 0xbd, 0x3f, 0xad, 0xc0, 0xa2, 0x5d, 0x0e, - 0xb2, 0xa9, 0x94, 0x7d, 0xa5, 0x03, 0x95, 0x45, 0x9a, 0x83, 0x8b, 0xfb, 0xfc, 0x4a, 0xd9, 0x3e, - 0xdf, 0xdc, 0x59, 0x57, 0x2f, 0x72, 0x11, 0xd6, 0xde, 0xce, 0x45, 0x58, 0x2f, 0x75, 0x11, 0xce, - 0xf6, 0x24, 0xcd, 0xfd, 0xaa, 0x9e, 0xa4, 0xf9, 0x37, 0x7a, 0x92, 0x7a, 0xff, 0xdb, 0x01, 0x56, - 0xe4, 0x5e, 0xf6, 0x48, 0xb8, 0x36, 0x42, 0x3e, 0x92, 0x4a, 0xec, 0xdb, 0x6f, 0x27, 0x01, 0x6a, - 0xb6, 0xd4, 0xd7, 0x28, 0x8a, 0x66, 0x70, 0x93, 0x69, 0x62, 0x2d, 0x78, 0x65, 0xa4, 0x9c, 0x9b, - 0xb4, 0x76, 0xb1, 0x9b, 0xb4, 0x7e, 0xb1, 0x9b, 0x74, 0x2e, 0xef, 0x26, 0xed, 0xfd, 0x75, 0x07, - 0x56, 0x4a, 0xd8, 0xec, 0x37, 0xd7, 0x71, 0x64, 0x0c, 0x4b, 0xfb, 0x54, 0x24, 0x63, 0x98, 0x60, - 0xef, 0x2f, 0xc3, 0x82, 0x25, 0x5a, 0xbf, 0xb9, 0xfa, 0xf3, 0x56, 0xa2, 0xe0, 0x6c, 0x0b, 0xeb, - 0xfd, 0xaf, 0x0a, 0xb0, 0xa2, 0x78, 0xff, 0x3f, 0x6d, 0x43, 0x71, 0x9c, 0xaa, 0x25, 0xe3, 0xf4, - 0x7f, 0x75, 0xe5, 0xf9, 0x00, 0x96, 0x65, 0xc4, 0xa6, 0xe1, 0xcc, 0x12, 0x1c, 0x53, 0x24, 0xa0, - 0x9d, 0x6c, 0xfb, 0xa8, 0x1b, 0x56, 0x84, 0x9a, 0xb1, 0xfc, 0xe6, 0x5c, 0xd5, 0x6e, 0x0f, 0xba, - 0x72, 0x84, 0x76, 0xce, 0x78, 0x98, 0x1e, 0x4e, 0x8f, 0x44, 0xc8, 0x62, 0x10, 0x85, 0x64, 0x06, - 0x9a, 0x44, 0x69, 0x50, 0x7c, 0x17, 0xda, 0xe6, 0xf2, 0x21, 0xa7, 0x23, 0xe7, 0xcf, 0x44, 0x53, - 0xc2, 0xcc, 0xc5, 0xb6, 0x61, 0x91, 0x94, 0xe4, 0x50, 0x7f, 0x57, 0xa1, 0xef, 0xde, 0xe0, 0xa3, - 0xd9, 0xbd, 0xe4, 0xe5, 0xbe, 0x61, 0xbf, 0x03, 0x8b, 0xf6, 0x06, 0x50, 0x5a, 0x25, 0x65, 0x3b, - 0x02, 0xfc, 0xdc, 0xce, 0xcc, 0x36, 0xa1, 0x93, 0xdf, 0x41, 0xca, 0x68, 0x9e, 0x19, 0x05, 0x14, - 0xb2, 0xb3, 0x8f, 0xe5, 0x81, 0x65, 0x9d, 0x7c, 0x27, 0x37, 0xec, 0xcf, 0x8c, 0x61, 0xba, 0x2b, - 0xfe, 0x18, 0x47, 0x98, 0xbf, 0x07, 0x90, 0x61, 0xac, 0x03, 0xed, 0xa7, 0x07, 0x3b, 0xfb, 0xfd, - 0xad, 0xdd, 0xcd, 0xfd, 0xfd, 0x9d, 0xbd, 0xce, 0x25, 0xc6, 0x60, 0x91, 0x5c, 0x7d, 0xdb, 0x1a, - 0x73, 0x10, 0x93, 0xce, 0x15, 0x85, 0x55, 0xd8, 0x2a, 0x74, 0x1e, 0xef, 0xe7, 0xd0, 0xea, 0x83, - 0xa6, 0x96, 0x0f, 0x77, 0x0d, 0x56, 0x45, 0x44, 0xee, 0x03, 0xc1, 0x1e, 0xca, 0x3a, 0xf9, 0xc7, - 0x0e, 0x5c, 0xce, 0x11, 0xb2, 0x90, 0x2f, 0x61, 0x80, 0xd8, 0x56, 0x89, 0x0d, 0xd2, 0x01, 0x84, - 0xb2, 0x35, 0x73, 0x1a, 0xa4, 0x48, 0x40, 0x9e, 0x37, 0x6c, 0xd3, 0x9c, 0x24, 0x95, 0x91, 0xdc, - 0x75, 0x1d, 0x59, 0x93, 0x6b, 0xf8, 0xb1, 0x88, 0xf4, 0x35, 0x09, 0xd9, 0x01, 0xb0, 0xdd, 0x64, - 0x95, 0xc4, 0x6d, 0x85, 0x65, 0xec, 0xd8, 0xed, 0x2d, 0xa5, 0xb9, 0xff, 0xae, 0x0a, 0xec, 0xfb, - 0x53, 0x1e, 0x9f, 0x53, 0x4c, 0x97, 0xf6, 0x9c, 0xae, 0xe7, 0xfd, 0x82, 0x73, 0x93, 0xe9, 0xd1, - 0xe7, 0xfc, 0x5c, 0x05, 0x4b, 0x56, 0xde, 0x2a, 0x58, 0xb2, 0x2c, 0x58, 0xb1, 0x76, 0x71, 0xb0, - 0x62, 0xfd, 0xa2, 0x60, 0xc5, 0x6f, 0xc0, 0x42, 0x70, 0x12, 0x46, 0xa8, 0x0e, 0xd0, 0x84, 0x48, - 0xba, 0x73, 0xd7, 0xab, 0xb8, 0xf5, 0x96, 0xe0, 0x3e, 0x62, 0xec, 0xd3, 0x2c, 0x13, 0x1f, 0x9e, - 0x50, 0x70, 0xad, 0xa9, 0x20, 0x76, 0x86, 0x27, 0x7c, 0x2f, 0x1a, 0xf8, 0x69, 0x14, 0xd3, 0x3e, - 0x4d, 0x7d, 0x8c, 0x78, 0xc2, 0x6e, 0xc0, 0x62, 0x12, 0x4d, 0xd1, 0xa8, 0x52, 0xc3, 0x20, 0x1c, - 0x4d, 0x6d, 0x81, 0x1e, 0x88, 0xc1, 0xb8, 0x0b, 0x2b, 0xd3, 0x84, 0xf7, 0xc7, 0x41, 0x92, 0xe0, - 0xc2, 0x39, 0x88, 0xc2, 0x34, 0x8e, 0x46, 0xd2, 0xdd, 0xb4, 0x3c, 0x4d, 0xf8, 0x13, 0x41, 0xd9, - 0x12, 0x04, 0xf6, 0xdd, 0xac, 0x49, 0x13, 0x3f, 0x88, 0x93, 0x2e, 0x50, 0x93, 0x54, 0x4f, 0xb1, - 0xdd, 0x07, 0x7e, 0x10, 0xeb, 0xb6, 0x60, 0x22, 0xc9, 0x05, 0x51, 0xb6, 0x72, 0x41, 0x94, 0x32, - 0xfe, 0xee, 0x2e, 0x34, 0xd4, 0xe7, 0xb8, 0x07, 0x3e, 0x8e, 0xa3, 0xb1, 0xda, 0x03, 0xe3, 0x6f, - 0xb6, 0x08, 0x95, 0x34, 0x92, 0xfb, 0xd7, 0x4a, 0x1a, 0xb9, 0xbf, 0x0f, 0x2d, 0x63, 0x04, 0xd8, - 0xfb, 0x62, 0x3b, 0x8e, 0xb6, 0x96, 0xdc, 0x3c, 0x8b, 0x53, 0x94, 0xa6, 0x44, 0x1f, 0x0f, 0xd9, - 0xb7, 0x60, 0x79, 0x18, 0xc4, 0x9c, 0xe2, 0x7c, 0xfb, 0x31, 0x3f, 0xe3, 0x71, 0xa2, 0x5c, 0x0d, - 0x1d, 0x4d, 0xf0, 0x04, 0xee, 0xf6, 0x61, 0xc5, 0xe2, 0x2a, 0x2d, 0x74, 0x73, 0x14, 0x34, 0xa8, - 0xbc, 0x9d, 0x76, 0x40, 0xa1, 0xa4, 0xe1, 0x72, 0x25, 0xbd, 0x24, 0xfd, 0x49, 0x1c, 0x1d, 0x51, - 0x25, 0x8e, 0x67, 0x61, 0xee, 0x2f, 0x2b, 0x50, 0xdd, 0x8d, 0x26, 0xe6, 0xd9, 0x8f, 0x53, 0x3c, - 0xfb, 0x91, 0x76, 0x65, 0x5f, 0x9b, 0x8d, 0x72, 0xf1, 0xb7, 0x40, 0x76, 0x07, 0x16, 0x91, 0x83, - 0xd3, 0x08, 0xed, 0xe8, 0x57, 0x7e, 0x2c, 0x22, 0x0c, 0xab, 0xc4, 0x16, 0x39, 0x0a, 0x5b, 0x85, - 0xaa, 0x36, 0x87, 0x28, 0x03, 0x26, 0x71, 0x13, 0x47, 0xe7, 0xeb, 0xe7, 0xd2, 0xa5, 0x29, 0x53, - 0xa8, 0x10, 0xec, 0xef, 0x85, 0x98, 0x88, 0x45, 0xad, 0x8c, 0x84, 0x36, 0x2e, 0x0a, 0xc2, 0x38, - 0x33, 0x19, 0x75, 0xda, 0x74, 0xd6, 0x37, 0x6c, 0x67, 0xfd, 0x75, 0x68, 0xa5, 0xa3, 0xb3, 0xfe, - 0xc4, 0x3f, 0x1f, 0x45, 0xfe, 0x50, 0x32, 0xa0, 0x09, 0xb1, 0xfb, 0x00, 0xe3, 0xc9, 0xa4, 0x8f, - 0xeb, 0x68, 0x3c, 0xa4, 0x9d, 0x79, 0x6b, 0xa3, 0x23, 0x47, 0xff, 0xc9, 0xc1, 0x81, 0x47, 0xb8, - 0x67, 0xe4, 0x71, 0x5f, 0x40, 0x53, 0x13, 0xcc, 0xd0, 0x54, 0x8a, 0xb0, 0x68, 0xd9, 0xa1, 0xa9, - 0x14, 0x50, 0x71, 0x13, 0x16, 0x85, 0xf2, 0xd4, 0xea, 0x40, 0x9c, 0x8a, 0xe7, 0x50, 0xf7, 0xcf, - 0x1d, 0xa8, 0xd3, 0x84, 0xa3, 0x35, 0x21, 0x68, 0xfa, 0xac, 0x8a, 0x26, 0x71, 0xc1, 0xcb, 0xc3, - 0xcc, 0xb5, 0xc2, 0xe4, 0x2b, 0x7a, 0xf4, 0xcd, 0x50, 0xf9, 0xeb, 0xd0, 0xd4, 0x35, 0x19, 0x33, - 0x98, 0x81, 0xec, 0x1a, 0xd4, 0x4e, 0xa3, 0x89, 0xda, 0x70, 0x81, 0x3a, 0xce, 0x8e, 0x26, 0x1e, - 0xe1, 0x59, 0x7b, 0xb0, 0x3c, 0xd1, 0x05, 0x61, 0xd4, 0xe6, 0xe1, 0x92, 0xbe, 0xce, 0x95, 0xf6, - 0xf5, 0x39, 0x2c, 0xa1, 0x58, 0x1a, 0xbe, 0xfb, 0xd9, 0xaa, 0xf5, 0x9b, 0xb8, 0x52, 0x0f, 0x46, - 0xd3, 0x21, 0x37, 0xb7, 0xbd, 0xe4, 0x9b, 0x95, 0xb8, 0x32, 0xf8, 0xdc, 0x7f, 0xe9, 0x08, 0x71, - 0xc7, 0x72, 0xd9, 0x6d, 0xa8, 0xa1, 0x16, 0xcc, 0x79, 0x39, 0x74, 0xd4, 0x0b, 0xe6, 0xf3, 0x28, - 0x07, 0xce, 0x22, 0x79, 0x4f, 0xcd, 0xd2, 0x85, 0xef, 0x34, 0xdb, 0x33, 0xea, 0x9e, 0xe5, 0xb6, - 0x5a, 0x39, 0x94, 0xdd, 0x35, 0x8e, 0x9e, 0x6a, 0x96, 0x66, 0x55, 0x86, 0xc1, 0xf0, 0x84, 0x1b, - 0x47, 0x4e, 0x7f, 0xec, 0xc0, 0x82, 0xd5, 0x26, 0x64, 0x5a, 0x0a, 0x22, 0x17, 0x4e, 0x13, 0x39, - 0xf3, 0x26, 0x64, 0x32, 0x7c, 0xc5, 0x66, 0x78, 0x7d, 0x84, 0x51, 0x35, 0x8f, 0x30, 0xee, 0x43, - 0x33, 0xbb, 0x27, 0x61, 0x37, 0x0a, 0x6b, 0x54, 0xf1, 0x3f, 0x59, 0xa6, 0xcc, 0x49, 0x5e, 0x37, - 0x9c, 0xe4, 0xee, 0xa7, 0xd0, 0x32, 0xf2, 0x9b, 0x4e, 0x6e, 0xc7, 0x72, 0x72, 0xeb, 0xe0, 0xb8, - 0x4a, 0x16, 0x1c, 0xe7, 0xfe, 0xbc, 0x02, 0x0b, 0xc8, 0xde, 0x41, 0x78, 0x72, 0x10, 0x8d, 0x82, - 0xc1, 0x39, 0xb1, 0x95, 0xe2, 0x64, 0xb9, 0x0a, 0x2a, 0x36, 0xb7, 0x61, 0x94, 0x7e, 0x1d, 0x11, - 0x2c, 0x54, 0x95, 0x4e, 0xa3, 0x2e, 0x43, 0x4d, 0x70, 0xe4, 0x27, 0xdc, 0xb8, 0x38, 0xe1, 0xd9, - 0x20, 0x6a, 0x1c, 0x04, 0x28, 0xd4, 0x71, 0x1c, 0x8c, 0x46, 0x81, 0xc8, 0x2b, 0xb6, 0x6f, 0x65, - 0x24, 0xac, 0x73, 0x18, 0x24, 0xfe, 0x51, 0x76, 0x3c, 0xa9, 0xd3, 0xe4, 0xfb, 0xf3, 0x5f, 0x1b, - 0xbe, 0x3f, 0x11, 0x1b, 0x6d, 0x83, 0xf9, 0x89, 0x9c, 0x2f, 0x4c, 0xa4, 0xfb, 0x6f, 0x2b, 0xd0, - 0x32, 0xd8, 0x02, 0xc5, 0xb9, 0x74, 0xb9, 0x31, 0x50, 0x79, 0x6e, 0x1f, 0x5a, 0x0e, 0x01, 0x03, - 0x61, 0x37, 0xec, 0x5a, 0xe9, 0x1c, 0x80, 0x04, 0xde, 0x62, 0xa1, 0xab, 0xd0, 0x44, 0xd6, 0xff, - 0x90, 0xbc, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x14, 0x75, 0x83, 0xa8, 0xf5, 0x8c, 0x4a, 0xc0, 0x1b, - 0x4f, 0xf2, 0x3f, 0x86, 0xb6, 0x2c, 0x86, 0xe6, 0x98, 0x3a, 0x9d, 0x09, 0x9f, 0x35, 0xff, 0x9e, - 0x95, 0x53, 0x7d, 0xb9, 0xa1, 0xbe, 0x6c, 0x5c, 0xf4, 0xa5, 0xca, 0xe9, 0x3e, 0xd2, 0x41, 0x12, - 0x8f, 0x62, 0x7f, 0x72, 0xaa, 0x14, 0xca, 0x7d, 0x58, 0x51, 0x7a, 0x63, 0x1a, 0xfa, 0x61, 0x18, - 0x4d, 0xc3, 0x01, 0x57, 0x71, 0x74, 0x65, 0x24, 0x77, 0xa8, 0xa3, 0xae, 0xa9, 0x20, 0x76, 0x07, - 0xea, 0xc2, 0x8e, 0x12, 0xab, 0x72, 0xb9, 0x0a, 0x11, 0x59, 0xd8, 0x6d, 0xa8, 0x0b, 0x73, 0xaa, - 0x32, 0x53, 0xe8, 0x45, 0x06, 0xf7, 0x2e, 0x2c, 0x51, 0x98, 0xb7, 0xa1, 0xfb, 0xde, 0x29, 0x5b, - 0xad, 0xe7, 0x06, 0x22, 0x18, 0x7c, 0x15, 0xd8, 0xbe, 0x90, 0x2b, 0xf3, 0xa8, 0xf3, 0xcf, 0xab, - 0xd0, 0x32, 0x60, 0xd4, 0x4f, 0x74, 0x3e, 0xd5, 0x1f, 0x06, 0xfe, 0x98, 0xa7, 0x3c, 0x96, 0xb2, - 0x94, 0x43, 0x31, 0x9f, 0x7f, 0x76, 0xd2, 0x8f, 0xa6, 0x69, 0x7f, 0xc8, 0x4f, 0x62, 0xce, 0xa5, - 0x19, 0x91, 0x43, 0x31, 0x1f, 0x72, 0xb3, 0x91, 0x4f, 0x9c, 0x28, 0xe5, 0x50, 0x75, 0x70, 0x29, - 0xc6, 0xa9, 0x96, 0x1d, 0x5c, 0x8a, 0x51, 0xc9, 0x6b, 0xd6, 0x7a, 0x89, 0x66, 0xfd, 0x08, 0xd6, - 0x84, 0x0e, 0x95, 0xda, 0xa3, 0x9f, 0x63, 0xae, 0x19, 0x54, 0x76, 0x07, 0x3a, 0xd8, 0x66, 0x25, - 0x1a, 0x49, 0xf0, 0x33, 0x21, 0x63, 0x8e, 0x57, 0xc0, 0x31, 0x2f, 0x79, 0xd2, 0xcd, 0xbc, 0x22, - 0x7a, 0xa4, 0x80, 0x53, 0x5e, 0xff, 0xb5, 0x9d, 0xb7, 0x29, 0xf3, 0xe6, 0x70, 0xf6, 0x31, 0xac, - 0x8f, 0xf9, 0x30, 0xf0, 0xed, 0x22, 0xfa, 0xd9, 0x22, 0x3f, 0x8b, 0x8c, 0xb5, 0xe0, 0x28, 0xfc, - 0x2c, 0x1a, 0x1f, 0x05, 0x62, 0x61, 0x13, 0x3e, 0xff, 0x9a, 0x57, 0xc0, 0xdd, 0x05, 0x68, 0x1d, - 0xa6, 0xd1, 0x44, 0x4d, 0xfd, 0x22, 0xb4, 0x45, 0x52, 0x46, 0x4e, 0xbe, 0x03, 0x57, 0x88, 0x5f, - 0x9f, 0x45, 0x93, 0x68, 0x14, 0x9d, 0x9c, 0x5b, 0x3b, 0xf7, 0xff, 0xe0, 0xc0, 0x8a, 0x45, 0xcd, - 0xb6, 0xee, 0xe4, 0x66, 0x54, 0xe1, 0x6e, 0x82, 0xc5, 0x97, 0x8d, 0x65, 0x41, 0x64, 0x14, 0xa7, - 0x3a, 0xcf, 0x65, 0x04, 0xdc, 0x66, 0x76, 0x87, 0x43, 0x7d, 0x28, 0xf8, 0xbd, 0x5b, 0xe4, 0x77, - 0xf9, 0xbd, 0xba, 0xdd, 0xa1, 0x8a, 0xf8, 0x1d, 0x19, 0xeb, 0x33, 0x94, 0x9d, 0xae, 0xda, 0xf1, - 0x19, 0xa6, 0xa7, 0x47, 0xb5, 0x60, 0xa0, 0xc1, 0xc4, 0xfd, 0x85, 0x03, 0x90, 0xb5, 0x8e, 0x22, - 0x44, 0xf4, 0xd2, 0x26, 0xee, 0x25, 0x1b, 0xcb, 0xd8, 0xfb, 0xd0, 0xd6, 0x87, 0xfc, 0xd9, 0x6a, - 0xd9, 0x52, 0x18, 0x5a, 0x17, 0xb7, 0x60, 0xe9, 0x64, 0x14, 0x1d, 0x91, 0x15, 0x43, 0xa1, 0xb8, - 0x89, 0x8c, 0x1f, 0x5d, 0x14, 0xf0, 0x43, 0x89, 0x66, 0x4b, 0x6b, 0xcd, 0x5c, 0x5a, 0xcb, 0x17, - 0xca, 0x9f, 0x57, 0xf4, 0x49, 0x6b, 0x36, 0x12, 0x6f, 0x94, 0x72, 0xb6, 0x51, 0x50, 0xeb, 0x33, - 0x0e, 0x37, 0x69, 0xeb, 0x71, 0x70, 0xa1, 0xe3, 0xf7, 0x53, 0x58, 0x8c, 0x85, 0xce, 0x54, 0x0a, - 0xb5, 0xf6, 0x06, 0x85, 0xba, 0x10, 0x5b, 0x2b, 0xf3, 0x37, 0xa1, 0xe3, 0x0f, 0xcf, 0x78, 0x9c, - 0x06, 0xe4, 0x08, 0x23, 0x33, 0x4a, 0x74, 0x70, 0xc9, 0xc0, 0xc9, 0x5a, 0xb9, 0x05, 0x4b, 0x32, - 0x9a, 0x57, 0xe7, 0x94, 0x37, 0xf4, 0x32, 0x18, 0x33, 0xba, 0xff, 0x4c, 0x1d, 0xec, 0xda, 0xb3, - 0xfb, 0xe6, 0x51, 0x31, 0x7b, 0x58, 0xc9, 0xf5, 0xf0, 0x1b, 0xf2, 0xa0, 0x75, 0xa8, 0x3c, 0x6e, - 0x55, 0x23, 0x6a, 0x6c, 0x28, 0x0f, 0xc6, 0xed, 0x61, 0xad, 0xbd, 0xcd, 0xb0, 0xba, 0xff, 0xd9, - 0x81, 0xf9, 0xdd, 0x68, 0xb2, 0x8b, 0x43, 0x8c, 0x36, 0x0e, 0x8a, 0x89, 0x0e, 0xa5, 0x57, 0xc9, - 0x0b, 0xa2, 0xeb, 0x4a, 0xad, 0x92, 0x85, 0xbc, 0x55, 0xf2, 0x17, 0xe1, 0x1d, 0xf2, 0xf9, 0xc6, - 0xd1, 0x24, 0x8a, 0x51, 0x5c, 0xfd, 0x91, 0x30, 0x41, 0xa2, 0x30, 0x3d, 0x55, 0xea, 0xf4, 0x4d, - 0x59, 0xc8, 0x11, 0x83, 0x9b, 0x60, 0xb1, 0xb1, 0x92, 0x56, 0x94, 0xd0, 0xb2, 0x45, 0x82, 0xfb, - 0xdb, 0xd0, 0xa4, 0x1d, 0x06, 0x75, 0xed, 0x03, 0x68, 0x9e, 0x46, 0x93, 0xfe, 0x69, 0x10, 0xa6, - 0x4a, 0xfc, 0x17, 0x33, 0xd3, 0x7f, 0x97, 0x06, 0x45, 0x67, 0x70, 0xff, 0x6c, 0x0e, 0xe6, 0x1f, - 0x87, 0x67, 0x51, 0x30, 0xa0, 0xc3, 0xe4, 0x31, 0x1f, 0x47, 0xea, 0x72, 0x01, 0xfe, 0xa6, 0x8b, - 0xb6, 0xd9, 0xf5, 0x3f, 0x21, 0x42, 0x06, 0x82, 0x5b, 0xc1, 0xd8, 0xbc, 0xbe, 0x27, 0x53, 0xd9, - 0xf5, 0x8c, 0xba, 0x71, 0x3d, 0x03, 0x4b, 0x13, 0xd7, 0xca, 0x68, 0xec, 0x44, 0x50, 0xa8, 0x81, - 0xe0, 0xe0, 0xcb, 0xa8, 0x3f, 0x11, 0x16, 0x26, 0x42, 0x54, 0x24, 0x44, 0xdb, 0xdb, 0x98, 0x0b, - 0xaf, 0xbd, 0x36, 0xbd, 0x70, 0x7b, 0x6b, 0x82, 0x68, 0x9e, 0x89, 0x0f, 0x44, 0x1e, 0xb1, 0x1c, - 0x98, 0x10, 0x1a, 0xa8, 0xf9, 0xdb, 0xa7, 0xe2, 0x06, 0x71, 0x1e, 0x46, 0x6d, 0x3e, 0xe4, 0x5a, - 0xe9, 0x8a, 0x7e, 0x82, 0xb8, 0x02, 0x99, 0xc7, 0x8d, 0x4d, 0xb1, 0x08, 0x7b, 0x56, 0x9b, 0x62, - 0x64, 0x19, 0x7f, 0x34, 0x3a, 0xf2, 0x07, 0x2f, 0xc5, 0x66, 0xb2, 0x2d, 0x0e, 0x7b, 0x2c, 0x90, - 0x62, 0xf7, 0xb2, 0x79, 0xa5, 0x00, 0x9b, 0x9a, 0x67, 0x42, 0x6c, 0x03, 0x5a, 0xe4, 0x30, 0x90, - 0x33, 0xbb, 0x48, 0x33, 0xdb, 0x31, 0x3d, 0x0a, 0x34, 0xb7, 0x66, 0x26, 0xf3, 0x98, 0x7b, 0xa9, - 0x10, 0x88, 0xec, 0x0f, 0x87, 0x32, 0x42, 0xa0, 0x23, 0xae, 0x00, 0x6a, 0x80, 0x5c, 0x12, 0x62, - 0xc0, 0x44, 0x86, 0x65, 0xca, 0x60, 0x61, 0xec, 0x9a, 0x70, 0x84, 0x4d, 0xfc, 0x60, 0x48, 0x31, - 0x35, 0x62, 0xfb, 0xa9, 0x31, 0x2c, 0x43, 0xfd, 0xa6, 0x85, 0x73, 0x85, 0x46, 0xc5, 0xc2, 0x70, - 0x6c, 0x74, 0x7a, 0x9c, 0x45, 0x2e, 0xdb, 0x20, 0xfb, 0x90, 0xce, 0x68, 0x53, 0x4e, 0xe1, 0xc9, - 0x8b, 0x1b, 0xef, 0xc8, 0x3e, 0x4b, 0xb6, 0x55, 0x7f, 0x0f, 0x31, 0x8b, 0x27, 0x72, 0xa2, 0xd9, - 0x26, 0xdc, 0xe4, 0x6b, 0x96, 0xd9, 0x26, 0xb3, 0x92, 0x9b, 0x5c, 0x64, 0x70, 0x37, 0xa1, 0x6d, - 0x16, 0xc0, 0x1a, 0x50, 0x7b, 0x7a, 0xb0, 0xb3, 0xdf, 0xb9, 0xc4, 0x5a, 0x30, 0x7f, 0xb8, 0xf3, - 0xec, 0xd9, 0xde, 0xce, 0x76, 0xc7, 0x61, 0x6d, 0x68, 0xe8, 0x90, 0xcc, 0x0a, 0xa6, 0x36, 0xb7, - 0xb6, 0x76, 0x0e, 0x9e, 0xed, 0x6c, 0x77, 0xaa, 0x9f, 0xd5, 0x1a, 0x95, 0x4e, 0xd5, 0xfd, 0xa3, - 0x0a, 0xb4, 0x8c, 0xf2, 0x2f, 0x70, 0xd5, 0x5c, 0x03, 0xa0, 0x1d, 0x45, 0x16, 0xa2, 0x51, 0xf3, - 0x0c, 0x04, 0x35, 0xa4, 0xde, 0x6b, 0x57, 0xc5, 0x7d, 0x48, 0x95, 0xa6, 0x51, 0xa3, 0x8b, 0x87, - 0xe6, 0x99, 0x44, 0xdd, 0xb3, 0x41, 0xe4, 0x28, 0x09, 0x50, 0x9c, 0xa0, 0x90, 0x43, 0x13, 0xc2, - 0x19, 0x8a, 0x79, 0x12, 0x8d, 0xce, 0xb8, 0xc8, 0x22, 0xec, 0x32, 0x0b, 0xc3, 0xba, 0xa4, 0xaa, - 0x31, 0x62, 0x78, 0xeb, 0x9e, 0x0d, 0xb2, 0x6f, 0xab, 0x19, 0x6a, 0xd0, 0x0c, 0xad, 0x17, 0x87, - 0xdb, 0x9c, 0x1d, 0x37, 0x05, 0xb6, 0x39, 0x1c, 0x4a, 0xaa, 0x79, 0xbb, 0x32, 0x36, 0xaf, 0xf3, - 0x2a, 0x55, 0x52, 0x22, 0xae, 0x95, 0x72, 0x71, 0x7d, 0x23, 0x53, 0xbb, 0x8f, 0xa1, 0x75, 0x60, - 0x5c, 0x10, 0x76, 0x51, 0xb3, 0xa9, 0xab, 0xc1, 0x42, 0xe7, 0x09, 0x1f, 0x4b, 0x86, 0x1a, 0x4d, - 0xaa, 0x98, 0x4d, 0x72, 0xff, 0xa9, 0x23, 0xee, 0x5c, 0xe9, 0x2e, 0x88, 0xfa, 0x5d, 0x68, 0x6b, - 0xaf, 0x73, 0x16, 0xa6, 0x6e, 0x61, 0x98, 0x87, 0x9a, 0xd3, 0x8f, 0x8e, 0x8f, 0x13, 0xae, 0x02, - 0x4a, 0x2d, 0x4c, 0x19, 0x91, 0x68, 0x96, 0x06, 0xa2, 0x86, 0x44, 0x06, 0x96, 0x16, 0x70, 0x64, - 0x14, 0xe9, 0x9d, 0x54, 0xa1, 0xb4, 0x3a, 0xad, 0xa3, 0xe9, 0xf3, 0x23, 0x7d, 0x07, 0x1a, 0xba, - 0x5c, 0x7b, 0x85, 0x50, 0x39, 0x35, 0x1d, 0x57, 0x22, 0xda, 0x60, 0x5a, 0x8d, 0x16, 0xfc, 0x5a, - 0x24, 0xb0, 0xbb, 0xc0, 0x8e, 0x83, 0x38, 0x9f, 0x5d, 0x30, 0x70, 0x09, 0xc5, 0x7d, 0x01, 0x2b, - 0x4a, 0xfa, 0x0c, 0xeb, 0xd6, 0x9e, 0x48, 0xe7, 0x22, 0xed, 0x54, 0x29, 0x6a, 0x27, 0xf7, 0x97, - 0x55, 0x98, 0x97, 0xb3, 0x5d, 0xb8, 0x68, 0x2e, 0xd6, 0x37, 0x0b, 0x63, 0x5d, 0xeb, 0x3a, 0x21, - 0x31, 0x82, 0x5c, 0xb3, 0x0a, 0xab, 0x4e, 0xb5, 0x6c, 0xd5, 0x61, 0x50, 0x9b, 0xf8, 0xe9, 0x29, - 0xb9, 0x61, 0x9a, 0x1e, 0xfd, 0x56, 0xce, 0xd3, 0xba, 0xed, 0x3c, 0x2d, 0xbb, 0x56, 0x2f, 0x4c, - 0xab, 0xe2, 0xb5, 0xfa, 0xab, 0xd0, 0x14, 0xab, 0x63, 0xe6, 0x1f, 0xcd, 0x80, 0xdc, 0x6a, 0xda, - 0x28, 0xac, 0xa6, 0x6f, 0xbf, 0xce, 0x7d, 0x17, 0xe6, 0xc4, 0xd5, 0x12, 0x19, 0x30, 0x7c, 0x55, - 0x1d, 0x2b, 0x8a, 0x7c, 0xea, 0xaf, 0x88, 0x3a, 0xf2, 0x64, 0x5e, 0xf3, 0x72, 0x6a, 0xcb, 0xbe, - 0x9c, 0x6a, 0xba, 0x75, 0xdb, 0xb6, 0x5b, 0xd7, 0x7d, 0x08, 0x0b, 0x56, 0x71, 0xa8, 0x67, 0x65, - 0xc0, 0x71, 0xe7, 0x12, 0x5b, 0x80, 0xe6, 0xe3, 0xfd, 0xfe, 0xc3, 0xbd, 0xc7, 0x8f, 0x76, 0x9f, - 0x75, 0x1c, 0x4c, 0x1e, 0x3e, 0xdf, 0xda, 0xda, 0xd9, 0xd9, 0x26, 0xbd, 0x0b, 0x30, 0xf7, 0x70, - 0xf3, 0x31, 0xea, 0xe0, 0xaa, 0xbb, 0x2d, 0x78, 0x5b, 0x96, 0xa5, 0x8f, 0x72, 0xbe, 0x0d, 0x4c, - 0xf9, 0x00, 0x28, 0xe8, 0x68, 0x32, 0xe2, 0xa9, 0x8a, 0x85, 0x5f, 0x96, 0x94, 0xc7, 0x9a, 0xa0, - 0xae, 0x73, 0x64, 0xa5, 0x64, 0x22, 0x22, 0x07, 0x29, 0x2f, 0x22, 0x32, 0xab, 0xa7, 0xe9, 0x6e, - 0x0f, 0xba, 0xdb, 0x1c, 0x4b, 0xdb, 0x1c, 0x8d, 0x72, 0xcd, 0xc1, 0x4d, 0x5c, 0x09, 0x4d, 0xee, - 0xf0, 0xbe, 0x0f, 0x97, 0x37, 0x45, 0xd8, 0xfb, 0x6f, 0x2a, 0x2a, 0xd2, 0xed, 0xc2, 0x5a, 0xbe, - 0x48, 0x59, 0xd9, 0x43, 0x58, 0xde, 0xe6, 0x47, 0xd3, 0x93, 0x3d, 0x7e, 0x96, 0x55, 0xc4, 0xa0, - 0x96, 0x9c, 0x46, 0xaf, 0xe4, 0xf8, 0xd0, 0x6f, 0xf6, 0x2e, 0xc0, 0x08, 0xf3, 0xf4, 0x93, 0x09, - 0x1f, 0xa8, 0x2b, 0x8d, 0x84, 0x1c, 0x4e, 0xf8, 0xc0, 0xfd, 0x08, 0x98, 0x59, 0x8e, 0x1c, 0x2f, - 0xb4, 0xba, 0xa6, 0x47, 0xfd, 0xe4, 0x3c, 0x49, 0xf9, 0x58, 0xdd, 0xd5, 0x34, 0x21, 0xf7, 0x16, - 0xb4, 0x0f, 0xfc, 0x73, 0x8f, 0x7f, 0x21, 0x1f, 0x5b, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x8e, 0x2c, - 0xa8, 0x1d, 0xc3, 0x44, 0x76, 0xff, 0x49, 0x15, 0xe6, 0x44, 0x4e, 0x2c, 0x75, 0xc8, 0x93, 0x34, - 0x08, 0x49, 0xd2, 0x54, 0xa9, 0x06, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0x4b, 0x6f, 0x85, 0xba, - 0x1a, 0x26, 0x05, 0xd8, 0xc2, 0x50, 0xd2, 0xb2, 0xf0, 0x66, 0xe1, 0x3e, 0xcc, 0x80, 0xdc, 0x81, - 0x47, 0x66, 0xdb, 0x89, 0xf6, 0x29, 0xb5, 0x25, 0xc5, 0xd8, 0x84, 0x4a, 0x2d, 0xc8, 0x79, 0x21, - 0xed, 0x05, 0x0b, 0xb2, 0x60, 0x29, 0x36, 0xde, 0xc2, 0x52, 0x14, 0x2e, 0x8c, 0x37, 0x59, 0x8a, - 0xf0, 0x36, 0x96, 0xe2, 0x1d, 0x94, 0x58, 0xb9, 0x51, 0xb6, 0xaf, 0x2f, 0xc9, 0x9d, 0xb2, 0xa7, - 0xe9, 0xee, 0xf7, 0x61, 0x5e, 0x82, 0xac, 0x03, 0xd5, 0xa3, 0x20, 0x95, 0x3e, 0x29, 0xfc, 0x89, - 0x1c, 0x15, 0xfa, 0x63, 0x75, 0x15, 0x96, 0x7e, 0x63, 0x93, 0xe9, 0x46, 0xde, 0x17, 0xd3, 0x20, - 0xe6, 0x43, 0x75, 0xa9, 0xc4, 0x80, 0x5c, 0x06, 0x1d, 0xba, 0xf6, 0x8e, 0x9b, 0x21, 0x25, 0x3a, - 0xff, 0xc0, 0x81, 0x8e, 0x64, 0x62, 0x4d, 0x53, 0x27, 0x77, 0x6f, 0xba, 0x1f, 0x75, 0x03, 0x16, - 0x68, 0x2b, 0xa6, 0x35, 0x90, 0x3c, 0x05, 0xb3, 0x40, 0x6c, 0x93, 0x8a, 0xcb, 0x19, 0x07, 0x23, - 0xc9, 0x13, 0x26, 0xa4, 0x94, 0x58, 0xec, 0xcb, 0x28, 0x61, 0xc7, 0xd3, 0x69, 0xf7, 0x4f, 0x1d, - 0x58, 0x36, 0x1a, 0x2c, 0x85, 0xe0, 0x53, 0x68, 0xeb, 0xd7, 0x25, 0xb8, 0x5e, 0x5b, 0xd7, 0x6d, - 0xa9, 0xcd, 0x3e, 0xb3, 0x32, 0x13, 0x2f, 0xf9, 0xe7, 0xd4, 0xc0, 0x64, 0x3a, 0x96, 0x8b, 0x9a, - 0x09, 0x21, 0x1f, 0xbf, 0xe2, 0xfc, 0xa5, 0xce, 0x22, 0x96, 0x55, 0x0b, 0x23, 0x17, 0x36, 0x6e, - 0x21, 0x75, 0xa6, 0x9a, 0x74, 0x61, 0x9b, 0xa0, 0xfb, 0x57, 0x2b, 0xb0, 0x22, 0x7c, 0x02, 0xd2, - 0x17, 0xa3, 0x2f, 0xf8, 0xce, 0x09, 0xf7, 0x88, 0x50, 0x08, 0xbb, 0x97, 0x3c, 0x99, 0x66, 0xdf, - 0x7b, 0x4b, 0x3f, 0x86, 0x0e, 0x5d, 0x9e, 0x31, 0x17, 0xd5, 0xb2, 0xb9, 0x78, 0xc3, 0x48, 0x97, - 0x9d, 0x26, 0xd4, 0xcb, 0x4f, 0x13, 0xde, 0xca, 0x7b, 0xff, 0x60, 0x1e, 0xea, 0xc9, 0x20, 0x9a, - 0x70, 0x77, 0x0d, 0x56, 0xed, 0x21, 0x90, 0x7a, 0xf2, 0x17, 0x0e, 0x74, 0x1f, 0x8a, 0x33, 0xca, - 0x20, 0x3c, 0xd9, 0x0d, 0x92, 0x34, 0x8a, 0xf5, 0x6b, 0x09, 0xd7, 0x00, 0x92, 0xd4, 0x8f, 0xa5, - 0x4d, 0x2d, 0x2c, 0x13, 0x03, 0xc1, 0x9e, 0xf0, 0x70, 0x28, 0xa8, 0x62, 0x06, 0x75, 0xba, 0x60, - 0xf9, 0x49, 0xbf, 0x86, 0x65, 0x3f, 0xdd, 0x14, 0x01, 0xff, 0xd8, 0x64, 0x7e, 0x46, 0x8b, 0x8f, - 0x70, 0x16, 0xe4, 0x50, 0xf7, 0x0f, 0x2a, 0xb0, 0x94, 0x35, 0x92, 0x82, 0x52, 0x6c, 0x15, 0x26, - 0x8d, 0xa6, 0x4c, 0x85, 0xc9, 0x33, 0x88, 0x7e, 0x80, 0x56, 0x94, 0xe1, 0xda, 0x30, 0x50, 0x76, - 0x03, 0x5a, 0x2a, 0x15, 0x4d, 0x53, 0xe3, 0xda, 0xb2, 0x09, 0x8b, 0x10, 0x5e, 0xb4, 0xe3, 0xa4, - 0x4d, 0x2a, 0x53, 0x74, 0x85, 0x6a, 0x9c, 0xd2, 0x97, 0x62, 0xe4, 0x55, 0x12, 0xb5, 0x04, 0x1a, - 0x42, 0xe2, 0x05, 0x19, 0x32, 0x82, 0x4c, 0x03, 0xa1, 0xa1, 0x9f, 0x7b, 0xd1, 0x92, 0x29, 0x4a, - 0xcc, 0xe2, 0xaf, 0x6b, 0x9e, 0x09, 0xa9, 0xad, 0x65, 0x34, 0x35, 0x0e, 0x5e, 0x6b, 0x9e, 0x85, - 0xb9, 0x7f, 0xdb, 0x81, 0x2b, 0x25, 0xd3, 0x28, 0x25, 0x75, 0x1b, 0x96, 0x8f, 0x35, 0x51, 0x0d, - 0xb5, 0x10, 0xd7, 0x35, 0xa5, 0xf7, 0xec, 0xe1, 0xf5, 0x8a, 0x1f, 0x68, 0xdb, 0x58, 0x4c, 0x9e, - 0x15, 0x6e, 0x5f, 0x24, 0xb8, 0x07, 0xd0, 0xdb, 0x79, 0x8d, 0x82, 0xbf, 0x65, 0x3e, 0xb2, 0xa7, - 0x38, 0x6b, 0xa3, 0xa0, 0xd8, 0x2e, 0xf6, 0x68, 0x1d, 0xc3, 0x82, 0x55, 0x16, 0xfb, 0xce, 0xdb, - 0x16, 0x62, 0xca, 0xe8, 0x75, 0x39, 0xeb, 0xe2, 0x95, 0x40, 0x15, 0xf4, 0x6f, 0x40, 0xee, 0x19, - 0x2c, 0x3d, 0x99, 0x8e, 0xd2, 0x20, 0x7b, 0x31, 0x90, 0x7d, 0x4f, 0x7e, 0x44, 0x45, 0xa8, 0xa1, - 0x2b, 0xad, 0xca, 0xcc, 0x87, 0x23, 0x36, 0xc6, 0x92, 0xfa, 0xc5, 0x1a, 0x8b, 0x04, 0xf7, 0x0a, - 0xac, 0x67, 0x55, 0x8a, 0xb1, 0x53, 0x8b, 0xc3, 0x1f, 0x3a, 0x22, 0x72, 0xcd, 0x7e, 0xc0, 0x90, - 0x3d, 0x82, 0x95, 0x24, 0x08, 0x4f, 0x46, 0xdc, 0x2c, 0x27, 0x91, 0x23, 0x71, 0xd9, 0x6e, 0x9e, - 0x7c, 0xe4, 0xd0, 0x2b, 0xfb, 0x02, 0x19, 0xa4, 0xbc, 0xa1, 0x19, 0x83, 0xe4, 0x86, 0xa4, 0xac, - 0x03, 0x9f, 0xc1, 0xa2, 0x5d, 0x19, 0xfb, 0x58, 0xc6, 0xea, 0x67, 0x2d, 0x33, 0x8f, 0xa0, 0x6c, - 0xce, 0xb0, 0x72, 0xba, 0x3f, 0x77, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x54, 0x2a, 0xb9, 0xe7, - 0xd3, 0x42, 0xb1, 0xb3, 0x3b, 0xac, 0xef, 0x00, 0xa8, 0xbe, 0xde, 0x9d, 0x39, 0x29, 0xbb, 0x97, - 0x4a, 0x7a, 0xf5, 0xa0, 0x01, 0x73, 0xb2, 0x7f, 0xeb, 0x70, 0x59, 0x36, 0x49, 0x35, 0x27, 0x3b, - 0xbb, 0xb0, 0x2a, 0xb5, 0xce, 0x2e, 0x7a, 0xd0, 0x15, 0x8f, 0x62, 0x98, 0xfd, 0x90, 0x1f, 0x6e, - 0x03, 0x7b, 0xe2, 0x0f, 0xfc, 0x38, 0x8a, 0xc2, 0x03, 0x1e, 0xcb, 0x50, 0x23, 0xb2, 0xbf, 0xc8, - 0xb5, 0xaf, 0x4c, 0x45, 0x91, 0x52, 0xef, 0x38, 0x44, 0xa1, 0x7a, 0x2f, 0x43, 0xa4, 0x5c, 0x0f, - 0x56, 0x1e, 0xf8, 0x2f, 0xb9, 0x2a, 0x29, 0x1b, 0xa5, 0xd6, 0x44, 0x17, 0xaa, 0xc6, 0x5e, 0x5d, - 0xc3, 0x29, 0x56, 0xeb, 0x99, 0xb9, 0xdd, 0x0d, 0x58, 0xb5, 0xcb, 0x94, 0xaa, 0xa4, 0x07, 0x8d, - 0xb1, 0xc4, 0x64, 0xeb, 0x74, 0xfa, 0xce, 0x57, 0xd0, 0x32, 0x1e, 0x3a, 0x61, 0xeb, 0xb0, 0xf2, - 0xe2, 0xf1, 0xb3, 0xfd, 0x9d, 0xc3, 0xc3, 0xfe, 0xc1, 0xf3, 0x07, 0x9f, 0xef, 0xfc, 0xb0, 0xbf, - 0xbb, 0x79, 0xb8, 0xdb, 0xb9, 0xc4, 0xd6, 0x80, 0xed, 0xef, 0x1c, 0x3e, 0xdb, 0xd9, 0xb6, 0x70, - 0x87, 0x5d, 0x83, 0xde, 0xf3, 0xfd, 0xe7, 0x87, 0x3b, 0xdb, 0xfd, 0xb2, 0xef, 0x2a, 0xec, 0x5d, - 0xb8, 0x22, 0xe9, 0x25, 0x9f, 0x57, 0xef, 0x7c, 0x0a, 0x9d, 0xbc, 0x0b, 0xc6, 0x72, 0x5d, 0xbd, - 0xc9, 0xc7, 0xb5, 0xf1, 0xf3, 0x2a, 0x2c, 0x8a, 0x58, 0x42, 0xf1, 0x04, 0x28, 0x8f, 0xd9, 0x13, - 0x98, 0x97, 0x6f, 0xc9, 0x32, 0xc5, 0x5a, 0xf6, 0xeb, 0xb5, 0xbd, 0xb5, 0x3c, 0x2c, 0xa7, 0x75, - 0xe5, 0xaf, 0xfd, 0xa7, 0xff, 0xf1, 0x77, 0x2b, 0x0b, 0xac, 0x75, 0xef, 0xec, 0xc3, 0x7b, 0x27, - 0x3c, 0x4c, 0xb0, 0x8c, 0xdf, 0x03, 0xc8, 0x5e, 0x48, 0x65, 0x5d, 0xed, 0x82, 0xc8, 0x3d, 0x1f, - 0xdb, 0xbb, 0x52, 0x42, 0x91, 0xe5, 0x5e, 0xa1, 0x72, 0x57, 0xdc, 0x45, 0x2c, 0x37, 0x08, 0x83, - 0x54, 0xbc, 0x96, 0xfa, 0x89, 0x73, 0x87, 0x0d, 0xa1, 0x6d, 0xbe, 0x5d, 0xca, 0xd4, 0x51, 0x54, - 0xc9, 0xeb, 0xab, 0xbd, 0x77, 0x4a, 0x69, 0x8a, 0x97, 0xa9, 0x8e, 0xcb, 0x6e, 0x07, 0xeb, 0x98, - 0x52, 0x8e, 0xac, 0x96, 0x91, 0x90, 0xf0, 0xec, 0x89, 0x52, 0x76, 0xd5, 0x10, 0xba, 0xc2, 0x03, - 0xa9, 0xbd, 0x77, 0x67, 0x50, 0x65, 0x5d, 0xef, 0x52, 0x5d, 0xeb, 0x2e, 0xc3, 0xba, 0x06, 0x94, - 0x47, 0x3d, 0x90, 0xfa, 0x89, 0x73, 0x67, 0xe3, 0xdf, 0xdf, 0x82, 0xa6, 0x3e, 0xa6, 0x66, 0x3f, - 0x85, 0x05, 0x2b, 0xd8, 0x93, 0xa9, 0x6e, 0x94, 0xc5, 0x86, 0xf6, 0xae, 0x96, 0x13, 0x65, 0xc5, - 0xd7, 0xa8, 0xe2, 0x2e, 0x5b, 0xc3, 0x8a, 0x65, 0xb4, 0xe4, 0x3d, 0x0a, 0x5b, 0x16, 0x37, 0x1f, - 0x5f, 0x1a, 0x9a, 0x4c, 0x54, 0x76, 0x35, 0xaf, 0x5c, 0xac, 0xda, 0xde, 0x9d, 0x41, 0x95, 0xd5, - 0x5d, 0xa5, 0xea, 0xd6, 0xd8, 0xaa, 0x59, 0x9d, 0x3e, 0x3a, 0xe6, 0x74, 0xdd, 0xd7, 0x7c, 0xbd, - 0x93, 0xbd, 0xab, 0x19, 0xab, 0xec, 0x55, 0x4f, 0xcd, 0x22, 0xc5, 0xa7, 0x3d, 0xdd, 0x2e, 0x55, - 0xc5, 0x18, 0x4d, 0x9f, 0xf9, 0x78, 0x27, 0x3b, 0x82, 0x96, 0xf1, 0xe6, 0x16, 0xbb, 0x32, 0xf3, - 0x7d, 0xb0, 0x5e, 0xaf, 0x8c, 0x54, 0xd6, 0x15, 0xb3, 0xfc, 0x7b, 0x68, 0xe8, 0xfc, 0x18, 0x9a, - 0xfa, 0x15, 0x27, 0xb6, 0x6e, 0xbc, 0xaa, 0x65, 0xbe, 0x3a, 0xd5, 0xeb, 0x16, 0x09, 0x65, 0xcc, - 0x67, 0x96, 0x8e, 0xcc, 0xf7, 0x02, 0x5a, 0xc6, 0x4b, 0x4d, 0xba, 0x03, 0xc5, 0xd7, 0xa0, 0x74, - 0x07, 0x4a, 0x1e, 0x76, 0x72, 0x97, 0xa9, 0x8a, 0x16, 0x6b, 0x12, 0x7f, 0xa7, 0xaf, 0xa3, 0x84, - 0xed, 0xc1, 0x65, 0xa9, 0xb1, 0x8f, 0xf8, 0xd7, 0x99, 0x86, 0x92, 0x07, 0x53, 0xef, 0x3b, 0xec, - 0x53, 0x68, 0xa8, 0x07, 0xb9, 0xd8, 0x5a, 0xf9, 0xc3, 0x62, 0xbd, 0xf5, 0x02, 0x2e, 0xd5, 0xeb, - 0x0f, 0x01, 0xb2, 0x67, 0xa1, 0xb4, 0x92, 0x28, 0x3c, 0x33, 0xa5, 0x39, 0xa0, 0xf8, 0x86, 0x94, - 0xbb, 0x46, 0x1d, 0xec, 0x30, 0x52, 0x12, 0x21, 0x7f, 0xa5, 0x6e, 0xf6, 0xff, 0x04, 0x5a, 0xc6, - 0xcb, 0x50, 0x7a, 0xf8, 0x8a, 0xaf, 0x4a, 0xe9, 0xe1, 0x2b, 0x79, 0x48, 0xca, 0xed, 0x51, 0xe9, - 0xab, 0xee, 0x12, 0x96, 0x9e, 0x04, 0x27, 0xe1, 0x58, 0x64, 0xc0, 0x09, 0x3a, 0x85, 0x05, 0xeb, - 0xf9, 0x27, 0x2d, 0xa1, 0x65, 0x8f, 0x4b, 0x69, 0x09, 0x2d, 0x7d, 0x31, 0x4a, 0xf1, 0x99, 0xbb, - 0x8c, 0xf5, 0x9c, 0x51, 0x16, 0xa3, 0xa6, 0x1f, 0x41, 0xcb, 0x78, 0xca, 0x49, 0xf7, 0xa5, 0xf8, - 0x6a, 0x94, 0xee, 0x4b, 0xd9, 0xcb, 0x4f, 0xab, 0x54, 0xc7, 0xa2, 0x4b, 0xac, 0x40, 0x77, 0xd4, - 0xb1, 0xec, 0x9f, 0xc2, 0xa2, 0xfd, 0xb8, 0x93, 0x96, 0xfd, 0xd2, 0x67, 0xa2, 0xb4, 0xec, 0xcf, - 0x78, 0x11, 0x4a, 0xb2, 0xf4, 0x9d, 0x15, 0x5d, 0xc9, 0xbd, 0x2f, 0x65, 0xa0, 0xdb, 0x57, 0xec, - 0xfb, 0xa8, 0xe0, 0xe4, 0xa3, 0x01, 0x6c, 0xdd, 0xe0, 0x5a, 0xf3, 0x69, 0x01, 0x2d, 0x2f, 0x85, - 0xf7, 0x05, 0x6c, 0x66, 0x16, 0xb7, 0xec, 0x69, 0xd5, 0xa2, 0xc7, 0x03, 0x8c, 0x55, 0xcb, 0x7c, - 0x5f, 0xc0, 0x58, 0xb5, 0xac, 0x37, 0x06, 0xf2, 0xab, 0x56, 0x1a, 0x60, 0x19, 0x21, 0x2c, 0xe5, - 0x2e, 0xa4, 0x68, 0xa9, 0x28, 0xbf, 0x33, 0xd8, 0xbb, 0xf6, 0xe6, 0x7b, 0x2c, 0xb6, 0x06, 0x51, - 0x4a, 0xf0, 0x9e, 0xba, 0xa1, 0xf9, 0xfb, 0xd0, 0x36, 0x1f, 0x9c, 0x61, 0xa6, 0x28, 0xe7, 0x6b, - 0x7a, 0xa7, 0x94, 0x66, 0x4f, 0x2e, 0x6b, 0x9b, 0xd5, 0xb0, 0x1f, 0xc0, 0x9a, 0x16, 0x75, 0xf3, - 0x8e, 0x43, 0xc2, 0xde, 0x2b, 0xb9, 0xf9, 0x60, 0xda, 0x71, 0xbd, 0x2b, 0x33, 0xaf, 0x46, 0xdc, - 0x77, 0x90, 0x69, 0xec, 0x57, 0x3c, 0xb2, 0x05, 0xa3, 0xec, 0xf1, 0x92, 0x6c, 0xc1, 0x28, 0x7d, - 0xfa, 0x43, 0x31, 0x0d, 0x5b, 0xb1, 0xc6, 0x48, 0xc4, 0x04, 0xb0, 0x1f, 0xc1, 0x92, 0x71, 0x8b, - 0xec, 0xf0, 0x3c, 0x1c, 0x68, 0x01, 0x28, 0x5e, 0x72, 0xee, 0x95, 0xed, 0x52, 0xdc, 0x75, 0x2a, - 0x7f, 0xd9, 0xb5, 0x06, 0x07, 0x99, 0x7f, 0x0b, 0x5a, 0xe6, 0x0d, 0xb5, 0x37, 0x94, 0xbb, 0x6e, - 0x90, 0xcc, 0xfb, 0xb9, 0xf7, 0x1d, 0x76, 0x20, 0x62, 0xc3, 0xf4, 0x8b, 0xa2, 0x51, 0x9c, 0x5f, - 0x3e, 0xed, 0x97, 0x46, 0xf5, 0x44, 0x96, 0xbd, 0x31, 0x7b, 0xdb, 0xb9, 0xef, 0xb0, 0x7f, 0xe8, - 0x40, 0xdb, 0xba, 0x41, 0x66, 0x45, 0xda, 0xe4, 0x5a, 0xd6, 0x35, 0x69, 0x66, 0xd3, 0x5c, 0x8f, - 0xba, 0xbd, 0x77, 0xe7, 0x33, 0x6b, 0x58, 0xbf, 0xb4, 0x1c, 0x6a, 0x77, 0xf3, 0xcf, 0x8a, 0x7e, - 0x95, 0xcf, 0x60, 0x5e, 0x2d, 0xff, 0xea, 0xbe, 0xc3, 0xfe, 0xd8, 0x81, 0x45, 0xdb, 0x0b, 0xad, - 0xbb, 0x5b, 0xea, 0xef, 0xd6, 0x93, 0x3f, 0xc3, 0x75, 0xfd, 0x23, 0x6a, 0xe5, 0xb3, 0x3b, 0x9e, - 0xd5, 0x4a, 0xf9, 0x62, 0xcc, 0xaf, 0xd7, 0x5a, 0xf6, 0x89, 0x78, 0x56, 0x5b, 0x9d, 0x15, 0xb1, - 0xe2, 0x8b, 0xcc, 0x9a, 0x61, 0xcc, 0x37, 0x94, 0x69, 0x12, 0x7e, 0x22, 0x9e, 0xd3, 0x54, 0xc7, - 0x19, 0xc8, 0x77, 0x6f, 0xfb, 0xbd, 0x7b, 0x83, 0xfa, 0x74, 0xcd, 0xbd, 0x62, 0xf5, 0x29, 0xbf, - 0xc2, 0x6f, 0x8a, 0xd6, 0xc9, 0xe7, 0x8f, 0xb3, 0x25, 0xaa, 0xf0, 0x24, 0xf2, 0xec, 0x46, 0x8e, - 0x45, 0x23, 0x65, 0x76, 0x4b, 0x38, 0xde, 0xb2, 0x18, 0xf7, 0x0e, 0xb5, 0xf5, 0x86, 0xfb, 0xde, - 0xcc, 0xb6, 0xde, 0x23, 0x5f, 0x32, 0xb6, 0xf8, 0x00, 0x20, 0x3b, 0xdb, 0x65, 0xb9, 0x73, 0x45, - 0xad, 0x32, 0x8a, 0xc7, 0xbf, 0xb6, 0x04, 0xaa, 0xe3, 0x47, 0x2c, 0xf1, 0xc7, 0x42, 0x01, 0x3e, - 0x56, 0x27, 0x92, 0xa6, 0x99, 0x63, 0x1f, 0xc0, 0x5a, 0x66, 0x4e, 0xbe, 0x7c, 0x4b, 0xfd, 0xe9, - 0xe3, 0xcd, 0xe7, 0xb0, 0xb0, 0x17, 0x45, 0x2f, 0xa7, 0x13, 0x1d, 0x04, 0x63, 0x1f, 0xf3, 0xec, - 0xfa, 0xc9, 0x69, 0x2f, 0xd7, 0x0b, 0xf7, 0x3a, 0x15, 0xd5, 0x63, 0x5d, 0xa3, 0xa8, 0x7b, 0x5f, - 0x66, 0xe7, 0xc6, 0x5f, 0x31, 0x1f, 0x96, 0xb5, 0x56, 0xd5, 0x0d, 0xef, 0xd9, 0xc5, 0x58, 0xba, - 0x34, 0x5f, 0x85, 0x65, 0x8f, 0xab, 0xd6, 0xde, 0x4b, 0x54, 0x99, 0xa4, 0x53, 0xda, 0xdb, 0x7c, - 0x40, 0x97, 0x60, 0xe8, 0xac, 0x64, 0x25, 0x6b, 0xb8, 0x3e, 0x64, 0xe9, 0x2d, 0x58, 0xa0, 0xbd, - 0xd2, 0x4c, 0xfc, 0xf3, 0x98, 0x7f, 0x71, 0xef, 0x4b, 0x79, 0x0a, 0xf3, 0x95, 0x5a, 0x69, 0xd4, - 0x31, 0x95, 0xb5, 0xd2, 0xe4, 0xce, 0xb5, 0xac, 0x95, 0xa6, 0x70, 0xae, 0x65, 0x0d, 0xb5, 0x3a, - 0x26, 0x63, 0x23, 0x58, 0x2e, 0x1c, 0x85, 0xe9, 0x45, 0x66, 0xd6, 0x01, 0x5a, 0xef, 0xfa, 0xec, - 0x0c, 0x76, 0x6d, 0x77, 0xec, 0xda, 0x0e, 0x61, 0x61, 0x9b, 0x8b, 0xc1, 0x12, 0x51, 0xbf, 0xb9, - 0x6b, 0x88, 0x66, 0x4c, 0x71, 0x7e, 0x49, 0x20, 0x9a, 0x6d, 0x4a, 0x50, 0xb8, 0x2d, 0xfb, 0x31, - 0xb4, 0x1e, 0xf1, 0x54, 0x85, 0xf9, 0x6a, 0x63, 0x36, 0x17, 0xf7, 0xdb, 0x2b, 0x89, 0x12, 0xb6, - 0x79, 0x86, 0x4a, 0xbb, 0xc7, 0x87, 0x27, 0x5c, 0x28, 0xa7, 0x7e, 0x30, 0xfc, 0x8a, 0xfd, 0x25, - 0x2a, 0x5c, 0xdf, 0x73, 0x58, 0x33, 0x62, 0x36, 0xcd, 0xc2, 0x97, 0x72, 0x78, 0x59, 0xc9, 0x61, - 0x34, 0xe4, 0x86, 0x51, 0x15, 0x42, 0xcb, 0xb8, 0x9e, 0xa4, 0x05, 0xa8, 0x78, 0x11, 0x4e, 0x0b, - 0x50, 0xc9, 0x6d, 0x26, 0xf7, 0x36, 0xd5, 0xe3, 0xb2, 0xeb, 0x59, 0x3d, 0xe2, 0x06, 0x53, 0x56, - 0xd3, 0xbd, 0x2f, 0xfd, 0x71, 0xfa, 0x15, 0x7b, 0x41, 0x2f, 0x38, 0x99, 0x61, 0xcc, 0x99, 0x75, - 0x9e, 0x8f, 0x78, 0xd6, 0x83, 0x65, 0x90, 0x6c, 0x8b, 0x5d, 0x54, 0x45, 0xb6, 0xd7, 0xf7, 0x00, - 0x0e, 0xd3, 0x68, 0xb2, 0xed, 0xf3, 0x71, 0x14, 0x66, 0xba, 0x36, 0x0b, 0xa2, 0xcd, 0xf4, 0x97, - 0x11, 0x49, 0xcb, 0x5e, 0x18, 0xdb, 0x19, 0x2b, 0x12, 0x5c, 0x31, 0xd7, 0xcc, 0x38, 0x5b, 0x3d, - 0x20, 0x25, 0xb1, 0xb6, 0xf7, 0x1d, 0xb6, 0x09, 0x90, 0x9d, 0x85, 0xea, 0xcd, 0x49, 0xe1, 0x98, - 0x55, 0xab, 0xbd, 0x92, 0x83, 0xd3, 0x03, 0x68, 0x66, 0xa7, 0x5b, 0xeb, 0xd9, 0x25, 0x40, 0xeb, - 0x2c, 0x4c, 0xaf, 0xe0, 0x85, 0x33, 0x27, 0xb7, 0x43, 0x43, 0x05, 0xac, 0x81, 0x43, 0x45, 0x07, - 0x49, 0x01, 0xac, 0x88, 0x06, 0x6a, 0x03, 0x87, 0x82, 0x3f, 0x55, 0x4f, 0x4a, 0xce, 0x7d, 0xb4, - 0x34, 0x97, 0x1e, 0x88, 0x58, 0x3e, 0x16, 0xe4, 0x56, 0x11, 0x78, 0x8a, 0xaa, 0x79, 0x0c, 0xcb, - 0x05, 0x1f, 0xbb, 0x16, 0xe9, 0x59, 0x87, 0x28, 0x5a, 0xa4, 0x67, 0xba, 0xe7, 0xdd, 0xcb, 0x54, - 0xe5, 0x92, 0x0b, 0xb4, 0xa7, 0x7a, 0x15, 0xa4, 0x83, 0x53, 0xac, 0xee, 0x0f, 0x1d, 0x58, 0x29, - 0x71, 0xa1, 0xb3, 0xf7, 0xd5, 0xf6, 0x7c, 0xa6, 0x7b, 0xbd, 0x57, 0xea, 0x61, 0x75, 0x0f, 0xa9, - 0x9e, 0x27, 0xec, 0x73, 0x6b, 0x61, 0x13, 0xce, 0x4d, 0x29, 0x99, 0x6f, 0x34, 0x2a, 0x4a, 0x2d, - 0x8a, 0x2f, 0x60, 0x5d, 0x34, 0x64, 0x73, 0x34, 0xca, 0x79, 0x7f, 0xaf, 0x15, 0xfe, 0xf5, 0x8e, - 0xe5, 0xd5, 0xee, 0xcd, 0xfe, 0xd7, 0x3c, 0x33, 0x0c, 0x60, 0xd1, 0x54, 0x36, 0x85, 0x4e, 0xde, - 0xa3, 0xca, 0x66, 0x97, 0xd5, 0x7b, 0xcf, 0xda, 0x68, 0x96, 0x78, 0x61, 0x7f, 0x8b, 0x2a, 0x7b, - 0xcf, 0xed, 0x95, 0x8d, 0x8b, 0xd8, 0x7b, 0xe2, 0x7c, 0xfc, 0x15, 0xed, 0xfe, 0xcd, 0xf5, 0x53, - 0x55, 0x30, 0xcb, 0x5f, 0xad, 0xb7, 0xba, 0xe5, 0xde, 0xe3, 0x9b, 0x54, 0xfd, 0x75, 0xf7, 0x9d, - 0xb2, 0xea, 0x63, 0xf1, 0x89, 0xd8, 0xf4, 0xae, 0xe7, 0xe5, 0x5a, 0xb5, 0xe0, 0x7a, 0xd9, 0x7c, - 0xcf, 0xdc, 0xbd, 0xe4, 0xc6, 0xfa, 0x12, 0xd9, 0x76, 0x6d, 0xd3, 0xdd, 0xab, 0xc5, 0xa7, 0xc4, - 0xaf, 0xac, 0xc5, 0xa7, 0xcc, 0x3f, 0x6c, 0xdb, 0x35, 0xca, 0x33, 0xfc, 0x89, 0x73, 0xe7, 0xc1, - 0xad, 0x1f, 0xfd, 0xd6, 0x49, 0x90, 0x9e, 0x4e, 0x8f, 0xee, 0x0e, 0xa2, 0xf1, 0xbd, 0x91, 0x72, - 0xeb, 0xc9, 0x0b, 0x11, 0xf7, 0x46, 0xe1, 0xf0, 0x1e, 0x15, 0x7b, 0x34, 0x47, 0xff, 0x2b, 0xec, - 0x3b, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x60, 0xd6, 0x92, 0xa4, 0x5d, 0x6c, 0x00, 0x00, + 0x62, 0x8c, 0x0d, 0x03, 0xb6, 0x61, 0x63, 0x81, 0x59, 0x03, 0xde, 0x85, 0x0f, 0xf6, 0xc5, 0xc0, + 0xda, 0xd8, 0x93, 0x0d, 0x63, 0x01, 0x03, 0x86, 0x0f, 0x3e, 0x18, 0xf0, 0xc1, 0x03, 0xc3, 0x06, + 0x8c, 0x85, 0xcf, 0xbe, 0x1b, 0xef, 0xc5, 0x47, 0x46, 0x64, 0x66, 0x89, 0xea, 0x99, 0xb1, 0x4f, + 0xac, 0xf8, 0x45, 0x64, 0x7c, 0xbe, 0xf7, 0xe2, 0xc5, 0x7b, 0x2f, 0x82, 0xd0, 0x8c, 0x27, 0x83, + 0xbb, 0x93, 0x38, 0x4a, 0x23, 0x56, 0x1f, 0x85, 0xf1, 0x64, 0xd0, 0xbb, 0x7a, 0x12, 0x45, 0x27, + 0x23, 0x7e, 0xcf, 0x9f, 0x04, 0xf7, 0xfc, 0x30, 0x8c, 0x52, 0x3f, 0x0d, 0xa2, 0x30, 0x11, 0x85, + 0xdc, 0x9f, 0xc0, 0xe2, 0x23, 0x1e, 0x1e, 0x72, 0x3e, 0xf4, 0xf8, 0x17, 0x53, 0x9e, 0xa4, 0xec, + 0x5b, 0xb0, 0xec, 0xf3, 0x9f, 0x71, 0x3e, 0xec, 0x4f, 0xfc, 0x24, 0x99, 0x9c, 0xc6, 0x7e, 0xc2, + 0xbb, 0xce, 0x75, 0xe7, 0x76, 0xdb, 0xeb, 0x88, 0x8c, 0x03, 0x8d, 0xb3, 0xf7, 0xa1, 0x9d, 0x60, + 0x51, 0x1e, 0xa6, 0x71, 0x34, 0x39, 0xef, 0x56, 0xa8, 0x5c, 0x0b, 0xb1, 0x1d, 0x01, 0xb9, 0x23, + 0x58, 0xd2, 0x2d, 0x24, 0x93, 0x28, 0x4c, 0x38, 0xbb, 0x0f, 0xab, 0x83, 0x60, 0x72, 0xca, 0xe3, + 0x3e, 0x7d, 0x3c, 0x0e, 0xf9, 0x38, 0x0a, 0x83, 0x41, 0xd7, 0xb9, 0x5e, 0xbd, 0xdd, 0xf4, 0x98, + 0xc8, 0xc3, 0x2f, 0x9e, 0xc8, 0x1c, 0x76, 0x0b, 0x96, 0x78, 0x28, 0x70, 0x3e, 0xa4, 0xaf, 0x64, + 0x53, 0x8b, 0x19, 0x8c, 0x1f, 0xb8, 0x7f, 0xb3, 0x02, 0xcb, 0x8f, 0xc3, 0x20, 0x7d, 0xe1, 0x8f, + 0x46, 0x3c, 0x55, 0x63, 0xba, 0x05, 0x4b, 0xaf, 0x08, 0xa0, 0x31, 0xbd, 0x8a, 0xe2, 0xa1, 0x1c, + 0xd1, 0xa2, 0x80, 0x0f, 0x24, 0x3a, 0xb3, 0x67, 0x95, 0x99, 0x3d, 0x2b, 0x9d, 0xae, 0xea, 0x8c, + 0xe9, 0xba, 0x05, 0x4b, 0x31, 0x1f, 0x44, 0x67, 0x3c, 0x3e, 0xef, 0xbf, 0x0a, 0xc2, 0x61, 0xf4, + 0xaa, 0x5b, 0xbb, 0xee, 0xdc, 0xae, 0x7b, 0x8b, 0x0a, 0x7e, 0x41, 0x28, 0x7b, 0x00, 0x4b, 0x83, + 0x53, 0x3f, 0x0c, 0xf9, 0xa8, 0x7f, 0xe4, 0x0f, 0x5e, 0x4e, 0x27, 0x49, 0xb7, 0x7e, 0xdd, 0xb9, + 0xdd, 0xda, 0xb8, 0x72, 0x97, 0x56, 0xf5, 0xee, 0xd6, 0xa9, 0x1f, 0x3e, 0xa0, 0x9c, 0xc3, 0xd0, + 0x9f, 0x24, 0xa7, 0x51, 0xea, 0x2d, 0xca, 0x2f, 0x04, 0x9c, 0xb8, 0xab, 0xc0, 0xcc, 0x99, 0x10, + 0x73, 0xef, 0xfe, 0x33, 0x07, 0x56, 0x9e, 0x87, 0xa3, 0x68, 0xf0, 0xf2, 0x57, 0x9c, 0xa2, 0x92, + 0x31, 0x54, 0xde, 0x76, 0x0c, 0xd5, 0xaf, 0x3b, 0x86, 0x35, 0x58, 0xb5, 0x3b, 0x2b, 0x47, 0xc1, + 0xe1, 0x32, 0x7e, 0x7d, 0xc2, 0x55, 0xb7, 0xd4, 0x30, 0xbe, 0x09, 0x9d, 0xc1, 0x34, 0x8e, 0x79, + 0x58, 0x18, 0xc7, 0x92, 0xc4, 0xf5, 0x40, 0xde, 0x87, 0x76, 0xc8, 0x5f, 0x65, 0xc5, 0x24, 0xed, + 0x86, 0xfc, 0x95, 0x2a, 0xe2, 0x76, 0x61, 0x2d, 0xdf, 0x8c, 0xec, 0xc0, 0x7f, 0x73, 0xa0, 0xf6, + 0x3c, 0x7d, 0x1d, 0xb1, 0xbb, 0x50, 0x4b, 0xcf, 0x27, 0x82, 0x43, 0x16, 0x37, 0x98, 0x1c, 0xda, + 0xe6, 0x70, 0x18, 0xf3, 0x24, 0x79, 0x76, 0x3e, 0xe1, 0x5e, 0xdb, 0x17, 0x89, 0x3e, 0x96, 0x63, + 0x5d, 0x98, 0x97, 0x69, 0x6a, 0xb0, 0xe9, 0xa9, 0x24, 0xbb, 0x06, 0xe0, 0x8f, 0xa3, 0x69, 0x98, + 0xf6, 0x13, 0x3f, 0xa5, 0xa9, 0xaa, 0x7a, 0x06, 0xc2, 0xae, 0x42, 0x73, 0xf2, 0xb2, 0x9f, 0x0c, + 0xe2, 0x60, 0x92, 0x12, 0xd9, 0x34, 0xbd, 0x0c, 0x60, 0xdf, 0x82, 0x46, 0x34, 0x4d, 0x27, 0x51, + 0x10, 0xa6, 0x92, 0x54, 0x96, 0x64, 0x5f, 0x9e, 0x4e, 0xd3, 0x03, 0x84, 0x3d, 0x5d, 0x80, 0xdd, + 0x80, 0x85, 0x41, 0x14, 0x1e, 0x07, 0xf1, 0x58, 0x08, 0x83, 0xee, 0x1c, 0xb5, 0x66, 0x83, 0xee, + 0xbf, 0xaa, 0x40, 0xeb, 0x59, 0xec, 0x87, 0x89, 0x3f, 0x40, 0x00, 0xbb, 0x9e, 0xbe, 0xee, 0x9f, + 0xfa, 0xc9, 0x29, 0x8d, 0xb6, 0xe9, 0xa9, 0x24, 0x5b, 0x83, 0x39, 0xd1, 0x51, 0x1a, 0x53, 0xd5, + 0x93, 0x29, 0xf6, 0x01, 0x2c, 0x87, 0xd3, 0x71, 0xdf, 0x6e, 0xab, 0x4a, 0xd4, 0x52, 0xcc, 0xc0, + 0x09, 0x38, 0xc2, 0xb5, 0x16, 0x4d, 0x88, 0x11, 0x1a, 0x08, 0x73, 0xa1, 0x2d, 0x53, 0x3c, 0x38, + 0x39, 0x15, 0xc3, 0xac, 0x7b, 0x16, 0x86, 0x75, 0xa4, 0xc1, 0x98, 0xf7, 0x93, 0xd4, 0x1f, 0x4f, + 0xe4, 0xb0, 0x0c, 0x84, 0xf2, 0xa3, 0xd4, 0x1f, 0xf5, 0x8f, 0x39, 0x4f, 0xba, 0xf3, 0x32, 0x5f, + 0x23, 0xec, 0x26, 0x2c, 0x0e, 0x79, 0x92, 0xf6, 0xe5, 0xa2, 0xf0, 0xa4, 0xdb, 0x20, 0xd6, 0xcf, + 0xa1, 0x58, 0x4f, 0xec, 0xbf, 0xea, 0xe3, 0x04, 0xf0, 0xd7, 0xdd, 0xa6, 0xe8, 0x6b, 0x86, 0x20, + 0xe5, 0x3c, 0xe2, 0xa9, 0x31, 0x7b, 0x89, 0xa4, 0x50, 0x77, 0x0f, 0x98, 0x01, 0x6f, 0xf3, 0xd4, + 0x0f, 0x46, 0x09, 0xfb, 0x08, 0xda, 0xa9, 0x51, 0x98, 0x44, 0x61, 0x4b, 0x93, 0x93, 0xf1, 0x81, + 0x67, 0x95, 0x73, 0x4f, 0xa1, 0xf1, 0x90, 0xf3, 0xbd, 0x60, 0x1c, 0xa4, 0x6c, 0x0d, 0xea, 0xc7, + 0xc1, 0x6b, 0x2e, 0x08, 0xbe, 0xba, 0x7b, 0xc9, 0x13, 0x49, 0xf6, 0x1e, 0x00, 0xfd, 0xe8, 0x8f, + 0x35, 0x61, 0xed, 0x5e, 0xf2, 0x9a, 0x84, 0x3d, 0x41, 0xca, 0xea, 0xc1, 0xfc, 0x84, 0xc7, 0x03, + 0xae, 0xd6, 0x6f, 0xf7, 0x92, 0xa7, 0x80, 0x07, 0xf3, 0x50, 0x1f, 0x61, 0xed, 0xee, 0x9f, 0xd4, + 0xa0, 0x75, 0xc8, 0x43, 0xcd, 0x69, 0x0c, 0x6a, 0x38, 0x27, 0x92, 0xbb, 0xe8, 0x37, 0xfb, 0x06, + 0xb4, 0x68, 0x9e, 0x92, 0x34, 0x0e, 0xc2, 0x13, 0x41, 0xe0, 0x0f, 0x2a, 0x5d, 0xc7, 0x03, 0x84, + 0x0f, 0x09, 0x65, 0x1d, 0xa8, 0xfa, 0x63, 0x45, 0xe0, 0xf8, 0x93, 0x5d, 0x81, 0x86, 0x3f, 0x4e, + 0x45, 0xf7, 0xda, 0x04, 0xcf, 0xfb, 0xe3, 0x94, 0xba, 0xf6, 0x3e, 0xb4, 0x27, 0xfe, 0xf9, 0x18, + 0xf9, 0x59, 0x53, 0x45, 0xdb, 0x6b, 0x49, 0x6c, 0x17, 0xc9, 0x62, 0x03, 0x56, 0xcc, 0x22, 0xaa, + 0xf1, 0xba, 0x6e, 0x7c, 0xd9, 0x28, 0x2d, 0xfb, 0x70, 0x0b, 0x96, 0xd4, 0x37, 0xb1, 0x18, 0x0f, + 0xd1, 0x4a, 0xd3, 0x5b, 0x94, 0xb0, 0x1a, 0xe5, 0x6d, 0xe8, 0x1c, 0x07, 0xa1, 0x3f, 0xea, 0x0f, + 0x46, 0xe9, 0x59, 0x7f, 0xc8, 0x47, 0xa9, 0x4f, 0x54, 0x53, 0xf7, 0x16, 0x09, 0xdf, 0x1a, 0xa5, + 0x67, 0xdb, 0x88, 0xb2, 0x0f, 0xa0, 0x79, 0xcc, 0x79, 0x9f, 0x26, 0xab, 0xdb, 0xb0, 0x38, 0x50, + 0xad, 0x90, 0xd7, 0x38, 0x56, 0x6b, 0xf5, 0x01, 0x74, 0xa2, 0x69, 0x7a, 0x12, 0x05, 0xe1, 0x49, + 0x1f, 0x65, 0x5e, 0x3f, 0x18, 0x12, 0x15, 0xd5, 0x1e, 0x54, 0xee, 0x3b, 0xde, 0xa2, 0xca, 0x43, + 0xe9, 0xf3, 0x78, 0xc8, 0x6e, 0xc2, 0xd2, 0xc8, 0x4f, 0xd2, 0xfe, 0x69, 0x34, 0xe9, 0x4f, 0xa6, + 0x47, 0x2f, 0xf9, 0x79, 0x77, 0x81, 0x26, 0x62, 0x01, 0xe1, 0xdd, 0x68, 0x72, 0x40, 0x20, 0x7b, + 0x17, 0x80, 0xfa, 0x29, 0x3a, 0x01, 0xd7, 0x9d, 0xdb, 0x0b, 0x5e, 0x13, 0x11, 0xd1, 0xe8, 0x27, + 0xd0, 0xa0, 0xe5, 0x49, 0x47, 0x67, 0xdd, 0x16, 0x11, 0xd8, 0x7b, 0xb2, 0x87, 0xc6, 0xc2, 0xde, + 0xdd, 0xe6, 0x49, 0xfa, 0x6c, 0x74, 0x86, 0xfb, 0xf7, 0xb9, 0x37, 0x3f, 0x14, 0xa9, 0xde, 0x27, + 0xd0, 0x36, 0x33, 0x70, 0x15, 0xb1, 0x1b, 0xb8, 0xfa, 0x35, 0x0f, 0x7f, 0xb2, 0x55, 0xa8, 0x9f, + 0xf9, 0xa3, 0x29, 0x97, 0x82, 0x54, 0x24, 0x3e, 0xa9, 0x7c, 0xec, 0xb8, 0x7f, 0xe2, 0x40, 0x5b, + 0xb4, 0x20, 0x15, 0x80, 0x1b, 0xb0, 0xa0, 0xa6, 0x9f, 0xc7, 0x71, 0x14, 0x4b, 0x79, 0x62, 0x83, + 0xec, 0x0e, 0x74, 0x14, 0x30, 0x89, 0x79, 0x30, 0xf6, 0x4f, 0x54, 0xdd, 0x05, 0x9c, 0x6d, 0x64, + 0x35, 0xc6, 0xd1, 0x34, 0xe5, 0x72, 0xab, 0x69, 0xcb, 0xf1, 0x79, 0x88, 0x79, 0x76, 0x11, 0x94, + 0x27, 0x25, 0xb4, 0x65, 0x61, 0xee, 0xdf, 0x73, 0x80, 0x61, 0xd7, 0x9f, 0x45, 0xa2, 0x0a, 0x49, + 0x16, 0x79, 0xb2, 0x74, 0xde, 0x9a, 0x2c, 0x2b, 0x6f, 0x22, 0x4b, 0x17, 0xea, 0xa2, 0xf7, 0xb5, + 0x92, 0xde, 0x8b, 0xac, 0xcf, 0x6a, 0x8d, 0x6a, 0xa7, 0xe6, 0xfe, 0x97, 0x2a, 0xac, 0x6e, 0x89, + 0xbd, 0x72, 0x73, 0x30, 0xe0, 0x13, 0x4d, 0xb0, 0xef, 0x41, 0x2b, 0x8c, 0x86, 0x5c, 0x91, 0x89, + 0xe8, 0x18, 0x20, 0x64, 0xd0, 0xc8, 0xa9, 0x1f, 0x84, 0xa2, 0xe3, 0x62, 0x3e, 0x9b, 0x84, 0x50, + 0xb7, 0x6f, 0xc2, 0xd2, 0x84, 0x87, 0x43, 0x93, 0x2e, 0x85, 0x36, 0xb3, 0x20, 0x61, 0x49, 0x92, + 0xef, 0x41, 0xeb, 0x78, 0x2a, 0xca, 0x21, 0x37, 0xd7, 0x88, 0x0e, 0x40, 0x42, 0x9b, 0x82, 0xa9, + 0x27, 0xd3, 0xe4, 0x94, 0x72, 0xeb, 0x94, 0x3b, 0x8f, 0x69, 0xcc, 0x7a, 0x17, 0x60, 0x38, 0x4d, + 0x52, 0x49, 0xa6, 0x73, 0x94, 0xd9, 0x44, 0x44, 0x90, 0xe9, 0xb7, 0x61, 0x65, 0xec, 0xbf, 0xee, + 0x13, 0xfd, 0xf4, 0x83, 0xb0, 0x7f, 0x3c, 0x22, 0x71, 0x3f, 0x4f, 0xe5, 0x3a, 0x63, 0xff, 0xf5, + 0x0f, 0x30, 0xe7, 0x71, 0xf8, 0x90, 0x70, 0xe4, 0x65, 0xa5, 0x67, 0xc4, 0x3c, 0xe1, 0xf1, 0x19, + 0x27, 0xf6, 0xab, 0x69, 0x65, 0xc2, 0x13, 0x28, 0xf6, 0x68, 0x8c, 0xe3, 0x4e, 0x47, 0x03, 0xc1, + 0x6b, 0xde, 0xfc, 0x38, 0x08, 0x77, 0xd3, 0xd1, 0x80, 0x5d, 0x05, 0x40, 0xe6, 0x9d, 0xf0, 0xb8, + 0xff, 0xf2, 0x15, 0x31, 0x4e, 0x8d, 0x98, 0xf5, 0x80, 0xc7, 0x9f, 0xbf, 0x62, 0xef, 0x40, 0x73, + 0x90, 0x10, 0xf7, 0xfb, 0xe7, 0xdd, 0x16, 0x71, 0x55, 0x63, 0x90, 0x20, 0xdf, 0xfb, 0xe7, 0xec, + 0x03, 0x60, 0xd8, 0x5b, 0x9f, 0x56, 0x81, 0x0f, 0xa9, 0xfa, 0x84, 0xc4, 0xd8, 0x02, 0x75, 0x76, + 0x53, 0x66, 0x60, 0x3b, 0x09, 0xfb, 0x06, 0x2c, 0xa8, 0xce, 0x1e, 0x8f, 0xfc, 0x93, 0x84, 0xf8, + 0x78, 0xc1, 0x6b, 0x4b, 0xf0, 0x21, 0x62, 0xee, 0x0b, 0xa1, 0xdd, 0x18, 0x6b, 0x2b, 0xf9, 0x06, + 0xf7, 0x59, 0x42, 0x68, 0x5d, 0x1b, 0x9e, 0x4c, 0x95, 0x2d, 0x5a, 0xa5, 0x64, 0xd1, 0xdc, 0x5f, + 0x38, 0xd0, 0x96, 0x35, 0x93, 0x4a, 0xc0, 0xee, 0x03, 0x53, 0xab, 0x98, 0xbe, 0x0e, 0x86, 0xfd, + 0xa3, 0xf3, 0x94, 0x27, 0x82, 0x68, 0x76, 0x2f, 0x79, 0x25, 0x79, 0x28, 0xb8, 0x2c, 0x34, 0x49, + 0x63, 0x41, 0xd3, 0xbb, 0x97, 0xbc, 0x42, 0x0e, 0xb2, 0x18, 0x2a, 0x1d, 0xd3, 0xb4, 0x1f, 0x84, + 0x43, 0xfe, 0x9a, 0x48, 0x69, 0xc1, 0xb3, 0xb0, 0x07, 0x8b, 0xd0, 0x36, 0xbf, 0x73, 0x7f, 0x0a, + 0x0d, 0xa5, 0xb2, 0xd0, 0x76, 0x9d, 0xeb, 0x97, 0x67, 0x20, 0xac, 0x07, 0x0d, 0xbb, 0x17, 0x5e, + 0xe3, 0xeb, 0xb4, 0xed, 0xfe, 0x05, 0xe8, 0xec, 0x21, 0x11, 0x85, 0x48, 0xb4, 0x52, 0x0f, 0x5b, + 0x83, 0x39, 0x83, 0x79, 0x9a, 0x9e, 0x4c, 0xe1, 0x86, 0x77, 0x1a, 0x25, 0xa9, 0x6c, 0x87, 0x7e, + 0xbb, 0x7f, 0xe6, 0x00, 0xdb, 0x49, 0xd2, 0x60, 0xec, 0xa7, 0xfc, 0x21, 0xd7, 0xe2, 0xe1, 0x29, + 0xb4, 0xb1, 0xb6, 0x67, 0xd1, 0xa6, 0xd0, 0x8a, 0xc4, 0x6e, 0xfe, 0x2d, 0xc9, 0xce, 0xc5, 0x0f, + 0xee, 0x9a, 0xa5, 0x85, 0xe0, 0xb5, 0x2a, 0x40, 0x6e, 0x4b, 0xfd, 0xf8, 0x84, 0xa7, 0xa4, 0x32, + 0x49, 0x85, 0x1b, 0x04, 0xb4, 0x15, 0x85, 0xc7, 0xbd, 0xdf, 0x85, 0xe5, 0x42, 0x1d, 0xa6, 0x8c, + 0x6e, 0x96, 0xc8, 0xe8, 0xaa, 0x29, 0xa3, 0x07, 0xb0, 0x62, 0xf5, 0x4b, 0x52, 0x5c, 0x17, 0xe6, + 0x91, 0x31, 0x70, 0x67, 0x76, 0xc4, 0xce, 0x2c, 0x93, 0x6c, 0x03, 0x56, 0x8f, 0x39, 0x8f, 0xfd, + 0x94, 0x92, 0xc4, 0x3a, 0xb8, 0x26, 0xb2, 0xe6, 0xd2, 0x3c, 0xf7, 0xbf, 0x3b, 0xb0, 0x84, 0xd2, + 0xf4, 0x89, 0x1f, 0x9e, 0xab, 0xb9, 0xda, 0x2b, 0x9d, 0xab, 0xdb, 0xc6, 0xc6, 0x64, 0x94, 0xfe, + 0xba, 0x13, 0x55, 0xcd, 0x4f, 0x14, 0xbb, 0x0e, 0x6d, 0xab, 0xbb, 0x75, 0xa1, 0x02, 0x26, 0x7e, + 0x7a, 0xc0, 0xe3, 0x07, 0xe7, 0x29, 0xff, 0xf5, 0xa7, 0xf2, 0x26, 0x74, 0xb2, 0x6e, 0xcb, 0x79, + 0x64, 0x50, 0x43, 0xc2, 0x94, 0x15, 0xd0, 0x6f, 0xf7, 0x1f, 0x39, 0xa2, 0xe0, 0x56, 0x14, 0x68, + 0xf5, 0x10, 0x0b, 0xa2, 0x96, 0xa9, 0x0a, 0xe2, 0xef, 0x99, 0xea, 0xf5, 0xaf, 0x3f, 0x58, 0x94, + 0x89, 0x09, 0x0f, 0x87, 0x7d, 0x7f, 0x34, 0x22, 0x41, 0xdc, 0xf0, 0xe6, 0x31, 0xbd, 0x39, 0x1a, + 0xb9, 0xb7, 0x60, 0xd9, 0xe8, 0xdd, 0x1b, 0xc6, 0xb1, 0x0f, 0x6c, 0x2f, 0x48, 0xd2, 0xe7, 0x61, + 0x32, 0x31, 0x34, 0xa7, 0x77, 0xa0, 0x89, 0xd2, 0x16, 0x7b, 0x26, 0x38, 0xb7, 0xee, 0xa1, 0xf8, + 0xc5, 0x7e, 0x25, 0x94, 0xe9, 0xbf, 0x96, 0x99, 0x15, 0x99, 0xe9, 0xbf, 0xa6, 0x4c, 0xf7, 0x63, + 0x58, 0xb1, 0xea, 0x93, 0x4d, 0xbf, 0x0f, 0xf5, 0x69, 0xfa, 0x3a, 0x52, 0xba, 0x71, 0x4b, 0x52, + 0x08, 0x9e, 0xc2, 0x3c, 0x91, 0xe3, 0x7e, 0x0a, 0xcb, 0xfb, 0xfc, 0x95, 0x64, 0x64, 0xd5, 0x91, + 0x9b, 0x17, 0x9e, 0xd0, 0x28, 0xdf, 0xbd, 0x0b, 0xcc, 0xfc, 0x38, 0x63, 0x00, 0x75, 0x5e, 0x73, + 0xac, 0xf3, 0x9a, 0x7b, 0x13, 0xd8, 0x61, 0x70, 0x12, 0x3e, 0xe1, 0x49, 0xe2, 0x9f, 0x68, 0xd6, + 0xef, 0x40, 0x75, 0x9c, 0x9c, 0x48, 0x51, 0x85, 0x3f, 0xdd, 0xef, 0xc0, 0x8a, 0x55, 0x4e, 0x56, + 0x7c, 0x15, 0x9a, 0x49, 0x70, 0x12, 0xfa, 0xe9, 0x34, 0xe6, 0xb2, 0xea, 0x0c, 0x70, 0x1f, 0xc2, + 0xea, 0x0f, 0x78, 0x1c, 0x1c, 0x9f, 0x5f, 0x54, 0xbd, 0x5d, 0x4f, 0x25, 0x5f, 0xcf, 0x0e, 0x5c, + 0xce, 0xd5, 0x23, 0x9b, 0x17, 0xe4, 0x2b, 0x57, 0xb2, 0xe1, 0x89, 0x84, 0x21, 0xfb, 0x2a, 0xa6, + 0xec, 0x73, 0x9f, 0x03, 0xdb, 0x8a, 0xc2, 0x90, 0x0f, 0xd2, 0x03, 0xce, 0xe3, 0xcc, 0x54, 0x94, + 0xd1, 0x6a, 0x6b, 0x63, 0x5d, 0xce, 0x6c, 0x5e, 0xa0, 0x4a, 0x22, 0x66, 0x50, 0x9b, 0xf0, 0x78, + 0x4c, 0x15, 0x37, 0x3c, 0xfa, 0xed, 0x5e, 0x86, 0x15, 0xab, 0x5a, 0x79, 0xb8, 0xfe, 0x10, 0x2e, + 0x6f, 0x07, 0xc9, 0xa0, 0xd8, 0x60, 0x17, 0xe6, 0x27, 0xd3, 0xa3, 0x7e, 0xc6, 0x89, 0x2a, 0x89, + 0xe7, 0xad, 0xfc, 0x27, 0xb2, 0xb2, 0xbf, 0xe1, 0x40, 0x6d, 0xf7, 0xd9, 0xde, 0x16, 0xee, 0x15, + 0x41, 0x38, 0x88, 0xc6, 0xa8, 0x85, 0x89, 0x41, 0xeb, 0xf4, 0x4c, 0x0e, 0xbb, 0x0a, 0x4d, 0x52, + 0xde, 0xf0, 0x88, 0x29, 0xf5, 0xa0, 0x0c, 0xc0, 0xe3, 0x2d, 0x7f, 0x3d, 0x09, 0x62, 0x3a, 0xbf, + 0xaa, 0x53, 0x69, 0x8d, 0xb6, 0x99, 0x62, 0x86, 0xfb, 0x8b, 0x79, 0x98, 0x97, 0x9b, 0xaf, 0xd8, + 0xc8, 0xd3, 0xe0, 0x8c, 0x67, 0x1b, 0x39, 0xa6, 0x50, 0x31, 0x8e, 0xf9, 0x38, 0x4a, 0xb5, 0xfe, + 0x26, 0x96, 0xc1, 0x06, 0xe9, 0xf8, 0x2e, 0x95, 0x08, 0x71, 0xe0, 0xaf, 0x8a, 0x52, 0x16, 0xc8, + 0xae, 0xc2, 0xbc, 0x52, 0x06, 0x6a, 0xfa, 0x64, 0xa1, 0x20, 0x9c, 0x8d, 0x81, 0x3f, 0xf1, 0x07, + 0x41, 0x7a, 0x2e, 0xc5, 0x82, 0x4e, 0x63, 0xfd, 0xa3, 0x68, 0xe0, 0x8f, 0xfa, 0x47, 0xfe, 0xc8, + 0x0f, 0x07, 0x5c, 0x99, 0x07, 0x2c, 0x10, 0x8f, 0xca, 0xb2, 0x5b, 0xaa, 0x98, 0x38, 0x4e, 0xe7, + 0x50, 0xdc, 0xc3, 0x07, 0xd1, 0x78, 0x1c, 0xa4, 0x78, 0xc2, 0x26, 0xd5, 0xac, 0xea, 0x19, 0x88, + 0x30, 0x46, 0x50, 0xea, 0x95, 0x98, 0xc1, 0xa6, 0x32, 0x46, 0x18, 0x20, 0xd6, 0x92, 0xd3, 0xd0, + 0xaa, 0x9e, 0x81, 0xe0, 0x5a, 0x4c, 0xc3, 0x84, 0xa7, 0xe9, 0x88, 0x0f, 0x75, 0x87, 0x5a, 0x54, + 0xac, 0x98, 0xc1, 0xee, 0xc3, 0x8a, 0x38, 0xf4, 0x27, 0x7e, 0x1a, 0x25, 0xa7, 0x41, 0xd2, 0x4f, + 0xf0, 0xf4, 0x2b, 0x0e, 0x9f, 0x65, 0x59, 0xec, 0x63, 0x58, 0xcf, 0xc1, 0x31, 0x1f, 0xf0, 0xe0, + 0x8c, 0x0f, 0x49, 0x85, 0xab, 0x7a, 0xb3, 0xb2, 0xd9, 0x75, 0x68, 0x85, 0xd3, 0x71, 0x7f, 0x3a, + 0x19, 0xfa, 0xa8, 0xc4, 0x2c, 0x92, 0x72, 0x69, 0x42, 0xec, 0x43, 0x50, 0x7a, 0x9a, 0xd4, 0x1e, + 0x97, 0x2c, 0x09, 0x87, 0xd4, 0xeb, 0xd9, 0x25, 0x90, 0x30, 0x33, 0x95, 0xb4, 0x23, 0x0f, 0x7a, + 0x0a, 0x20, 0x3e, 0x89, 0x83, 0x33, 0x3f, 0xe5, 0xdd, 0x65, 0x21, 0xd4, 0x65, 0x12, 0xbf, 0x0b, + 0xc2, 0x20, 0x0d, 0xfc, 0x34, 0x8a, 0xbb, 0x8c, 0xf2, 0x32, 0x00, 0x27, 0x91, 0xe8, 0x23, 0x49, + 0xfd, 0x74, 0x9a, 0x48, 0x0d, 0x75, 0x85, 0x88, 0xab, 0x98, 0xc1, 0x3e, 0x82, 0x35, 0x41, 0x11, + 0x94, 0x25, 0x75, 0x6f, 0x52, 0x15, 0x56, 0x69, 0x46, 0x66, 0xe4, 0xe2, 0x54, 0x4a, 0x12, 0x29, + 0x7c, 0x78, 0x59, 0x4c, 0xe5, 0x8c, 0x6c, 0xec, 0x1f, 0xf6, 0x20, 0x18, 0xf4, 0x65, 0x09, 0x64, + 0x91, 0x35, 0x1a, 0x45, 0x31, 0x03, 0x49, 0x7c, 0x14, 0x1c, 0xf3, 0x34, 0x18, 0xf3, 0xee, 0xba, + 0x20, 0x71, 0x95, 0x46, 0x06, 0x9c, 0x4e, 0x28, 0xa7, 0x2b, 0x18, 0x5e, 0xa4, 0xdc, 0x3f, 0x70, + 0xc4, 0xe6, 0x23, 0x19, 0x35, 0x31, 0x8e, 0x55, 0x82, 0x45, 0xfb, 0x51, 0x38, 0x3a, 0x97, 0x5c, + 0x0b, 0x02, 0x7a, 0x1a, 0x8e, 0xce, 0x51, 0xb1, 0x0f, 0x42, 0xb3, 0x88, 0x90, 0x73, 0x6d, 0x05, + 0x52, 0xa1, 0xf7, 0xa0, 0x35, 0x99, 0x1e, 0x8d, 0x82, 0x81, 0x28, 0x52, 0x15, 0xb5, 0x08, 0x88, + 0x0a, 0xe0, 0xb9, 0x52, 0xac, 0x94, 0x28, 0x51, 0xa3, 0x12, 0x2d, 0x89, 0x61, 0x11, 0xf7, 0x01, + 0xac, 0xda, 0x1d, 0x94, 0x02, 0xfd, 0x0e, 0x34, 0x24, 0xff, 0x27, 0xf2, 0x70, 0xbf, 0x68, 0xd8, + 0x59, 0xf1, 0x18, 0xa4, 0xf3, 0xdd, 0x7f, 0x5d, 0x83, 0x15, 0x89, 0x6e, 0x8d, 0xa2, 0x84, 0x1f, + 0x4e, 0xc7, 0x63, 0x3f, 0x2e, 0x11, 0x2c, 0xce, 0x05, 0x82, 0xa5, 0x52, 0x14, 0x2c, 0xd7, 0xac, + 0xf3, 0xa5, 0x90, 0x4c, 0x06, 0xc2, 0x6e, 0xc3, 0xd2, 0x60, 0x14, 0x25, 0x42, 0xdd, 0x37, 0x4d, + 0x7d, 0x79, 0xb8, 0x28, 0x0c, 0xeb, 0x65, 0xc2, 0xd0, 0x14, 0x64, 0x73, 0x39, 0x41, 0xe6, 0x42, + 0x1b, 0x2b, 0xe5, 0x4a, 0x36, 0xcf, 0xcb, 0xc3, 0x96, 0x81, 0x61, 0x7f, 0xf2, 0x62, 0x43, 0xc8, + 0xa8, 0xa5, 0x32, 0xa1, 0x11, 0x8c, 0x39, 0xc9, 0x7e, 0xa3, 0x74, 0x53, 0x0a, 0x8d, 0x62, 0x16, + 0x7b, 0x08, 0x20, 0xda, 0x22, 0x05, 0x04, 0x48, 0x01, 0xb9, 0x69, 0xaf, 0x8a, 0x39, 0xff, 0x77, + 0x31, 0x31, 0x8d, 0x39, 0x29, 0x25, 0xc6, 0x97, 0xee, 0xdf, 0x72, 0xa0, 0x65, 0xe4, 0xb1, 0xcb, + 0xb0, 0xbc, 0xf5, 0xf4, 0xe9, 0xc1, 0x8e, 0xb7, 0xf9, 0xec, 0xf1, 0x0f, 0x76, 0xfa, 0x5b, 0x7b, + 0x4f, 0x0f, 0x77, 0x3a, 0x97, 0x10, 0xde, 0x7b, 0xba, 0xb5, 0xb9, 0xd7, 0x7f, 0xf8, 0xd4, 0xdb, + 0x52, 0xb0, 0xc3, 0xd6, 0x80, 0x79, 0x3b, 0x4f, 0x9e, 0x3e, 0xdb, 0xb1, 0xf0, 0x0a, 0xeb, 0x40, + 0xfb, 0x81, 0xb7, 0xb3, 0xb9, 0xb5, 0x2b, 0x91, 0x2a, 0x5b, 0x85, 0xce, 0xc3, 0xe7, 0xfb, 0xdb, + 0x8f, 0xf7, 0x1f, 0xf5, 0xb7, 0x36, 0xf7, 0xb7, 0x76, 0xf6, 0x76, 0xb6, 0x3b, 0x35, 0xb6, 0x00, + 0xcd, 0xcd, 0x07, 0x9b, 0xfb, 0xdb, 0x4f, 0xf7, 0x77, 0xb6, 0x3b, 0x75, 0xf7, 0xbf, 0x3a, 0x70, + 0x99, 0x7a, 0x3d, 0xcc, 0x33, 0xc9, 0x75, 0x68, 0x0d, 0xa2, 0x68, 0x82, 0x8a, 0x7f, 0xb6, 0xb5, + 0x99, 0x10, 0x32, 0x80, 0x10, 0x0a, 0xc7, 0x51, 0x3c, 0xe0, 0x92, 0x47, 0x80, 0xa0, 0x87, 0x88, + 0x20, 0x03, 0xc8, 0xe5, 0x15, 0x25, 0x04, 0x8b, 0xb4, 0x04, 0x26, 0x8a, 0xac, 0xc1, 0xdc, 0x51, + 0xcc, 0xfd, 0xc1, 0xa9, 0xe4, 0x0e, 0x99, 0x62, 0xdf, 0xcc, 0x4e, 0xa6, 0x03, 0x9c, 0xfd, 0x11, + 0x1f, 0x12, 0xc5, 0x34, 0xbc, 0x25, 0x89, 0x6f, 0x49, 0x18, 0xa5, 0xa0, 0x7f, 0xe4, 0x87, 0xc3, + 0x28, 0xe4, 0x43, 0xa9, 0xf6, 0x66, 0x80, 0x7b, 0x00, 0x6b, 0xf9, 0xf1, 0x49, 0x1e, 0xfb, 0xc8, + 0xe0, 0x31, 0xa1, 0x85, 0xf6, 0x66, 0xaf, 0xa6, 0xc1, 0x6f, 0xbf, 0xac, 0x40, 0x0d, 0x95, 0x92, + 0xd9, 0x0a, 0x8c, 0xa9, 0x67, 0x56, 0x0b, 0x7e, 0x01, 0x3a, 0xec, 0x8a, 0x2d, 0x4a, 0x1a, 0x5a, + 0x32, 0x24, 0xcb, 0x8f, 0xf9, 0xe0, 0x4c, 0x9a, 0x5a, 0x0c, 0x04, 0x19, 0x04, 0x0f, 0x01, 0xf4, + 0xb5, 0x64, 0x10, 0x95, 0x56, 0x79, 0xf4, 0xe5, 0x7c, 0x96, 0x47, 0xdf, 0x75, 0x61, 0x3e, 0x08, + 0x8f, 0xa2, 0x69, 0x38, 0x24, 0x86, 0x68, 0x78, 0x2a, 0x49, 0x9e, 0x08, 0x62, 0x54, 0x94, 0x9f, + 0x82, 0xfc, 0x33, 0x80, 0x6d, 0x40, 0x33, 0x39, 0x0f, 0x07, 0x26, 0xcd, 0xaf, 0xca, 0x59, 0xc2, + 0x39, 0xb8, 0x7b, 0x78, 0x1e, 0x0e, 0x88, 0xc2, 0xb3, 0x62, 0xee, 0xef, 0x42, 0x43, 0xc1, 0x48, + 0x96, 0xcf, 0xf7, 0x3f, 0xdf, 0x7f, 0xfa, 0x62, 0xbf, 0x7f, 0xf8, 0xc3, 0xfd, 0xad, 0xce, 0x25, + 0xb6, 0x04, 0xad, 0xcd, 0x2d, 0xa2, 0x74, 0x02, 0x1c, 0x2c, 0x72, 0xb0, 0x79, 0x78, 0xa8, 0x91, + 0x8a, 0xcb, 0xf0, 0x20, 0x9f, 0x90, 0xe6, 0xa7, 0x2d, 0xed, 0x1f, 0xc1, 0xb2, 0x81, 0x65, 0xa7, + 0x88, 0x09, 0x02, 0xb9, 0x53, 0x04, 0xa9, 0x8c, 0x22, 0xc7, 0xed, 0xc0, 0xe2, 0x23, 0x9e, 0x3e, + 0x0e, 0x8f, 0x23, 0x55, 0xd3, 0xff, 0xac, 0xc1, 0x92, 0x86, 0x64, 0x45, 0xb7, 0x61, 0x29, 0x18, + 0xf2, 0x30, 0x0d, 0xd2, 0xf3, 0xbe, 0x65, 0x2f, 0xc8, 0xc3, 0xa8, 0x6a, 0xfb, 0xa3, 0xc0, 0x57, + 0x0e, 0x1f, 0x91, 0xc0, 0xf3, 0x33, 0xea, 0x00, 0xa6, 0xdd, 0x86, 0xe8, 0x4a, 0x98, 0x29, 0x4a, + 0xf3, 0x50, 0x02, 0x21, 0x2e, 0xb7, 0x19, 0xfd, 0x89, 0x50, 0x39, 0xcb, 0xb2, 0x70, 0xa9, 0x44, + 0x4d, 0x38, 0xe4, 0xba, 0xd0, 0x13, 0x34, 0x50, 0xf0, 0xa8, 0xcc, 0x09, 0xf9, 0x98, 0xf7, 0xa8, + 0x18, 0x5e, 0x99, 0x46, 0xc1, 0x2b, 0x83, 0xf2, 0xf3, 0x3c, 0x1c, 0xf0, 0x61, 0x3f, 0x8d, 0xfa, + 0x24, 0xe7, 0x89, 0x24, 0x1a, 0x5e, 0x1e, 0xc6, 0x7d, 0x23, 0xe5, 0x49, 0x1a, 0x72, 0x61, 0x9a, + 0x6e, 0x90, 0x15, 0x54, 0x41, 0x78, 0x3e, 0x98, 0xc6, 0x41, 0xd2, 0x6d, 0x93, 0xbf, 0x85, 0x7e, + 0xb3, 0xef, 0xc2, 0xe5, 0x23, 0x9e, 0xa4, 0xfd, 0x53, 0xee, 0x0f, 0x79, 0x4c, 0xe4, 0x25, 0x1c, + 0x3b, 0x42, 0xe5, 0x2a, 0xcf, 0x44, 0xc2, 0x3d, 0xe3, 0x71, 0x12, 0x44, 0x21, 0x29, 0x5b, 0x4d, + 0x4f, 0x25, 0xb1, 0x3e, 0x1c, 0xbc, 0xde, 0xa8, 0xf5, 0x0c, 0x2e, 0xd1, 0xc0, 0xcb, 0x33, 0xd9, + 0x0d, 0x98, 0xa3, 0x01, 0x24, 0xdd, 0x0e, 0xd1, 0x4c, 0x3b, 0xe3, 0xf9, 0x20, 0xf4, 0x64, 0x1e, + 0xae, 0xf2, 0x20, 0x1a, 0x45, 0x31, 0x69, 0x5c, 0x4d, 0x4f, 0x24, 0xec, 0xd9, 0x39, 0x89, 0xfd, + 0xc9, 0xa9, 0xd4, 0xba, 0xf2, 0xf0, 0x67, 0xb5, 0x46, 0xab, 0xd3, 0x76, 0xff, 0x3f, 0xa8, 0x53, + 0xb5, 0x54, 0x1d, 0x4d, 0xa6, 0x23, 0xab, 0x23, 0xb4, 0x0b, 0xf3, 0x21, 0x4f, 0x5f, 0x45, 0xf1, + 0x4b, 0xe5, 0x3d, 0x94, 0x49, 0xf7, 0x67, 0x74, 0x42, 0xd3, 0xde, 0xb4, 0xe7, 0xa4, 0x5a, 0xe2, + 0x39, 0x5b, 0x2c, 0x55, 0x72, 0xea, 0xcb, 0x43, 0x63, 0x83, 0x80, 0xc3, 0x53, 0x1f, 0x65, 0xad, + 0xb5, 0xfa, 0xe2, 0x1c, 0xde, 0x22, 0x6c, 0x57, 0x2c, 0xfe, 0x0d, 0x58, 0x54, 0x7e, 0xba, 0xa4, + 0x3f, 0xe2, 0xc7, 0xa9, 0xb2, 0xa2, 0x85, 0xd3, 0x31, 0x1d, 0xd6, 0xf7, 0xf8, 0x71, 0xea, 0xee, + 0xc3, 0xb2, 0x94, 0x7f, 0x4f, 0x27, 0x5c, 0x35, 0xfd, 0xdb, 0x65, 0xba, 0x44, 0x6b, 0x63, 0xc5, + 0x16, 0x98, 0xc2, 0x33, 0x69, 0x97, 0x74, 0x3d, 0x60, 0xa6, 0x3c, 0x95, 0x15, 0xca, 0xcd, 0x5c, + 0xd9, 0x09, 0xe5, 0x70, 0x2c, 0x0c, 0xe7, 0x27, 0x99, 0x0e, 0x06, 0xca, 0xbb, 0xda, 0xf0, 0x54, + 0xd2, 0xfd, 0x23, 0x07, 0x56, 0xa8, 0x36, 0xa5, 0x0d, 0xc9, 0x3d, 0xeb, 0xe3, 0xaf, 0xd1, 0x4d, + 0x65, 0xa5, 0x15, 0xb6, 0xc9, 0x55, 0xa8, 0x9b, 0xbb, 0x98, 0x48, 0x7c, 0x7d, 0x9b, 0x4c, 0x2d, + 0x6f, 0x93, 0x71, 0xff, 0xbe, 0x03, 0xcb, 0x62, 0x23, 0x21, 0x6d, 0x5b, 0x0e, 0xff, 0xff, 0x87, + 0x05, 0xa1, 0x11, 0x48, 0xa9, 0x20, 0x3b, 0x9a, 0x89, 0x56, 0x42, 0x45, 0xe1, 0xdd, 0x4b, 0x9e, + 0x5d, 0x98, 0x7d, 0x4a, 0x5a, 0x59, 0xd8, 0x27, 0xb4, 0xc4, 0x0f, 0x6f, 0xcf, 0xf5, 0xee, 0x25, + 0xcf, 0x28, 0xfe, 0xa0, 0x81, 0xca, 0x32, 0xe2, 0xee, 0x23, 0x58, 0xb0, 0x1a, 0xb2, 0xec, 0x41, + 0x6d, 0x61, 0x0f, 0x2a, 0x18, 0x5e, 0x2b, 0x25, 0x86, 0xd7, 0x7f, 0x59, 0x05, 0x86, 0xc4, 0x92, + 0x5b, 0x8d, 0xeb, 0xb6, 0xf7, 0x42, 0xb9, 0xe4, 0x33, 0x88, 0x6d, 0x00, 0x33, 0x92, 0xca, 0xab, + 0x52, 0xd5, 0x5e, 0x95, 0x92, 0x5c, 0x14, 0xb5, 0x52, 0xeb, 0xd0, 0x1e, 0x0b, 0x3a, 0xeb, 0x8b, + 0xa9, 0x2f, 0xcd, 0xc3, 0x9d, 0x91, 0xdc, 0x17, 0x78, 0x2a, 0x91, 0xe7, 0x63, 0x95, 0xce, 0xaf, + 0xf1, 0xdc, 0x85, 0x6b, 0x3c, 0x5f, 0xb0, 0xbb, 0x19, 0x27, 0xb4, 0x86, 0x7d, 0x42, 0xbb, 0x01, + 0x0b, 0xca, 0x4b, 0x21, 0x3c, 0xa2, 0xf2, 0x38, 0x6c, 0x81, 0xec, 0x0e, 0x74, 0xd4, 0x21, 0x49, + 0x1f, 0x03, 0x85, 0xbf, 0xaf, 0x80, 0xe3, 0x1e, 0x90, 0x59, 0xe2, 0x5a, 0xd4, 0xd9, 0x0c, 0xa0, + 0x33, 0x15, 0x52, 0x49, 0x7f, 0x1a, 0x4a, 0x77, 0x3c, 0x1f, 0xd2, 0x41, 0x18, 0xcf, 0x54, 0xf9, + 0x0c, 0xf7, 0xef, 0x38, 0xd0, 0xc1, 0x75, 0xb3, 0x48, 0xf3, 0x13, 0x20, 0xce, 0x78, 0x4b, 0xca, + 0xb4, 0xca, 0xb2, 0x8f, 0xa1, 0x49, 0xe9, 0x68, 0xc2, 0x43, 0x49, 0x97, 0x5d, 0x9b, 0x2e, 0x33, + 0x99, 0xb2, 0x7b, 0xc9, 0xcb, 0x0a, 0x1b, 0x54, 0xf9, 0x1f, 0x1d, 0x68, 0xc9, 0x56, 0x7e, 0x65, + 0x4b, 0x4f, 0xcf, 0x88, 0x9f, 0x10, 0x0a, 0x58, 0x16, 0x2e, 0x71, 0x1b, 0x96, 0xc6, 0x7e, 0x3a, + 0x8d, 0x71, 0x4f, 0xb7, 0xac, 0x3c, 0x79, 0x18, 0x37, 0x68, 0x12, 0x9f, 0x49, 0x3f, 0x0d, 0x46, + 0x7d, 0x95, 0x2b, 0x23, 0x15, 0xca, 0xb2, 0x50, 0x8a, 0x24, 0xa9, 0x7f, 0xc2, 0xe5, 0xde, 0x2b, + 0x12, 0x6e, 0x17, 0xd6, 0x0e, 0x32, 0xcf, 0x8d, 0xa1, 0x63, 0xbb, 0xff, 0x7c, 0x01, 0xd6, 0x0b, + 0x59, 0x3a, 0xae, 0x4a, 0x9a, 0x2e, 0x46, 0xc1, 0xf8, 0x28, 0xd2, 0x07, 0x14, 0xc7, 0xb4, 0x6a, + 0x58, 0x59, 0xec, 0x04, 0x2e, 0x2b, 0x25, 0x03, 0xe7, 0x34, 0xdb, 0x10, 0x2b, 0xb4, 0xd3, 0x7d, + 0x68, 0x2f, 0x61, 0xbe, 0x41, 0x85, 0x9b, 0x8c, 0x5c, 0x5e, 0x1f, 0x3b, 0x85, 0xae, 0xd6, 0x66, + 0xa4, 0xc0, 0x36, 0x34, 0x1e, 0x6c, 0xeb, 0x83, 0x0b, 0xda, 0xb2, 0x54, 0x72, 0x6f, 0x66, 0x6d, + 0xec, 0x1c, 0xae, 0xa9, 0x3c, 0x92, 0xc8, 0xc5, 0xf6, 0x6a, 0x6f, 0x35, 0x36, 0x3a, 0x6c, 0xd8, + 0x8d, 0x5e, 0x50, 0x31, 0xfb, 0x29, 0xac, 0xbd, 0xf2, 0x83, 0x54, 0x75, 0xcb, 0xd0, 0x2f, 0xea, + 0xd4, 0xe4, 0xc6, 0x05, 0x4d, 0xbe, 0x10, 0x1f, 0x5b, 0xdb, 0xd4, 0x8c, 0x1a, 0x7b, 0x7f, 0x5a, + 0x81, 0x45, 0xbb, 0x1e, 0x24, 0x53, 0xc9, 0xfb, 0x4a, 0x06, 0x2a, 0x8d, 0x34, 0x07, 0x17, 0xcf, + 0xf9, 0x95, 0xb2, 0x73, 0xbe, 0x79, 0xb2, 0xae, 0x5e, 0x64, 0x22, 0xac, 0xbd, 0x9d, 0x89, 0xb0, + 0x5e, 0x6a, 0x22, 0x9c, 0x6d, 0x49, 0x9a, 0xfb, 0x55, 0x2d, 0x49, 0xf3, 0x6f, 0xb4, 0x24, 0xf5, + 0xfe, 0xb7, 0x03, 0xac, 0x48, 0xbd, 0xec, 0x91, 0x30, 0x6d, 0x84, 0x7c, 0x24, 0x85, 0xd8, 0xb7, + 0xdf, 0x8e, 0x03, 0xd4, 0x6a, 0xa9, 0xaf, 0x91, 0x15, 0xcd, 0xe0, 0x26, 0x53, 0xc5, 0x5a, 0xf0, + 0xca, 0xb2, 0x72, 0x66, 0xd2, 0xda, 0xc5, 0x66, 0xd2, 0xfa, 0xc5, 0x66, 0xd2, 0xb9, 0xbc, 0x99, + 0xb4, 0xf7, 0xd7, 0x1d, 0x58, 0x29, 0x21, 0xb3, 0xdf, 0xdc, 0xc0, 0x91, 0x30, 0x2c, 0xe9, 0x53, + 0x91, 0x84, 0x61, 0x82, 0xbd, 0xbf, 0x0c, 0x0b, 0x16, 0x6b, 0xfd, 0xe6, 0xda, 0xcf, 0x6b, 0x89, + 0x82, 0xb2, 0x2d, 0xac, 0xf7, 0xbf, 0x2a, 0xc0, 0x8a, 0xec, 0xfd, 0xff, 0xb4, 0x0f, 0xc5, 0x79, + 0xaa, 0x96, 0xcc, 0xd3, 0xff, 0xd5, 0x9d, 0xe7, 0x03, 0x58, 0x96, 0x11, 0x9b, 0x86, 0x31, 0x4b, + 0x50, 0x4c, 0x31, 0x03, 0xf5, 0x64, 0xdb, 0x46, 0xdd, 0xb0, 0x22, 0xd4, 0x8c, 0xed, 0x37, 0x67, + 0xaa, 0x76, 0x7b, 0xd0, 0x95, 0x33, 0xb4, 0x73, 0xc6, 0xc3, 0xf4, 0x70, 0x7a, 0x24, 0x42, 0x16, + 0x83, 0x28, 0x24, 0x35, 0xd0, 0xcc, 0x94, 0x0a, 0xc5, 0x77, 0xa1, 0x6d, 0x6e, 0x1f, 0x72, 0x39, + 0x72, 0xf6, 0x4c, 0x54, 0x25, 0xcc, 0x52, 0x6c, 0x1b, 0x16, 0x49, 0x48, 0x0e, 0xf5, 0x77, 0x15, + 0xfa, 0xee, 0x0d, 0x36, 0x9a, 0xdd, 0x4b, 0x5e, 0xee, 0x1b, 0xf6, 0x3b, 0xb0, 0x68, 0x1f, 0x00, + 0xa5, 0x56, 0x52, 0x76, 0x22, 0xc0, 0xcf, 0xed, 0xc2, 0x6c, 0x13, 0x3a, 0xf9, 0x13, 0xa4, 0x8c, + 0xe6, 0x99, 0x51, 0x41, 0xa1, 0x38, 0xfb, 0x58, 0x3a, 0x2c, 0xeb, 0x64, 0x3b, 0xb9, 0x61, 0x7f, + 0x66, 0x4c, 0xd3, 0x5d, 0xf1, 0xc7, 0x70, 0x61, 0xfe, 0x1e, 0x40, 0x86, 0xb1, 0x0e, 0xb4, 0x9f, + 0x1e, 0xec, 0xec, 0xf7, 0xb7, 0x76, 0x37, 0xf7, 0xf7, 0x77, 0xf6, 0x3a, 0x97, 0x18, 0x83, 0x45, + 0x32, 0xf5, 0x6d, 0x6b, 0xcc, 0x41, 0x4c, 0x1a, 0x57, 0x14, 0x56, 0x61, 0xab, 0xd0, 0x79, 0xbc, + 0x9f, 0x43, 0xab, 0x0f, 0x9a, 0x9a, 0x3f, 0xdc, 0x35, 0x58, 0x15, 0x11, 0xb9, 0x0f, 0x04, 0x79, + 0x28, 0xed, 0xe4, 0x1f, 0x3b, 0x70, 0x39, 0x97, 0x91, 0x85, 0x7c, 0x09, 0x05, 0xc4, 0xd6, 0x4a, + 0x6c, 0x90, 0x1c, 0x10, 0x4a, 0xd7, 0xcc, 0x49, 0x90, 0x62, 0x06, 0xd2, 0xbc, 0xa1, 0x9b, 0xe6, + 0x38, 0xa9, 0x2c, 0xcb, 0x5d, 0xd7, 0x91, 0x35, 0xb9, 0x8e, 0x1f, 0x8b, 0x48, 0x5f, 0x33, 0x23, + 0x73, 0x00, 0xdb, 0x5d, 0x56, 0x49, 0x3c, 0x56, 0x58, 0xca, 0x8e, 0xdd, 0xdf, 0xd2, 0x3c, 0xf7, + 0xdf, 0x55, 0x81, 0x7d, 0x7f, 0xca, 0xe3, 0x73, 0x8a, 0xe9, 0xd2, 0x96, 0xd3, 0xf5, 0xbc, 0x5d, + 0x70, 0x6e, 0x32, 0x3d, 0xfa, 0x9c, 0x9f, 0xab, 0x60, 0xc9, 0xca, 0x5b, 0x05, 0x4b, 0x96, 0x05, + 0x2b, 0xd6, 0x2e, 0x0e, 0x56, 0xac, 0x5f, 0x14, 0xac, 0xf8, 0x0d, 0x58, 0x08, 0x4e, 0xc2, 0x08, + 0xc5, 0x01, 0xaa, 0x10, 0x49, 0x77, 0xee, 0x7a, 0x15, 0x8f, 0xde, 0x12, 0xdc, 0x47, 0x8c, 0x7d, + 0x9a, 0x15, 0xe2, 0xc3, 0x13, 0x0a, 0xae, 0x35, 0x05, 0xc4, 0xce, 0xf0, 0x84, 0xef, 0x45, 0x03, + 0x3f, 0x8d, 0x62, 0x3a, 0xa7, 0xa9, 0x8f, 0x11, 0x4f, 0xd8, 0x0d, 0x58, 0x4c, 0xa2, 0x29, 0x2a, + 0x55, 0x6a, 0x1a, 0x84, 0xa1, 0xa9, 0x2d, 0xd0, 0x03, 0x31, 0x19, 0x77, 0x61, 0x65, 0x9a, 0xf0, + 0xfe, 0x38, 0x48, 0x12, 0xdc, 0x38, 0x07, 0x51, 0x98, 0xc6, 0xd1, 0x48, 0x9a, 0x9b, 0x96, 0xa7, + 0x09, 0x7f, 0x22, 0x72, 0xb6, 0x44, 0x06, 0xfb, 0x6e, 0xd6, 0xa5, 0x89, 0x1f, 0xc4, 0x49, 0x17, + 0xa8, 0x4b, 0x6a, 0xa4, 0xd8, 0xef, 0x03, 0x3f, 0x88, 0x75, 0x5f, 0x30, 0x91, 0xe4, 0x82, 0x28, + 0x5b, 0xb9, 0x20, 0x4a, 0x19, 0x7f, 0x77, 0x17, 0x1a, 0xea, 0x73, 0x3c, 0x03, 0x1f, 0xc7, 0xd1, + 0x58, 0x9d, 0x81, 0xf1, 0x37, 0x5b, 0x84, 0x4a, 0x1a, 0xc9, 0xf3, 0x6b, 0x25, 0x8d, 0xdc, 0xdf, + 0x87, 0x96, 0x31, 0x03, 0xec, 0x7d, 0x71, 0x1c, 0x47, 0x5d, 0x4b, 0x1e, 0x9e, 0x85, 0x17, 0xa5, + 0x29, 0xd1, 0xc7, 0x43, 0xf6, 0x2d, 0x58, 0x1e, 0x06, 0x31, 0xa7, 0x38, 0xdf, 0x7e, 0xcc, 0xcf, + 0x78, 0x9c, 0x28, 0x53, 0x43, 0x47, 0x67, 0x78, 0x02, 0x77, 0xfb, 0xb0, 0x62, 0x51, 0x95, 0x66, + 0xba, 0x39, 0x0a, 0x1a, 0x54, 0xd6, 0x4e, 0x3b, 0xa0, 0x50, 0xe6, 0xe1, 0x76, 0x25, 0xad, 0x24, + 0xfd, 0x49, 0x1c, 0x1d, 0x51, 0x23, 0x8e, 0x67, 0x61, 0xee, 0x2f, 0x2b, 0x50, 0xdd, 0x8d, 0x26, + 0xa6, 0xef, 0xc7, 0x29, 0xfa, 0x7e, 0xa4, 0x5e, 0xd9, 0xd7, 0x6a, 0xa3, 0xdc, 0xfc, 0x2d, 0x90, + 0xdd, 0x81, 0x45, 0xa4, 0xe0, 0x34, 0x42, 0x3d, 0xfa, 0x95, 0x1f, 0x8b, 0x08, 0xc3, 0x2a, 0x91, + 0x45, 0x2e, 0x87, 0xad, 0x42, 0x55, 0xab, 0x43, 0x54, 0x00, 0x93, 0x78, 0x88, 0x23, 0xff, 0xfa, + 0xb9, 0x34, 0x69, 0xca, 0x14, 0x0a, 0x04, 0xfb, 0x7b, 0xc1, 0x26, 0x62, 0x53, 0x2b, 0xcb, 0x42, + 0x1d, 0x17, 0x19, 0x61, 0x9c, 0xa9, 0x8c, 0x3a, 0x6d, 0x1a, 0xeb, 0x1b, 0xb6, 0xb1, 0xfe, 0x3a, + 0xb4, 0xd2, 0xd1, 0x59, 0x7f, 0xe2, 0x9f, 0x8f, 0x22, 0x7f, 0x28, 0x09, 0xd0, 0x84, 0xd8, 0x7d, + 0x80, 0xf1, 0x64, 0xd2, 0xc7, 0x7d, 0x34, 0x1e, 0xd2, 0xc9, 0xbc, 0xb5, 0xd1, 0x91, 0xb3, 0xff, + 0xe4, 0xe0, 0xc0, 0x23, 0xdc, 0x33, 0xca, 0xb8, 0x2f, 0xa0, 0xa9, 0x33, 0xcc, 0xd0, 0x54, 0x8a, + 0xb0, 0x68, 0xd9, 0xa1, 0xa9, 0x14, 0x50, 0x71, 0x13, 0x16, 0x85, 0xf0, 0xd4, 0xe2, 0x40, 0x78, + 0xc5, 0x73, 0xa8, 0xfb, 0xe7, 0x0e, 0xd4, 0x69, 0xc1, 0x51, 0x9b, 0x10, 0x79, 0xda, 0x57, 0x45, + 0x8b, 0xb8, 0xe0, 0xe5, 0x61, 0xe6, 0x5a, 0x61, 0xf2, 0x15, 0x3d, 0xfb, 0x66, 0xa8, 0xfc, 0x75, + 0x68, 0xea, 0x96, 0x8c, 0x15, 0xcc, 0x40, 0x76, 0x0d, 0x6a, 0xa7, 0xd1, 0x44, 0x1d, 0xb8, 0x40, + 0xb9, 0xb3, 0xa3, 0x89, 0x47, 0x78, 0xd6, 0x1f, 0xac, 0x4f, 0x0c, 0x41, 0x28, 0xb5, 0x79, 0xb8, + 0x64, 0xac, 0x73, 0xa5, 0x63, 0x7d, 0x0e, 0x4b, 0xc8, 0x96, 0x86, 0xed, 0x7e, 0xb6, 0x68, 0xfd, + 0x26, 0xee, 0xd4, 0x83, 0xd1, 0x74, 0xc8, 0xcd, 0x63, 0x2f, 0xd9, 0x66, 0x25, 0xae, 0x14, 0x3e, + 0xf7, 0x5f, 0x38, 0x82, 0xdd, 0xb1, 0x5e, 0x76, 0x1b, 0x6a, 0x28, 0x05, 0x73, 0x56, 0x0e, 0x1d, + 0xf5, 0x82, 0xe5, 0x3c, 0x2a, 0x81, 0xab, 0x48, 0xd6, 0x53, 0xb3, 0x76, 0x61, 0x3b, 0xcd, 0xce, + 0x8c, 0x7a, 0x64, 0xb9, 0xa3, 0x56, 0x0e, 0x65, 0x77, 0x0d, 0xd7, 0x53, 0xcd, 0x92, 0xac, 0x4a, + 0x31, 0x18, 0x9e, 0x70, 0xc3, 0xe5, 0xf4, 0xc7, 0x0e, 0x2c, 0x58, 0x7d, 0x42, 0xa2, 0xa5, 0x20, + 0x72, 0x61, 0x34, 0x91, 0x2b, 0x6f, 0x42, 0x26, 0xc1, 0x57, 0x6c, 0x82, 0xd7, 0x2e, 0x8c, 0xaa, + 0xe9, 0xc2, 0xb8, 0x0f, 0xcd, 0xec, 0x9e, 0x84, 0xdd, 0x29, 0x6c, 0x51, 0xc5, 0xff, 0x64, 0x85, + 0x32, 0x23, 0x79, 0xdd, 0x30, 0x92, 0xbb, 0x9f, 0x42, 0xcb, 0x28, 0x6f, 0x1a, 0xb9, 0x1d, 0xcb, + 0xc8, 0xad, 0x83, 0xe3, 0x2a, 0x59, 0x70, 0x9c, 0xfb, 0xf3, 0x0a, 0x2c, 0x20, 0x79, 0x07, 0xe1, + 0xc9, 0x41, 0x34, 0x0a, 0x06, 0xe7, 0x44, 0x56, 0x8a, 0x92, 0xe5, 0x2e, 0xa8, 0xc8, 0xdc, 0x86, + 0x91, 0xfb, 0x75, 0x44, 0xb0, 0x10, 0x55, 0x3a, 0x8d, 0xb2, 0x0c, 0x25, 0xc1, 0x91, 0x9f, 0x70, + 0xe3, 0xe2, 0x84, 0x67, 0x83, 0x28, 0x71, 0x10, 0xa0, 0x50, 0xc7, 0x71, 0x30, 0x1a, 0x05, 0xa2, + 0xac, 0x38, 0xbe, 0x95, 0x65, 0x61, 0x9b, 0xc3, 0x20, 0xf1, 0x8f, 0x32, 0xf7, 0xa4, 0x4e, 0x93, + 0xed, 0xcf, 0x7f, 0x6d, 0xd8, 0xfe, 0x44, 0x6c, 0xb4, 0x0d, 0xe6, 0x17, 0x72, 0xbe, 0xb0, 0x90, + 0xee, 0xbf, 0xad, 0x40, 0xcb, 0x20, 0x0b, 0x64, 0xe7, 0xd2, 0xed, 0xc6, 0x40, 0xa5, 0xdf, 0x3e, + 0xb4, 0x0c, 0x02, 0x06, 0xc2, 0x6e, 0xd8, 0xad, 0x92, 0x1f, 0x80, 0x18, 0xde, 0x22, 0xa1, 0xab, + 0xd0, 0x44, 0xd2, 0xff, 0x90, 0xac, 0x0f, 0xf2, 0x92, 0x92, 0x06, 0x54, 0xee, 0x06, 0xe5, 0xd6, + 0xb3, 0x5c, 0x02, 0xde, 0xe8, 0xc9, 0xff, 0x18, 0xda, 0xb2, 0x1a, 0x5a, 0x63, 0x1a, 0x74, 0xc6, + 0x7c, 0xd6, 0xfa, 0x7b, 0x56, 0x49, 0xf5, 0xe5, 0x86, 0xfa, 0xb2, 0x71, 0xd1, 0x97, 0xaa, 0xa4, + 0xfb, 0x48, 0x07, 0x49, 0x3c, 0x8a, 0xfd, 0xc9, 0xa9, 0x12, 0x28, 0xf7, 0x61, 0x45, 0xc9, 0x8d, + 0x69, 0xe8, 0x87, 0x61, 0x34, 0x0d, 0x07, 0x5c, 0xc5, 0xd1, 0x95, 0x65, 0xb9, 0x43, 0x1d, 0x75, + 0x4d, 0x15, 0xb1, 0x3b, 0x50, 0x17, 0x7a, 0x94, 0xd8, 0x95, 0xcb, 0x45, 0x88, 0x28, 0xc2, 0x6e, + 0x43, 0x5d, 0xa8, 0x53, 0x95, 0x99, 0x4c, 0x2f, 0x0a, 0xb8, 0x77, 0x61, 0x89, 0xc2, 0xbc, 0x0d, + 0xd9, 0xf7, 0x4e, 0xd9, 0x6e, 0x3d, 0x37, 0x10, 0xc1, 0xe0, 0xab, 0xc0, 0xf6, 0x05, 0x5f, 0x99, + 0xae, 0xce, 0x3f, 0xaf, 0x42, 0xcb, 0x80, 0x51, 0x3e, 0x91, 0x7f, 0xaa, 0x3f, 0x0c, 0xfc, 0x31, + 0x4f, 0x79, 0x2c, 0x79, 0x29, 0x87, 0x62, 0x39, 0xff, 0xec, 0xa4, 0x1f, 0x4d, 0xd3, 0xfe, 0x90, + 0x9f, 0xc4, 0x9c, 0x4b, 0x35, 0x22, 0x87, 0x62, 0x39, 0xa4, 0x66, 0xa3, 0x9c, 0xf0, 0x28, 0xe5, + 0x50, 0xe5, 0xb8, 0x14, 0xf3, 0x54, 0xcb, 0x1c, 0x97, 0x62, 0x56, 0xf2, 0x92, 0xb5, 0x5e, 0x22, + 0x59, 0x3f, 0x82, 0x35, 0x21, 0x43, 0xa5, 0xf4, 0xe8, 0xe7, 0x88, 0x6b, 0x46, 0x2e, 0xbb, 0x03, + 0x1d, 0xec, 0xb3, 0x62, 0x8d, 0x24, 0xf8, 0x99, 0xe0, 0x31, 0xc7, 0x2b, 0xe0, 0x58, 0x96, 0x2c, + 0xe9, 0x66, 0x59, 0x11, 0x3d, 0x52, 0xc0, 0xa9, 0xac, 0xff, 0xda, 0x2e, 0xdb, 0x94, 0x65, 0x73, + 0x38, 0xfb, 0x18, 0xd6, 0xc7, 0x7c, 0x18, 0xf8, 0x76, 0x15, 0xfd, 0x6c, 0x93, 0x9f, 0x95, 0x8d, + 0xad, 0xe0, 0x2c, 0xfc, 0x2c, 0x1a, 0x1f, 0x05, 0x62, 0x63, 0x13, 0x36, 0xff, 0x9a, 0x57, 0xc0, + 0xdd, 0x05, 0x68, 0x1d, 0xa6, 0xd1, 0x44, 0x2d, 0xfd, 0x22, 0xb4, 0x45, 0x52, 0x46, 0x4e, 0xbe, + 0x03, 0x57, 0x88, 0x5e, 0x9f, 0x45, 0x93, 0x68, 0x14, 0x9d, 0x9c, 0x5b, 0x27, 0xf7, 0xff, 0xe0, + 0xc0, 0x8a, 0x95, 0x9b, 0x1d, 0xdd, 0xc9, 0xcc, 0xa8, 0xc2, 0xdd, 0x04, 0x89, 0x2f, 0x1b, 0xdb, + 0x82, 0x28, 0x28, 0xbc, 0x3a, 0xcf, 0x65, 0x04, 0xdc, 0x66, 0x76, 0x87, 0x43, 0x7d, 0x28, 0xe8, + 0xbd, 0x5b, 0xa4, 0x77, 0xf9, 0xbd, 0xba, 0xdd, 0xa1, 0xaa, 0xf8, 0x1d, 0x19, 0xeb, 0x33, 0x94, + 0x83, 0xae, 0xda, 0xf1, 0x19, 0xa6, 0xa5, 0x47, 0xf5, 0x60, 0xa0, 0xc1, 0xc4, 0xfd, 0x85, 0x03, + 0x90, 0xf5, 0x8e, 0x22, 0x44, 0xf4, 0xd6, 0x26, 0xee, 0x25, 0x1b, 0xdb, 0xd8, 0xfb, 0xd0, 0xd6, + 0x4e, 0xfe, 0x6c, 0xb7, 0x6c, 0x29, 0x0c, 0xb5, 0x8b, 0x5b, 0xb0, 0x74, 0x32, 0x8a, 0x8e, 0x48, + 0x8b, 0xa1, 0x50, 0xdc, 0x44, 0xc6, 0x8f, 0x2e, 0x0a, 0xf8, 0xa1, 0x44, 0xb3, 0xad, 0xb5, 0x66, + 0x6e, 0xad, 0xe5, 0x1b, 0xe5, 0xcf, 0x2b, 0xda, 0xd3, 0x9a, 0xcd, 0xc4, 0x1b, 0xb9, 0x9c, 0x6d, + 0x14, 0xc4, 0xfa, 0x0c, 0xe7, 0x26, 0x1d, 0x3d, 0x0e, 0x2e, 0x34, 0xfc, 0x7e, 0x0a, 0x8b, 0xb1, + 0x90, 0x99, 0x4a, 0xa0, 0xd6, 0xde, 0x20, 0x50, 0x17, 0x62, 0x6b, 0x67, 0xfe, 0x26, 0x74, 0xfc, + 0xe1, 0x19, 0x8f, 0xd3, 0x80, 0x0c, 0x61, 0xa4, 0x46, 0x89, 0x01, 0x2e, 0x19, 0x38, 0x69, 0x2b, + 0xb7, 0x60, 0x49, 0x46, 0xf3, 0xea, 0x92, 0xf2, 0x86, 0x5e, 0x06, 0x63, 0x41, 0xf7, 0x9f, 0x2a, + 0xc7, 0xae, 0xbd, 0xba, 0x6f, 0x9e, 0x15, 0x73, 0x84, 0x95, 0xdc, 0x08, 0xbf, 0x21, 0x1d, 0xad, + 0x43, 0x65, 0x71, 0xab, 0x1a, 0x51, 0x63, 0x43, 0xe9, 0x18, 0xb7, 0xa7, 0xb5, 0xf6, 0x36, 0xd3, + 0xea, 0xfe, 0x67, 0x07, 0xe6, 0x77, 0xa3, 0xc9, 0x2e, 0x4e, 0x31, 0xea, 0x38, 0xc8, 0x26, 0x3a, + 0x94, 0x5e, 0x25, 0x2f, 0x88, 0xae, 0x2b, 0xd5, 0x4a, 0x16, 0xf2, 0x5a, 0xc9, 0x5f, 0x84, 0x77, + 0xc8, 0xe6, 0x1b, 0x47, 0x93, 0x28, 0x46, 0x76, 0xf5, 0x47, 0x42, 0x05, 0x89, 0xc2, 0xf4, 0x54, + 0x89, 0xd3, 0x37, 0x15, 0x21, 0x43, 0x0c, 0x1e, 0x82, 0xc5, 0xc1, 0x4a, 0x6a, 0x51, 0x42, 0xca, + 0x16, 0x33, 0xdc, 0xdf, 0x86, 0x26, 0x9d, 0x30, 0x68, 0x68, 0x1f, 0x40, 0xf3, 0x34, 0x9a, 0xf4, + 0x4f, 0x83, 0x30, 0x55, 0xec, 0xbf, 0x98, 0xa9, 0xfe, 0xbb, 0x34, 0x29, 0xba, 0x80, 0xfb, 0x67, + 0x73, 0x30, 0xff, 0x38, 0x3c, 0x8b, 0x82, 0x01, 0x39, 0x93, 0xc7, 0x7c, 0x1c, 0xa9, 0xcb, 0x05, + 0xf8, 0x9b, 0x2e, 0xda, 0x66, 0xd7, 0xff, 0x04, 0x0b, 0x19, 0x08, 0x1e, 0x05, 0x63, 0xf3, 0xfa, + 0x9e, 0x4c, 0x65, 0xd7, 0x33, 0xea, 0xc6, 0xf5, 0x0c, 0xac, 0x4d, 0x5c, 0x2b, 0xa3, 0xb9, 0x13, + 0x41, 0xa1, 0x06, 0x82, 0x93, 0x2f, 0xa3, 0xfe, 0x44, 0x58, 0x98, 0x08, 0x51, 0x91, 0x10, 0x1d, + 0x6f, 0x63, 0x2e, 0xac, 0xf6, 0x5a, 0xf5, 0xc2, 0xe3, 0xad, 0x09, 0xa2, 0x7a, 0x26, 0x3e, 0x10, + 0x65, 0xc4, 0x76, 0x60, 0x42, 0xa8, 0xa0, 0xe6, 0x6f, 0x9f, 0x8a, 0x1b, 0xc4, 0x79, 0x18, 0xa5, + 0xf9, 0x90, 0x6b, 0xa1, 0x2b, 0xc6, 0x09, 0xe2, 0x0a, 0x64, 0x1e, 0x37, 0x0e, 0xc5, 0x22, 0xec, + 0x59, 0x1d, 0x8a, 0x91, 0x64, 0xfc, 0xd1, 0xe8, 0xc8, 0x1f, 0xbc, 0x14, 0x87, 0xc9, 0xb6, 0x70, + 0xf6, 0x58, 0x20, 0xc5, 0xee, 0x65, 0xeb, 0x4a, 0x01, 0x36, 0x35, 0xcf, 0x84, 0xd8, 0x06, 0xb4, + 0xc8, 0x60, 0x20, 0x57, 0x76, 0x91, 0x56, 0xb6, 0x63, 0x5a, 0x14, 0x68, 0x6d, 0xcd, 0x42, 0xa6, + 0x9b, 0x7b, 0xa9, 0x10, 0x88, 0xec, 0x0f, 0x87, 0x32, 0x42, 0xa0, 0x23, 0xae, 0x00, 0x6a, 0x80, + 0x4c, 0x12, 0x62, 0xc2, 0x44, 0x81, 0x65, 0x2a, 0x60, 0x61, 0xec, 0x9a, 0x30, 0x84, 0x4d, 0xfc, + 0x60, 0x48, 0x31, 0x35, 0xe2, 0xf8, 0xa9, 0x31, 0xac, 0x43, 0xfd, 0xa6, 0x8d, 0x73, 0x85, 0x66, + 0xc5, 0xc2, 0x70, 0x6e, 0x74, 0x7a, 0x9c, 0x45, 0x2e, 0xdb, 0x20, 0xfb, 0x90, 0x7c, 0xb4, 0x29, + 0xa7, 0xf0, 0xe4, 0xc5, 0x8d, 0x77, 0xe4, 0x98, 0x25, 0xd9, 0xaa, 0xbf, 0x87, 0x58, 0xc4, 0x13, + 0x25, 0x51, 0x6d, 0x13, 0x66, 0xf2, 0x35, 0x4b, 0x6d, 0x93, 0x45, 0xc9, 0x4c, 0x2e, 0x0a, 0xb8, + 0x9b, 0xd0, 0x36, 0x2b, 0x60, 0x0d, 0xa8, 0x3d, 0x3d, 0xd8, 0xd9, 0xef, 0x5c, 0x62, 0x2d, 0x98, + 0x3f, 0xdc, 0x79, 0xf6, 0x6c, 0x6f, 0x67, 0xbb, 0xe3, 0xb0, 0x36, 0x34, 0x74, 0x48, 0x66, 0x05, + 0x53, 0x9b, 0x5b, 0x5b, 0x3b, 0x07, 0xcf, 0x76, 0xb6, 0x3b, 0xd5, 0xcf, 0x6a, 0x8d, 0x4a, 0xa7, + 0xea, 0xfe, 0x51, 0x05, 0x5a, 0x46, 0xfd, 0x17, 0x98, 0x6a, 0xae, 0x01, 0xd0, 0x89, 0x22, 0x0b, + 0xd1, 0xa8, 0x79, 0x06, 0x82, 0x12, 0x52, 0x9f, 0xb5, 0xab, 0xe2, 0x3e, 0xa4, 0x4a, 0xd3, 0xac, + 0xd1, 0xc5, 0x43, 0xd3, 0x27, 0x51, 0xf7, 0x6c, 0x10, 0x29, 0x4a, 0x02, 0x14, 0x27, 0x28, 0xf8, + 0xd0, 0x84, 0x70, 0x85, 0x62, 0x9e, 0x44, 0xa3, 0x33, 0x2e, 0x8a, 0x08, 0xbd, 0xcc, 0xc2, 0xb0, + 0x2d, 0x29, 0x6a, 0x8c, 0x18, 0xde, 0xba, 0x67, 0x83, 0xec, 0xdb, 0x6a, 0x85, 0x1a, 0xb4, 0x42, + 0xeb, 0xc5, 0xe9, 0x36, 0x57, 0xc7, 0x4d, 0x81, 0x6d, 0x0e, 0x87, 0x32, 0xd7, 0xbc, 0x5d, 0x19, + 0x9b, 0xd7, 0x79, 0x95, 0x28, 0x29, 0x61, 0xd7, 0x4a, 0x39, 0xbb, 0xbe, 0x91, 0xa8, 0xdd, 0xc7, + 0xd0, 0x3a, 0x30, 0x2e, 0x08, 0xbb, 0x28, 0xd9, 0xd4, 0xd5, 0x60, 0x21, 0xf3, 0x84, 0x8d, 0x25, + 0x43, 0x8d, 0x2e, 0x55, 0xcc, 0x2e, 0xb9, 0xff, 0xc4, 0x11, 0x77, 0xae, 0xf4, 0x10, 0x44, 0xfb, + 0x2e, 0xb4, 0xb5, 0xd5, 0x39, 0x0b, 0x53, 0xb7, 0x30, 0x2c, 0x43, 0xdd, 0xe9, 0x47, 0xc7, 0xc7, + 0x09, 0x57, 0x01, 0xa5, 0x16, 0xa6, 0x94, 0x48, 0x54, 0x4b, 0x03, 0xd1, 0x42, 0x22, 0x03, 0x4b, + 0x0b, 0x38, 0x12, 0x8a, 0xb4, 0x4e, 0xaa, 0x50, 0x5a, 0x9d, 0xd6, 0xd1, 0xf4, 0xf9, 0x99, 0xbe, + 0x03, 0x0d, 0x5d, 0xaf, 0xbd, 0x43, 0xa8, 0x92, 0x3a, 0x1f, 0x77, 0x22, 0x3a, 0x60, 0x5a, 0x9d, + 0x16, 0xf4, 0x5a, 0xcc, 0x60, 0x77, 0x81, 0x1d, 0x07, 0x71, 0xbe, 0xb8, 0x20, 0xe0, 0x92, 0x1c, + 0xf7, 0x05, 0xac, 0x28, 0xee, 0x33, 0xb4, 0x5b, 0x7b, 0x21, 0x9d, 0x8b, 0xa4, 0x53, 0xa5, 0x28, + 0x9d, 0xdc, 0x5f, 0x56, 0x61, 0x5e, 0xae, 0x76, 0xe1, 0xa2, 0xb9, 0xd8, 0xdf, 0x2c, 0x8c, 0x75, + 0xad, 0xeb, 0x84, 0x44, 0x08, 0x72, 0xcf, 0x2a, 0xec, 0x3a, 0xd5, 0xb2, 0x5d, 0x87, 0x41, 0x6d, + 0xe2, 0xa7, 0xa7, 0x64, 0x86, 0x69, 0x7a, 0xf4, 0x5b, 0x19, 0x4f, 0xeb, 0xb6, 0xf1, 0xb4, 0xec, + 0x5a, 0xbd, 0x50, 0xad, 0x8a, 0xd7, 0xea, 0xaf, 0x42, 0x53, 0xec, 0x8e, 0x99, 0x7d, 0x34, 0x03, + 0x72, 0xbb, 0x69, 0xa3, 0xb0, 0x9b, 0xbe, 0xfd, 0x3e, 0xf7, 0x5d, 0x98, 0x13, 0x57, 0x4b, 0x64, + 0xc0, 0xf0, 0x55, 0xe5, 0x56, 0x14, 0xe5, 0xd4, 0x5f, 0x11, 0x75, 0xe4, 0xc9, 0xb2, 0xe6, 0xe5, + 0xd4, 0x96, 0x7d, 0x39, 0xd5, 0x34, 0xeb, 0xb6, 0x6d, 0xb3, 0xae, 0xfb, 0x10, 0x16, 0xac, 0xea, + 0x50, 0xce, 0xca, 0x80, 0xe3, 0xce, 0x25, 0xb6, 0x00, 0xcd, 0xc7, 0xfb, 0xfd, 0x87, 0x7b, 0x8f, + 0x1f, 0xed, 0x3e, 0xeb, 0x38, 0x98, 0x3c, 0x7c, 0xbe, 0xb5, 0xb5, 0xb3, 0xb3, 0x4d, 0x72, 0x17, + 0x60, 0xee, 0xe1, 0xe6, 0x63, 0x94, 0xc1, 0x55, 0x77, 0x5b, 0xd0, 0xb6, 0xac, 0x4b, 0xbb, 0x72, + 0xbe, 0x0d, 0x4c, 0xd9, 0x00, 0x28, 0xe8, 0x68, 0x32, 0xe2, 0xa9, 0x8a, 0x85, 0x5f, 0x96, 0x39, + 0x8f, 0x75, 0x86, 0xba, 0xce, 0x91, 0xd5, 0x92, 0xb1, 0x88, 0x9c, 0xa4, 0x3c, 0x8b, 0xc8, 0xa2, + 0x9e, 0xce, 0x77, 0x7b, 0xd0, 0xdd, 0xe6, 0x58, 0xdb, 0xe6, 0x68, 0x94, 0xeb, 0x0e, 0x1e, 0xe2, + 0x4a, 0xf2, 0xe4, 0x09, 0xef, 0xfb, 0x70, 0x79, 0x53, 0x84, 0xbd, 0xff, 0xa6, 0xa2, 0x22, 0xdd, + 0x2e, 0xac, 0xe5, 0xab, 0x94, 0x8d, 0x3d, 0x84, 0xe5, 0x6d, 0x7e, 0x34, 0x3d, 0xd9, 0xe3, 0x67, + 0x59, 0x43, 0x0c, 0x6a, 0xc9, 0x69, 0xf4, 0x4a, 0xce, 0x0f, 0xfd, 0x66, 0xef, 0x02, 0x8c, 0xb0, + 0x4c, 0x3f, 0x99, 0xf0, 0x81, 0xba, 0xd2, 0x48, 0xc8, 0xe1, 0x84, 0x0f, 0xdc, 0x8f, 0x80, 0x99, + 0xf5, 0xc8, 0xf9, 0x42, 0xad, 0x6b, 0x7a, 0xd4, 0x4f, 0xce, 0x93, 0x94, 0x8f, 0xd5, 0x5d, 0x4d, + 0x13, 0x72, 0x6f, 0x41, 0xfb, 0xc0, 0x3f, 0xf7, 0xf8, 0x17, 0xf2, 0xb1, 0x85, 0x75, 0x98, 0x9f, + 0xf8, 0xe7, 0x48, 0x82, 0xda, 0x30, 0x4c, 0xd9, 0xee, 0xbf, 0xa9, 0xc2, 0x9c, 0x28, 0x89, 0xb5, + 0x0e, 0x79, 0x92, 0x06, 0x21, 0x71, 0x9a, 0xaa, 0xd5, 0x80, 0x0a, 0xbc, 0x5d, 0x29, 0xe1, 0x6d, + 0x69, 0xad, 0x50, 0x57, 0xc3, 0x24, 0x03, 0x5b, 0x18, 0x72, 0x5a, 0x16, 0xde, 0x2c, 0xcc, 0x87, + 0x19, 0x90, 0x73, 0x78, 0x64, 0xba, 0x9d, 0xe8, 0x9f, 0x12, 0x5b, 0x92, 0x8d, 0x4d, 0xa8, 0x54, + 0x83, 0x9c, 0x17, 0xdc, 0x5e, 0xd0, 0x20, 0x0b, 0x9a, 0x62, 0xe3, 0x2d, 0x34, 0x45, 0x61, 0xc2, + 0x78, 0x93, 0xa6, 0x08, 0x6f, 0xa3, 0x29, 0xde, 0x41, 0x8e, 0x95, 0x07, 0x65, 0xfb, 0xfa, 0x92, + 0x3c, 0x29, 0x7b, 0x3a, 0xbf, 0xe0, 0x1d, 0x69, 0x17, 0xbd, 0x23, 0xee, 0xf7, 0x61, 0x5e, 0x7e, + 0xc8, 0x3a, 0x50, 0x3d, 0x0a, 0x52, 0x69, 0xb7, 0xc2, 0x9f, 0x48, 0x75, 0xa1, 0x3f, 0x56, 0xd7, + 0x65, 0xe9, 0x37, 0x0e, 0x8b, 0x6e, 0xed, 0x7d, 0x31, 0x0d, 0x62, 0x3e, 0x54, 0x17, 0x4f, 0x0c, + 0xc8, 0x65, 0xd0, 0xa1, 0xab, 0xf1, 0x78, 0x60, 0x52, 0xec, 0xf5, 0x0f, 0x1c, 0xe8, 0x48, 0x42, + 0xd7, 0x79, 0xca, 0xbb, 0xf7, 0xa6, 0x3b, 0x54, 0x37, 0x60, 0x81, 0x8e, 0x6b, 0x5a, 0x4a, 0x49, + 0x4f, 0x99, 0x05, 0x62, 0x9f, 0x54, 0xec, 0xce, 0x38, 0x18, 0x49, 0xba, 0x31, 0x21, 0x25, 0xe8, + 0x62, 0x5f, 0x46, 0x12, 0x3b, 0x9e, 0x4e, 0xbb, 0x7f, 0xea, 0xc0, 0xb2, 0xd1, 0x61, 0xc9, 0x28, + 0x9f, 0x42, 0x5b, 0xbf, 0x40, 0xc1, 0xf5, 0xfe, 0xbb, 0x6e, 0x73, 0x76, 0xf6, 0x99, 0x55, 0x98, + 0xe8, 0xcd, 0x3f, 0xa7, 0x0e, 0x26, 0xd3, 0xb1, 0xdc, 0xf8, 0x4c, 0x08, 0xd7, 0xe6, 0x15, 0xe7, + 0x2f, 0x75, 0x11, 0xb1, 0xf5, 0x5a, 0x18, 0x99, 0xb9, 0xf1, 0x98, 0xa9, 0x0b, 0xd5, 0xa4, 0x99, + 0xdb, 0x04, 0xdd, 0xbf, 0x5a, 0x81, 0x15, 0x61, 0x37, 0x90, 0xf6, 0x1a, 0x7d, 0x09, 0x78, 0x4e, + 0x98, 0x50, 0x84, 0xd0, 0xd8, 0xbd, 0xe4, 0xc9, 0x34, 0xfb, 0xde, 0x5b, 0xda, 0x3a, 0x74, 0x78, + 0xf3, 0x8c, 0xb5, 0xa8, 0x96, 0xad, 0xc5, 0x1b, 0x66, 0xba, 0xcc, 0xe3, 0x50, 0x2f, 0xf7, 0x38, + 0xbc, 0x95, 0x85, 0xff, 0xc1, 0x3c, 0xd4, 0x93, 0x41, 0x34, 0xe1, 0xee, 0x1a, 0xac, 0xda, 0x53, + 0x20, 0x65, 0xe9, 0x2f, 0x1c, 0xe8, 0x3e, 0x14, 0x7e, 0xcc, 0x20, 0x3c, 0xd9, 0x0d, 0x92, 0x34, + 0x8a, 0xf5, 0x8b, 0x0a, 0xd7, 0x00, 0x92, 0xd4, 0x8f, 0xa5, 0xde, 0x2d, 0xb4, 0x17, 0x03, 0xc1, + 0x91, 0xf0, 0x70, 0x28, 0x72, 0xc5, 0x0a, 0xea, 0x74, 0x41, 0x3b, 0x94, 0xb6, 0x0f, 0x4b, 0xc7, + 0xba, 0x29, 0x2e, 0x05, 0x60, 0x97, 0xf9, 0x19, 0x6d, 0x50, 0xc2, 0xa0, 0x90, 0x43, 0xdd, 0x3f, + 0xa8, 0xc0, 0x52, 0xd6, 0x49, 0x0a, 0x5c, 0xb1, 0xc5, 0x9c, 0x54, 0xac, 0x32, 0x31, 0x27, 0xfd, + 0x14, 0xfd, 0x00, 0x35, 0x2d, 0xc3, 0xfc, 0x61, 0xa0, 0xec, 0x06, 0xb4, 0x54, 0x2a, 0x9a, 0xa6, + 0xc6, 0xd5, 0x66, 0x13, 0x16, 0x61, 0xbe, 0xa8, 0xeb, 0x49, 0xbd, 0x55, 0xa6, 0xe8, 0x9a, 0xd5, + 0x38, 0xa5, 0x2f, 0xc5, 0xcc, 0xab, 0x24, 0x4a, 0x09, 0x54, 0x96, 0xc4, 0x2b, 0x33, 0xa4, 0x28, + 0x99, 0x4a, 0x44, 0x43, 0x3f, 0x09, 0xa3, 0x39, 0x53, 0xd4, 0x98, 0xc5, 0x68, 0xd7, 0x3c, 0x13, + 0x52, 0xc7, 0xcf, 0x68, 0x6a, 0x38, 0x67, 0x6b, 0x9e, 0x85, 0xb9, 0x7f, 0xdb, 0x81, 0x2b, 0x25, + 0xcb, 0x28, 0x39, 0x75, 0x1b, 0x96, 0x8f, 0x75, 0xa6, 0x9a, 0x6a, 0xc1, 0xae, 0x6b, 0x4a, 0x36, + 0xda, 0xd3, 0xeb, 0x15, 0x3f, 0xd0, 0xfa, 0xb3, 0x58, 0x3c, 0x2b, 0x24, 0xbf, 0x98, 0xe1, 0x1e, + 0x40, 0x6f, 0xe7, 0x35, 0x32, 0xfe, 0x96, 0xf9, 0x10, 0x9f, 0xa2, 0xac, 0x8d, 0x82, 0x60, 0xbb, + 0xd8, 0xea, 0x75, 0x0c, 0x0b, 0x56, 0x5d, 0xec, 0x3b, 0x6f, 0x5b, 0x89, 0xc9, 0xa3, 0xd7, 0xe5, + 0xaa, 0x8b, 0x97, 0x04, 0xd5, 0xc5, 0x00, 0x03, 0x72, 0xcf, 0x60, 0xe9, 0xc9, 0x74, 0x94, 0x06, + 0xd9, 0xab, 0x82, 0xec, 0x7b, 0xf2, 0x23, 0xaa, 0x42, 0x4d, 0x5d, 0x69, 0x53, 0x66, 0x39, 0x9c, + 0xb1, 0x31, 0xd6, 0xd4, 0x2f, 0xb6, 0x58, 0xcc, 0x70, 0xaf, 0xc0, 0x7a, 0xd6, 0xa4, 0x98, 0x3b, + 0xb5, 0x39, 0xfc, 0xa1, 0x23, 0xa2, 0xdb, 0xec, 0x47, 0x0e, 0xd9, 0x23, 0x58, 0x49, 0x82, 0xf0, + 0x64, 0xc4, 0xcd, 0x7a, 0x12, 0x39, 0x13, 0x97, 0xed, 0xee, 0xc9, 0x87, 0x10, 0xbd, 0xb2, 0x2f, + 0x90, 0x40, 0xca, 0x3b, 0x9a, 0x11, 0x48, 0x6e, 0x4a, 0xca, 0x06, 0xf0, 0x19, 0x2c, 0xda, 0x8d, + 0xb1, 0x8f, 0x65, 0x3c, 0x7f, 0xd6, 0x33, 0xd3, 0x4d, 0x65, 0x53, 0x86, 0x55, 0xd2, 0xfd, 0xb9, + 0x03, 0x5d, 0x8f, 0x23, 0x19, 0x73, 0xa3, 0x51, 0x49, 0x3d, 0x9f, 0x16, 0xaa, 0x9d, 0x3d, 0x60, + 0x7d, 0x4f, 0x40, 0x8d, 0xf5, 0xee, 0xcc, 0x45, 0xd9, 0xbd, 0x54, 0x32, 0xaa, 0x07, 0x0d, 0x98, + 0x93, 0xe3, 0x5b, 0x87, 0xcb, 0xb2, 0x4b, 0xaa, 0x3b, 0x99, 0x7f, 0xc3, 0x6a, 0xd4, 0xf2, 0x6f, + 0xf4, 0xa0, 0x2b, 0x1e, 0xce, 0x30, 0xc7, 0x21, 0x3f, 0xdc, 0x06, 0xf6, 0xc4, 0x1f, 0xf8, 0x71, + 0x14, 0x85, 0x07, 0x3c, 0x96, 0xe1, 0x48, 0xa4, 0xa3, 0x91, 0xf9, 0x5f, 0xa9, 0x93, 0x22, 0xa5, + 0xde, 0x7a, 0x88, 0x42, 0xf5, 0xa6, 0x86, 0x48, 0xb9, 0x1e, 0xac, 0x3c, 0xf0, 0x5f, 0x72, 0x55, + 0x53, 0x36, 0x4b, 0xad, 0x89, 0xae, 0x54, 0xcd, 0xbd, 0xba, 0xaa, 0x53, 0x6c, 0xd6, 0x33, 0x4b, + 0xbb, 0x1b, 0xb0, 0x6a, 0xd7, 0x29, 0x45, 0x49, 0x0f, 0x1a, 0x63, 0x89, 0xc9, 0xde, 0xe9, 0xf4, + 0x9d, 0xaf, 0xa0, 0x65, 0x3c, 0x86, 0xc2, 0xd6, 0x61, 0xe5, 0xc5, 0xe3, 0x67, 0xfb, 0x3b, 0x87, + 0x87, 0xfd, 0x83, 0xe7, 0x0f, 0x3e, 0xdf, 0xf9, 0x61, 0x7f, 0x77, 0xf3, 0x70, 0xb7, 0x73, 0x89, + 0xad, 0x01, 0xdb, 0xdf, 0x39, 0x7c, 0xb6, 0xb3, 0x6d, 0xe1, 0x0e, 0xbb, 0x06, 0xbd, 0xe7, 0xfb, + 0xcf, 0x0f, 0x77, 0xb6, 0xfb, 0x65, 0xdf, 0x55, 0xd8, 0xbb, 0x70, 0x45, 0xe6, 0x97, 0x7c, 0x5e, + 0xbd, 0xf3, 0x29, 0x74, 0xf2, 0x66, 0x1a, 0xcb, 0xbc, 0xf5, 0x26, 0x3b, 0xd8, 0xc6, 0xcf, 0xab, + 0xb0, 0x28, 0xe2, 0x0d, 0xc5, 0x33, 0xa1, 0x3c, 0x66, 0x4f, 0x60, 0x5e, 0xbe, 0x37, 0xcb, 0x14, + 0x69, 0xd9, 0x2f, 0xdc, 0xf6, 0xd6, 0xf2, 0xb0, 0x5c, 0xd6, 0x95, 0xbf, 0xf6, 0x9f, 0xfe, 0xc7, + 0xdf, 0xad, 0x2c, 0xb0, 0xd6, 0xbd, 0xb3, 0x0f, 0xef, 0x9d, 0xf0, 0x30, 0xc1, 0x3a, 0x7e, 0x0f, + 0x20, 0x7b, 0x45, 0x95, 0x75, 0xb5, 0x99, 0x22, 0xf7, 0xc4, 0x6c, 0xef, 0x4a, 0x49, 0x8e, 0xac, + 0xf7, 0x0a, 0xd5, 0xbb, 0xe2, 0x2e, 0x62, 0xbd, 0x41, 0x18, 0xa4, 0xe2, 0x45, 0xd5, 0x4f, 0x9c, + 0x3b, 0x6c, 0x08, 0x6d, 0xf3, 0x7d, 0x53, 0xa6, 0xdc, 0x55, 0x25, 0x2f, 0xb4, 0xf6, 0xde, 0x29, + 0xcd, 0x53, 0xb4, 0x4c, 0x6d, 0x5c, 0x76, 0x3b, 0xd8, 0xc6, 0x94, 0x4a, 0x64, 0xad, 0x8c, 0x04, + 0x87, 0x67, 0xcf, 0x98, 0xb2, 0xab, 0x06, 0xd3, 0x15, 0x1e, 0x51, 0xed, 0xbd, 0x3b, 0x23, 0x57, + 0xb6, 0xf5, 0x2e, 0xb5, 0xb5, 0xee, 0x32, 0x6c, 0x6b, 0x40, 0x65, 0xd4, 0x23, 0xaa, 0x9f, 0x38, + 0x77, 0x36, 0xfe, 0xfd, 0x2d, 0x68, 0x6a, 0x57, 0x36, 0xfb, 0x29, 0x2c, 0x58, 0x01, 0xa1, 0x4c, + 0x0d, 0xa3, 0x2c, 0x7e, 0xb4, 0x77, 0xb5, 0x3c, 0x53, 0x36, 0x7c, 0x8d, 0x1a, 0xee, 0xb2, 0x35, + 0x6c, 0x58, 0x46, 0x54, 0xde, 0xa3, 0xd0, 0x66, 0x71, 0x3b, 0xf2, 0xa5, 0x21, 0xc9, 0x44, 0x63, + 0x57, 0xf3, 0xc2, 0xc5, 0x6a, 0xed, 0xdd, 0x19, 0xb9, 0xb2, 0xb9, 0xab, 0xd4, 0xdc, 0x1a, 0x5b, + 0x35, 0x9b, 0xd3, 0xee, 0x65, 0x4e, 0x57, 0x82, 0xcd, 0x17, 0x3e, 0xd9, 0xbb, 0x9a, 0xb0, 0xca, + 0x5e, 0xfe, 0xd4, 0x24, 0x52, 0x7c, 0xfe, 0xd3, 0xed, 0x52, 0x53, 0x8c, 0xd1, 0xf2, 0x99, 0x0f, + 0x7c, 0xb2, 0x23, 0x68, 0x19, 0xef, 0x72, 0xb1, 0x2b, 0x33, 0xdf, 0x10, 0xeb, 0xf5, 0xca, 0xb2, + 0xca, 0x86, 0x62, 0xd6, 0x7f, 0x0f, 0x15, 0x9d, 0x1f, 0x43, 0x53, 0xbf, 0xf4, 0xc4, 0xd6, 0x8d, + 0x97, 0xb7, 0xcc, 0x97, 0xa9, 0x7a, 0xdd, 0x62, 0x46, 0x19, 0xf1, 0x99, 0xb5, 0x23, 0xf1, 0xbd, + 0x80, 0x96, 0xf1, 0x9a, 0x93, 0x1e, 0x40, 0xf1, 0xc5, 0x28, 0x3d, 0x80, 0x92, 0xc7, 0x9f, 0xdc, + 0x65, 0x6a, 0xa2, 0xc5, 0x9a, 0x44, 0xdf, 0xe9, 0xeb, 0x28, 0x61, 0x7b, 0x70, 0x59, 0x4a, 0xec, + 0x23, 0xfe, 0x75, 0x96, 0xa1, 0xe4, 0x51, 0xd5, 0xfb, 0x0e, 0xfb, 0x14, 0x1a, 0xea, 0xd1, 0x2e, + 0xb6, 0x56, 0xfe, 0xf8, 0x58, 0x6f, 0xbd, 0x80, 0x4b, 0xf1, 0xfa, 0x43, 0x80, 0xec, 0xe9, 0x28, + 0x2d, 0x24, 0x0a, 0x4f, 0x51, 0x69, 0x0a, 0x28, 0xbe, 0x33, 0xe5, 0xae, 0xd1, 0x00, 0x3b, 0x8c, + 0x84, 0x44, 0xc8, 0x5f, 0xa9, 0xdb, 0xff, 0x3f, 0x81, 0x96, 0xf1, 0x7a, 0x94, 0x9e, 0xbe, 0xe2, + 0xcb, 0x53, 0x7a, 0xfa, 0x4a, 0x1e, 0x9b, 0x72, 0x7b, 0x54, 0xfb, 0xaa, 0xbb, 0x84, 0xb5, 0x27, + 0xc1, 0x49, 0x38, 0x16, 0x05, 0x70, 0x81, 0x4e, 0x61, 0xc1, 0x7a, 0x22, 0x4a, 0x73, 0x68, 0xd9, + 0x03, 0x54, 0x9a, 0x43, 0x4b, 0x5f, 0x95, 0x52, 0x74, 0xe6, 0x2e, 0x63, 0x3b, 0x67, 0x54, 0xc4, + 0x68, 0xe9, 0x47, 0xd0, 0x32, 0x9e, 0x7b, 0xd2, 0x63, 0x29, 0xbe, 0x2c, 0xa5, 0xc7, 0x52, 0xf6, + 0x3a, 0xd4, 0x2a, 0xb5, 0xb1, 0xe8, 0x12, 0x29, 0xd0, 0x3d, 0x76, 0xac, 0xfb, 0xa7, 0xb0, 0x68, + 0x3f, 0x00, 0xa5, 0x79, 0xbf, 0xf4, 0x29, 0x29, 0xcd, 0xfb, 0x33, 0x5e, 0x8d, 0x92, 0x24, 0x7d, + 0x67, 0x45, 0x37, 0x72, 0xef, 0x4b, 0x19, 0x0c, 0xf7, 0x15, 0xfb, 0x3e, 0x0a, 0x38, 0xf9, 0xb0, + 0x00, 0x5b, 0x37, 0xa8, 0xd6, 0x7c, 0x7e, 0x40, 0xf3, 0x4b, 0xe1, 0x0d, 0x02, 0x9b, 0x98, 0xc5, + 0x4d, 0x7c, 0xda, 0xb5, 0xe8, 0x81, 0x01, 0x63, 0xd7, 0x32, 0xdf, 0x20, 0x30, 0x76, 0x2d, 0xeb, + 0x1d, 0x82, 0xfc, 0xae, 0x95, 0x06, 0x58, 0x47, 0x08, 0x4b, 0xb9, 0x4b, 0x2b, 0x9a, 0x2b, 0xca, + 0xef, 0x15, 0xf6, 0xae, 0xbd, 0xf9, 0xae, 0x8b, 0x2d, 0x41, 0x94, 0x10, 0xbc, 0xa7, 0x6e, 0x71, + 0xfe, 0x3e, 0xb4, 0xcd, 0x47, 0x69, 0x98, 0xc9, 0xca, 0xf9, 0x96, 0xde, 0x29, 0xcd, 0xb3, 0x17, + 0x97, 0xb5, 0xcd, 0x66, 0xd8, 0x0f, 0x60, 0x4d, 0xb3, 0xba, 0x79, 0x0f, 0x22, 0x61, 0xef, 0x95, + 0xdc, 0x8e, 0x30, 0xf5, 0xb8, 0xde, 0x95, 0x99, 0xd7, 0x27, 0xee, 0x3b, 0x48, 0x34, 0xf6, 0x4b, + 0x1f, 0xd9, 0x86, 0x51, 0xf6, 0xc0, 0x49, 0xb6, 0x61, 0x94, 0x3e, 0x0f, 0xa2, 0x88, 0x86, 0xad, + 0x58, 0x73, 0x24, 0xe2, 0x06, 0xd8, 0x8f, 0x60, 0xc9, 0xb8, 0x69, 0x76, 0x78, 0x1e, 0x0e, 0x34, + 0x03, 0x14, 0x2f, 0x42, 0xf7, 0xca, 0x4e, 0x29, 0xee, 0x3a, 0xd5, 0xbf, 0xec, 0x5a, 0x93, 0x83, + 0xc4, 0xbf, 0x05, 0x2d, 0xf3, 0x16, 0xdb, 0x1b, 0xea, 0x5d, 0x37, 0xb2, 0xcc, 0x3b, 0xbc, 0xf7, + 0x1d, 0x76, 0x20, 0xe2, 0xc7, 0xf4, 0xab, 0xa3, 0x51, 0x9c, 0xdf, 0x3e, 0xed, 0xd7, 0x48, 0xf5, + 0x42, 0x96, 0xbd, 0x43, 0x7b, 0xdb, 0xb9, 0xef, 0xb0, 0x7f, 0xe8, 0x40, 0xdb, 0xba, 0x65, 0x66, + 0x45, 0xe3, 0xe4, 0x7a, 0xd6, 0x35, 0xf3, 0xcc, 0xae, 0xb9, 0x1e, 0x0d, 0x7b, 0xef, 0xce, 0x67, + 0xd6, 0xb4, 0x7e, 0x69, 0x19, 0xd4, 0xee, 0xe6, 0x9f, 0x1e, 0xfd, 0x2a, 0x5f, 0xc0, 0xbc, 0x7e, + 0xfe, 0xd5, 0x7d, 0x87, 0xfd, 0xb1, 0x03, 0x8b, 0xb6, 0xa5, 0x5a, 0x0f, 0xb7, 0xd4, 0x26, 0xae, + 0x17, 0x7f, 0x86, 0x79, 0xfb, 0x47, 0xd4, 0xcb, 0x67, 0x77, 0x3c, 0xab, 0x97, 0xf2, 0x55, 0x99, + 0x5f, 0xaf, 0xb7, 0xec, 0x13, 0xf1, 0xf4, 0xb6, 0xf2, 0x27, 0xb1, 0xe2, 0xab, 0xcd, 0x9a, 0x60, + 0xcc, 0x77, 0x96, 0x69, 0x11, 0x7e, 0x22, 0x9e, 0xdc, 0x54, 0x2e, 0x0f, 0xa4, 0xbb, 0xb7, 0xfd, + 0xde, 0xbd, 0x41, 0x63, 0xba, 0xe6, 0x5e, 0xb1, 0xc6, 0x94, 0xdf, 0xe1, 0x37, 0x45, 0xef, 0xe4, + 0x13, 0xc9, 0xd9, 0x16, 0x55, 0x78, 0x36, 0x79, 0x76, 0x27, 0xc7, 0xa2, 0x93, 0xb2, 0xb8, 0xc5, + 0x1c, 0x6f, 0x59, 0x8d, 0x7b, 0x87, 0xfa, 0x7a, 0xc3, 0x7d, 0x6f, 0x66, 0x5f, 0xef, 0x91, 0xbd, + 0x19, 0x7b, 0x7c, 0x00, 0x90, 0xf9, 0x7f, 0x59, 0xce, 0xf7, 0xa8, 0x45, 0x46, 0xd1, 0x45, 0x6c, + 0x73, 0xa0, 0x72, 0x51, 0x62, 0x8d, 0x3f, 0x16, 0x02, 0xf0, 0xb1, 0xf2, 0x5a, 0x9a, 0x6a, 0x8e, + 0xed, 0xa4, 0xb5, 0xd4, 0x9c, 0x7c, 0xfd, 0x96, 0xf8, 0xd3, 0x2e, 0xd0, 0xe7, 0xb0, 0xb0, 0x17, + 0x45, 0x2f, 0xa7, 0x13, 0x1d, 0x28, 0x63, 0xbb, 0x82, 0x76, 0xfd, 0xe4, 0xb4, 0x97, 0x1b, 0x85, + 0x7b, 0x9d, 0xaa, 0xea, 0xb1, 0xae, 0x51, 0xd5, 0xbd, 0x2f, 0x33, 0xdf, 0xf2, 0x57, 0xcc, 0x87, + 0x65, 0x2d, 0x55, 0x75, 0xc7, 0x7b, 0x76, 0x35, 0x96, 0x2c, 0xcd, 0x37, 0x61, 0xe9, 0xe3, 0xaa, + 0xb7, 0xf7, 0x12, 0x55, 0x27, 0xc9, 0x94, 0xf6, 0x36, 0x1f, 0xd0, 0x45, 0x19, 0xf2, 0xa7, 0xac, + 0x64, 0x1d, 0xd7, 0x8e, 0x98, 0xde, 0x82, 0x05, 0xda, 0x3b, 0xcd, 0xc4, 0x3f, 0x8f, 0xf9, 0x17, + 0xf7, 0xbe, 0x94, 0x9e, 0x9a, 0xaf, 0xd4, 0x4e, 0xa3, 0x5c, 0x59, 0xd6, 0x4e, 0x93, 0xf3, 0x7d, + 0x59, 0x3b, 0x4d, 0xc1, 0xf7, 0x65, 0x4d, 0xb5, 0x72, 0xa5, 0xb1, 0x11, 0x2c, 0x17, 0xdc, 0x65, + 0x7a, 0x93, 0x99, 0xe5, 0x64, 0xeb, 0x5d, 0x9f, 0x5d, 0xc0, 0x6e, 0xed, 0x8e, 0xdd, 0xda, 0x21, + 0x2c, 0x6c, 0x73, 0x31, 0x59, 0x22, 0x32, 0x38, 0x77, 0x55, 0xd1, 0x8c, 0x3b, 0xce, 0x6f, 0x09, + 0x94, 0x67, 0xab, 0x12, 0x14, 0x92, 0xcb, 0x7e, 0x0c, 0xad, 0x47, 0x3c, 0x55, 0xa1, 0xc0, 0x5a, + 0x99, 0xcd, 0xc5, 0x06, 0xf7, 0x4a, 0x22, 0x89, 0x6d, 0x9a, 0xa1, 0xda, 0xee, 0xf1, 0xe1, 0x09, + 0x17, 0xc2, 0xa9, 0x1f, 0x0c, 0xbf, 0x62, 0x7f, 0x89, 0x2a, 0xd7, 0x77, 0x21, 0xd6, 0x8c, 0xb8, + 0x4e, 0xb3, 0xf2, 0xa5, 0x1c, 0x5e, 0x56, 0x73, 0x18, 0x0d, 0xb9, 0xa1, 0x54, 0x85, 0xd0, 0x32, + 0xae, 0x30, 0x69, 0x06, 0x2a, 0x5e, 0x96, 0xd3, 0x0c, 0x54, 0x72, 0xe3, 0xc9, 0xbd, 0x4d, 0xed, + 0xb8, 0xec, 0x7a, 0xd6, 0x8e, 0xb8, 0xe5, 0x94, 0xb5, 0x74, 0xef, 0x4b, 0x7f, 0x9c, 0x7e, 0xc5, + 0x5e, 0xd0, 0x2b, 0x4f, 0x66, 0xa8, 0x73, 0xa6, 0x9d, 0xe7, 0xa3, 0xa2, 0xf5, 0x64, 0x19, 0x59, + 0xb6, 0xc6, 0x2e, 0x9a, 0x22, 0xdd, 0xeb, 0x7b, 0x00, 0x87, 0x69, 0x34, 0xd9, 0xf6, 0xf9, 0x38, + 0x0a, 0x33, 0x59, 0x9b, 0x05, 0xda, 0x66, 0xf2, 0xcb, 0x88, 0xb6, 0x65, 0x2f, 0x8c, 0xe3, 0x8c, + 0x15, 0x2d, 0xae, 0x88, 0x6b, 0x66, 0x2c, 0xae, 0x9e, 0x90, 0x92, 0x78, 0xdc, 0xfb, 0x0e, 0xdb, + 0x04, 0xc8, 0xfc, 0xa5, 0xfa, 0x70, 0x52, 0x70, 0xc5, 0x6a, 0xb1, 0x57, 0xe2, 0x5c, 0x3d, 0x80, + 0x66, 0xe6, 0xdd, 0x5a, 0xcf, 0x2e, 0x0a, 0x5a, 0xbe, 0x30, 0xbd, 0x83, 0x17, 0x7c, 0x4e, 0x6e, + 0x87, 0xa6, 0x0a, 0x58, 0x03, 0xa7, 0x8a, 0x1c, 0x49, 0x01, 0xac, 0x88, 0x0e, 0x6a, 0x05, 0x87, + 0x02, 0x44, 0xd5, 0x48, 0x4a, 0xfc, 0x3e, 0x9a, 0x9b, 0x4b, 0x1d, 0x22, 0x96, 0x8d, 0x05, 0xa9, + 0x55, 0x04, 0xa7, 0xa2, 0x68, 0x1e, 0xc3, 0x72, 0xc1, 0xc6, 0xae, 0x59, 0x7a, 0x96, 0x13, 0x45, + 0xb3, 0xf4, 0x4c, 0xf3, 0xbc, 0x7b, 0x99, 0x9a, 0x5c, 0x72, 0x81, 0xce, 0x54, 0xaf, 0x82, 0x74, + 0x70, 0x8a, 0xcd, 0xfd, 0xa1, 0x03, 0x2b, 0x25, 0x26, 0x74, 0xf6, 0xbe, 0x3a, 0x9e, 0xcf, 0x34, + 0xaf, 0xf7, 0x4a, 0x2d, 0xac, 0xee, 0x21, 0xb5, 0xf3, 0x84, 0x7d, 0x6e, 0x6d, 0x6c, 0xc2, 0xb8, + 0x29, 0x39, 0xf3, 0x8d, 0x4a, 0x45, 0xa9, 0x46, 0xf1, 0x05, 0xac, 0x8b, 0x8e, 0x6c, 0x8e, 0x46, + 0x39, 0xeb, 0xef, 0xb5, 0xc2, 0xbf, 0xe7, 0xb1, 0xac, 0xda, 0xbd, 0xd9, 0xff, 0xbe, 0x67, 0x86, + 0x02, 0x2c, 0xba, 0xca, 0xa6, 0xd0, 0xc9, 0x5b, 0x54, 0xd9, 0xec, 0xba, 0x7a, 0xef, 0x59, 0x07, + 0xcd, 0x12, 0x2b, 0xec, 0x6f, 0x51, 0x63, 0xef, 0xb9, 0xbd, 0xb2, 0x79, 0x11, 0x67, 0x4f, 0x5c, + 0x8f, 0xbf, 0xa2, 0xcd, 0xbf, 0xb9, 0x71, 0xaa, 0x06, 0x66, 0xd9, 0xab, 0xf5, 0x51, 0xb7, 0xdc, + 0x7a, 0x7c, 0x93, 0x9a, 0xbf, 0xee, 0xbe, 0x53, 0xd6, 0x7c, 0x2c, 0x3e, 0x11, 0x87, 0xde, 0xf5, + 0x3c, 0x5f, 0xab, 0x1e, 0x5c, 0x2f, 0x5b, 0xef, 0x99, 0xa7, 0x97, 0xdc, 0x5c, 0x5f, 0x22, 0xdd, + 0xae, 0x6d, 0x9a, 0x7b, 0x35, 0xfb, 0x94, 0xd8, 0x95, 0x35, 0xfb, 0x94, 0xd9, 0x87, 0x6d, 0xbd, + 0x46, 0x59, 0x86, 0x3f, 0x71, 0xee, 0x3c, 0xb8, 0xf5, 0xa3, 0xdf, 0x3a, 0x09, 0xd2, 0xd3, 0xe9, + 0xd1, 0xdd, 0x41, 0x34, 0xbe, 0x37, 0x52, 0x66, 0x3d, 0x79, 0x69, 0xe2, 0xde, 0x28, 0x1c, 0xde, + 0xa3, 0x6a, 0x8f, 0xe6, 0xe8, 0xff, 0x89, 0x7d, 0xe7, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0xc9, + 0x06, 0x4d, 0xa1, 0x81, 0x6c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index c6c97b55e137..368c7ab7924a 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -2565,6 +2565,7 @@ message PayReq { int64 cltv_expiry = 9 [json_name = "cltv_expiry"]; repeated RouteHint route_hints = 10 [json_name = "route_hints"]; repeated Feature features = 11 [json_name = "features"]; + bytes payment_addr = 12 [json_name = "payment_addr"]; } message Feature { diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 847df0ad2450..9e9763223026 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -3230,6 +3230,10 @@ "items": { "$ref": "#/definitions/lnrpcFeature" } + }, + "payment_addr": { + "type": "string", + "format": "byte" } } }, From eb2df7149f930eedb39cd8d6443eeea6a6e1f0fc Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 19 Nov 2019 21:07:25 -0800 Subject: [PATCH 25/25] rpcserver: populate payment address in decode payreq --- rpcserver.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rpcserver.go b/rpcserver.go index 47ee47a52db8..d7c3f8311b75 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -4532,6 +4532,12 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, } } + // Extract the payment address from the payment request, if present. + var paymentAddr []byte + if payReq.PaymentAddr != nil { + paymentAddr = payReq.PaymentAddr[:] + } + dest := payReq.Destination.SerializeCompressed() return &lnrpc.PayReq{ Destination: hex.EncodeToString(dest), @@ -4545,6 +4551,7 @@ func (r *rpcServer) DecodePayReq(ctx context.Context, CltvExpiry: int64(payReq.MinFinalCLTVExpiry()), RouteHints: routeHints, Features: features, + PaymentAddr: paymentAddr, }, nil }