From dc8530ac7cffd1a1c51deb99c49e7639649e0a4b Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 29 Jul 2020 13:09:12 -0400 Subject: [PATCH 01/14] WIP on unknown field rejection in TxDecoder --- go.sum | 5 ----- x/auth/tx/decoder.go | 50 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/go.sum b/go.sum index b3d075b7647d..a79943ce319c 100644 --- a/go.sum +++ b/go.sum @@ -168,8 +168,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -646,7 +644,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20u golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -772,7 +769,5 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index e229c1f35b85..74b1c95257d5 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -3,6 +3,8 @@ package tx import ( "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/codec/unknownproto" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" @@ -16,25 +18,61 @@ import ( func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { cdc := codec.NewProtoCodec(anyUnpacker) return func(txBytes []byte) (sdk.Tx, error) { + strictChecker := &unknownproto.Checker{AllowUnknownNonCriticals: false} + allowNonCriticalFieldsChecker := &unknownproto.Checker{AllowUnknownNonCriticals: true} + var raw tx.TxRaw - err := cdc.UnmarshalBinaryBare(txBytes, &raw) + + // reject all unknown proto fields in the root TxRaw + err := strictChecker.RejectUnknownFields(txBytes, &raw) if err != nil { return nil, err } - var theTx tx.Tx - err = cdc.UnmarshalBinaryBare(txBytes, &theTx) + err = cdc.UnmarshalBinaryBare(txBytes, &raw) + if err != nil { + return nil, err + } + + var body tx.TxBody + + // allow non-critical unknown fields in TxBody + err = allowNonCriticalFieldsChecker.RejectUnknownFields(raw.BodyBytes, &body) + if err != nil { + return nil, err + } + + err = cdc.UnmarshalBinaryBare(raw.BodyBytes, &body) if err != nil { return nil, err } + var authInfo tx.AuthInfo + + // reject all unknown proto fields in AuthInfo + err = strictChecker.RejectUnknownFields(raw.AuthInfoBytes, &authInfo) + if err != nil { + return nil, err + } + + err = cdc.UnmarshalBinaryBare(raw.AuthInfoBytes, &authInfo) + if err != nil { + return nil, err + } + + theTx := &tx.Tx{ + Body: &body, + AuthInfo: &authInfo, + Signatures: raw.Signatures, + } + pks, err := extractPubKeys(theTx, keyCodec) if err != nil { return nil, err } return &builder{ - tx: &theTx, + tx: theTx, bodyBz: raw.BodyBytes, authInfoBz: raw.AuthInfoBytes, pubKeys: pks, @@ -53,7 +91,7 @@ func DefaultJSONTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.Pu return nil, err } - pks, err := extractPubKeys(theTx, keyCodec) + pks, err := extractPubKeys(&theTx, keyCodec) if err != nil { return nil, err } @@ -66,7 +104,7 @@ func DefaultJSONTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.Pu } } -func extractPubKeys(tx tx.Tx, keyCodec cryptotypes.PublicKeyCodec) ([]crypto.PubKey, error) { +func extractPubKeys(tx *tx.Tx, keyCodec cryptotypes.PublicKeyCodec) ([]crypto.PubKey, error) { if tx.AuthInfo == nil { return []crypto.PubKey{}, nil } From 2d6f141255dff22d911dae937df265008dbdb2ca Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 11:55:40 -0400 Subject: [PATCH 02/14] WIP on unknown field rejection in TxDecoder --- codec/unknownproto/benchmarks_test.go | 6 ++-- codec/unknownproto/unknown_fields.go | 44 +++++++++++++---------- codec/unknownproto/unknown_fields_test.go | 31 ++++++++-------- x/auth/tx/builder.go | 2 ++ x/auth/tx/decoder.go | 20 +++++------ 5 files changed, 53 insertions(+), 50 deletions(-) diff --git a/codec/unknownproto/benchmarks_test.go b/codec/unknownproto/benchmarks_test.go index 93c5158e7d63..e2c4b2c19655 100644 --- a/codec/unknownproto/benchmarks_test.go +++ b/codec/unknownproto/benchmarks_test.go @@ -53,11 +53,10 @@ func benchmarkRejectUnknownFields(b *testing.B, parallel bool) { b.ReportAllocs() if !parallel { - ckr := new(unknownproto.Checker) b.ResetTimer() for i := 0; i < b.N; i++ { n1A := new(testdata.Nested1A) - if err := ckr.RejectUnknownFields(n1BBlob, n1A); err == nil { + if err := unknownproto.RejectUnknownFieldsStrict(n1BBlob, n1A); err == nil { b.Fatal("expected an error") } b.SetBytes(int64(len(n1BBlob))) @@ -66,11 +65,10 @@ func benchmarkRejectUnknownFields(b *testing.B, parallel bool) { var mu sync.Mutex b.ResetTimer() b.RunParallel(func(pb *testing.PB) { - ckr := new(unknownproto.Checker) for pb.Next() { // To simulate the conditions of multiple transactions being processed in parallel. n1A := new(testdata.Nested1A) - if err := ckr.RejectUnknownFields(n1BBlob, n1A); err == nil { + if err := unknownproto.RejectUnknownFieldsStrict(n1BBlob, n1A); err == nil { b.Fatal("expected an error") } mu.Lock() diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 1e37c96e0912..9f8839c1155c 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -22,30 +22,30 @@ type descriptorIface interface { Descriptor() ([]byte, []int) } -type Checker struct { - // AllowUnknownNonCriticals when set will skip over non-critical fields that are unknown. - AllowUnknownNonCriticals bool +func RejectUnknownFieldsStrict(b []byte, msg proto.Message) error { + _, err := RejectUnknownFields(b, msg, false) + return err } -func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { +func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals bool) (hasUnknownNonCriticals bool, err error) { if len(b) == 0 { - return nil + return hasUnknownNonCriticals, nil } desc, ok := msg.(descriptorIface) if !ok { - return fmt.Errorf("%T does not have a Descriptor() method", msg) + return hasUnknownNonCriticals, fmt.Errorf("%T does not have a Descriptor() method", msg) } fieldDescProtoFromTagNum, _, err := getDescriptorInfo(desc, msg) if err != nil { - return err + return hasUnknownNonCriticals, err } for len(b) > 0 { tagNum, wireType, n := protowire.ConsumeField(b) if n < 0 { - return errors.New("invalid length") + return hasUnknownNonCriticals, errors.New("invalid length") } fieldDescProto, ok := fieldDescProtoFromTagNum[int32(tagNum)] @@ -53,7 +53,7 @@ func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { case ok: // Assert that the wireTypes match. if !canEncodeType(wireType, fieldDescProto.GetType()) { - return &errMismatchedWireType{ + return hasUnknownNonCriticals, &errMismatchedWireType{ Type: reflect.ValueOf(msg).Type().String(), TagNum: tagNum, GotWireType: wireType, @@ -62,9 +62,15 @@ func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { } default: - if !ckr.AllowUnknownNonCriticals || tagNum&bit11NonCritical == 0 { + isCriticalField := tagNum&bit11NonCritical == 0 + + if !isCriticalField { + hasUnknownNonCriticals = true + } + + if isCriticalField || !allowUnknownNonCriticals { // The tag is critical, so report it. - return &errUnknownField{ + return hasUnknownNonCriticals, &errUnknownField{ Type: reflect.ValueOf(msg).Type().String(), TagNum: tagNum, WireType: wireType, @@ -89,7 +95,7 @@ func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { // TYPE_BYTES and TYPE_STRING as per // https://github.com/gogo/protobuf/blob/5628607bb4c51c3157aacc3a50f0ab707582b805/protoc-gen-gogo/descriptor/descriptor.go#L95-L118 default: - return fmt.Errorf("failed to get typename for message of type %v, can only be TYPE_STRING or TYPE_BYTES", typ) + return false, fmt.Errorf("failed to get typename for message of type %v, can only be TYPE_STRING or TYPE_BYTES", typ) } continue } @@ -98,13 +104,13 @@ func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { if protoMessageName == ".google.protobuf.Any" { // Firstly typecheck types.Any to ensure nothing snuck in. - if err := ckr.RejectUnknownFields(fieldBytes, (*types.Any)(nil)); err != nil { - return err + if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, (*types.Any)(nil), allowUnknownNonCriticals); err != nil { + return hasUnknownNonCriticals || hasUnknownNonCriticalsChild, err } // And finally we can extract the TypeURL containing the protoMessageName. any := new(types.Any) if err := proto.Unmarshal(fieldBytes, any); err != nil { - return err + return hasUnknownNonCriticals, err } protoMessageName = any.TypeUrl fieldBytes = any.Value @@ -112,14 +118,14 @@ func (ckr *Checker) RejectUnknownFields(b []byte, msg proto.Message) error { msg, err := protoMessageForTypeName(protoMessageName[1:]) if err != nil { - return err + return hasUnknownNonCriticals, err } - if err := ckr.RejectUnknownFields(fieldBytes, msg); err != nil { - return err + if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, msg, allowUnknownNonCriticals); err != nil { + return hasUnknownNonCriticals || hasUnknownNonCriticalsChild, err } } - return nil + return hasUnknownNonCriticals, nil } var protoMessageForTypeNameMu sync.RWMutex diff --git a/codec/unknownproto/unknown_fields_test.go b/codec/unknownproto/unknown_fields_test.go index 2fef6188f9ee..5b671e1cb215 100644 --- a/codec/unknownproto/unknown_fields_test.go +++ b/codec/unknownproto/unknown_fields_test.go @@ -4,6 +4,8 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/require" + "github.com/gogo/protobuf/proto" "github.com/cosmos/cosmos-sdk/codec/types" @@ -17,6 +19,7 @@ func TestRejectUnknownFieldsRepeated(t *testing.T) { recv proto.Message wantErr error allowUnknownNonCriticals bool + hasUnknownNonCriticals bool }{ { name: "Unknown field in midst of repeated values", @@ -172,6 +175,7 @@ func TestRejectUnknownFieldsRepeated(t *testing.T) { TagNum: 1031, WireType: 2, }, + hasUnknownNonCriticals: true, }, { name: "Unknown field in midst of repeated values, non-critical field ignored", @@ -213,8 +217,9 @@ func TestRejectUnknownFieldsRepeated(t *testing.T) { }, }, }, - recv: new(testdata.TestVersion1), - wantErr: nil, + recv: new(testdata.TestVersion1), + wantErr: nil, + hasUnknownNonCriticals: true, }, } @@ -225,11 +230,9 @@ func TestRejectUnknownFieldsRepeated(t *testing.T) { if err != nil { t.Fatal(err) } - ckr := &Checker{AllowUnknownNonCriticals: tt.allowUnknownNonCriticals} - gotErr := ckr.RejectUnknownFields(protoBlob, tt.recv) - if !reflect.DeepEqual(gotErr, tt.wantErr) { - t.Fatalf("Error mismatch\nGot:\n%v\n\nWant:\n%v", gotErr, tt.wantErr) - } + hasUnknownNonCriticals, gotErr := RejectUnknownFields(protoBlob, tt.recv, tt.allowUnknownNonCriticals) + require.Equal(t, tt.wantErr, gotErr) + require.Equal(t, tt.hasUnknownNonCriticals, hasUnknownNonCriticals) }) } } @@ -263,7 +266,7 @@ func TestRejectUnknownFields_allowUnknownNonCriticals(t *testing.T) { wantErr: nil, }, { - name: "Unkown fields that are critical, but with allowUnknownNonCriticals set", + name: "Unknown fields that are critical, but with allowUnknownNonCriticals set", allowUnknownNonCriticals: true, in: &testdata.Customer2{ Id: 289, @@ -285,9 +288,8 @@ func TestRejectUnknownFields_allowUnknownNonCriticals(t *testing.T) { t.Fatalf("Failed to marshal input: %v", err) } - ckr := &Checker{AllowUnknownNonCriticals: tt.allowUnknownNonCriticals} c1 := new(testdata.Customer1) - gotErr := ckr.RejectUnknownFields(blob, c1) + _, gotErr := RejectUnknownFields(blob, c1, tt.allowUnknownNonCriticals) if !reflect.DeepEqual(gotErr, tt.wantErr) { t.Fatalf("Error mismatch\nGot:\n%s\n\nWant:\n%s", gotErr, tt.wantErr) } @@ -498,8 +500,7 @@ func TestRejectUnknownFieldsNested(t *testing.T) { if err != nil { t.Fatal(err) } - ckr := new(Checker) - gotErr := ckr.RejectUnknownFields(protoBlob, tt.recv) + gotErr := RejectUnknownFieldsStrict(protoBlob, tt.recv) if !reflect.DeepEqual(gotErr, tt.wantErr) { t.Fatalf("Error mismatch\nGot:\n%s\n\nWant:\n%s", gotErr, tt.wantErr) } @@ -652,8 +653,7 @@ func TestRejectUnknownFieldsFlat(t *testing.T) { } c1 := new(testdata.Customer1) - ckr := new(Checker) - gotErr := ckr.RejectUnknownFields(blob, c1) + gotErr := RejectUnknownFieldsStrict(blob, c1) if !reflect.DeepEqual(gotErr, tt.wantErr) { t.Fatalf("Error mismatch\nGot:\n%s\n\nWant:\n%s", gotErr, tt.wantErr) } @@ -738,8 +738,7 @@ func TestMismatchedTypes_Nested(t *testing.T) { if err != nil { t.Fatal(err) } - ckr := new(Checker) - gotErr := ckr.RejectUnknownFields(protoBlob, tt.recv) + _, gotErr := RejectUnknownFields(protoBlob, tt.recv, false) if !reflect.DeepEqual(gotErr, tt.wantErr) { t.Fatalf("Error mismatch\nGot:\n%s\n\nWant:\n%s", gotErr, tt.wantErr) } diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index d29e805ad705..2635d13b1064 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -39,6 +39,8 @@ type builder struct { pubKeys []crypto.PubKey pubkeyCodec types.PublicKeyCodec + + txBodyHasUnknownNonCriticals bool } var ( diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index 74b1c95257d5..d20886fceecd 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -18,13 +18,10 @@ import ( func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { cdc := codec.NewProtoCodec(anyUnpacker) return func(txBytes []byte) (sdk.Tx, error) { - strictChecker := &unknownproto.Checker{AllowUnknownNonCriticals: false} - allowNonCriticalFieldsChecker := &unknownproto.Checker{AllowUnknownNonCriticals: true} - var raw tx.TxRaw // reject all unknown proto fields in the root TxRaw - err := strictChecker.RejectUnknownFields(txBytes, &raw) + err := unknownproto.RejectUnknownFieldsStrict(txBytes, &raw) if err != nil { return nil, err } @@ -37,7 +34,7 @@ func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.Public var body tx.TxBody // allow non-critical unknown fields in TxBody - err = allowNonCriticalFieldsChecker.RejectUnknownFields(raw.BodyBytes, &body) + txBodyHasUnknownNonCriticals, err := unknownproto.RejectUnknownFields(raw.BodyBytes, &body, true) if err != nil { return nil, err } @@ -50,7 +47,7 @@ func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.Public var authInfo tx.AuthInfo // reject all unknown proto fields in AuthInfo - err = strictChecker.RejectUnknownFields(raw.AuthInfoBytes, &authInfo) + err = unknownproto.RejectUnknownFieldsStrict(raw.AuthInfoBytes, &authInfo) if err != nil { return nil, err } @@ -72,11 +69,12 @@ func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.Public } return &builder{ - tx: theTx, - bodyBz: raw.BodyBytes, - authInfoBz: raw.AuthInfoBytes, - pubKeys: pks, - pubkeyCodec: keyCodec, + tx: theTx, + bodyBz: raw.BodyBytes, + authInfoBz: raw.AuthInfoBytes, + pubKeys: pks, + pubkeyCodec: keyCodec, + txBodyHasUnknownNonCriticals: txBodyHasUnknownNonCriticals, }, nil } } From 9a905535f01c0568dc15cc5ce9910b228421a9a0 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 14:09:58 -0400 Subject: [PATCH 03/14] WIP --- simapp/params/proto.go | 6 +- x/auth/ante/ante_test.go | 2 +- x/auth/ante/sigverify_test.go | 4 +- x/auth/ante/testutil_test.go | 2 +- x/auth/signing/direct/direct.go | 66 ------------------- x/auth/signing/handler_map_test.go | 4 +- x/auth/tx/builder.go | 7 +- x/auth/tx/builder_test.go | 24 +++---- x/auth/tx/{generator.go => config.go} | 27 ++++---- .../tx/{generator_test.go => config_test.go} | 2 +- x/auth/tx/direct.go | 56 ++++++++++++++++ x/auth/{signing/direct => tx}/direct_test.go | 22 +++---- x/auth/tx/encoder.go | 4 +- x/auth/tx/legacy_amino_json.go | 57 ++++++++++++++++ x/auth/tx/mode_handler.go | 34 +++++++--- x/auth/types/amino_signing.go | 12 ++-- x/auth/types/amino_signing_test.go | 26 +++----- x/auth/types/client_tx.go | 2 +- 18 files changed, 207 insertions(+), 150 deletions(-) delete mode 100644 x/auth/signing/direct/direct.go rename x/auth/tx/{generator.go => config.go} (61%) rename x/auth/tx/{generator_test.go => config_test.go} (94%) create mode 100644 x/auth/tx/direct.go rename x/auth/{signing/direct => tx}/direct_test.go (86%) create mode 100644 x/auth/tx/legacy_amino_json.go diff --git a/simapp/params/proto.go b/simapp/params/proto.go index a5c859ada421..e8427336bead 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/std" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -15,7 +16,10 @@ func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewHybridCodec(cdc, interfaceRegistry) - txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) + txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, []signingtypes.SignMode{ + signingtypes.SignMode_SIGN_MODE_DIRECT, + signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, + }) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index a6f565f52048..5942744386fc 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -988,7 +988,7 @@ func (suite *AnteTestSuite) TestCustomSignatureVerificationGasConsumer() { default: return sdkerrors.Wrapf(sdkerrors.ErrInvalidPubKey, "unrecognized public key type: %T", pubkey) } - }, types.LegacyAminoJSONHandler{}) + }, types.legacyAminoJSONHandler{}) // Same data for every test cases accounts := suite.CreateTestAccounts(1) diff --git a/x/auth/ante/sigverify_test.go b/x/auth/ante/sigverify_test.go index e128b9e26276..a55625c4d358 100644 --- a/x/auth/ante/sigverify_test.go +++ b/x/auth/ante/sigverify_test.go @@ -143,7 +143,7 @@ func (suite *AnteTestSuite) TestSigVerification() { gasLimit := testdata.NewTestGasLimit() spkd := ante.NewSetPubKeyDecorator(suite.app.AccountKeeper) - svd := ante.NewSigVerificationDecorator(suite.app.AccountKeeper, types.LegacyAminoJSONHandler{}) + svd := ante.NewSigVerificationDecorator(suite.app.AccountKeeper, types.legacyAminoJSONHandler{}) antehandler := sdk.ChainAnteDecorators(spkd, svd) type testCase struct { @@ -230,7 +230,7 @@ func (suite *AnteTestSuite) runSigDecorators(params types.Params, _ bool, privs spkd := ante.NewSetPubKeyDecorator(suite.app.AccountKeeper) svgc := ante.NewSigGasConsumeDecorator(suite.app.AccountKeeper, ante.DefaultSigVerificationGasConsumer) - svd := ante.NewSigVerificationDecorator(suite.app.AccountKeeper, types.LegacyAminoJSONHandler{}) + svd := ante.NewSigVerificationDecorator(suite.app.AccountKeeper, types.legacyAminoJSONHandler{}) antehandler := sdk.ChainAnteDecorators(spkd, svgc, svd) // Determine gas consumption of antehandler with default params diff --git a/x/auth/ante/testutil_test.go b/x/auth/ante/testutil_test.go index b82844d88279..0566624f5f3d 100644 --- a/x/auth/ante/testutil_test.go +++ b/x/auth/ante/testutil_test.go @@ -40,7 +40,7 @@ type AnteTestSuite struct { func (suite *AnteTestSuite) SetupTest(isCheckTx bool) { suite.app, suite.ctx = createTestApp(isCheckTx) suite.ctx = suite.ctx.WithBlockHeight(1) - suite.anteHandler = ante.NewAnteHandler(suite.app.AccountKeeper, suite.app.BankKeeper, ante.DefaultSigVerificationGasConsumer, types.LegacyAminoJSONHandler{}) + suite.anteHandler = ante.NewAnteHandler(suite.app.AccountKeeper, suite.app.BankKeeper, ante.DefaultSigVerificationGasConsumer, types.legacyAminoJSONHandler{}) // set up the TxBuilder encodingConfig := simappparams.MakeEncodingConfig() diff --git a/x/auth/signing/direct/direct.go b/x/auth/signing/direct/direct.go deleted file mode 100644 index 8377f4403430..000000000000 --- a/x/auth/signing/direct/direct.go +++ /dev/null @@ -1,66 +0,0 @@ -package direct - -import ( - "fmt" - - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - - sdk "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types/tx" - "github.com/cosmos/cosmos-sdk/x/auth/signing" -) - -// ProtoTx defines an interface which protobuf transactions must implement for -// signature verification via SignModeDirect -type ProtoTx interface { - // GetBodyBytes returns the raw serialized bytes for TxBody - GetBodyBytes() []byte - - // GetBodyBytes returns the raw serialized bytes for AuthInfo - GetAuthInfoBytes() []byte -} - -// ModeHandler defines the SIGN_MODE_DIRECT SignModeHandler -type ModeHandler struct{} - -var _ signing.SignModeHandler = ModeHandler{} - -// DefaultMode implements SignModeHandler.DefaultMode -func (ModeHandler) DefaultMode() signingtypes.SignMode { - return signingtypes.SignMode_SIGN_MODE_DIRECT -} - -// Modes implements SignModeHandler.Modes -func (ModeHandler) Modes() []signingtypes.SignMode { - return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT} -} - -// GetSignBytes implements SignModeHandler.GetSignBytes -func (ModeHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { - if mode != signingtypes.SignMode_SIGN_MODE_DIRECT { - return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_DIRECT, mode) - } - - protoTx, ok := tx.(ProtoTx) - if !ok { - return nil, fmt.Errorf("can only get direct sign bytes for a ProtoTx, got %T", tx) - } - - bodyBz := protoTx.GetBodyBytes() - authInfoBz := protoTx.GetAuthInfoBytes() - - return SignBytes(bodyBz, authInfoBz, data.ChainID, data.AccountNumber, data.AccountSequence) -} - -// SignBytes returns the SIGN_MODE_DIRECT sign bytes for the provided TxBody bytes, AuthInfo bytes, chain ID, -// account number and sequence. -func SignBytes(bodyBytes, authInfoBytes []byte, chainID string, accnum, sequence uint64) ([]byte, error) { - signDoc := types.SignDoc{ - BodyBytes: bodyBytes, - AuthInfoBytes: authInfoBytes, - ChainId: chainID, - AccountNumber: accnum, - AccountSequence: sequence, - } - return signDoc.Marshal() -} diff --git a/x/auth/signing/handler_map_test.go b/x/auth/signing/handler_map_test.go index f4a7db2769ec..718ec76e9f36 100644 --- a/x/auth/signing/handler_map_test.go +++ b/x/auth/signing/handler_map_test.go @@ -18,7 +18,7 @@ func MakeTestHandlerMap() signing.SignModeHandler { return signing.NewSignModeHandlerMap( signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, []signing.SignModeHandler{ - authtypes.LegacyAminoJSONHandler{}, + authtypes.legacyAminoJSONHandler{}, }, ) } @@ -58,7 +58,7 @@ func TestHandlerMap_GetSignBytes(t *testing.T) { ) handler := MakeTestHandlerMap() - aminoJSONHandler := authtypes.LegacyAminoJSONHandler{} + aminoJSONHandler := authtypes.legacyAminoJSONHandler{} signingData := signing.SignerData{ ChainID: chainId, diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 2635d13b1064..8bfa62e28d14 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -6,8 +6,6 @@ import ( "github.com/gogo/protobuf/proto" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/x/auth/signing/direct" - authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/types/tx" @@ -46,7 +44,6 @@ type builder struct { var ( _ authsigning.SigFeeMemoTx = &builder{} _ client.TxBuilder = &builder{} - _ direct.ProtoTx = &builder{} ) func newBuilder(pubkeyCodec types.PublicKeyCodec) *builder { @@ -129,7 +126,7 @@ func (t *builder) ValidateBasic() error { return nil } -func (t *builder) GetBodyBytes() []byte { +func (t *builder) getBodyBytes() []byte { if len(t.bodyBz) == 0 { // if bodyBz is empty, then marshal the body. bodyBz will generally // be set to nil whenever SetBody is called so the result of calling @@ -145,7 +142,7 @@ func (t *builder) GetBodyBytes() []byte { return t.bodyBz } -func (t *builder) GetAuthInfoBytes() []byte { +func (t *builder) getAuthInfoBytes() []byte { if len(t.authInfoBz) == 0 { // if authInfoBz is empty, then marshal the body. authInfoBz will generally // be set to nil whenever SetAuthInfo is called so the result of calling diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index f1a7b1140f16..ed4679622e39 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -56,7 +56,7 @@ func TestTxBuilder(t *testing.T) { fee := tx2.Fee{Amount: sdk.NewCoins(sdk.NewInt64Coin("atom", 150)), GasLimit: 20000} - t.Log("verify that authInfo bytes encoded with DefaultTxEncoder and decoded with DefaultTxDecoder can be retrieved from GetAuthInfoBytes") + t.Log("verify that authInfo bytes encoded with DefaultTxEncoder and decoded with DefaultTxDecoder can be retrieved from getAuthInfoBytes") authInfo := &tx2.AuthInfo{ Fee: &fee, SignerInfos: signerInfo, @@ -66,7 +66,7 @@ func TestTxBuilder(t *testing.T) { require.NotEmpty(t, authInfoBytes) - t.Log("verify that body bytes encoded with DefaultTxEncoder and decoded with DefaultTxDecoder can be retrieved from GetBodyBytes") + t.Log("verify that body bytes encoded with DefaultTxEncoder and decoded with DefaultTxDecoder can be retrieved from getBodyBytes") anys := make([]*codectypes.Any, len(msgs)) for i, msg := range msgs { @@ -83,29 +83,29 @@ func TestTxBuilder(t *testing.T) { } bodyBytes := marshaler.MustMarshalBinaryBare(txBody) require.NotEmpty(t, bodyBytes) - require.Empty(t, tx.GetBodyBytes()) + require.Empty(t, tx.getBodyBytes()) - t.Log("verify that calling the SetMsgs, SetMemo results in the correct GetBodyBytes") - require.NotEqual(t, bodyBytes, tx.GetBodyBytes()) + t.Log("verify that calling the SetMsgs, SetMemo results in the correct getBodyBytes") + require.NotEqual(t, bodyBytes, tx.getBodyBytes()) err = tx.SetMsgs(msgs...) require.NoError(t, err) - require.NotEqual(t, bodyBytes, tx.GetBodyBytes()) + require.NotEqual(t, bodyBytes, tx.getBodyBytes()) tx.SetMemo(memo) - require.Equal(t, bodyBytes, tx.GetBodyBytes()) + require.Equal(t, bodyBytes, tx.getBodyBytes()) require.Equal(t, len(msgs), len(tx.GetMsgs())) require.Equal(t, 0, len(tx.GetPubKeys())) - t.Log("verify that updated AuthInfo results in the correct GetAuthInfoBytes and GetPubKeys") - require.NotEqual(t, authInfoBytes, tx.GetAuthInfoBytes()) + t.Log("verify that updated AuthInfo results in the correct getAuthInfoBytes and GetPubKeys") + require.NotEqual(t, authInfoBytes, tx.getAuthInfoBytes()) tx.SetFeeAmount(fee.Amount) - require.NotEqual(t, authInfoBytes, tx.GetAuthInfoBytes()) + require.NotEqual(t, authInfoBytes, tx.getAuthInfoBytes()) tx.SetGasLimit(fee.GasLimit) - require.NotEqual(t, authInfoBytes, tx.GetAuthInfoBytes()) + require.NotEqual(t, authInfoBytes, tx.getAuthInfoBytes()) err = tx.SetSignatures(sig) require.NoError(t, err) // once fee, gas and signerInfos are all set, AuthInfo bytes should match - require.Equal(t, authInfoBytes, tx.GetAuthInfoBytes()) + require.Equal(t, authInfoBytes, tx.getAuthInfoBytes()) require.Equal(t, len(msgs), len(tx.GetMsgs())) require.Equal(t, 1, len(tx.GetPubKeys())) diff --git a/x/auth/tx/generator.go b/x/auth/tx/config.go similarity index 61% rename from x/auth/tx/generator.go rename to x/auth/tx/config.go index f70ddaafca7f..2551755a65ef 100644 --- a/x/auth/tx/generator.go +++ b/x/auth/tx/config.go @@ -3,6 +3,8 @@ package tx import ( "fmt" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/types" @@ -10,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" ) -type generator struct { +type config struct { pubkeyCodec types.PublicKeyCodec handler signing.SignModeHandler decoder sdk.TxDecoder @@ -19,11 +21,12 @@ type generator struct { jsonEncoder sdk.TxEncoder } -// NewTxConfig returns a new protobuf TxConfig using the provided Marshaler, PublicKeyCodec and SignModeHandler. -func NewTxConfig(anyUnpacker codectypes.AnyUnpacker, pubkeyCodec types.PublicKeyCodec, signModeHandler signing.SignModeHandler) client.TxConfig { - return &generator{ +// NewTxConfig returns a new protobuf TxConfig using the provided Marshaler, PublicKeyCodec and sign modes. The +// first enabled sign mode will become the default sign mode. +func NewTxConfig(anyUnpacker codectypes.AnyUnpacker, pubkeyCodec types.PublicKeyCodec, enabledSignModes []signingtypes.SignMode) client.TxConfig { + return &config{ pubkeyCodec: pubkeyCodec, - handler: signModeHandler, + handler: makeSignModeHandler(enabledSignModes), decoder: DefaultTxDecoder(anyUnpacker, pubkeyCodec), encoder: DefaultTxEncoder(), jsonDecoder: DefaultJSONTxDecoder(anyUnpacker, pubkeyCodec), @@ -31,12 +34,12 @@ func NewTxConfig(anyUnpacker codectypes.AnyUnpacker, pubkeyCodec types.PublicKey } } -func (g generator) NewTxBuilder() client.TxBuilder { +func (g config) NewTxBuilder() client.TxBuilder { return newBuilder(g.pubkeyCodec) } // WrapTxBuilder returns a builder from provided transaction -func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { +func (g config) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { newBuilder, ok := newTx.(*builder) if !ok { return nil, fmt.Errorf("expected %T, got %T", &builder{}, newTx) @@ -45,22 +48,22 @@ func (g generator) WrapTxBuilder(newTx sdk.Tx) (client.TxBuilder, error) { return newBuilder, nil } -func (g generator) SignModeHandler() signing.SignModeHandler { +func (g config) SignModeHandler() signing.SignModeHandler { return g.handler } -func (g generator) TxEncoder() sdk.TxEncoder { +func (g config) TxEncoder() sdk.TxEncoder { return g.encoder } -func (g generator) TxDecoder() sdk.TxDecoder { +func (g config) TxDecoder() sdk.TxDecoder { return g.decoder } -func (g generator) TxJSONEncoder() sdk.TxEncoder { +func (g config) TxJSONEncoder() sdk.TxEncoder { return g.jsonEncoder } -func (g generator) TxJSONDecoder() sdk.TxDecoder { +func (g config) TxJSONDecoder() sdk.TxDecoder { return g.jsonDecoder } diff --git a/x/auth/tx/generator_test.go b/x/auth/tx/config_test.go similarity index 94% rename from x/auth/tx/generator_test.go rename to x/auth/tx/config_test.go index 21fc057dceb7..4a121e43963f 100644 --- a/x/auth/tx/generator_test.go +++ b/x/auth/tx/config_test.go @@ -20,6 +20,6 @@ func TestGenerator(t *testing.T) { interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) marshaler := codec.NewProtoCodec(interfaceRegistry) pubKeyCodec := std.DefaultPublicKeyCodec{} - signModeHandler := DefaultSignModeHandler() + signModeHandler := makeSignModeHandler(nil) suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, pubKeyCodec, signModeHandler))) } diff --git a/x/auth/tx/direct.go b/x/auth/tx/direct.go new file mode 100644 index 000000000000..9e2c46de73b6 --- /dev/null +++ b/x/auth/tx/direct.go @@ -0,0 +1,56 @@ +package tx + +import ( + "fmt" + + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + + sdk "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +// signModeDirectHandler defines the SIGN_MODE_DIRECT SignModeHandler +type signModeDirectHandler struct{} + +var _ signing.SignModeHandler = signModeDirectHandler{} + +// DefaultMode implements SignModeHandler.DefaultMode +func (signModeDirectHandler) DefaultMode() signingtypes.SignMode { + return signingtypes.SignMode_SIGN_MODE_DIRECT +} + +// Modes implements SignModeHandler.Modes +func (signModeDirectHandler) Modes() []signingtypes.SignMode { + return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT} +} + +// GetSignBytes implements SignModeHandler.GetSignBytes +func (signModeDirectHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { + if mode != signingtypes.SignMode_SIGN_MODE_DIRECT { + return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_DIRECT, mode) + } + + protoTx, ok := tx.(*builder) + if !ok { + return nil, fmt.Errorf("can only handle a protobuf Tx, got %T", tx) + } + + bodyBz := protoTx.getBodyBytes() + authInfoBz := protoTx.getAuthInfoBytes() + + return DirectSignBytes(bodyBz, authInfoBz, data.ChainID, data.AccountNumber, data.AccountSequence) +} + +// DirectSignBytes returns the SIGN_MODE_DIRECT sign bytes for the provided TxBody bytes, AuthInfo bytes, chain ID, +// account number and sequence. +func DirectSignBytes(bodyBytes, authInfoBytes []byte, chainID string, accnum, sequence uint64) ([]byte, error) { + signDoc := types.SignDoc{ + BodyBytes: bodyBytes, + AuthInfoBytes: authInfoBytes, + ChainId: chainID, + AccountNumber: accnum, + AccountSequence: sequence, + } + return signDoc.Marshal() +} diff --git a/x/auth/signing/direct/direct_test.go b/x/auth/tx/direct_test.go similarity index 86% rename from x/auth/signing/direct/direct_test.go rename to x/auth/tx/direct_test.go index 7af0c1624449..f718c5c657eb 100644 --- a/x/auth/signing/direct/direct_test.go +++ b/x/auth/tx/direct_test.go @@ -1,4 +1,4 @@ -package direct_test +package tx_test import ( "fmt" @@ -6,8 +6,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/cosmos/cosmos-sdk/x/auth/signing/direct" - "github.com/cosmos/cosmos-sdk/testutil/testdata" "github.com/cosmos/cosmos-sdk/codec" @@ -30,8 +28,8 @@ func TestDirectModeHandler(t *testing.T) { marshaler := codec.NewProtoCodec(interfaceRegistry) pubKeyCdc := std.DefaultPublicKeyCodec{} - txGen := tx.NewTxConfig(marshaler, pubKeyCdc, tx.DefaultSignModeHandler()) - txBuilder := txGen.NewTxBuilder() + txConfig := tx.NewTxConfig(marshaler, pubKeyCdc, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}) + txBuilder := txConfig.NewTxBuilder() memo := "sometestmemo" msgs := []sdk.Msg{testdata.NewTestMsg(addr)} @@ -71,9 +69,9 @@ func TestDirectModeHandler(t *testing.T) { require.NoError(t, err) t.Log("verify modes and default-mode") - directModeHandler := direct.ModeHandler{} - require.Equal(t, directModeHandler.DefaultMode(), signingtypes.SignMode_SIGN_MODE_DIRECT) - require.Len(t, directModeHandler.Modes(), 1) + modeHandler := txConfig.SignModeHandler() + require.Equal(t, modeHandler.DefaultMode(), signingtypes.SignMode_SIGN_MODE_DIRECT) + require.Len(t, modeHandler.Modes(), 1) signingData := signing.SignerData{ ChainID: "test-chain", @@ -81,7 +79,7 @@ func TestDirectModeHandler(t *testing.T) { AccountSequence: 1, } - signBytes, err := directModeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, txBuilder.GetTx()) + signBytes, err := modeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, txBuilder.GetTx()) require.NoError(t, err) require.NotNil(t, signBytes) @@ -127,7 +125,7 @@ func TestDirectModeHandler(t *testing.T) { require.NoError(t, err) err = txBuilder.SetSignatures(sig) require.NoError(t, err) - signBytes, err = directModeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, txBuilder.GetTx()) + signBytes, err = modeHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, txBuilder.GetTx()) require.NoError(t, err) require.Equal(t, expectedSignBytes, signBytes) @@ -146,7 +144,7 @@ func TestDirectModeHandler_nonDIRECT_MODE(t *testing.T) { } for _, invalidMode := range invalidModes { t.Run(invalidMode.String(), func(t *testing.T) { - var dh direct.ModeHandler + var dh tx.signModeDirectHandler var signingData signing.SignerData _, err := dh.GetSignBytes(invalidMode, signingData, nil) require.Error(t, err) @@ -164,7 +162,7 @@ func (npt *nonProtoTx) ValidateBasic() error { return nil } var _ sdk.Tx = (*nonProtoTx)(nil) func TestDirectModeHandler_nonProtoTx(t *testing.T) { - var dh direct.ModeHandler + var dh tx.signModeDirectHandler var signingData signing.SignerData tx := new(nonProtoTx) _, err := dh.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, tx) diff --git a/x/auth/tx/encoder.go b/x/auth/tx/encoder.go index 004728a3e132..5272740a98ac 100644 --- a/x/auth/tx/encoder.go +++ b/x/auth/tx/encoder.go @@ -19,8 +19,8 @@ func DefaultTxEncoder() types.TxEncoder { } raw := &txtypes.TxRaw{ - BodyBytes: wrapper.GetBodyBytes(), - AuthInfoBytes: wrapper.GetAuthInfoBytes(), + BodyBytes: wrapper.getBodyBytes(), + AuthInfoBytes: wrapper.getAuthInfoBytes(), Signatures: wrapper.tx.Signatures, } diff --git a/x/auth/tx/legacy_amino_json.go b/x/auth/tx/legacy_amino_json.go new file mode 100644 index 000000000000..05e9f91f783d --- /dev/null +++ b/x/auth/tx/legacy_amino_json.go @@ -0,0 +1,57 @@ +package tx + +import ( + "fmt" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/auth/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" +) + +// signModeLegacyAminoJSONHandler defines the SIGN_MODE_LEGACY_AMINO_JSON SignModeHandler +type signModeLegacyAminoJSONHandler struct{} + +func (s signModeLegacyAminoJSONHandler) DefaultMode() signingtypes.SignMode { + return signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON +} + +func (s signModeLegacyAminoJSONHandler) Modes() []signingtypes.SignMode { + return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON} +} + +func (s signModeLegacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { + if mode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON { + return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, mode) + } + + protoTx, ok := tx.(*builder) + if !ok { + return nil, fmt.Errorf("can only handle a protobuf Tx, got %T", tx) + } + + if protoTx.txBodyHasUnknownNonCriticals { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, + fmt.Sprintf("protobuf transaction contains unknown non-critical fields. This is a transaction malleability issue and SIGN_MODE_LEGACY_AMINO_JSON cannot be used.")) + } + + body := protoTx.tx.Body + + if len(body.ExtensionOptions) != 0 || len(body.NonCriticalExtensionOptions) != 0 { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, + fmt.Sprintf("SIGN_MODE_LEGACY_AMINO_JSON does not support protobuf extension options.")) + } + + if body.TimeoutHeight != 0 { + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, + fmt.Sprintf("SIGN_MODE_LEGACY_AMINO_JSON does not support timeout height.")) + } + + return types.StdSignBytes( + data.ChainID, data.AccountNumber, data.AccountSequence, types.StdFee{Amount: protoTx.GetFee(), Gas: protoTx.GetGas()}, tx.GetMsgs(), protoTx.GetMemo(), + ), nil +} + +var _ signing.SignModeHandler = signModeLegacyAminoJSONHandler{} diff --git a/x/auth/tx/mode_handler.go b/x/auth/tx/mode_handler.go index ef45d90dbfa0..c3bc5b7193b2 100644 --- a/x/auth/tx/mode_handler.go +++ b/x/auth/tx/mode_handler.go @@ -1,20 +1,34 @@ package tx import ( - signing2 "github.com/cosmos/cosmos-sdk/types/tx/signing" + "fmt" + + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/cosmos/cosmos-sdk/x/auth/signing/direct" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -// DefaultSignModeHandler returns the default protobuf SignModeHandler supporting +// makeSignModeHandler returns the default protobuf SignModeHandler supporting // SIGN_MODE_DIRECT and SIGN_MODE_LEGACY_AMINO_JSON. -func DefaultSignModeHandler() signing.SignModeHandler { +func makeSignModeHandler(modes []signingtypes.SignMode) signing.SignModeHandler { + if len(modes) < 1 { + panic(fmt.Errorf("no sign modes enabled")) + } + + handlers := make([]signing.SignModeHandler, len(modes)) + + for i, mode := range modes { + switch mode { + case signingtypes.SignMode_SIGN_MODE_DIRECT: + handlers[i] = signModeDirectHandler{} + case signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON: + handlers[i] = signModeLegacyAminoJSONHandler{} + default: + panic(fmt.Errorf("unsupported sign mode %+v", mode)) + } + } + return signing.NewSignModeHandlerMap( - signing2.SignMode_SIGN_MODE_DIRECT, - []signing.SignModeHandler{ - authtypes.LegacyAminoJSONHandler{}, - direct.ModeHandler{}, - }, + modes[0], + handlers, ) } diff --git a/x/auth/types/amino_signing.go b/x/auth/types/amino_signing.go index f8747ca1da37..7e1411b485ba 100644 --- a/x/auth/types/amino_signing.go +++ b/x/auth/types/amino_signing.go @@ -8,23 +8,23 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" ) -// LegacyAminoJSONHandler is a SignModeHandler that handles SIGN_MODE_LEGACY_AMINO_JSON -type LegacyAminoJSONHandler struct{} +// legacyAminoJSONHandler is a SignModeHandler that handles SIGN_MODE_LEGACY_AMINO_JSON +type legacyAminoJSONHandler struct{} -var _ signing.SignModeHandler = LegacyAminoJSONHandler{} +var _ signing.SignModeHandler = legacyAminoJSONHandler{} // DefaultMode implements SignModeHandler.DefaultMode -func (h LegacyAminoJSONHandler) DefaultMode() signingtypes.SignMode { +func (h legacyAminoJSONHandler) DefaultMode() signingtypes.SignMode { return signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON } // Modes implements SignModeHandler.Modes -func (LegacyAminoJSONHandler) Modes() []signingtypes.SignMode { +func (legacyAminoJSONHandler) Modes() []signingtypes.SignMode { return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON} } // DefaultMode implements SignModeHandler.GetSignBytes -func (LegacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { +func (legacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { if mode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON { return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, mode) } diff --git a/x/auth/types/amino_signing_test.go b/x/auth/types/amino_signing_test.go index cee158b47629..1132e693d927 100644 --- a/x/auth/types/amino_signing_test.go +++ b/x/auth/types/amino_signing_test.go @@ -1,18 +1,16 @@ -package types_test +package types import ( "testing" - "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto/secp256k1" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/auth/signing" ) func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { @@ -23,20 +21,16 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { coins := sdk.Coins{sdk.NewInt64Coin("foocoin", 10)} - fee := types.StdFee{ + fee := StdFee{ Amount: coins, Gas: 10000, } memo := "foo" msgs := []sdk.Msg{ - &banktypes.MsgSend{ - FromAddress: addr1, - ToAddress: addr2, - Amount: coins, - }, + testdata.NewTestMsg(addr1, addr2), } - tx := types.StdTx{ + tx := StdTx{ Msgs: msgs, Fee: fee, Signatures: nil, @@ -49,7 +43,7 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { seqNum uint64 = 7 ) - handler := types.LegacyAminoJSONHandler{} + handler := legacyAminoJSONHandler{} signingData := signing.SignerData{ ChainID: chainId, AccountNumber: accNum, @@ -58,7 +52,7 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { signBz, err := handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx) require.NoError(t, err) - expectedSignBz := types.StdSignBytes(chainId, accNum, seqNum, fee, msgs, memo) + expectedSignBz := StdSignBytes(chainId, accNum, seqNum, fee, msgs, memo) require.Equal(t, expectedSignBz, signBz) @@ -68,11 +62,11 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { } func TestLegacyAminoJSONHandler_DefaultMode(t *testing.T) { - handler := types.LegacyAminoJSONHandler{} + handler := legacyAminoJSONHandler{} require.Equal(t, signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, handler.DefaultMode()) } func TestLegacyAminoJSONHandler_Modes(t *testing.T) { - handler := types.LegacyAminoJSONHandler{} + handler := legacyAminoJSONHandler{} require.Equal(t, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON}, handler.Modes()) } diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index b0f8fc613bcd..2e2a9e150f91 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -123,5 +123,5 @@ func (s StdTxConfig) TxJSONDecoder() sdk.TxDecoder { } func (s StdTxConfig) SignModeHandler() authsigning.SignModeHandler { - return LegacyAminoJSONHandler{} + return legacyAminoJSONHandler{} } From c1e710ab3a59b75eb5e410c1eec814d49c8186a8 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 15:05:51 -0400 Subject: [PATCH 04/14] WIP --- simapp/params/proto.go | 6 +----- x/auth/tx/config_test.go | 3 +-- x/auth/tx/direct_test.go | 12 +++++------- x/auth/tx/mode_handler.go | 5 +++++ 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/simapp/params/proto.go b/simapp/params/proto.go index e8427336bead..fbccd86bbba6 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -7,7 +7,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/std" - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -16,10 +15,7 @@ func MakeEncodingConfig() EncodingConfig { cdc := codec.New() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewHybridCodec(cdc, interfaceRegistry) - txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, []signingtypes.SignMode{ - signingtypes.SignMode_SIGN_MODE_DIRECT, - signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, - }) + txGen := tx.NewTxConfig(interfaceRegistry, std.DefaultPublicKeyCodec{}, tx.DefaultSignModes) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, diff --git a/x/auth/tx/config_test.go b/x/auth/tx/config_test.go index 4a121e43963f..e3d9d5d2be55 100644 --- a/x/auth/tx/config_test.go +++ b/x/auth/tx/config_test.go @@ -20,6 +20,5 @@ func TestGenerator(t *testing.T) { interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) marshaler := codec.NewProtoCodec(interfaceRegistry) pubKeyCodec := std.DefaultPublicKeyCodec{} - signModeHandler := makeSignModeHandler(nil) - suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, pubKeyCodec, signModeHandler))) + suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, pubKeyCodec, DefaultSignModes))) } diff --git a/x/auth/tx/direct_test.go b/x/auth/tx/direct_test.go index f718c5c657eb..58ebf0ec13a1 100644 --- a/x/auth/tx/direct_test.go +++ b/x/auth/tx/direct_test.go @@ -1,11 +1,9 @@ -package tx_test +package tx import ( "fmt" "testing" - "github.com/cosmos/cosmos-sdk/x/auth/tx" - "github.com/cosmos/cosmos-sdk/testutil/testdata" "github.com/cosmos/cosmos-sdk/codec" @@ -28,7 +26,7 @@ func TestDirectModeHandler(t *testing.T) { marshaler := codec.NewProtoCodec(interfaceRegistry) pubKeyCdc := std.DefaultPublicKeyCodec{} - txConfig := tx.NewTxConfig(marshaler, pubKeyCdc, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}) + txConfig := NewTxConfig(marshaler, pubKeyCdc, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}) txBuilder := txConfig.NewTxBuilder() memo := "sometestmemo" @@ -144,7 +142,7 @@ func TestDirectModeHandler_nonDIRECT_MODE(t *testing.T) { } for _, invalidMode := range invalidModes { t.Run(invalidMode.String(), func(t *testing.T) { - var dh tx.signModeDirectHandler + var dh signModeDirectHandler var signingData signing.SignerData _, err := dh.GetSignBytes(invalidMode, signingData, nil) require.Error(t, err) @@ -162,11 +160,11 @@ func (npt *nonProtoTx) ValidateBasic() error { return nil } var _ sdk.Tx = (*nonProtoTx)(nil) func TestDirectModeHandler_nonProtoTx(t *testing.T) { - var dh tx.signModeDirectHandler + var dh signModeDirectHandler var signingData signing.SignerData tx := new(nonProtoTx) _, err := dh.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, tx) require.Error(t, err) - wantErr := fmt.Errorf("can only get direct sign bytes for a ProtoTx, got %T", tx) + wantErr := fmt.Errorf("can only handle a protobuf Tx, got %T", tx) require.Equal(t, err, wantErr) } diff --git a/x/auth/tx/mode_handler.go b/x/auth/tx/mode_handler.go index c3bc5b7193b2..4523542c6b8b 100644 --- a/x/auth/tx/mode_handler.go +++ b/x/auth/tx/mode_handler.go @@ -7,6 +7,11 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" ) +var DefaultSignModes = []signingtypes.SignMode{ + signingtypes.SignMode_SIGN_MODE_DIRECT, + signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, +} + // makeSignModeHandler returns the default protobuf SignModeHandler supporting // SIGN_MODE_DIRECT and SIGN_MODE_LEGACY_AMINO_JSON. func makeSignModeHandler(modes []signingtypes.SignMode) signing.SignModeHandler { From 8b96a05a309cb7790b67bb62e1f068f99061760b Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 15:12:40 -0400 Subject: [PATCH 05/14] WIP --- x/auth/tx/builder.go | 7 ------- x/auth/tx/config.go | 8 ++++++++ x/auth/tx/decoder.go | 3 +-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 16b4ec77112f..d31151691916 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -8,12 +8,6 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/client" - authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - - "github.com/cosmos/cosmos-sdk/types/tx" - - "github.com/cosmos/cosmos-sdk/types/tx/signing" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" @@ -21,7 +15,6 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" - "github.com/cosmos/cosmos-sdk/x/auth/signing/direct" ) type builder struct { diff --git a/x/auth/tx/config.go b/x/auth/tx/config.go index df63d3aa5d44..e2f9bb9e94c0 100644 --- a/x/auth/tx/config.go +++ b/x/auth/tx/config.go @@ -70,3 +70,11 @@ func (g config) TxJSONEncoder() sdk.TxEncoder { func (g config) TxJSONDecoder() sdk.TxDecoder { return g.jsonDecoder } + +func (g config) MarshalSignatureJSON(v2s []signingtypes.SignatureV2) ([]byte, error) { + panic("implement me") +} + +func (g config) UnmarshalSignatureJSON(bytes []byte) ([]signingtypes.SignatureV2, error) { + panic("implement me") +} diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index eb60b1618a38..db8ab80f7e72 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -14,8 +14,7 @@ import ( ) // DefaultTxDecoder returns a default protobuf TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { - cdc := codec.NewProtoCodec(anyUnpacker) +func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, error) { var raw tx.TxRaw From 19ceea6fe2fa425dae350e1a9bca590d9408bd34 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 15:46:13 -0400 Subject: [PATCH 06/14] WIP --- client/tx/legacy_test.go | 2 +- client/{tx_generator.go => tx_config.go} | 0 codec/unknownproto/unknown_fields.go | 16 ++++++++------ x/auth/signing/handler_map_test.go | 4 ++-- x/auth/tx/builder_test.go | 3 ++- x/auth/tx/config.go | 8 ------- x/auth/tx/decoder.go | 4 +--- x/auth/tx/sigs.go | 4 ++-- x/auth/types/amino_signing.go | 27 ++++++++++++------------ x/auth/types/amino_signing_test.go | 6 +++--- x/auth/types/client_tx.go | 2 +- 11 files changed, 34 insertions(+), 42 deletions(-) rename client/{tx_generator.go => tx_config.go} (100%) diff --git a/client/tx/legacy_test.go b/client/tx/legacy_test.go index 69aa088c0e5a..a2d4ec7de664 100644 --- a/client/tx/legacy_test.go +++ b/client/tx/legacy_test.go @@ -65,7 +65,7 @@ type TestSuite struct { func (s *TestSuite) SetupSuite() { encCfg := simapp.MakeEncodingConfig() s.encCfg = encCfg - s.protoCfg = tx.NewTxConfig(codec.NewProtoCodec(encCfg.InterfaceRegistry), std.DefaultPublicKeyCodec{}, tx.DefaultSignModeHandler()) + s.protoCfg = tx.NewTxConfig(codec.NewProtoCodec(encCfg.InterfaceRegistry), std.DefaultPublicKeyCodec{}, tx.DefaultSignModes) s.aminoCfg = types3.StdTxConfig{Cdc: encCfg.Amino} } diff --git a/client/tx_generator.go b/client/tx_config.go similarity index 100% rename from client/tx_generator.go rename to client/tx_config.go diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 9f8839c1155c..062a41894c56 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -43,8 +43,8 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b } for len(b) > 0 { - tagNum, wireType, n := protowire.ConsumeField(b) - if n < 0 { + tagNum, wireType, m := protowire.ConsumeTag(b) + if m < 0 { return hasUnknownNonCriticals, errors.New("invalid length") } @@ -78,10 +78,6 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b } } - // Skip over the 2 bytes that store fieldNumber and wireType bytes. - fieldBytes := b[2:n] - b = b[n:] - // An unknown but non-critical field or just a scalar type (aka *INT and BYTES like). if fieldDescProto == nil || fieldDescProto.IsScalar() { continue @@ -102,9 +98,15 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b // Let's recursively traverse and typecheck the field. + // Skip over the bytes that store fieldNumber and wireType bytes. + b = b[m:] + n := protowire.ConsumeFieldValue(tagNum, wireType, b) + fieldBytes := b[:n] + b = b[n:] + if protoMessageName == ".google.protobuf.Any" { // Firstly typecheck types.Any to ensure nothing snuck in. - if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, (*types.Any)(nil), allowUnknownNonCriticals); err != nil { + if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, &types.Any{}, allowUnknownNonCriticals); err != nil { return hasUnknownNonCriticals || hasUnknownNonCriticalsChild, err } // And finally we can extract the TypeURL containing the protoMessageName. diff --git a/x/auth/signing/handler_map_test.go b/x/auth/signing/handler_map_test.go index 718ec76e9f36..e419cff836e9 100644 --- a/x/auth/signing/handler_map_test.go +++ b/x/auth/signing/handler_map_test.go @@ -18,7 +18,7 @@ func MakeTestHandlerMap() signing.SignModeHandler { return signing.NewSignModeHandlerMap( signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, []signing.SignModeHandler{ - authtypes.legacyAminoJSONHandler{}, + authtypes.NewStdTxSignModeHandler(), }, ) } @@ -58,7 +58,7 @@ func TestHandlerMap_GetSignBytes(t *testing.T) { ) handler := MakeTestHandlerMap() - aminoJSONHandler := authtypes.legacyAminoJSONHandler{} + aminoJSONHandler := authtypes.NewStdTxSignModeHandler() signingData := signing.SignerData{ ChainID: chainId, diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index 45c83d7cd33c..2c4f78d235d6 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -233,9 +233,10 @@ func TestBuilderValidateBasic(t *testing.T) { func TestDefaultTxDecoderError(t *testing.T) { registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) pubKeyCdc := std.DefaultPublicKeyCodec{} encoder := DefaultTxEncoder() - decoder := DefaultTxDecoder(registry, pubKeyCdc) + decoder := DefaultTxDecoder(cdc, pubKeyCdc) builder := newBuilder(pubKeyCdc) err := builder.SetMsgs(testdata.NewTestMsg()) diff --git a/x/auth/tx/config.go b/x/auth/tx/config.go index e2f9bb9e94c0..df63d3aa5d44 100644 --- a/x/auth/tx/config.go +++ b/x/auth/tx/config.go @@ -70,11 +70,3 @@ func (g config) TxJSONEncoder() sdk.TxEncoder { func (g config) TxJSONDecoder() sdk.TxDecoder { return g.jsonDecoder } - -func (g config) MarshalSignatureJSON(v2s []signingtypes.SignatureV2) ([]byte, error) { - panic("implement me") -} - -func (g config) UnmarshalSignatureJSON(bytes []byte) ([]signingtypes.SignatureV2, error) { - panic("implement me") -} diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index db8ab80f7e72..e9ca72127137 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -6,7 +6,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec/unknownproto" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -78,8 +77,7 @@ func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec } // DefaultTxDecoder returns a default protobuf JSON TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultJSONTxDecoder(anyUnpacker types.AnyUnpacker, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { - cdc := codec.NewProtoCodec(anyUnpacker) +func DefaultJSONTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, error) { var theTx tx.Tx err := cdc.UnmarshalJSON(txBytes, &theTx) diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index 1d13277f37f5..e2035e3a3a32 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -105,7 +105,7 @@ func decodeMultisignatures(bz []byte) ([][]byte, error) { return multisig.Signatures, nil } -func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) { +func (g config) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) { descs := make([]*signing.SignatureDescriptor, len(sigs)) for i, sig := range sigs { @@ -127,7 +127,7 @@ func (g generator) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, err return codec.ProtoMarshalJSON(toJSON) } -func (g generator) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { +func (g config) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) { var sigDescs signing.SignatureDescriptors err := g.protoCodec.UnmarshalJSON(bz, &sigDescs) if err != nil { diff --git a/x/auth/types/amino_signing.go b/x/auth/types/amino_signing.go index 7e1411b485ba..ea9b197ee7c1 100644 --- a/x/auth/types/amino_signing.go +++ b/x/auth/types/amino_signing.go @@ -8,38 +8,37 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" ) -// legacyAminoJSONHandler is a SignModeHandler that handles SIGN_MODE_LEGACY_AMINO_JSON -type legacyAminoJSONHandler struct{} +// stdTxSignModeHandler is a SignModeHandler that handles SIGN_MODE_LEGACY_AMINO_JSON +type stdTxSignModeHandler struct{} -var _ signing.SignModeHandler = legacyAminoJSONHandler{} +func NewStdTxSignModeHandler() signing.SignModeHandler { + return &stdTxSignModeHandler{} +} + +var _ signing.SignModeHandler = stdTxSignModeHandler{} // DefaultMode implements SignModeHandler.DefaultMode -func (h legacyAminoJSONHandler) DefaultMode() signingtypes.SignMode { +func (h stdTxSignModeHandler) DefaultMode() signingtypes.SignMode { return signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON } // Modes implements SignModeHandler.Modes -func (legacyAminoJSONHandler) Modes() []signingtypes.SignMode { +func (stdTxSignModeHandler) Modes() []signingtypes.SignMode { return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON} } // DefaultMode implements SignModeHandler.GetSignBytes -func (legacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { +func (stdTxSignModeHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { if mode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON { return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, mode) } - feeTx, ok := tx.(sdk.FeeTx) - if !ok { - return nil, fmt.Errorf("expected FeeTx, got %T", tx) - } - - memoTx, ok := tx.(sdk.TxWithMemo) + stdTx, ok := tx.(StdTx) if !ok { - return nil, fmt.Errorf("expected TxWithMemo, got %T", tx) + return nil, fmt.Errorf("expected %T, got %T", StdTx{}, tx) } return StdSignBytes( - data.ChainID, data.AccountNumber, data.AccountSequence, StdFee{Amount: feeTx.GetFee(), Gas: feeTx.GetGas()}, tx.GetMsgs(), memoTx.GetMemo(), + data.ChainID, data.AccountNumber, data.AccountSequence, StdFee{Amount: stdTx.GetFee(), Gas: stdTx.GetGas()}, tx.GetMsgs(), stdTx.GetMemo(), ), nil } diff --git a/x/auth/types/amino_signing_test.go b/x/auth/types/amino_signing_test.go index 1132e693d927..3f205ab65d79 100644 --- a/x/auth/types/amino_signing_test.go +++ b/x/auth/types/amino_signing_test.go @@ -43,7 +43,7 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { seqNum uint64 = 7 ) - handler := legacyAminoJSONHandler{} + handler := stdTxSignModeHandler{} signingData := signing.SignerData{ ChainID: chainId, AccountNumber: accNum, @@ -62,11 +62,11 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { } func TestLegacyAminoJSONHandler_DefaultMode(t *testing.T) { - handler := legacyAminoJSONHandler{} + handler := stdTxSignModeHandler{} require.Equal(t, signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, handler.DefaultMode()) } func TestLegacyAminoJSONHandler_Modes(t *testing.T) { - handler := legacyAminoJSONHandler{} + handler := stdTxSignModeHandler{} require.Equal(t, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON}, handler.Modes()) } diff --git a/x/auth/types/client_tx.go b/x/auth/types/client_tx.go index ffdea219c39c..4c3371c6a63d 100644 --- a/x/auth/types/client_tx.go +++ b/x/auth/types/client_tx.go @@ -146,5 +146,5 @@ func (s StdTxConfig) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, e } func (s StdTxConfig) SignModeHandler() authsigning.SignModeHandler { - return legacyAminoJSONHandler{} + return stdTxSignModeHandler{} } From d7fabf9ed66d00e108e8f5ac3f6d3b97f9e08d85 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 16:17:26 -0400 Subject: [PATCH 07/14] Fix bugs with RejectUnknownFields --- codec/unknownproto/unknown_fields.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 062a41894c56..00b20ea9fdfe 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -78,6 +78,12 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b } } + // Skip over the bytes that store fieldNumber and wireType bytes. + b = b[m:] + n := protowire.ConsumeFieldValue(tagNum, wireType, b) + fieldBytes := b[:n] + b = b[n:] + // An unknown but non-critical field or just a scalar type (aka *INT and BYTES like). if fieldDescProto == nil || fieldDescProto.IsScalar() { continue @@ -91,18 +97,16 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b // TYPE_BYTES and TYPE_STRING as per // https://github.com/gogo/protobuf/blob/5628607bb4c51c3157aacc3a50f0ab707582b805/protoc-gen-gogo/descriptor/descriptor.go#L95-L118 default: - return false, fmt.Errorf("failed to get typename for message of type %v, can only be TYPE_STRING or TYPE_BYTES", typ) + return hasUnknownNonCriticals, fmt.Errorf("failed to get typename for message of type %v, can only be TYPE_STRING or TYPE_BYTES", typ) } continue } // Let's recursively traverse and typecheck the field. - // Skip over the bytes that store fieldNumber and wireType bytes. - b = b[m:] - n := protowire.ConsumeFieldValue(tagNum, wireType, b) - fieldBytes := b[:n] - b = b[n:] + // consume length prefix of nested message + _, o := protowire.ConsumeVarint(fieldBytes) + fieldBytes = fieldBytes[o:] if protoMessageName == ".google.protobuf.Any" { // Firstly typecheck types.Any to ensure nothing snuck in. @@ -116,6 +120,8 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b } protoMessageName = any.TypeUrl fieldBytes = any.Value + } else { + // remove } msg, err := protoMessageForTypeName(protoMessageName[1:]) From ed5a77e27114a06c6c69929002e1fc16b6dec873 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 16:39:29 -0400 Subject: [PATCH 08/14] Fix tests --- codec/unknownproto/unknown_fields.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 00b20ea9fdfe..32eb32978e71 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -110,8 +110,10 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b if protoMessageName == ".google.protobuf.Any" { // Firstly typecheck types.Any to ensure nothing snuck in. - if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, &types.Any{}, allowUnknownNonCriticals); err != nil { - return hasUnknownNonCriticals || hasUnknownNonCriticalsChild, err + hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, &types.Any{}, allowUnknownNonCriticals) + hasUnknownNonCriticals = hasUnknownNonCriticals || hasUnknownNonCriticalsChild + if err != nil { + return hasUnknownNonCriticals, err } // And finally we can extract the TypeURL containing the protoMessageName. any := new(types.Any) @@ -128,8 +130,11 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b if err != nil { return hasUnknownNonCriticals, err } - if hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, msg, allowUnknownNonCriticals); err != nil { - return hasUnknownNonCriticals || hasUnknownNonCriticalsChild, err + + hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, msg, allowUnknownNonCriticals) + hasUnknownNonCriticals = hasUnknownNonCriticals || hasUnknownNonCriticalsChild + if err != nil { + return hasUnknownNonCriticals, err } } From ecf9dc761f8cd0a3ff974643a79b54a671f517da Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 16:46:54 -0400 Subject: [PATCH 09/14] Fix bug and update docs --- codec/unknownproto/doc.go | 12 ++++-------- codec/unknownproto/unknown_fields.go | 27 +++++++++++++++++---------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/codec/unknownproto/doc.go b/codec/unknownproto/doc.go index 7e6ae8080785..0a1cc81c7907 100644 --- a/codec/unknownproto/doc.go +++ b/codec/unknownproto/doc.go @@ -6,22 +6,18 @@ a) Unknown fields in the stream -- this is indicative of mismatched services, pe b) Mismatched wire types for a field -- this is indicative of mismatched services -Its API signature is similar to proto.Unmarshal([]byte, proto.Message) as +Its API signature is similar to proto.Unmarshal([]byte, proto.Message) in the strict case - ckr := new(unknownproto.Checker) - if err := ckr.RejectUnknownFields(protoBlob, protoMessage); err != nil { + if err := RejectUnknownFieldsStrict(protoBlob, protoMessage, false); err != nil { // Handle the error. } and ideally should be added before invoking proto.Unmarshal, if you'd like to enforce the features mentioned above. By default, for security we report every single field that's unknown, whether a non-critical field or not. To customize -this behavior, please create a Checker and set the AllowUnknownNonCriticals to true, for example: +this behavior, please pass the boolean glag allowUnknownNonCriticals to true to RejectUnknownFields: - ckr := &unknownproto.Checker{ - AllowUnknownNonCriticals: true, - } - if err := ckr.RejectUnknownFields(protoBlob, protoMessage); err != nil { + if err := RejectUnknownFields(protoBlob, protoMessage, true); err != nil { // Handle the error. } */ diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 32eb32978e71..08ca758136e7 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -22,13 +22,20 @@ type descriptorIface interface { Descriptor() ([]byte, []int) } -func RejectUnknownFieldsStrict(b []byte, msg proto.Message) error { - _, err := RejectUnknownFields(b, msg, false) +// RejectUnknownFieldsStrict rejects any bytes bz with an error that has unknown fields for the provided proto.Message type. +// This function traverses inside of messages nested via google.protobuf.Any. It does not do any deserialization of the proto.Message. +func RejectUnknownFieldsStrict(bz []byte, msg proto.Message) error { + _, err := RejectUnknownFields(bz, msg, false) return err } -func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals bool) (hasUnknownNonCriticals bool, err error) { - if len(b) == 0 { +// RejectUnknownFields rejects any bytes bz with an error that has unknown fields for the provided proto.Message type with an +// option to allow non-critical fields (specified as those fields with bit 11) to pass through. In either case, the +// hasUnknownNonCriticals will be set to true if non-critical fields were encountered during traversal. This flag can be +// used to treat a message with non-critical field different in different security contexts (such as transaction signing). +// This function traverses inside of messages nested via google.protobuf.Any. It does not do any deserialization of the proto.Message. +func RejectUnknownFields(bz []byte, msg proto.Message, allowUnknownNonCriticals bool) (hasUnknownNonCriticals bool, err error) { + if len(bz) == 0 { return hasUnknownNonCriticals, nil } @@ -42,8 +49,8 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b return hasUnknownNonCriticals, err } - for len(b) > 0 { - tagNum, wireType, m := protowire.ConsumeTag(b) + for len(bz) > 0 { + tagNum, wireType, m := protowire.ConsumeTag(bz) if m < 0 { return hasUnknownNonCriticals, errors.New("invalid length") } @@ -79,10 +86,10 @@ func RejectUnknownFields(b []byte, msg proto.Message, allowUnknownNonCriticals b } // Skip over the bytes that store fieldNumber and wireType bytes. - b = b[m:] - n := protowire.ConsumeFieldValue(tagNum, wireType, b) - fieldBytes := b[:n] - b = b[n:] + bz = bz[m:] + n := protowire.ConsumeFieldValue(tagNum, wireType, bz) + fieldBytes := bz[:n] + bz = bz[n:] // An unknown but non-critical field or just a scalar type (aka *INT and BYTES like). if fieldDescProto == nil || fieldDescProto.IsScalar() { From 4c91215288a99d19e9c646e39f9a017db31a65da Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 16:53:27 -0400 Subject: [PATCH 10/14] Lint --- codec/unknownproto/unknown_fields.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 08ca758136e7..8e5ee9b789e6 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -129,8 +129,6 @@ func RejectUnknownFields(bz []byte, msg proto.Message, allowUnknownNonCriticals } protoMessageName = any.TypeUrl fieldBytes = any.Value - } else { - // remove } msg, err := protoMessageForTypeName(protoMessageName[1:]) From 021b8d35997e1225239c7a54ba11f25fc1a9cf66 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 17:06:45 -0400 Subject: [PATCH 11/14] Add tests --- x/auth/tx/legacy_amino_json_test.go | 101 ++++++++++++++++++++++++++++ x/auth/tx/mode_handler.go | 1 + 2 files changed, 102 insertions(+) create mode 100644 x/auth/tx/legacy_amino_json_test.go diff --git a/x/auth/tx/legacy_amino_json_test.go b/x/auth/tx/legacy_amino_json_test.go new file mode 100644 index 000000000000..bbab15a55ae5 --- /dev/null +++ b/x/auth/tx/legacy_amino_json_test.go @@ -0,0 +1,101 @@ +package tx + +import ( + "testing" + + cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/std" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +var ( + _, _, addr1 = testdata.KeyTestPubAddr() + _, _, addr2 = testdata.KeyTestPubAddr() + + coins = sdk.Coins{sdk.NewInt64Coin("foocoin", 10)} + gas = uint64(10000) + msg = testdata.NewTestMsg(addr1, addr2) + memo = "foo" +) + +func buildTx(t *testing.T, bldr *builder) { + bldr.SetFeeAmount(coins) + bldr.SetGasLimit(gas) + bldr.SetMemo(memo) + require.NoError(t, bldr.SetMsgs(msg)) +} + +func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { + bldr := newBuilder(std.DefaultPublicKeyCodec{}) + buildTx(t, bldr) + tx := bldr.GetTx() + + var ( + chainId = "test-chain" + accNum uint64 = 7 + seqNum uint64 = 7 + ) + + handler := signModeLegacyAminoJSONHandler{} + signingData := signing.SignerData{ + ChainID: chainId, + AccountNumber: accNum, + AccountSequence: seqNum, + } + signBz, err := handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx) + require.NoError(t, err) + + expectedSignBz := types.StdSignBytes(chainId, accNum, seqNum, types.StdFee{ + Amount: coins, + Gas: gas, + }, []sdk.Msg{msg}, memo) + + require.Equal(t, expectedSignBz, signBz) + + // expect error with wrong sign mode + _, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_DIRECT, signingData, tx) + require.Error(t, err) + + // expect error with timeout height + bldr = newBuilder(std.DefaultPublicKeyCodec{}) + buildTx(t, bldr) + bldr.tx.Body.TimeoutHeight = 10 + tx = bldr.GetTx() + signBz, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx) + require.Error(t, err) + + // expect error with extension options + bldr = newBuilder(std.DefaultPublicKeyCodec{}) + buildTx(t, bldr) + any, err := cdctypes.NewAnyWithValue(testdata.NewTestMsg()) + require.NoError(t, err) + bldr.tx.Body.ExtensionOptions = []*cdctypes.Any{any} + tx = bldr.GetTx() + signBz, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx) + require.Error(t, err) + + // expect error with non-critical extension options + bldr = newBuilder(std.DefaultPublicKeyCodec{}) + buildTx(t, bldr) + bldr.tx.Body.NonCriticalExtensionOptions = []*cdctypes.Any{any} + tx = bldr.GetTx() + signBz, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signingData, tx) + require.Error(t, err) +} + +func TestLegacyAminoJSONHandler_DefaultMode(t *testing.T) { + handler := signModeLegacyAminoJSONHandler{} + require.Equal(t, signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, handler.DefaultMode()) +} + +func TestLegacyAminoJSONHandler_Modes(t *testing.T) { + handler := signModeLegacyAminoJSONHandler{} + require.Equal(t, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON}, handler.Modes()) +} diff --git a/x/auth/tx/mode_handler.go b/x/auth/tx/mode_handler.go index 4523542c6b8b..f49ee16198d7 100644 --- a/x/auth/tx/mode_handler.go +++ b/x/auth/tx/mode_handler.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/signing" ) +// DefaultSignModes are the default sign modes enabled for protobuf transactions. var DefaultSignModes = []signingtypes.SignMode{ signingtypes.SignMode_SIGN_MODE_DIRECT, signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, From f78ee0cfccba62675191aec317fef3ec0f755bd7 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 17:38:41 -0400 Subject: [PATCH 12/14] Add unknown field tests --- testutil/testdata/proto.pb.go | 1674 +++++++++++++++++++++++++++---- testutil/testdata/proto.proto | 26 + x/auth/tx/builder_test.go | 22 - x/auth/tx/decoder.go | 6 +- x/auth/tx/encode_decode_test.go | 165 +++ x/auth/tx/legacy_amino_json.go | 4 +- x/staking/types/staking.pb.go | 1215 +++++++++++----------- 7 files changed, 2267 insertions(+), 845 deletions(-) create mode 100644 x/auth/tx/encode_decode_test.go diff --git a/testutil/testdata/proto.pb.go b/testutil/testdata/proto.pb.go index 0edda11fcf47..04a4672b9638 100644 --- a/testutil/testdata/proto.pb.go +++ b/testutil/testdata/proto.pb.go @@ -9,6 +9,7 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + tx "github.com/cosmos/cosmos-sdk/types/tx" _ "github.com/gogo/protobuf/gogoproto" grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" @@ -3101,6 +3102,242 @@ func (m *AnyWithExtra) GetC() int64 { return 0 } +type TestUpdatedTxRaw struct { + BodyBytes []byte `protobuf:"bytes,1,opt,name=body_bytes,json=bodyBytes,proto3" json:"body_bytes,omitempty"` + AuthInfoBytes []byte `protobuf:"bytes,2,opt,name=auth_info_bytes,json=authInfoBytes,proto3" json:"auth_info_bytes,omitempty"` + Signatures [][]byte `protobuf:"bytes,3,rep,name=signatures,proto3" json:"signatures,omitempty"` + NewField_5 []byte `protobuf:"bytes,5,opt,name=new_field_5,json=newField5,proto3" json:"new_field_5,omitempty"` + NewField_1024 []byte `protobuf:"bytes,1024,opt,name=new_field_1024,json=newField1024,proto3" json:"new_field_1024,omitempty"` +} + +func (m *TestUpdatedTxRaw) Reset() { *m = TestUpdatedTxRaw{} } +func (m *TestUpdatedTxRaw) String() string { return proto.CompactTextString(m) } +func (*TestUpdatedTxRaw) ProtoMessage() {} +func (*TestUpdatedTxRaw) Descriptor() ([]byte, []int) { + return fileDescriptor_2fcc84b9998d60d8, []int{33} +} +func (m *TestUpdatedTxRaw) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TestUpdatedTxRaw) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TestUpdatedTxRaw.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TestUpdatedTxRaw) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestUpdatedTxRaw.Merge(m, src) +} +func (m *TestUpdatedTxRaw) XXX_Size() int { + return m.Size() +} +func (m *TestUpdatedTxRaw) XXX_DiscardUnknown() { + xxx_messageInfo_TestUpdatedTxRaw.DiscardUnknown(m) +} + +var xxx_messageInfo_TestUpdatedTxRaw proto.InternalMessageInfo + +func (m *TestUpdatedTxRaw) GetBodyBytes() []byte { + if m != nil { + return m.BodyBytes + } + return nil +} + +func (m *TestUpdatedTxRaw) GetAuthInfoBytes() []byte { + if m != nil { + return m.AuthInfoBytes + } + return nil +} + +func (m *TestUpdatedTxRaw) GetSignatures() [][]byte { + if m != nil { + return m.Signatures + } + return nil +} + +func (m *TestUpdatedTxRaw) GetNewField_5() []byte { + if m != nil { + return m.NewField_5 + } + return nil +} + +func (m *TestUpdatedTxRaw) GetNewField_1024() []byte { + if m != nil { + return m.NewField_1024 + } + return nil +} + +type TestUpdatedTxBody struct { + Messages []*types.Any `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"` + Memo string `protobuf:"bytes,2,opt,name=memo,proto3" json:"memo,omitempty"` + TimeoutHeight int64 `protobuf:"varint,3,opt,name=timeout_height,json=timeoutHeight,proto3" json:"timeout_height,omitempty"` + SomeNewField uint64 `protobuf:"varint,4,opt,name=some_new_field,json=someNewField,proto3" json:"some_new_field,omitempty"` + SomeNewFieldNonCriticalField string `protobuf:"bytes,1050,opt,name=some_new_field_non_critical_field,json=someNewFieldNonCriticalField,proto3" json:"some_new_field_non_critical_field,omitempty"` + ExtensionOptions []*types.Any `protobuf:"bytes,1023,rep,name=extension_options,json=extensionOptions,proto3" json:"extension_options,omitempty"` + NonCriticalExtensionOptions []*types.Any `protobuf:"bytes,2047,rep,name=non_critical_extension_options,json=nonCriticalExtensionOptions,proto3" json:"non_critical_extension_options,omitempty"` +} + +func (m *TestUpdatedTxBody) Reset() { *m = TestUpdatedTxBody{} } +func (m *TestUpdatedTxBody) String() string { return proto.CompactTextString(m) } +func (*TestUpdatedTxBody) ProtoMessage() {} +func (*TestUpdatedTxBody) Descriptor() ([]byte, []int) { + return fileDescriptor_2fcc84b9998d60d8, []int{34} +} +func (m *TestUpdatedTxBody) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TestUpdatedTxBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TestUpdatedTxBody.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TestUpdatedTxBody) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestUpdatedTxBody.Merge(m, src) +} +func (m *TestUpdatedTxBody) XXX_Size() int { + return m.Size() +} +func (m *TestUpdatedTxBody) XXX_DiscardUnknown() { + xxx_messageInfo_TestUpdatedTxBody.DiscardUnknown(m) +} + +var xxx_messageInfo_TestUpdatedTxBody proto.InternalMessageInfo + +func (m *TestUpdatedTxBody) GetMessages() []*types.Any { + if m != nil { + return m.Messages + } + return nil +} + +func (m *TestUpdatedTxBody) GetMemo() string { + if m != nil { + return m.Memo + } + return "" +} + +func (m *TestUpdatedTxBody) GetTimeoutHeight() int64 { + if m != nil { + return m.TimeoutHeight + } + return 0 +} + +func (m *TestUpdatedTxBody) GetSomeNewField() uint64 { + if m != nil { + return m.SomeNewField + } + return 0 +} + +func (m *TestUpdatedTxBody) GetSomeNewFieldNonCriticalField() string { + if m != nil { + return m.SomeNewFieldNonCriticalField + } + return "" +} + +func (m *TestUpdatedTxBody) GetExtensionOptions() []*types.Any { + if m != nil { + return m.ExtensionOptions + } + return nil +} + +func (m *TestUpdatedTxBody) GetNonCriticalExtensionOptions() []*types.Any { + if m != nil { + return m.NonCriticalExtensionOptions + } + return nil +} + +type TestUpdatedAuthInfo struct { + SignerInfos []*tx.SignerInfo `protobuf:"bytes,1,rep,name=signer_infos,json=signerInfos,proto3" json:"signer_infos,omitempty"` + Fee *tx.Fee `protobuf:"bytes,2,opt,name=fee,proto3" json:"fee,omitempty"` + NewField_3 []byte `protobuf:"bytes,3,opt,name=new_field_3,json=newField3,proto3" json:"new_field_3,omitempty"` + NewField_1024 []byte `protobuf:"bytes,1024,opt,name=new_field_1024,json=newField1024,proto3" json:"new_field_1024,omitempty"` +} + +func (m *TestUpdatedAuthInfo) Reset() { *m = TestUpdatedAuthInfo{} } +func (m *TestUpdatedAuthInfo) String() string { return proto.CompactTextString(m) } +func (*TestUpdatedAuthInfo) ProtoMessage() {} +func (*TestUpdatedAuthInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2fcc84b9998d60d8, []int{35} +} +func (m *TestUpdatedAuthInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TestUpdatedAuthInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TestUpdatedAuthInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TestUpdatedAuthInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TestUpdatedAuthInfo.Merge(m, src) +} +func (m *TestUpdatedAuthInfo) XXX_Size() int { + return m.Size() +} +func (m *TestUpdatedAuthInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TestUpdatedAuthInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_TestUpdatedAuthInfo proto.InternalMessageInfo + +func (m *TestUpdatedAuthInfo) GetSignerInfos() []*tx.SignerInfo { + if m != nil { + return m.SignerInfos + } + return nil +} + +func (m *TestUpdatedAuthInfo) GetFee() *tx.Fee { + if m != nil { + return m.Fee + } + return nil +} + +func (m *TestUpdatedAuthInfo) GetNewField_3() []byte { + if m != nil { + return m.NewField_3 + } + return nil +} + +func (m *TestUpdatedAuthInfo) GetNewField_1024() []byte { + if m != nil { + return m.NewField_1024 + } + return nil +} + func init() { proto.RegisterEnum("testdata.Customer2_City", Customer2_City_name, Customer2_City_value) proto.RegisterType((*Dog)(nil), "testdata.Dog") @@ -3145,116 +3382,139 @@ func init() { proto.RegisterType((*TestVersionFD1)(nil), "testdata.TestVersionFD1") proto.RegisterType((*TestVersionFD1WithExtraAny)(nil), "testdata.TestVersionFD1WithExtraAny") proto.RegisterType((*AnyWithExtra)(nil), "testdata.AnyWithExtra") + proto.RegisterType((*TestUpdatedTxRaw)(nil), "testdata.TestUpdatedTxRaw") + proto.RegisterType((*TestUpdatedTxBody)(nil), "testdata.TestUpdatedTxBody") + proto.RegisterType((*TestUpdatedAuthInfo)(nil), "testdata.TestUpdatedAuthInfo") } func init() { proto.RegisterFile("proto.proto", fileDescriptor_2fcc84b9998d60d8) } var fileDescriptor_2fcc84b9998d60d8 = []byte{ - // 1664 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x6f, 0x23, 0x49, - 0x15, 0x4e, 0xb9, 0xed, 0xc4, 0x7e, 0x31, 0x8e, 0x29, 0xc2, 0xd2, 0xe3, 0x65, 0x33, 0xa1, 0x35, - 0xec, 0x98, 0xd5, 0x8e, 0x43, 0xda, 0x5e, 0x09, 0xcd, 0x01, 0xad, 0x9d, 0x49, 0x36, 0x23, 0x66, - 0xb2, 0xa8, 0x67, 0x35, 0xa0, 0xbd, 0x44, 0xe5, 0xee, 0x72, 0xbb, 0x94, 0x76, 0x55, 0xe8, 0x6a, - 0xcf, 0x8c, 0x39, 0xc2, 0x81, 0x2b, 0x17, 0xc4, 0x99, 0x23, 0x27, 0xb4, 0x7f, 0x05, 0x7b, 0x41, - 0x9a, 0x0b, 0x12, 0x12, 0xd2, 0x08, 0xcd, 0x5c, 0xf9, 0x0b, 0x40, 0x08, 0x54, 0xdd, 0xd5, 0x3f, - 0x92, 0xb1, 0xb3, 0x4e, 0x16, 0x76, 0x14, 0x89, 0x8b, 0x5d, 0xf5, 0xfa, 0xab, 0xaf, 0x5e, 0x7d, - 0xaf, 0xde, 0xeb, 0xea, 0x82, 0xf5, 0xd3, 0x50, 0x44, 0xa2, 0x13, 0xff, 0xe2, 0x6a, 0x44, 0x65, - 0xe4, 0x91, 0x88, 0xb4, 0x36, 0x7d, 0xe1, 0x8b, 0xd8, 0xb8, 0xa3, 0x5a, 0xc9, 0xf3, 0xd6, 0x0d, - 0x5f, 0x08, 0x3f, 0xa0, 0x3b, 0x71, 0x6f, 0x38, 0x1d, 0xed, 0x10, 0x3e, 0x4b, 0x1e, 0x59, 0x77, - 0xc0, 0xb8, 0x27, 0x7c, 0x8c, 0xa1, 0x2c, 0xd9, 0xcf, 0xa9, 0x89, 0xb6, 0x51, 0xbb, 0xe6, 0xc4, - 0x6d, 0x65, 0xe3, 0x64, 0x42, 0xcd, 0x52, 0x62, 0x53, 0x6d, 0xeb, 0x03, 0x30, 0xf6, 0x48, 0x84, - 0x4d, 0x58, 0x9b, 0x08, 0xce, 0x4e, 0x68, 0xa8, 0x47, 0xa4, 0x5d, 0xbc, 0x09, 0x95, 0x80, 0x3d, - 0xa1, 0x32, 0x1e, 0x55, 0x71, 0x92, 0x8e, 0xf5, 0x11, 0xd4, 0x0e, 0x89, 0xec, 0x73, 0x36, 0x21, - 0x01, 0x7e, 0x1f, 0x56, 0x49, 0xdc, 0x8a, 0xc7, 0xae, 0xdb, 0x9b, 0x9d, 0xc4, 0xbd, 0x4e, 0xea, - 0x5e, 0xa7, 0xcf, 0x67, 0x8e, 0xc6, 0xe0, 0x3a, 0xa0, 0x67, 0x31, 0x99, 0xe1, 0xa0, 0x67, 0xd6, - 0x1e, 0xd4, 0x0f, 0x89, 0xcc, 0xb9, 0xba, 0x00, 0x63, 0x22, 0x8f, 0x97, 0xe0, 0xab, 0x8d, 0xd3, - 0x41, 0xd6, 0x43, 0xd8, 0x48, 0x48, 0x72, 0x9e, 0xbb, 0xd0, 0x50, 0x3c, 0x4b, 0x72, 0xd5, 0xc7, - 0x85, 0xb1, 0xd6, 0x6d, 0x58, 0xdf, 0x77, 0xc7, 0xc2, 0xa1, 0x3f, 0x9b, 0x52, 0x99, 0x68, 0x43, - 0xa5, 0x24, 0x3e, 0xcd, 0xb4, 0x49, 0xba, 0x56, 0x1b, 0xea, 0x09, 0x50, 0x9e, 0x0a, 0x2e, 0xe9, - 0x05, 0xc8, 0xef, 0xc2, 0xc6, 0x23, 0x32, 0x3b, 0xa4, 0x41, 0x90, 0xd1, 0xa6, 0xd1, 0x40, 0x85, - 0x68, 0x74, 0xa0, 0x99, 0xc3, 0x34, 0x69, 0x0b, 0xaa, 0x7e, 0x48, 0x69, 0xc4, 0xb8, 0xaf, 0xb1, - 0x59, 0xdf, 0xda, 0x87, 0xc6, 0x27, 0x54, 0x46, 0x6a, 0x09, 0x9a, 0xb5, 0x0b, 0x40, 0xf8, 0x6c, - 0x29, 0xfd, 0x08, 0x9f, 0xe9, 0x05, 0xef, 0xc3, 0x46, 0x46, 0xa3, 0x67, 0xb5, 0xe7, 0xc4, 0xe1, - 0x1b, 0x9d, 0x74, 0x5b, 0x76, 0x32, 0xb1, 0x8a, 0x61, 0x78, 0x0c, 0x6b, 0x8a, 0xe6, 0xa1, 0xf4, - 0xf1, 0x8f, 0x60, 0x4d, 0x32, 0x9f, 0xd3, 0x50, 0x9a, 0x68, 0xdb, 0x68, 0xd7, 0x07, 0xbb, 0xff, - 0x78, 0x71, 0xf3, 0x8e, 0xcf, 0xa2, 0xf1, 0x74, 0xd8, 0x71, 0xc5, 0x64, 0xc7, 0x15, 0x72, 0x22, - 0xa4, 0xfe, 0xbb, 0x23, 0xbd, 0x93, 0x9d, 0x68, 0x76, 0x4a, 0x65, 0xa7, 0xef, 0xba, 0x7d, 0xcf, - 0x0b, 0xa9, 0x94, 0x4e, 0xca, 0x60, 0x0d, 0xe1, 0xeb, 0x03, 0xe2, 0x3d, 0x9c, 0x06, 0x11, 0x7b, - 0xc4, 0x7c, 0x4e, 0xa2, 0x69, 0x48, 0xf1, 0x16, 0x80, 0x4c, 0x3b, 0x7a, 0x12, 0xa7, 0x60, 0xc1, - 0xb7, 0x61, 0x63, 0x42, 0x02, 0xe6, 0x32, 0x31, 0x95, 0xc7, 0x23, 0x46, 0x03, 0xcf, 0xac, 0x6c, - 0xa3, 0x76, 0xdd, 0x69, 0x64, 0xe6, 0x03, 0x65, 0xbd, 0x5b, 0x7e, 0xfe, 0xbb, 0x9b, 0xc8, 0x8a, - 0xa0, 0xb6, 0x37, 0x95, 0x91, 0x98, 0xd0, 0x70, 0x17, 0x37, 0xa0, 0xc4, 0xbc, 0x78, 0xd1, 0x15, - 0xa7, 0xc4, 0xbc, 0x79, 0x89, 0x83, 0xbf, 0x07, 0x4d, 0x39, 0x1d, 0x4a, 0x37, 0x64, 0xa7, 0x11, - 0x13, 0xfc, 0x78, 0x44, 0xa9, 0x69, 0x6c, 0xa3, 0x76, 0xc9, 0xd9, 0x28, 0xda, 0x0f, 0x68, 0xbc, - 0x2d, 0x4e, 0xc9, 0x6c, 0x42, 0x79, 0x64, 0xae, 0x25, 0xdb, 0x42, 0x77, 0xad, 0xcf, 0x4a, 0xf9, - 0xb4, 0xf6, 0x6b, 0xd3, 0xb6, 0xa0, 0xca, 0xb8, 0x37, 0x95, 0x51, 0x38, 0xd3, 0xd9, 0x97, 0xf5, - 0x33, 0x97, 0x8c, 0x82, 0x4b, 0x9b, 0x50, 0x19, 0xd1, 0xa7, 0x34, 0x34, 0xcb, 0xb1, 0x1f, 0x49, - 0x07, 0xbf, 0x0d, 0xd5, 0x90, 0x4a, 0x1a, 0x3e, 0xa1, 0x9e, 0xf9, 0xdb, 0x6a, 0x9c, 0x77, 0x99, - 0x01, 0xbf, 0x0f, 0x65, 0x97, 0x45, 0x33, 0x73, 0x75, 0x1b, 0xb5, 0x1b, 0xb6, 0x99, 0x07, 0x38, - 0xf3, 0xaa, 0xb3, 0xc7, 0xa2, 0x99, 0x13, 0xa3, 0xf0, 0x5d, 0xf8, 0xda, 0x84, 0x49, 0x97, 0x06, - 0x01, 0xe1, 0x54, 0x4c, 0xa5, 0x09, 0x17, 0xec, 0xaf, 0xb3, 0x50, 0xeb, 0x23, 0x28, 0x2b, 0x26, - 0x5c, 0x85, 0xf2, 0x03, 0x22, 0x64, 0x73, 0x05, 0x37, 0x00, 0x1e, 0x08, 0xd9, 0xe7, 0x3e, 0x0d, - 0xa8, 0x6c, 0x22, 0x5c, 0x87, 0xea, 0x8f, 0x49, 0x20, 0xfa, 0x41, 0x24, 0x9a, 0x25, 0x0c, 0xb0, - 0xfa, 0x50, 0x48, 0x57, 0x3c, 0x6d, 0x1a, 0x78, 0x1d, 0xd6, 0x8e, 0x08, 0x0b, 0xc5, 0x90, 0x35, - 0xcb, 0x56, 0x07, 0xaa, 0x47, 0x54, 0x46, 0xd4, 0xeb, 0xf5, 0x97, 0x09, 0x94, 0xf5, 0x67, 0x94, - 0x0e, 0xe8, 0x2e, 0x35, 0x00, 0x5b, 0x50, 0x22, 0x3d, 0xb3, 0xbc, 0x6d, 0xb4, 0xd7, 0x6d, 0x9c, - 0x2b, 0x92, 0x4e, 0xea, 0x94, 0x48, 0x0f, 0x77, 0xa1, 0xc2, 0xb8, 0x47, 0x9f, 0x99, 0x95, 0x18, - 0xf6, 0xce, 0x79, 0x58, 0xb7, 0xdf, 0xb9, 0xaf, 0x9e, 0xef, 0xf3, 0x28, 0x9c, 0x39, 0x09, 0xb6, - 0xf5, 0x00, 0x20, 0x37, 0xe2, 0x26, 0x18, 0x27, 0x74, 0x16, 0xfb, 0x62, 0x38, 0xaa, 0x89, 0xdb, - 0x50, 0x79, 0x42, 0x82, 0x69, 0xe2, 0xcd, 0xfc, 0xb9, 0x13, 0xc0, 0xdd, 0xd2, 0x0f, 0x90, 0xf5, - 0x69, 0xba, 0x2c, 0x7b, 0xb9, 0x65, 0xbd, 0x07, 0xab, 0x3c, 0xc6, 0xc7, 0x7b, 0x66, 0x0e, 0x7d, - 0xb7, 0xef, 0x68, 0x84, 0x75, 0x90, 0x72, 0xef, 0xbe, 0xce, 0x9d, 0xf3, 0x2c, 0x70, 0xd3, 0xce, - 0x79, 0x3e, 0xcc, 0x62, 0x35, 0x78, 0x8d, 0xa7, 0x09, 0x86, 0x2a, 0x94, 0xc9, 0xc6, 0x56, 0xcd, - 0x79, 0x7b, 0xda, 0xf2, 0xb2, 0xe0, 0x5d, 0x91, 0x41, 0x85, 0x73, 0xb8, 0x38, 0x9c, 0x03, 0xa7, - 0x34, 0xec, 0x59, 0x3c, 0xd3, 0x72, 0xee, 0x2c, 0x2a, 0xb7, 0xd5, 0x2c, 0xc8, 0x51, 0xcd, 0x25, - 0x94, 0x1c, 0xa4, 0x0a, 0xa8, 0x9c, 0x0c, 0xc5, 0x34, 0xa2, 0x71, 0x4e, 0xd6, 0x9c, 0xa4, 0x63, - 0xfd, 0x34, 0xd3, 0x77, 0x70, 0x05, 0x7d, 0x73, 0x76, 0xad, 0x80, 0x91, 0x29, 0x60, 0xfd, 0xa2, - 0x50, 0x51, 0xba, 0x4b, 0xed, 0x8b, 0x06, 0x94, 0xe4, 0x48, 0x97, 0xae, 0x92, 0x1c, 0xe1, 0x6f, - 0x43, 0x4d, 0x4e, 0x43, 0x77, 0x4c, 0x42, 0x9f, 0xea, 0x4a, 0x92, 0x1b, 0xf0, 0x36, 0xac, 0x7b, - 0x54, 0x46, 0x8c, 0x13, 0x55, 0xdd, 0xe2, 0x92, 0x5a, 0x73, 0x8a, 0x26, 0xfc, 0x2e, 0x34, 0xdc, - 0x90, 0x7a, 0x2c, 0x3a, 0x76, 0x49, 0xe8, 0x1d, 0x73, 0x91, 0x14, 0xbd, 0xc3, 0x15, 0xa7, 0x9e, - 0xd8, 0xf7, 0x48, 0xe8, 0x1d, 0x09, 0xfc, 0x0e, 0xd4, 0xdc, 0xb1, 0x7a, 0x6b, 0x29, 0x48, 0x55, - 0x43, 0xaa, 0x89, 0xe9, 0x48, 0xe0, 0x1d, 0xa8, 0x8a, 0x90, 0xf9, 0x8c, 0x93, 0xc0, 0xac, 0x9d, - 0x7f, 0xfd, 0x64, 0xa5, 0xda, 0xc9, 0x40, 0x83, 0x5a, 0x56, 0x65, 0xad, 0xbf, 0x97, 0xa0, 0xae, - 0xde, 0x44, 0x8f, 0x69, 0x28, 0x99, 0xe0, 0xbb, 0xc9, 0x99, 0x03, 0xe9, 0x33, 0x07, 0xbe, 0x05, - 0x88, 0x68, 0x71, 0xdf, 0xca, 0x39, 0x8b, 0x03, 0x1c, 0x44, 0x14, 0x6a, 0xa8, 0x03, 0xbc, 0x10, - 0x35, 0x54, 0x28, 0x57, 0x6f, 0xae, 0x85, 0x28, 0x17, 0xbf, 0x07, 0xc8, 0xd3, 0xa5, 0x62, 0x01, - 0x6a, 0x50, 0xfe, 0xfc, 0xc5, 0xcd, 0x15, 0x07, 0x79, 0xb8, 0x01, 0x88, 0xc6, 0xf5, 0xb8, 0x72, - 0xb8, 0xe2, 0x20, 0x8a, 0xdf, 0x05, 0x34, 0x8a, 0x25, 0x5c, 0x38, 0x56, 0xe1, 0x46, 0xd8, 0x02, - 0xe4, 0xc7, 0x3a, 0x2e, 0x2a, 0xc8, 0xc8, 0x57, 0xde, 0x8e, 0xcd, 0xda, 0xc5, 0xde, 0x8e, 0xf1, - 0x6d, 0x40, 0x27, 0x66, 0x7d, 0xa1, 0xe6, 0x83, 0xf2, 0xf3, 0x17, 0x37, 0x91, 0x83, 0x4e, 0x06, - 0x15, 0x30, 0xe4, 0x74, 0x62, 0xfd, 0xd2, 0x38, 0x23, 0xb7, 0x7d, 0x59, 0xb9, 0xed, 0xa5, 0xe4, - 0xb6, 0x97, 0x92, 0xdb, 0x56, 0x72, 0xdf, 0xfa, 0x22, 0xb9, 0xed, 0x2b, 0x09, 0x6d, 0xbf, 0x29, - 0xa1, 0xf1, 0xdb, 0x50, 0xe3, 0xf4, 0xa9, 0x3e, 0xc6, 0xdc, 0xd8, 0x46, 0xed, 0xb2, 0x53, 0xe5, - 0xf4, 0x69, 0x7c, 0x80, 0x49, 0xa3, 0xf0, 0x9b, 0xb3, 0x51, 0xe8, 0x5e, 0x36, 0x0a, 0xdd, 0xa5, - 0xa2, 0xd0, 0x5d, 0x2a, 0x0a, 0xdd, 0xa5, 0xa2, 0xd0, 0xbd, 0x52, 0x14, 0xba, 0x6f, 0x2c, 0x0a, - 0x77, 0x00, 0x73, 0xc1, 0x8f, 0xdd, 0x90, 0x45, 0xcc, 0x25, 0x81, 0x0e, 0xc7, 0xaf, 0xe2, 0xda, - 0xe5, 0x34, 0xb9, 0xe0, 0x7b, 0xfa, 0xc9, 0x99, 0xb8, 0xfc, 0xb3, 0x04, 0xad, 0xa2, 0xfb, 0x0f, - 0x04, 0xa7, 0x1f, 0x73, 0xfa, 0xf1, 0xe8, 0xb1, 0x7a, 0x95, 0x5f, 0xd3, 0x28, 0x5d, 0x1b, 0xf5, - 0xff, 0xb5, 0x0a, 0xdf, 0x3a, 0xaf, 0xfe, 0x51, 0xfc, 0xb6, 0xf2, 0xaf, 0x89, 0xf4, 0xbb, 0x79, - 0x42, 0x7c, 0x67, 0x3e, 0xaa, 0xb0, 0xa6, 0x6b, 0x92, 0x1b, 0xf8, 0x43, 0x58, 0x65, 0x9c, 0xd3, - 0x70, 0xd7, 0x6c, 0xc4, 0xe4, 0xed, 0x2f, 0x5c, 0x59, 0xe7, 0x7e, 0x8c, 0x77, 0xf4, 0xb8, 0x8c, - 0xc1, 0x36, 0x37, 0x2e, 0xc5, 0x60, 0x6b, 0x06, 0xbb, 0xf5, 0x7b, 0x04, 0xab, 0x09, 0x69, 0xe1, - 0x9c, 0x64, 0x2c, 0x3c, 0x27, 0xdd, 0x57, 0x47, 0x7e, 0x4e, 0x43, 0x1d, 0xfd, 0xee, 0xb2, 0x1e, - 0x27, 0x7f, 0xf1, 0x8f, 0x93, 0x30, 0xb4, 0xbe, 0xaf, 0x3e, 0x04, 0x52, 0x63, 0x61, 0xf2, 0x5a, - 0x3a, 0x79, 0xfc, 0x4d, 0xa6, 0x27, 0x57, 0xed, 0xd6, 0x1f, 0x52, 0x5f, 0xed, 0xd7, 0xe0, 0x26, - 0xac, 0xb9, 0x62, 0xca, 0xd3, 0x8f, 0xc4, 0x9a, 0x93, 0x76, 0xaf, 0xea, 0xb1, 0xfd, 0xdf, 0xf0, - 0x38, 0xcd, 0xbf, 0x7f, 0x9f, 0xcd, 0xbf, 0xde, 0xff, 0xf3, 0xef, 0x1a, 0xe5, 0x5f, 0xef, 0x4b, - 0xe7, 0x5f, 0xef, 0x2b, 0xce, 0xbf, 0xde, 0x97, 0xca, 0x3f, 0x63, 0x61, 0xfe, 0x7d, 0xf6, 0x3f, - 0xcb, 0xbf, 0xde, 0x52, 0xf9, 0x67, 0x5f, 0x98, 0x7f, 0x9b, 0xc5, 0x8b, 0x03, 0x43, 0x5f, 0x12, - 0xa4, 0x19, 0xf8, 0x27, 0x94, 0x5c, 0x12, 0xea, 0xf9, 0x0e, 0xee, 0x5d, 0xed, 0x73, 0xe8, 0x8d, - 0x7f, 0x96, 0xa4, 0xeb, 0xf9, 0x2b, 0x3a, 0x73, 0x9e, 0x3a, 0xb8, 0xb7, 0xfb, 0x13, 0x16, 0x8d, - 0xf7, 0x9f, 0x45, 0x21, 0xe9, 0xf3, 0xd9, 0x57, 0xba, 0xb6, 0x5b, 0xf9, 0xda, 0x0a, 0xb8, 0x3e, - 0x9f, 0x65, 0x1e, 0x5d, 0x7a, 0x75, 0x9f, 0x40, 0xbd, 0x38, 0x1e, 0xb7, 0xd5, 0x02, 0x2e, 0xb8, - 0xc6, 0x4d, 0x2b, 0x00, 0x51, 0x0b, 0x4f, 0x2a, 0xa3, 0xa1, 0x2a, 0x60, 0x3d, 0xa9, 0x80, 0x71, - 0xcf, 0xb5, 0xff, 0x88, 0x60, 0x5d, 0x4d, 0xf8, 0x88, 0x86, 0x4f, 0x98, 0x4b, 0xf1, 0x07, 0x50, - 0xde, 0x77, 0xc7, 0x02, 0x7f, 0x33, 0xf7, 0xa7, 0x70, 0xe3, 0xdd, 0x7a, 0xeb, 0xbc, 0x59, 0x5f, - 0x0a, 0xf7, 0xa1, 0x9a, 0x5e, 0x4f, 0xe3, 0x1b, 0x39, 0xe6, 0xdc, 0xcd, 0x76, 0xab, 0x35, 0xef, - 0x91, 0xa6, 0xf8, 0x61, 0x72, 0x47, 0xac, 0x22, 0x65, 0x9e, 0x15, 0x23, 0xbf, 0xc4, 0x6e, 0xdd, - 0x98, 0xf3, 0x24, 0x19, 0x3f, 0x38, 0xfc, 0xfc, 0xe5, 0x16, 0x7a, 0xfe, 0x72, 0x0b, 0xfd, 0xed, - 0xe5, 0x16, 0xfa, 0xf5, 0xab, 0xad, 0x95, 0xe7, 0xaf, 0xb6, 0x56, 0xfe, 0xf2, 0x6a, 0x6b, 0xe5, - 0xd3, 0xce, 0xc5, 0xb7, 0xcb, 0x54, 0x46, 0xd3, 0x88, 0x05, 0x3b, 0x29, 0xf3, 0x70, 0x35, 0x96, - 0xb1, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x62, 0xd0, 0xa8, 0x05, 0x79, 0x19, 0x00, 0x00, + // 1972 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x72, 0x49, 0x89, 0x7c, 0xa4, 0x29, 0x7a, 0xe2, 0xa4, 0x6b, 0x3a, 0x96, 0x95, 0x85, + 0x63, 0xb3, 0x41, 0x4c, 0x59, 0x4b, 0x1a, 0x08, 0x7c, 0x28, 0x42, 0xca, 0x52, 0x64, 0xd4, 0x96, + 0x8b, 0xb5, 0xeb, 0x16, 0xbe, 0x10, 0xcb, 0xdd, 0x21, 0xb9, 0x10, 0x39, 0xa3, 0xee, 0x0c, 0x2d, + 0xb1, 0xa7, 0xa2, 0x3d, 0xf4, 0x9a, 0x4b, 0x51, 0xa0, 0xb7, 0x1e, 0x7b, 0x2a, 0x72, 0xeb, 0xb1, + 0xb7, 0xe6, 0x52, 0xc0, 0x97, 0x02, 0x05, 0x0a, 0x18, 0x85, 0x7d, 0xed, 0x5f, 0xd0, 0xa2, 0x48, + 0x31, 0xb3, 0xb3, 0x1f, 0x94, 0x48, 0x85, 0x56, 0xda, 0x18, 0x02, 0x7a, 0x21, 0x67, 0xde, 0xfe, + 0xe6, 0x37, 0x6f, 0xde, 0xd7, 0xce, 0xcc, 0x42, 0xf1, 0x20, 0xa0, 0x9c, 0xd6, 0xe5, 0x2f, 0xca, + 0x73, 0xcc, 0xb8, 0xe7, 0x70, 0xa7, 0x7a, 0xa9, 0x4f, 0xfb, 0x54, 0x0a, 0x37, 0x44, 0x2b, 0x7c, + 0x5e, 0xbd, 0xdc, 0xa7, 0xb4, 0x3f, 0xc4, 0x1b, 0xb2, 0xd7, 0x1d, 0xf7, 0x36, 0x1c, 0x32, 0x51, + 0x8f, 0x90, 0x4b, 0xd9, 0x88, 0xb2, 0x0d, 0x7e, 0xb4, 0xc1, 0x8f, 0x42, 0x99, 0x79, 0x0b, 0xf4, + 0x7b, 0xb4, 0x8f, 0x10, 0x64, 0x99, 0xff, 0x53, 0x6c, 0x68, 0xeb, 0x5a, 0xad, 0x60, 0xcb, 0xb6, + 0x90, 0x11, 0x67, 0x84, 0x8d, 0x4c, 0x28, 0x13, 0x6d, 0xf3, 0x0e, 0xe8, 0x5b, 0x0e, 0x47, 0x06, + 0xac, 0x8c, 0x28, 0xf1, 0xf7, 0x71, 0xa0, 0x46, 0x44, 0x5d, 0x74, 0x09, 0x72, 0x43, 0xff, 0x39, + 0x66, 0x72, 0x54, 0xce, 0x0e, 0x3b, 0xe6, 0x67, 0x50, 0xd8, 0x75, 0x58, 0x8b, 0xf8, 0x23, 0x67, + 0x88, 0x3e, 0x86, 0x65, 0x47, 0xb6, 0xe4, 0xd8, 0xa2, 0x75, 0xa9, 0x1e, 0xaa, 0x5c, 0x8f, 0x54, + 0xae, 0xb7, 0xc8, 0xc4, 0x56, 0x18, 0x54, 0x02, 0xed, 0x48, 0x92, 0xe9, 0xb6, 0x76, 0x64, 0x6e, + 0x41, 0x69, 0xd7, 0x61, 0x09, 0x57, 0x03, 0x60, 0xe0, 0xb0, 0xce, 0x02, 0x7c, 0x85, 0x41, 0x34, + 0xc8, 0x7c, 0x08, 0xab, 0x21, 0x49, 0xc2, 0x73, 0x17, 0xca, 0x82, 0x67, 0x41, 0xae, 0xd2, 0x20, + 0x35, 0xd6, 0xbc, 0x09, 0xc5, 0x6d, 0x77, 0x40, 0x6d, 0xfc, 0x93, 0x31, 0x66, 0xa1, 0x6d, 0x30, + 0x63, 0x4e, 0x1f, 0xc7, 0xb6, 0x09, 0xbb, 0x66, 0x0d, 0x4a, 0x21, 0x90, 0x1d, 0x50, 0xc2, 0xf0, + 0x29, 0xc8, 0x0f, 0x61, 0xf5, 0xb1, 0x33, 0xd9, 0xc5, 0xc3, 0x61, 0x4c, 0x1b, 0x79, 0x43, 0x4b, + 0x79, 0xa3, 0x0e, 0x95, 0x04, 0xa6, 0x48, 0xab, 0x90, 0xef, 0x07, 0x18, 0x73, 0x9f, 0xf4, 0x15, + 0x36, 0xee, 0x9b, 0xdb, 0x50, 0x7e, 0x82, 0x19, 0x17, 0x4b, 0x50, 0xac, 0x0d, 0x00, 0x87, 0x4c, + 0x16, 0xb2, 0x9f, 0x43, 0x26, 0x6a, 0xc1, 0xdb, 0xb0, 0x1a, 0xd3, 0xa8, 0x59, 0xad, 0x19, 0x7e, + 0x78, 0xa7, 0x1e, 0x85, 0x6a, 0x3d, 0x36, 0x56, 0xda, 0x0d, 0x4f, 0x61, 0x45, 0xd0, 0x3c, 0x64, + 0x7d, 0xf4, 0x7d, 0x58, 0x61, 0x7e, 0x9f, 0xe0, 0x80, 0x19, 0xda, 0xba, 0x5e, 0x2b, 0xb5, 0x37, + 0xff, 0xf9, 0xf2, 0xda, 0xad, 0xbe, 0xcf, 0x07, 0xe3, 0x6e, 0xdd, 0xa5, 0xa3, 0x0d, 0x15, 0xb9, + 0xe1, 0xdf, 0x2d, 0xe6, 0xed, 0x6f, 0xf0, 0xc9, 0x01, 0x66, 0xf5, 0x96, 0xeb, 0xb6, 0x3c, 0x2f, + 0xc0, 0x8c, 0xd9, 0x11, 0x83, 0xd9, 0x85, 0x8b, 0x6d, 0xc7, 0x7b, 0x38, 0x1e, 0x72, 0xff, 0xb1, + 0xdf, 0x27, 0x0e, 0x1f, 0x07, 0x18, 0xad, 0x01, 0xb0, 0xa8, 0xa3, 0x26, 0xb1, 0x53, 0x12, 0x74, + 0x13, 0x56, 0x47, 0xce, 0xd0, 0x77, 0x7d, 0x3a, 0x66, 0x9d, 0x9e, 0x8f, 0x87, 0x9e, 0x91, 0x5b, + 0xd7, 0x6a, 0x25, 0xbb, 0x1c, 0x8b, 0x77, 0x84, 0xf4, 0x6e, 0xf6, 0xc5, 0x6f, 0xaf, 0x69, 0x26, + 0x87, 0xc2, 0xd6, 0x98, 0x71, 0x3a, 0xc2, 0xc1, 0x26, 0x2a, 0x43, 0xc6, 0xf7, 0xe4, 0xa2, 0x73, + 0x76, 0xc6, 0xf7, 0x66, 0x25, 0x0e, 0xfa, 0x2e, 0x54, 0xd8, 0xb8, 0xcb, 0xdc, 0xc0, 0x3f, 0xe0, + 0x3e, 0x25, 0x9d, 0x1e, 0xc6, 0x86, 0xbe, 0xae, 0xd5, 0x32, 0xf6, 0x6a, 0x5a, 0xbe, 0x83, 0x65, + 0x58, 0x1c, 0x38, 0x93, 0x11, 0x26, 0xdc, 0x58, 0x09, 0xc3, 0x42, 0x75, 0xcd, 0x2f, 0x32, 0xc9, + 0xb4, 0xd6, 0x89, 0x69, 0xab, 0x90, 0xf7, 0x89, 0x37, 0x66, 0x3c, 0x98, 0xa8, 0xec, 0x8b, 0xfb, + 0xb1, 0x4a, 0x7a, 0x4a, 0xa5, 0x4b, 0x90, 0xeb, 0xe1, 0x43, 0x1c, 0x18, 0x59, 0xa9, 0x47, 0xd8, + 0x41, 0x57, 0x20, 0x1f, 0x60, 0x86, 0x83, 0xe7, 0xd8, 0x33, 0x7e, 0x9d, 0x97, 0x79, 0x17, 0x0b, + 0xd0, 0xc7, 0x90, 0x75, 0x7d, 0x3e, 0x31, 0x96, 0xd7, 0xb5, 0x5a, 0xd9, 0x32, 0x12, 0x07, 0xc7, + 0x5a, 0xd5, 0xb7, 0x7c, 0x3e, 0xb1, 0x25, 0x0a, 0xdd, 0x85, 0x0b, 0x23, 0x9f, 0xb9, 0x78, 0x38, + 0x74, 0x08, 0xa6, 0x63, 0x66, 0xc0, 0x29, 0xf1, 0x35, 0x0d, 0x35, 0x3f, 0x83, 0xac, 0x60, 0x42, + 0x79, 0xc8, 0x3e, 0x70, 0x28, 0xab, 0x2c, 0xa1, 0x32, 0xc0, 0x03, 0xca, 0x5a, 0xa4, 0x8f, 0x87, + 0x98, 0x55, 0x34, 0x54, 0x82, 0xfc, 0x0f, 0x9c, 0x21, 0x6d, 0x0d, 0x39, 0xad, 0x64, 0x10, 0xc0, + 0xf2, 0x43, 0xca, 0x5c, 0x7a, 0x58, 0xd1, 0x51, 0x11, 0x56, 0xf6, 0x1c, 0x3f, 0xa0, 0x5d, 0xbf, + 0x92, 0x35, 0xeb, 0x90, 0xdf, 0xc3, 0x8c, 0x63, 0xaf, 0xd9, 0x5a, 0xc4, 0x51, 0xe6, 0x5f, 0xb4, + 0x68, 0x40, 0x63, 0xa1, 0x01, 0xc8, 0x84, 0x8c, 0xd3, 0x34, 0xb2, 0xeb, 0x7a, 0xad, 0x68, 0xa1, + 0xc4, 0x22, 0xd1, 0xa4, 0x76, 0xc6, 0x69, 0xa2, 0x06, 0xe4, 0x7c, 0xe2, 0xe1, 0x23, 0x23, 0x27, + 0x61, 0x57, 0x8f, 0xc3, 0x1a, 0xad, 0xfa, 0x7d, 0xf1, 0x7c, 0x9b, 0xf0, 0x60, 0x62, 0x87, 0xd8, + 0xea, 0x03, 0x80, 0x44, 0x88, 0x2a, 0xa0, 0xef, 0xe3, 0x89, 0xd4, 0x45, 0xb7, 0x45, 0x13, 0xd5, + 0x20, 0xf7, 0xdc, 0x19, 0x8e, 0x43, 0x6d, 0x66, 0xcf, 0x1d, 0x02, 0xee, 0x66, 0x3e, 0xd1, 0xcc, + 0x67, 0xd1, 0xb2, 0xac, 0xc5, 0x96, 0xf5, 0x11, 0x2c, 0x13, 0x89, 0x97, 0x31, 0x33, 0x83, 0xbe, + 0xd1, 0xb2, 0x15, 0xc2, 0xdc, 0x89, 0xb8, 0x37, 0x4f, 0x72, 0x27, 0x3c, 0x73, 0xd4, 0xb4, 0x12, + 0x9e, 0x4f, 0x63, 0x5f, 0xb5, 0x4f, 0xf0, 0x54, 0x40, 0x17, 0x85, 0x32, 0x0c, 0x6c, 0xd1, 0x9c, + 0x15, 0xd3, 0xa6, 0x17, 0x3b, 0xef, 0x8c, 0x0c, 0xc2, 0x9d, 0xdd, 0xf9, 0xee, 0x6c, 0xdb, 0x99, + 0x6e, 0xd3, 0x24, 0xb1, 0x2d, 0x67, 0xce, 0x22, 0x72, 0x5b, 0xcc, 0xa2, 0xd9, 0xa2, 0xb9, 0x80, + 0x25, 0xdb, 0x91, 0x05, 0x44, 0x4e, 0x06, 0x74, 0xcc, 0xb1, 0xcc, 0xc9, 0x82, 0x1d, 0x76, 0xcc, + 0x1f, 0xc7, 0xf6, 0x6d, 0x9f, 0xc1, 0xbe, 0x09, 0xbb, 0xb2, 0x80, 0x1e, 0x5b, 0xc0, 0xfc, 0x79, + 0xaa, 0xa2, 0x34, 0x16, 0x8a, 0x8b, 0x32, 0x64, 0x58, 0x4f, 0x95, 0xae, 0x0c, 0xeb, 0xa1, 0xf7, + 0xa1, 0xc0, 0xc6, 0x81, 0x3b, 0x70, 0x82, 0x3e, 0x56, 0x95, 0x24, 0x11, 0xa0, 0x75, 0x28, 0x7a, + 0x98, 0x71, 0x9f, 0x38, 0xa2, 0xba, 0xc9, 0x92, 0x5a, 0xb0, 0xd3, 0x22, 0x74, 0x03, 0xca, 0x6e, + 0x80, 0x3d, 0x9f, 0x77, 0x5c, 0x27, 0xf0, 0x3a, 0x84, 0x86, 0x45, 0x6f, 0x77, 0xc9, 0x2e, 0x85, + 0xf2, 0x2d, 0x27, 0xf0, 0xf6, 0x28, 0xba, 0x0a, 0x05, 0x77, 0x20, 0xde, 0x5a, 0x02, 0x92, 0x57, + 0x90, 0x7c, 0x28, 0xda, 0xa3, 0x68, 0x03, 0xf2, 0x34, 0xf0, 0xfb, 0x3e, 0x71, 0x86, 0x46, 0xe1, + 0xf8, 0xeb, 0x27, 0x2e, 0xd5, 0x76, 0x0c, 0x6a, 0x17, 0xe2, 0x2a, 0x6b, 0xfe, 0x23, 0x03, 0x25, + 0xf1, 0x26, 0x7a, 0x8a, 0x03, 0xe6, 0x53, 0xb2, 0x19, 0xee, 0x39, 0x34, 0xb5, 0xe7, 0x40, 0xd7, + 0x41, 0x73, 0x94, 0x71, 0xdf, 0x4b, 0x38, 0xd3, 0x03, 0x6c, 0xcd, 0x11, 0xa8, 0xae, 0x72, 0xf0, + 0x5c, 0x54, 0x57, 0xa0, 0x5c, 0x15, 0x5c, 0x73, 0x51, 0x2e, 0xfa, 0x08, 0x34, 0x4f, 0x95, 0x8a, + 0x39, 0xa8, 0x76, 0xf6, 0xcb, 0x97, 0xd7, 0x96, 0x6c, 0xcd, 0x43, 0x65, 0xd0, 0xb0, 0xac, 0xc7, + 0xb9, 0xdd, 0x25, 0x5b, 0xc3, 0xe8, 0x06, 0x68, 0x3d, 0x69, 0xc2, 0xb9, 0x63, 0x05, 0xae, 0x87, + 0x4c, 0xd0, 0xfa, 0xd2, 0x8e, 0xf3, 0x0a, 0xb2, 0xd6, 0x17, 0xda, 0x0e, 0x8c, 0xc2, 0xe9, 0xda, + 0x0e, 0xd0, 0x4d, 0xd0, 0xf6, 0x8d, 0xd2, 0x5c, 0x9b, 0xb7, 0xb3, 0x2f, 0x5e, 0x5e, 0xd3, 0x6c, + 0x6d, 0xbf, 0x9d, 0x03, 0x9d, 0x8d, 0x47, 0xe6, 0x2f, 0xf4, 0x29, 0x73, 0x5b, 0x6f, 0x6a, 0x6e, + 0x6b, 0x21, 0x73, 0x5b, 0x0b, 0x99, 0xdb, 0x12, 0xe6, 0xbe, 0xfe, 0x75, 0xe6, 0xb6, 0xce, 0x64, + 0x68, 0xeb, 0x6d, 0x19, 0x1a, 0x5d, 0x81, 0x02, 0xc1, 0x87, 0x6a, 0x1b, 0x73, 0x79, 0x5d, 0xab, + 0x65, 0xed, 0x3c, 0xc1, 0x87, 0x72, 0x03, 0x13, 0x79, 0xe1, 0x57, 0xd3, 0x5e, 0x68, 0xbc, 0xa9, + 0x17, 0x1a, 0x0b, 0x79, 0xa1, 0xb1, 0x90, 0x17, 0x1a, 0x0b, 0x79, 0xa1, 0x71, 0x26, 0x2f, 0x34, + 0xde, 0x9a, 0x17, 0x6e, 0x01, 0x22, 0x94, 0x74, 0xdc, 0xc0, 0xe7, 0xbe, 0xeb, 0x0c, 0x95, 0x3b, + 0x7e, 0x29, 0x6b, 0x97, 0x5d, 0x21, 0x94, 0x6c, 0xa9, 0x27, 0x53, 0x7e, 0xf9, 0x57, 0x06, 0xaa, + 0x69, 0xf5, 0x1f, 0x50, 0x82, 0x1f, 0x11, 0xfc, 0xa8, 0xf7, 0x54, 0xbc, 0xca, 0xcf, 0xa9, 0x97, + 0xce, 0x8d, 0xf5, 0xff, 0xbd, 0x0c, 0xdf, 0x39, 0x6e, 0xfd, 0x3d, 0xf9, 0xb6, 0xea, 0x9f, 0x13, + 0xd3, 0x6f, 0x26, 0x09, 0xf1, 0xc1, 0x6c, 0x54, 0x6a, 0x4d, 0xe7, 0x24, 0x37, 0xd0, 0xa7, 0xb0, + 0xec, 0x13, 0x82, 0x83, 0x4d, 0xa3, 0x2c, 0xc9, 0x6b, 0x5f, 0xbb, 0xb2, 0xfa, 0x7d, 0x89, 0xb7, + 0xd5, 0xb8, 0x98, 0xc1, 0x32, 0x56, 0xdf, 0x88, 0xc1, 0x52, 0x0c, 0x56, 0xf5, 0x77, 0x1a, 0x2c, + 0x87, 0xa4, 0xa9, 0x7d, 0x92, 0x3e, 0x77, 0x9f, 0x74, 0x5f, 0x6c, 0xf9, 0x09, 0x0e, 0x94, 0xf7, + 0x1b, 0x8b, 0x6a, 0x1c, 0xfe, 0xc9, 0x1f, 0x3b, 0x64, 0xa8, 0xde, 0x16, 0x07, 0x81, 0x48, 0x98, + 0x9a, 0xbc, 0x10, 0x4d, 0x2e, 0xcf, 0x64, 0x6a, 0x72, 0xd1, 0xae, 0xfe, 0x3e, 0xd2, 0xd5, 0x3a, + 0x01, 0x37, 0x60, 0xc5, 0xa5, 0x63, 0x12, 0x1d, 0x12, 0x0b, 0x76, 0xd4, 0x3d, 0xab, 0xc6, 0xd6, + 0x7f, 0x43, 0xe3, 0x28, 0xff, 0xbe, 0x9a, 0xce, 0xbf, 0xe6, 0xff, 0xf3, 0xef, 0x1c, 0xe5, 0x5f, + 0xf3, 0x1b, 0xe7, 0x5f, 0xf3, 0x5b, 0xce, 0xbf, 0xe6, 0x37, 0xca, 0x3f, 0x7d, 0x6e, 0xfe, 0x7d, + 0xf1, 0x3f, 0xcb, 0xbf, 0xe6, 0x42, 0xf9, 0x67, 0x9d, 0x9a, 0x7f, 0x97, 0xd2, 0x17, 0x07, 0xba, + 0xba, 0x24, 0x88, 0x32, 0xf0, 0xcf, 0x5a, 0x78, 0x49, 0xa8, 0xe6, 0xdb, 0xb9, 0x77, 0xb6, 0xe3, + 0xd0, 0x5b, 0x3f, 0x96, 0x44, 0xeb, 0xf9, 0x9b, 0x36, 0xb5, 0x9f, 0xda, 0xb9, 0xb7, 0xf9, 0x23, + 0x9f, 0x0f, 0xb6, 0x8f, 0x78, 0xe0, 0xb4, 0xc8, 0xe4, 0x5b, 0x5d, 0xdb, 0xf5, 0x64, 0x6d, 0x29, + 0x5c, 0x8b, 0x4c, 0x62, 0x8d, 0xde, 0x78, 0x75, 0x4f, 0xa0, 0x94, 0x1e, 0x8f, 0x6a, 0x62, 0x01, + 0xa7, 0x5c, 0xe3, 0x46, 0x15, 0xc0, 0x11, 0x0b, 0x0f, 0x2b, 0xa3, 0x2e, 0x2a, 0x60, 0x29, 0xac, + 0x80, 0xb2, 0xe7, 0x9a, 0x7f, 0xd4, 0xa0, 0x22, 0x26, 0xfc, 0xe1, 0x81, 0xe7, 0x70, 0xec, 0x3d, + 0x39, 0xb2, 0x9d, 0x43, 0x74, 0x15, 0xa0, 0x4b, 0xbd, 0x49, 0xa7, 0x3b, 0xe1, 0xf2, 0x06, 0x55, + 0xab, 0x95, 0xec, 0x82, 0x90, 0xb4, 0x85, 0x00, 0xdd, 0x80, 0x55, 0x67, 0xcc, 0x07, 0x1d, 0x9f, + 0xf4, 0xa8, 0xc2, 0x64, 0x24, 0xe6, 0x82, 0x10, 0xdf, 0x27, 0x3d, 0x1a, 0xe2, 0xa6, 0x2f, 0x62, + 0xf5, 0x13, 0x17, 0xb1, 0x6b, 0x50, 0x8c, 0xcf, 0x2e, 0x9d, 0x3b, 0xea, 0x12, 0xb6, 0x10, 0x9d, + 0x5e, 0xee, 0xa0, 0x0f, 0xa1, 0x9c, 0x3c, 0xdf, 0xbc, 0x6d, 0x35, 0x8d, 0x9f, 0xe5, 0x25, 0xa6, + 0x14, 0x61, 0x84, 0xd0, 0xfc, 0x5c, 0x87, 0x8b, 0x53, 0x4b, 0x68, 0x53, 0x6f, 0x82, 0x6e, 0x43, + 0x5e, 0x5d, 0xb1, 0x87, 0x77, 0xc0, 0xf3, 0x82, 0x2c, 0x46, 0x89, 0xec, 0x1e, 0xe1, 0x11, 0x8d, + 0xb2, 0x5b, 0xb4, 0x85, 0x0a, 0xdc, 0x1f, 0x61, 0x3a, 0xe6, 0x9d, 0x01, 0xf6, 0xfb, 0x03, 0xae, + 0xec, 0x78, 0x41, 0x49, 0x77, 0xa5, 0x10, 0x5d, 0x87, 0x32, 0xa3, 0x23, 0xdc, 0x49, 0x8e, 0x62, + 0x59, 0x79, 0x14, 0x2b, 0x09, 0xe9, 0x9e, 0x52, 0x16, 0xed, 0xc2, 0x07, 0xd3, 0xa8, 0xce, 0x8c, + 0xc2, 0xfc, 0x9b, 0xb0, 0x30, 0xbf, 0x9f, 0x1e, 0xb9, 0x77, 0xbc, 0x48, 0xb7, 0xe1, 0x22, 0x3e, + 0xe2, 0x98, 0x88, 0x18, 0xe9, 0x50, 0x79, 0x9d, 0xcc, 0x8c, 0xaf, 0x56, 0x4e, 0x59, 0x66, 0x25, + 0xc6, 0x3f, 0x0a, 0xe1, 0xe8, 0x19, 0xac, 0x4d, 0x4d, 0x3f, 0x83, 0x70, 0xf5, 0x14, 0xc2, 0x2b, + 0xa9, 0x37, 0xc7, 0xf6, 0x31, 0x6e, 0xf3, 0x0f, 0x1a, 0xbc, 0x93, 0x72, 0x49, 0x4b, 0x85, 0x05, + 0xfa, 0x04, 0x4a, 0xe1, 0xd5, 0xbd, 0x8c, 0x9d, 0xc8, 0x31, 0xef, 0xd6, 0xc3, 0xcb, 0xfe, 0x3a, + 0x3f, 0xaa, 0x3f, 0x96, 0x8f, 0x05, 0xd8, 0x2e, 0xb2, 0xb8, 0xcd, 0xd0, 0x7a, 0x72, 0xd7, 0x56, + 0xb4, 0xca, 0xa9, 0x01, 0x3b, 0x18, 0x87, 0x77, 0x6f, 0x53, 0xd1, 0xd4, 0x90, 0x7e, 0x4a, 0x45, + 0x53, 0x63, 0xc1, 0x68, 0xb2, 0xfe, 0xa4, 0x41, 0x51, 0xa8, 0xfe, 0x18, 0x07, 0xcf, 0x7d, 0x17, + 0xa3, 0x3b, 0x90, 0xdd, 0x76, 0x07, 0x14, 0xbd, 0x9b, 0x24, 0x68, 0xea, 0x13, 0x50, 0xf5, 0xbd, + 0xe3, 0x62, 0xf5, 0x95, 0xa4, 0x05, 0xf9, 0xe8, 0x7b, 0x0d, 0xba, 0x9c, 0x60, 0x8e, 0x7d, 0xea, + 0xa9, 0x56, 0x67, 0x3d, 0x52, 0x14, 0xdf, 0x0b, 0x3f, 0x9a, 0x88, 0xd2, 0x65, 0x4c, 0x57, 0x87, + 0xe4, 0xab, 0x4e, 0xf5, 0xf2, 0x8c, 0x27, 0xe1, 0xf8, 0xf6, 0xee, 0x97, 0xaf, 0xd6, 0xb4, 0x17, + 0xaf, 0xd6, 0xb4, 0xbf, 0xbf, 0x5a, 0xd3, 0x3e, 0x7f, 0xbd, 0xb6, 0xf4, 0xe2, 0xf5, 0xda, 0xd2, + 0x5f, 0x5f, 0xaf, 0x2d, 0x3d, 0xab, 0x9f, 0xfe, 0xb9, 0x05, 0x33, 0x3e, 0xe6, 0xfe, 0x70, 0x23, + 0x62, 0xee, 0x2e, 0x4b, 0xcf, 0x37, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xd0, 0x8b, 0x6c, + 0x9e, 0x1c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6067,99 +6327,321 @@ func (m *AnyWithExtra) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarintProto(dAtA []byte, offset int, v uint64) int { - offset -= sovProto(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *TestUpdatedTxRaw) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *Dog) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Size_) - if l > 0 { - n += 1 + l + sovProto(uint64(l)) - } - l = len(m.Name) - if l > 0 { - n += 1 + l + sovProto(uint64(l)) - } - return n + +func (m *TestUpdatedTxRaw) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Cat) Size() (n int) { - if m == nil { - return 0 - } +func (m *TestUpdatedTxRaw) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Moniker) - if l > 0 { - n += 1 + l + sovProto(uint64(l)) + if len(m.NewField_1024) > 0 { + i -= len(m.NewField_1024) + copy(dAtA[i:], m.NewField_1024) + i = encodeVarintProto(dAtA, i, uint64(len(m.NewField_1024))) + i-- + dAtA[i] = 0x40 + i-- + dAtA[i] = 0x82 } - if m.Lives != 0 { - n += 1 + sovProto(uint64(m.Lives)) + if len(m.NewField_5) > 0 { + i -= len(m.NewField_5) + copy(dAtA[i:], m.NewField_5) + i = encodeVarintProto(dAtA, i, uint64(len(m.NewField_5))) + i-- + dAtA[i] = 0x2a } - return n -} - -func (m *HasAnimal) Size() (n int) { - if m == nil { - return 0 + if len(m.Signatures) > 0 { + for iNdEx := len(m.Signatures) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Signatures[iNdEx]) + copy(dAtA[i:], m.Signatures[iNdEx]) + i = encodeVarintProto(dAtA, i, uint64(len(m.Signatures[iNdEx]))) + i-- + dAtA[i] = 0x1a + } } - var l int - _ = l - if m.Animal != nil { - l = m.Animal.Size() - n += 1 + l + sovProto(uint64(l)) + if len(m.AuthInfoBytes) > 0 { + i -= len(m.AuthInfoBytes) + copy(dAtA[i:], m.AuthInfoBytes) + i = encodeVarintProto(dAtA, i, uint64(len(m.AuthInfoBytes))) + i-- + dAtA[i] = 0x12 } - if m.X != 0 { - n += 1 + sovProto(uint64(m.X)) + if len(m.BodyBytes) > 0 { + i -= len(m.BodyBytes) + copy(dAtA[i:], m.BodyBytes) + i = encodeVarintProto(dAtA, i, uint64(len(m.BodyBytes))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *HasHasAnimal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HasAnimal != nil { - l = m.HasAnimal.Size() - n += 1 + l + sovProto(uint64(l)) +func (m *TestUpdatedTxBody) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *HasHasHasAnimal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HasHasAnimal != nil { - l = m.HasHasAnimal.Size() - n += 1 + l + sovProto(uint64(l)) - } - return n +func (m *TestUpdatedTxBody) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EchoRequest) Size() (n int) { - if m == nil { - return 0 - } +func (m *TestUpdatedTxBody) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Message) + if len(m.NonCriticalExtensionOptions) > 0 { + for iNdEx := len(m.NonCriticalExtensionOptions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.NonCriticalExtensionOptions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7f + i-- + dAtA[i] = 0xfa + } + } + if len(m.SomeNewFieldNonCriticalField) > 0 { + i -= len(m.SomeNewFieldNonCriticalField) + copy(dAtA[i:], m.SomeNewFieldNonCriticalField) + i = encodeVarintProto(dAtA, i, uint64(len(m.SomeNewFieldNonCriticalField))) + i-- + dAtA[i] = 0x41 + i-- + dAtA[i] = 0xd2 + } + if len(m.ExtensionOptions) > 0 { + for iNdEx := len(m.ExtensionOptions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ExtensionOptions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3f + i-- + dAtA[i] = 0xfa + } + } + if m.SomeNewField != 0 { + i = encodeVarintProto(dAtA, i, uint64(m.SomeNewField)) + i-- + dAtA[i] = 0x20 + } + if m.TimeoutHeight != 0 { + i = encodeVarintProto(dAtA, i, uint64(m.TimeoutHeight)) + i-- + dAtA[i] = 0x18 + } + if len(m.Memo) > 0 { + i -= len(m.Memo) + copy(dAtA[i:], m.Memo) + i = encodeVarintProto(dAtA, i, uint64(len(m.Memo))) + i-- + dAtA[i] = 0x12 + } + if len(m.Messages) > 0 { + for iNdEx := len(m.Messages) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Messages[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *TestUpdatedAuthInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TestUpdatedAuthInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TestUpdatedAuthInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.NewField_1024) > 0 { + i -= len(m.NewField_1024) + copy(dAtA[i:], m.NewField_1024) + i = encodeVarintProto(dAtA, i, uint64(len(m.NewField_1024))) + i-- + dAtA[i] = 0x40 + i-- + dAtA[i] = 0x82 + } + if len(m.NewField_3) > 0 { + i -= len(m.NewField_3) + copy(dAtA[i:], m.NewField_3) + i = encodeVarintProto(dAtA, i, uint64(len(m.NewField_3))) + i-- + dAtA[i] = 0x1a + } + if m.Fee != nil { + { + size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.SignerInfos) > 0 { + for iNdEx := len(m.SignerInfos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.SignerInfos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProto(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintProto(dAtA []byte, offset int, v uint64) int { + offset -= sovProto(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Dog) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Size_) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + return n +} + +func (m *Cat) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Moniker) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + if m.Lives != 0 { + n += 1 + sovProto(uint64(m.Lives)) + } + return n +} + +func (m *HasAnimal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Animal != nil { + l = m.Animal.Size() + n += 1 + l + sovProto(uint64(l)) + } + if m.X != 0 { + n += 1 + sovProto(uint64(m.X)) + } + return n +} + +func (m *HasHasAnimal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HasAnimal != nil { + l = m.HasAnimal.Size() + n += 1 + l + sovProto(uint64(l)) + } + return n +} + +func (m *HasHasHasAnimal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HasHasAnimal != nil { + l = m.HasHasAnimal.Size() + n += 1 + l + sovProto(uint64(l)) + } + return n +} + +func (m *EchoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) if l > 0 { n += 1 + l + sovProto(uint64(l)) } @@ -7241,42 +7723,141 @@ func (m *AnyWithExtra) Size() (n int) { return n } -func sovProto(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozProto(x uint64) (n int) { - return sovProto(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Dog) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowProto - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Dog: wiretype end group for non-group") +func (m *TestUpdatedTxRaw) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.BodyBytes) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + l = len(m.AuthInfoBytes) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + if len(m.Signatures) > 0 { + for _, b := range m.Signatures { + l = len(b) + n += 1 + l + sovProto(uint64(l)) } - if fieldNum <= 0 { - return fmt.Errorf("proto: Dog: illegal tag %d (wire type %d)", fieldNum, wire) + } + l = len(m.NewField_5) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + l = len(m.NewField_1024) + if l > 0 { + n += 2 + l + sovProto(uint64(l)) + } + return n +} + +func (m *TestUpdatedTxBody) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Messages) > 0 { + for _, e := range m.Messages { + l = e.Size() + n += 1 + l + sovProto(uint64(l)) } - switch fieldNum { - case 1: + } + l = len(m.Memo) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + if m.TimeoutHeight != 0 { + n += 1 + sovProto(uint64(m.TimeoutHeight)) + } + if m.SomeNewField != 0 { + n += 1 + sovProto(uint64(m.SomeNewField)) + } + if len(m.ExtensionOptions) > 0 { + for _, e := range m.ExtensionOptions { + l = e.Size() + n += 2 + l + sovProto(uint64(l)) + } + } + l = len(m.SomeNewFieldNonCriticalField) + if l > 0 { + n += 2 + l + sovProto(uint64(l)) + } + if len(m.NonCriticalExtensionOptions) > 0 { + for _, e := range m.NonCriticalExtensionOptions { + l = e.Size() + n += 2 + l + sovProto(uint64(l)) + } + } + return n +} + +func (m *TestUpdatedAuthInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.SignerInfos) > 0 { + for _, e := range m.SignerInfos { + l = e.Size() + n += 1 + l + sovProto(uint64(l)) + } + } + if m.Fee != nil { + l = m.Fee.Size() + n += 1 + l + sovProto(uint64(l)) + } + l = len(m.NewField_3) + if l > 0 { + n += 1 + l + sovProto(uint64(l)) + } + l = len(m.NewField_1024) + if l > 0 { + n += 2 + l + sovProto(uint64(l)) + } + return n +} + +func sovProto(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozProto(x uint64) (n int) { + return sovProto(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Dog) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Dog: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Dog: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) } @@ -14328,6 +14909,675 @@ func (m *AnyWithExtra) Unmarshal(dAtA []byte) error { } return nil } +func (m *TestUpdatedTxRaw) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestUpdatedTxRaw: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestUpdatedTxRaw: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BodyBytes", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BodyBytes = append(m.BodyBytes[:0], dAtA[iNdEx:postIndex]...) + if m.BodyBytes == nil { + m.BodyBytes = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthInfoBytes", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AuthInfoBytes = append(m.AuthInfoBytes[:0], dAtA[iNdEx:postIndex]...) + if m.AuthInfoBytes == nil { + m.AuthInfoBytes = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signatures", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signatures = append(m.Signatures, make([]byte, postIndex-iNdEx)) + copy(m.Signatures[len(m.Signatures)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewField_5", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewField_5 = append(m.NewField_5[:0], dAtA[iNdEx:postIndex]...) + if m.NewField_5 == nil { + m.NewField_5 = []byte{} + } + iNdEx = postIndex + case 1024: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewField_1024", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewField_1024 = append(m.NewField_1024[:0], dAtA[iNdEx:postIndex]...) + if m.NewField_1024 == nil { + m.NewField_1024 = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestUpdatedTxBody) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestUpdatedTxBody: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestUpdatedTxBody: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Messages", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Messages = append(m.Messages, &types.Any{}) + if err := m.Messages[len(m.Messages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Memo", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Memo = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutHeight", wireType) + } + m.TimeoutHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TimeoutHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SomeNewField", wireType) + } + m.SomeNewField = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SomeNewField |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 1023: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExtensionOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExtensionOptions = append(m.ExtensionOptions, &types.Any{}) + if err := m.ExtensionOptions[len(m.ExtensionOptions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 1050: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SomeNewFieldNonCriticalField", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SomeNewFieldNonCriticalField = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2047: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NonCriticalExtensionOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NonCriticalExtensionOptions = append(m.NonCriticalExtensionOptions, &types.Any{}) + if err := m.NonCriticalExtensionOptions[len(m.NonCriticalExtensionOptions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TestUpdatedAuthInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TestUpdatedAuthInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TestUpdatedAuthInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SignerInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SignerInfos = append(m.SignerInfos, &tx.SignerInfo{}) + if err := m.SignerInfos[len(m.SignerInfos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Fee == nil { + m.Fee = &tx.Fee{} + } + if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewField_3", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewField_3 = append(m.NewField_3[:0], dAtA[iNdEx:postIndex]...) + if m.NewField_3 == nil { + m.NewField_3 = []byte{} + } + iNdEx = postIndex + case 1024: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewField_1024", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProto + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProto + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProto + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewField_1024 = append(m.NewField_1024[:0], dAtA[iNdEx:postIndex]...) + if m.NewField_1024 == nil { + m.NewField_1024 = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProto(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthProto + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipProto(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/testutil/testdata/proto.proto b/testutil/testdata/proto.proto index acfef24c856e..335091fc9846 100644 --- a/testutil/testdata/proto.proto +++ b/testutil/testdata/proto.proto @@ -3,6 +3,7 @@ package testdata; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; +import "cosmos/tx/tx.proto"; option go_package = "github.com/cosmos/cosmos-sdk/testutil/testdata"; @@ -341,3 +342,28 @@ message AnyWithExtra { int64 b = 3; int64 c = 4; } + +message TestUpdatedTxRaw { + bytes body_bytes = 1; + bytes auth_info_bytes = 2; + repeated bytes signatures = 3; + bytes new_field_5 = 5; + bytes new_field_1024 = 1024; +} + +message TestUpdatedTxBody { + repeated google.protobuf.Any messages = 1; + string memo = 2; + int64 timeout_height = 3; + uint64 some_new_field = 4; + string some_new_field_non_critical_field = 1050; + repeated google.protobuf.Any extension_options = 1023; + repeated google.protobuf.Any non_critical_extension_options = 2047; +} + +message TestUpdatedAuthInfo { + repeated cosmos.tx.SignerInfo signer_infos = 1; + cosmos.tx.Fee fee = 2; + bytes new_field_3 = 3; + bytes new_field_1024 = 1024; +} diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index 2c4f78d235d6..09206f274653 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -230,25 +230,3 @@ func TestBuilderValidateBasic(t *testing.T) { err = txBuilder.ValidateBasic() require.Error(t, err) } - -func TestDefaultTxDecoderError(t *testing.T) { - registry := codectypes.NewInterfaceRegistry() - cdc := codec.NewProtoCodec(registry) - pubKeyCdc := std.DefaultPublicKeyCodec{} - encoder := DefaultTxEncoder() - decoder := DefaultTxDecoder(cdc, pubKeyCdc) - - builder := newBuilder(pubKeyCdc) - err := builder.SetMsgs(testdata.NewTestMsg()) - require.NoError(t, err) - - txBz, err := encoder(builder.GetTx()) - require.NoError(t, err) - - _, err = decoder(txBz) - require.EqualError(t, err, "no registered implementations of type types.Msg: tx parse error") - - registry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) - _, err = decoder(txBz) - require.NoError(t, err) -} diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index e9ca72127137..908c6e433c11 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -38,7 +38,7 @@ func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec err = cdc.UnmarshalBinaryBare(raw.BodyBytes, &body) if err != nil { - return nil, err + return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) } var authInfo tx.AuthInfo @@ -46,12 +46,12 @@ func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec // reject all unknown proto fields in AuthInfo err = unknownproto.RejectUnknownFieldsStrict(raw.AuthInfoBytes, &authInfo) if err != nil { - return nil, err + return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) } err = cdc.UnmarshalBinaryBare(raw.AuthInfoBytes, &authInfo) if err != nil { - return nil, err + return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) } theTx := &tx.Tx{ diff --git a/x/auth/tx/encode_decode_test.go b/x/auth/tx/encode_decode_test.go new file mode 100644 index 000000000000..43d47a981796 --- /dev/null +++ b/x/auth/tx/encode_decode_test.go @@ -0,0 +1,165 @@ +package tx + +import ( + "fmt" + "testing" + + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + "github.com/cosmos/cosmos-sdk/types/tx" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/std" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestDefaultTxDecoderError(t *testing.T) { + registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) + pubKeyCdc := std.DefaultPublicKeyCodec{} + encoder := DefaultTxEncoder() + decoder := DefaultTxDecoder(cdc, pubKeyCdc) + + builder := newBuilder(pubKeyCdc) + err := builder.SetMsgs(testdata.NewTestMsg()) + require.NoError(t, err) + + txBz, err := encoder(builder.GetTx()) + require.NoError(t, err) + + _, err = decoder(txBz) + require.EqualError(t, err, "no registered implementations of type types.Msg: tx parse error") + + registry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) + _, err = decoder(txBz) + require.NoError(t, err) +} + +func TestUnknownFields(t *testing.T) { + registry := codectypes.NewInterfaceRegistry() + cdc := codec.NewProtoCodec(registry) + pubKeyCdc := std.DefaultPublicKeyCodec{} + decoder := DefaultTxDecoder(cdc, pubKeyCdc) + + tests := []struct { + name string + body *testdata.TestUpdatedTxBody + authInfo *testdata.TestUpdatedAuthInfo + shouldErr bool + shouldAminoErr string + }{ + { + name: "no new fields should pass", + body: &testdata.TestUpdatedTxBody{ + Memo: "foo", + }, + authInfo: &testdata.TestUpdatedAuthInfo{}, + shouldErr: false, + }, + { + name: "non-critical fields in TxBody should not error on decode, but should error with amino", + body: &testdata.TestUpdatedTxBody{ + Memo: "foo", + SomeNewFieldNonCriticalField: "blah", + }, + authInfo: &testdata.TestUpdatedAuthInfo{}, + shouldErr: false, + shouldAminoErr: fmt.Sprintf("%s: %s", aminoNonCriticalFieldsError, sdkerrors.ErrInvalidRequest.Error()), + }, + { + name: "critical fields in TxBody should error on decode", + body: &testdata.TestUpdatedTxBody{ + Memo: "foo", + SomeNewField: 10, + }, + authInfo: &testdata.TestUpdatedAuthInfo{}, + shouldErr: true, + }, + { + name: "critical fields in AuthInfo should error on decode", + body: &testdata.TestUpdatedTxBody{ + Memo: "foo", + }, + authInfo: &testdata.TestUpdatedAuthInfo{ + NewField_3: []byte("xyz"), + }, + shouldErr: true, + }, + { + name: "non-critical fields in AuthInfo should error on decode", + body: &testdata.TestUpdatedTxBody{ + Memo: "foo", + }, + authInfo: &testdata.TestUpdatedAuthInfo{ + NewField_1024: []byte("xyz"), + }, + shouldErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + bodyBz, err := tt.body.Marshal() + require.NoError(t, err) + + authInfoBz, err := tt.authInfo.Marshal() + require.NoError(t, err) + + txRaw := &tx.TxRaw{ + BodyBytes: bodyBz, + AuthInfoBytes: authInfoBz, + } + txBz, err := txRaw.Marshal() + require.NoError(t, err) + + _, err = decoder(txBz) + if tt.shouldErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } + + if tt.shouldAminoErr != "" { + handler := signModeLegacyAminoJSONHandler{} + decoder := DefaultTxDecoder(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), std.DefaultPublicKeyCodec{}) + theTx, err := decoder(txBz) + require.NoError(t, err) + _, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signing.SignerData{}, theTx) + require.EqualError(t, err, tt.shouldAminoErr) + } + }) + } + + t.Log("test TxRaw no new fields, should succeed") + txRaw := &testdata.TestUpdatedTxRaw{} + txBz, err := txRaw.Marshal() + require.NoError(t, err) + _, err = decoder(txBz) + require.NoError(t, err) + + t.Log("new field in TxRaw should fail") + txRaw = &testdata.TestUpdatedTxRaw{ + NewField_5: []byte("abc"), + } + txBz, err = txRaw.Marshal() + require.NoError(t, err) + _, err = decoder(txBz) + require.Error(t, err) + + // + t.Log("new \"non-critical\" field in TxRaw should fail") + txRaw = &testdata.TestUpdatedTxRaw{ + NewField_1024: []byte("abc"), + } + txBz, err = txRaw.Marshal() + require.NoError(t, err) + _, err = decoder(txBz) + require.Error(t, err) +} diff --git a/x/auth/tx/legacy_amino_json.go b/x/auth/tx/legacy_amino_json.go index 05e9f91f783d..78076905d880 100644 --- a/x/auth/tx/legacy_amino_json.go +++ b/x/auth/tx/legacy_amino_json.go @@ -22,6 +22,8 @@ func (s signModeLegacyAminoJSONHandler) Modes() []signingtypes.SignMode { return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON} } +const aminoNonCriticalFieldsError = "protobuf transaction contains unknown non-critical fields. This is a transaction malleability issue and SIGN_MODE_LEGACY_AMINO_JSON cannot be used." + func (s signModeLegacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) { if mode != signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON { return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, mode) @@ -34,7 +36,7 @@ func (s signModeLegacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, if protoTx.txBodyHasUnknownNonCriticals { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, - fmt.Sprintf("protobuf transaction contains unknown non-critical fields. This is a transaction malleability issue and SIGN_MODE_LEGACY_AMINO_JSON cannot be used.")) + fmt.Sprintf(aminoNonCriticalFieldsError)) } body := protoTx.tx.Body diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 8169b56ec933..93226ea42ae4 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1569,614 +1569,615 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9698 bytes of a gzipped FileDescriptorSet + // 9722 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x7b, 0x70, 0x24, 0xc7, - 0x79, 0x1f, 0xf6, 0x81, 0xc5, 0xee, 0xb7, 0x8b, 0xc5, 0xa2, 0x81, 0xbb, 0xc3, 0x2d, 0xc9, 0xdb, - 0xe3, 0x1c, 0x1f, 0x38, 0x3e, 0x70, 0xd4, 0x89, 0xcf, 0x3d, 0x8a, 0x14, 0x16, 0xc0, 0xdd, 0x81, - 0x04, 0xee, 0xc0, 0x01, 0x70, 0xa4, 0x28, 0xdb, 0xe3, 0xc1, 0x6c, 0x63, 0x31, 0xc4, 0xee, 0xcc, - 0x72, 0x66, 0xf6, 0x0e, 0x60, 0x29, 0x55, 0x4c, 0xf9, 0x21, 0xc9, 0x91, 0x2d, 0x45, 0xb1, 0x1d, - 0x5a, 0x96, 0x64, 0x4a, 0xa9, 0x44, 0x8e, 0x92, 0xf8, 0x91, 0x28, 0x7a, 0xd8, 0xf9, 0x43, 0x55, - 0x79, 0x58, 0xa9, 0x72, 0xa5, 0xa4, 0xc4, 0x49, 0xb9, 0x52, 0x29, 0xd8, 0x22, 0x55, 0x65, 0x45, - 0x61, 0x12, 0xe5, 0x42, 0xbb, 0x5c, 0xd2, 0x1f, 0x49, 0xf5, 0x6b, 0x5e, 0x3b, 0xbb, 0x33, 0x38, - 0x1e, 0x29, 0xba, 0xa4, 0xbf, 0xb0, 0xd3, 0xf3, 0x7d, 0xbf, 0xee, 0xfe, 0xfa, 0xeb, 0xef, 0xfb, - 0xfa, 0xeb, 0xee, 0x01, 0x7c, 0x31, 0x0d, 0xb7, 0x69, 0xa6, 0xdd, 0x31, 0xed, 0x33, 0x2f, 0xf6, - 0xb0, 0xb5, 0x7f, 0xa6, 0xab, 0xb6, 0x74, 0x43, 0x75, 0x74, 0xd3, 0x98, 0xeb, 0x5a, 0xa6, 0x63, - 0xa2, 0x12, 0x7b, 0x3d, 0x47, 0x5f, 0x4b, 0x06, 0x14, 0xd7, 0xd4, 0x16, 0x96, 0xf1, 0x8b, 0x3d, - 0x6c, 0x3b, 0xa8, 0x02, 0x99, 0x5d, 0xbc, 0x3f, 0x93, 0x3a, 0x99, 0x9a, 0x2d, 0xc9, 0xe4, 0x27, - 0x3a, 0x0a, 0x39, 0x73, 0x7b, 0xdb, 0xc6, 0xce, 0x4c, 0xfa, 0x64, 0x6a, 0x36, 0x2b, 0xf3, 0x27, - 0x34, 0x0d, 0xa3, 0x6d, 0xbd, 0xa3, 0x3b, 0x33, 0x19, 0x5a, 0xcc, 0x1e, 0x50, 0x0d, 0x8a, 0x9a, - 0xd9, 0x33, 0x1c, 0xc5, 0x31, 0x1d, 0xb5, 0x3d, 0x93, 0x3d, 0x99, 0x9a, 0xcd, 0xcb, 0x40, 0x8b, - 0x36, 0x48, 0x89, 0xf4, 0x24, 0x94, 0x58, 0x7d, 0x76, 0xd7, 0x34, 0x6c, 0x8c, 0x8e, 0x43, 0xde, - 0xc0, 0x7b, 0x8e, 0xe2, 0xd5, 0x3a, 0x46, 0x9e, 0x9f, 0xc6, 0xfb, 0xa4, 0x06, 0x86, 0xc2, 0x2a, - 0x66, 0x0f, 0x8d, 0xc6, 0x37, 0x5e, 0x3b, 0x91, 0xfa, 0xe6, 0x6b, 0x27, 0x52, 0x7f, 0xfe, 0xda, - 0x89, 0xd4, 0x27, 0x5e, 0x3f, 0x31, 0xf2, 0xcd, 0xd7, 0x4f, 0x8c, 0xfc, 0xe9, 0xeb, 0x27, 0x46, - 0x9e, 0x9f, 0x6d, 0xe9, 0xce, 0x4e, 0x6f, 0x6b, 0x4e, 0x33, 0x3b, 0x67, 0xb8, 0x08, 0xd8, 0x9f, - 0xfb, 0xed, 0xe6, 0xee, 0x19, 0x67, 0xbf, 0x8b, 0xb9, 0x4c, 0xb6, 0x72, 0x54, 0x12, 0xef, 0x85, - 0xdf, 0x3c, 0x07, 0x27, 0x5b, 0xa6, 0xd9, 0x6a, 0xe3, 0x33, 0xb4, 0x64, 0xab, 0xb7, 0x7d, 0xa6, - 0x89, 0x6d, 0xcd, 0xd2, 0xbb, 0x8e, 0x69, 0x71, 0x79, 0x4d, 0x30, 0x8a, 0x39, 0x41, 0x21, 0xad, - 0xc2, 0xe4, 0x79, 0xbd, 0x8d, 0x17, 0x5d, 0xc2, 0x75, 0xec, 0xa0, 0x47, 0x21, 0xbb, 0xad, 0xb7, - 0xf1, 0x4c, 0xea, 0x64, 0x66, 0xb6, 0x78, 0xf6, 0x8e, 0xb9, 0x10, 0xd3, 0x5c, 0x90, 0x63, 0x8d, - 0x14, 0xcb, 0x94, 0x43, 0xfa, 0x4e, 0x16, 0xa6, 0x22, 0xde, 0x22, 0x04, 0x59, 0x43, 0xed, 0x60, - 0x2a, 0x95, 0x82, 0x4c, 0x7f, 0xa3, 0x19, 0x18, 0xeb, 0xaa, 0xda, 0xae, 0xda, 0xc2, 0x54, 0x28, - 0x05, 0x59, 0x3c, 0xa2, 0x13, 0x00, 0x4d, 0xdc, 0xc5, 0x46, 0x13, 0x1b, 0xda, 0xfe, 0x4c, 0xe6, - 0x64, 0x66, 0xb6, 0x20, 0xfb, 0x4a, 0xd0, 0xbd, 0x30, 0xd9, 0xed, 0x6d, 0xb5, 0x75, 0x4d, 0xf1, - 0x91, 0xc1, 0xc9, 0xcc, 0xec, 0xa8, 0x5c, 0x61, 0x2f, 0x16, 0x3d, 0xe2, 0xbb, 0x61, 0xe2, 0x1a, - 0x56, 0x77, 0xfd, 0xa4, 0x45, 0x4a, 0x5a, 0x26, 0xc5, 0x3e, 0xc2, 0x05, 0x28, 0x75, 0xb0, 0x6d, - 0xab, 0x2d, 0xac, 0x10, 0xf9, 0xce, 0x64, 0x69, 0xef, 0x4f, 0xf6, 0xf5, 0x3e, 0xdc, 0xf3, 0x22, - 0xe7, 0xda, 0xd8, 0xef, 0x62, 0x34, 0x0f, 0x05, 0x6c, 0xf4, 0x3a, 0x0c, 0x61, 0x74, 0x80, 0xfc, - 0x96, 0x8c, 0x5e, 0x27, 0x8c, 0x92, 0x27, 0x6c, 0x1c, 0x62, 0xcc, 0xc6, 0xd6, 0x55, 0x5d, 0xc3, - 0x33, 0x39, 0x0a, 0x70, 0x77, 0x1f, 0xc0, 0x3a, 0x7b, 0x1f, 0xc6, 0x10, 0x7c, 0x68, 0x01, 0x0a, - 0x78, 0xcf, 0xc1, 0x86, 0xad, 0x9b, 0xc6, 0xcc, 0x18, 0x05, 0xb9, 0x33, 0x62, 0x14, 0x71, 0xbb, - 0x19, 0x86, 0xf0, 0xf8, 0xd0, 0xc3, 0x30, 0x66, 0x76, 0xc9, 0x5c, 0xb3, 0x67, 0xf2, 0x27, 0x53, - 0xb3, 0xc5, 0xb3, 0xb7, 0x46, 0x2a, 0xc2, 0x65, 0x46, 0x23, 0x0b, 0x62, 0xb4, 0x0c, 0x15, 0xdb, - 0xec, 0x59, 0x1a, 0x56, 0x34, 0xb3, 0x89, 0x15, 0xdd, 0xd8, 0x36, 0x67, 0x0a, 0x14, 0xa0, 0xd6, - 0xdf, 0x11, 0x4a, 0xb8, 0x60, 0x36, 0xf1, 0xb2, 0xb1, 0x6d, 0xca, 0x65, 0x3b, 0xf0, 0x4c, 0xe6, - 0xab, 0xbd, 0x6f, 0x38, 0xea, 0xde, 0x4c, 0x89, 0x6a, 0x08, 0x7f, 0x92, 0xbe, 0x96, 0x83, 0x89, - 0x24, 0x2a, 0x76, 0x0e, 0x46, 0xb7, 0x49, 0x2f, 0x67, 0xd2, 0x87, 0x91, 0x01, 0xe3, 0x09, 0x0a, - 0x31, 0x77, 0x83, 0x42, 0x9c, 0x87, 0xa2, 0x81, 0x6d, 0x07, 0x37, 0x99, 0x46, 0x64, 0x12, 0xea, - 0x14, 0x30, 0xa6, 0x7e, 0x95, 0xca, 0xde, 0x90, 0x4a, 0x3d, 0x07, 0x13, 0x6e, 0x93, 0x14, 0x4b, - 0x35, 0x5a, 0x42, 0x37, 0xcf, 0xc4, 0xb5, 0x64, 0x6e, 0x49, 0xf0, 0xc9, 0x84, 0x4d, 0x2e, 0xe3, - 0xc0, 0x33, 0x5a, 0x04, 0x30, 0x0d, 0x6c, 0x6e, 0x2b, 0x4d, 0xac, 0xb5, 0x67, 0xf2, 0x03, 0xa4, - 0x74, 0x99, 0x90, 0xf4, 0x49, 0xc9, 0x64, 0xa5, 0x5a, 0x1b, 0x3d, 0xe6, 0xa9, 0xda, 0xd8, 0x00, - 0x4d, 0x59, 0x65, 0x93, 0xac, 0x4f, 0xdb, 0x36, 0xa1, 0x6c, 0x61, 0xa2, 0xf7, 0xb8, 0xc9, 0x7b, - 0x56, 0xa0, 0x8d, 0x98, 0x8b, 0xed, 0x99, 0xcc, 0xd9, 0x58, 0xc7, 0xc6, 0x2d, 0xff, 0x23, 0x3a, - 0x05, 0x6e, 0x81, 0x42, 0xd5, 0x0a, 0xa8, 0x15, 0x2a, 0x89, 0xc2, 0x4b, 0x6a, 0x07, 0x57, 0x5f, - 0x82, 0x72, 0x50, 0x3c, 0xc4, 0xcc, 0xdb, 0x8e, 0x6a, 0x39, 0x54, 0x0b, 0x47, 0x65, 0xf6, 0x40, - 0x1c, 0x11, 0x36, 0x9a, 0xd4, 0xca, 0x8d, 0xca, 0xe4, 0x27, 0x7a, 0xbf, 0xd7, 0xe1, 0x0c, 0xed, - 0xf0, 0x5d, 0xfd, 0x23, 0x1a, 0x40, 0x0e, 0xf7, 0xbb, 0xfa, 0x08, 0x8c, 0x07, 0x3a, 0x90, 0xb4, - 0x6a, 0xe9, 0x43, 0x70, 0x24, 0x12, 0x1a, 0x3d, 0x07, 0xd3, 0x3d, 0x43, 0x37, 0x1c, 0x6c, 0x75, - 0x2d, 0x4c, 0x34, 0x96, 0x55, 0x35, 0xf3, 0x17, 0x63, 0x03, 0x74, 0x6e, 0xd3, 0x4f, 0xcd, 0x50, - 0xe4, 0xa9, 0x5e, 0x7f, 0xe1, 0x3d, 0x85, 0xfc, 0x77, 0xc7, 0x2a, 0x2f, 0xbf, 0xfc, 0xf2, 0xcb, - 0x69, 0xe9, 0x95, 0x1c, 0x4c, 0x47, 0xcd, 0x99, 0xc8, 0xe9, 0x7b, 0x14, 0x72, 0x46, 0xaf, 0xb3, - 0x85, 0x2d, 0x2a, 0xa4, 0x51, 0x99, 0x3f, 0xa1, 0x79, 0x18, 0x6d, 0xab, 0x5b, 0x98, 0xb9, 0xe4, - 0xf2, 0xd9, 0x7b, 0x13, 0xcd, 0xca, 0xb9, 0x15, 0xc2, 0x22, 0x33, 0x4e, 0xf4, 0x04, 0x64, 0xb9, - 0x89, 0x26, 0x08, 0xf7, 0x24, 0x43, 0x20, 0x73, 0x49, 0xa6, 0x7c, 0xe8, 0x16, 0x28, 0x90, 0xbf, - 0x4c, 0x37, 0x72, 0xb4, 0xcd, 0x79, 0x52, 0x40, 0xf4, 0x02, 0x55, 0x21, 0x4f, 0xa7, 0x49, 0x13, - 0x0b, 0xd7, 0xe6, 0x3e, 0x13, 0xc5, 0x6a, 0xe2, 0x6d, 0xb5, 0xd7, 0x76, 0x94, 0xab, 0x6a, 0xbb, - 0x87, 0xa9, 0xc2, 0x17, 0xe4, 0x12, 0x2f, 0xbc, 0x42, 0xca, 0x48, 0xe4, 0xc1, 0x66, 0x95, 0x6e, - 0x34, 0xf1, 0x1e, 0xb5, 0x9e, 0xa3, 0x32, 0x9b, 0x68, 0xcb, 0xa4, 0x84, 0x54, 0xff, 0x82, 0x6d, - 0x1a, 0x42, 0x35, 0x69, 0x15, 0xa4, 0x80, 0x56, 0xff, 0x48, 0xd8, 0x70, 0xdf, 0x16, 0xdd, 0xbd, - 0xb0, 0x4e, 0x49, 0x5f, 0x4e, 0x43, 0x96, 0xda, 0x8b, 0x09, 0x28, 0x6e, 0x7c, 0x60, 0x6d, 0x49, - 0x59, 0xbc, 0xbc, 0xd9, 0x58, 0x59, 0xaa, 0xa4, 0x50, 0x19, 0x80, 0x16, 0x9c, 0x5f, 0xb9, 0x3c, - 0xbf, 0x51, 0x49, 0xbb, 0xcf, 0xcb, 0x97, 0x36, 0x1e, 0x7e, 0xb0, 0x92, 0x71, 0x19, 0x36, 0x59, - 0x41, 0xd6, 0x4f, 0xf0, 0xde, 0xb3, 0x95, 0x51, 0x54, 0x81, 0x12, 0x03, 0x58, 0x7e, 0x6e, 0x69, - 0xf1, 0xe1, 0x07, 0x2b, 0xb9, 0x60, 0xc9, 0x7b, 0xcf, 0x56, 0xc6, 0xd0, 0x38, 0x14, 0x68, 0x49, - 0xe3, 0xf2, 0xe5, 0x95, 0x4a, 0xde, 0xc5, 0x5c, 0xdf, 0x90, 0x97, 0x2f, 0x5d, 0xa8, 0x14, 0x5c, - 0xcc, 0x0b, 0xf2, 0xe5, 0xcd, 0xb5, 0x0a, 0xb8, 0x08, 0xab, 0x4b, 0xeb, 0xeb, 0xf3, 0x17, 0x96, - 0x2a, 0x45, 0x97, 0xa2, 0xf1, 0x81, 0x8d, 0xa5, 0xf5, 0x4a, 0x29, 0xd0, 0xac, 0xf7, 0x9e, 0xad, - 0x8c, 0xbb, 0x55, 0x2c, 0x5d, 0xda, 0x5c, 0xad, 0x94, 0xd1, 0x24, 0x8c, 0xb3, 0x2a, 0x44, 0x23, - 0x26, 0x42, 0x45, 0x0f, 0x3f, 0x58, 0xa9, 0x78, 0x0d, 0x61, 0x28, 0x93, 0x81, 0x82, 0x87, 0x1f, - 0xac, 0x20, 0x69, 0x01, 0x46, 0xa9, 0x76, 0x21, 0x04, 0xe5, 0x95, 0xf9, 0xc6, 0xd2, 0x8a, 0x72, - 0x79, 0x6d, 0x63, 0xf9, 0xf2, 0xa5, 0xf9, 0x95, 0x4a, 0xca, 0x2b, 0x93, 0x97, 0x9e, 0xd9, 0x5c, - 0x96, 0x97, 0x16, 0x2b, 0x69, 0x7f, 0xd9, 0xda, 0xd2, 0xfc, 0xc6, 0xd2, 0x62, 0x25, 0x23, 0x69, - 0x30, 0x1d, 0x65, 0x27, 0x23, 0x67, 0x86, 0x6f, 0x88, 0xd3, 0x03, 0x86, 0x98, 0x62, 0xf5, 0x0d, - 0xf1, 0xeb, 0x69, 0x98, 0x8a, 0xf0, 0x15, 0x91, 0x95, 0x3c, 0x09, 0xa3, 0x4c, 0x45, 0x99, 0xf7, - 0x3c, 0x1d, 0xe9, 0x74, 0xa8, 0xc2, 0xf6, 0x79, 0x50, 0xca, 0xe7, 0x8f, 0x20, 0x32, 0x03, 0x22, - 0x08, 0x02, 0xd1, 0x67, 0xd3, 0x7f, 0xba, 0xcf, 0xa6, 0x33, 0xb7, 0xf7, 0x70, 0x12, 0xb7, 0x47, - 0xcb, 0x0e, 0x67, 0xdb, 0x47, 0x23, 0x6c, 0xfb, 0x39, 0x98, 0xec, 0x03, 0x4a, 0x6c, 0x63, 0x7f, - 0x2e, 0x05, 0x33, 0x83, 0x84, 0x13, 0x63, 0xe9, 0xd2, 0x01, 0x4b, 0x77, 0x2e, 0x2c, 0xc1, 0xdb, - 0x07, 0x0f, 0x42, 0xdf, 0x58, 0x7f, 0x21, 0x05, 0x47, 0xa3, 0x23, 0xc5, 0xc8, 0x36, 0x3c, 0x01, - 0xb9, 0x0e, 0x76, 0x76, 0x4c, 0x11, 0x2d, 0xdd, 0x15, 0xe1, 0x83, 0xc9, 0xeb, 0xf0, 0x60, 0x73, - 0x2e, 0xbf, 0x13, 0xcf, 0x0c, 0x0a, 0xf7, 0x58, 0x6b, 0xfa, 0x5a, 0xfa, 0xd1, 0x34, 0x1c, 0x89, - 0x04, 0x8f, 0x6c, 0xe8, 0x6d, 0x00, 0xba, 0xd1, 0xed, 0x39, 0x2c, 0x22, 0x62, 0x06, 0xb6, 0x40, - 0x4b, 0xa8, 0xf1, 0x22, 0xc6, 0xb3, 0xe7, 0xb8, 0xef, 0x33, 0xf4, 0x3d, 0xb0, 0x22, 0x4a, 0xf0, - 0xa8, 0xd7, 0xd0, 0x2c, 0x6d, 0xe8, 0x89, 0x01, 0x3d, 0xed, 0x53, 0xcc, 0x07, 0xa0, 0xa2, 0xb5, - 0x75, 0x6c, 0x38, 0x8a, 0xed, 0x58, 0x58, 0xed, 0xe8, 0x46, 0x8b, 0x7a, 0x90, 0x7c, 0x7d, 0x74, - 0x5b, 0x6d, 0xdb, 0x58, 0x9e, 0x60, 0xaf, 0xd7, 0xc5, 0x5b, 0xc2, 0x41, 0x15, 0xc8, 0xf2, 0x71, - 0xe4, 0x02, 0x1c, 0xec, 0xb5, 0xcb, 0x21, 0x7d, 0xb2, 0x00, 0x45, 0x5f, 0x5c, 0x8d, 0x6e, 0x87, - 0xd2, 0x0b, 0xea, 0x55, 0x55, 0x11, 0x6b, 0x25, 0x26, 0x89, 0x22, 0x29, 0x5b, 0xe3, 0xeb, 0xa5, - 0x07, 0x60, 0x9a, 0x92, 0x98, 0x3d, 0x07, 0x5b, 0x8a, 0xd6, 0x56, 0x6d, 0x9b, 0x0a, 0x2d, 0x4f, - 0x49, 0x11, 0x79, 0x77, 0x99, 0xbc, 0x5a, 0x10, 0x6f, 0xd0, 0x43, 0x30, 0x45, 0x39, 0x3a, 0xbd, - 0xb6, 0xa3, 0x77, 0xdb, 0x58, 0x21, 0xab, 0x37, 0x9b, 0x7a, 0x12, 0xb7, 0x65, 0x93, 0x84, 0x62, - 0x95, 0x13, 0x90, 0x16, 0xd9, 0x68, 0x11, 0x6e, 0xa3, 0x6c, 0x2d, 0x6c, 0x60, 0x4b, 0x75, 0xb0, - 0x82, 0x5f, 0xec, 0xa9, 0x6d, 0x5b, 0x51, 0x8d, 0xa6, 0xb2, 0xa3, 0xda, 0x3b, 0x33, 0xd3, 0x04, - 0xa0, 0x91, 0x9e, 0x49, 0xc9, 0xc7, 0x09, 0xe1, 0x05, 0x4e, 0xb7, 0x44, 0xc9, 0xe6, 0x8d, 0xe6, - 0x45, 0xd5, 0xde, 0x41, 0x75, 0x38, 0x4a, 0x51, 0x6c, 0xc7, 0xd2, 0x8d, 0x96, 0xa2, 0xed, 0x60, - 0x6d, 0x57, 0xe9, 0x39, 0xdb, 0x8f, 0xce, 0xdc, 0xe2, 0xaf, 0x9f, 0xb6, 0x70, 0x9d, 0xd2, 0x2c, - 0x10, 0x92, 0x4d, 0x67, 0xfb, 0x51, 0xb4, 0x0e, 0x25, 0x32, 0x18, 0x1d, 0xfd, 0x25, 0xac, 0x6c, - 0x9b, 0x16, 0x75, 0x8d, 0xe5, 0x08, 0xd3, 0xe4, 0x93, 0xe0, 0xdc, 0x65, 0xce, 0xb0, 0x6a, 0x36, - 0x71, 0x7d, 0x74, 0x7d, 0x6d, 0x69, 0x69, 0x51, 0x2e, 0x0a, 0x94, 0xf3, 0xa6, 0x45, 0x14, 0xaa, - 0x65, 0xba, 0x02, 0x2e, 0x32, 0x85, 0x6a, 0x99, 0x42, 0xbc, 0x0f, 0xc1, 0x94, 0xa6, 0xb1, 0x3e, - 0xeb, 0x9a, 0xc2, 0xd7, 0x58, 0xf6, 0x4c, 0x25, 0x20, 0x2c, 0x4d, 0xbb, 0xc0, 0x08, 0xb8, 0x8e, - 0xdb, 0xe8, 0x31, 0x38, 0xe2, 0x09, 0xcb, 0xcf, 0x38, 0xd9, 0xd7, 0xcb, 0x30, 0xeb, 0x43, 0x30, - 0xd5, 0xdd, 0xef, 0x67, 0x44, 0x81, 0x1a, 0xbb, 0xfb, 0x61, 0xb6, 0x47, 0x60, 0xba, 0xbb, 0xd3, - 0xed, 0xe7, 0xbb, 0xc7, 0xcf, 0x87, 0xba, 0x3b, 0xdd, 0x30, 0xe3, 0x9d, 0x74, 0xc1, 0x6d, 0x61, - 0x4d, 0x75, 0x70, 0x73, 0xe6, 0x98, 0x9f, 0xdc, 0xf7, 0x02, 0x9d, 0x81, 0x8a, 0xa6, 0x29, 0xd8, - 0x50, 0xb7, 0xda, 0x58, 0x51, 0x2d, 0x6c, 0xa8, 0xf6, 0x4c, 0xcd, 0x4f, 0x5c, 0xd6, 0xb4, 0x25, - 0xfa, 0x76, 0x9e, 0xbe, 0x44, 0xf7, 0xc0, 0xa4, 0xb9, 0xf5, 0x82, 0xc6, 0x54, 0x52, 0xe9, 0x5a, - 0x78, 0x5b, 0xdf, 0x9b, 0xb9, 0x83, 0xca, 0x77, 0x82, 0xbc, 0xa0, 0x0a, 0xb9, 0x46, 0x8b, 0xd1, - 0x69, 0xa8, 0x68, 0xf6, 0x8e, 0x6a, 0x75, 0xa9, 0x4d, 0xb6, 0xbb, 0xaa, 0x86, 0x67, 0xee, 0x64, - 0xa4, 0xac, 0xfc, 0x92, 0x28, 0x26, 0x53, 0xc2, 0xbe, 0xa6, 0x6f, 0x3b, 0x02, 0xf1, 0x6e, 0x36, - 0x25, 0x68, 0x19, 0x47, 0x9b, 0x85, 0x0a, 0x11, 0x45, 0xa0, 0xe2, 0x59, 0x4a, 0x56, 0xee, 0xee, - 0x74, 0xfd, 0xf5, 0x9e, 0x82, 0x71, 0x42, 0xe9, 0x55, 0x7a, 0x9a, 0x05, 0x64, 0xdd, 0x1d, 0x5f, - 0x8d, 0x0f, 0xc2, 0x51, 0x42, 0xd4, 0xc1, 0x8e, 0xda, 0x54, 0x1d, 0xd5, 0x47, 0x7d, 0x1f, 0xa5, - 0x26, 0x72, 0x5f, 0xe5, 0x2f, 0x03, 0xed, 0xb4, 0x7a, 0x5b, 0xfb, 0xae, 0x66, 0xdd, 0xcf, 0xda, - 0x49, 0xca, 0x84, 0x6e, 0xbd, 0x6d, 0x41, 0xb7, 0x54, 0x87, 0x92, 0x5f, 0xf1, 0x51, 0x01, 0x98, - 0xea, 0x57, 0x52, 0x24, 0x0a, 0x5a, 0xb8, 0xbc, 0x48, 0xe2, 0x97, 0xe7, 0x97, 0x2a, 0x69, 0x12, - 0x47, 0xad, 0x2c, 0x6f, 0x2c, 0x29, 0xf2, 0xe6, 0xa5, 0x8d, 0xe5, 0xd5, 0xa5, 0x4a, 0xc6, 0x17, - 0xb0, 0x3f, 0x95, 0xcd, 0xdf, 0x55, 0xb9, 0x5b, 0xfa, 0x56, 0x1a, 0xca, 0xc1, 0x15, 0x18, 0x7a, - 0x1c, 0x8e, 0x89, 0x74, 0x89, 0x8d, 0x1d, 0xe5, 0x9a, 0x6e, 0xd1, 0x19, 0xd9, 0x51, 0x99, 0x77, - 0x74, 0x75, 0x62, 0x9a, 0x53, 0xad, 0x63, 0xe7, 0x59, 0xdd, 0x22, 0xf3, 0xad, 0xa3, 0x3a, 0x68, - 0x05, 0x6a, 0x86, 0xa9, 0xd8, 0x8e, 0x6a, 0x34, 0x55, 0xab, 0xa9, 0x78, 0x89, 0x2a, 0x45, 0xd5, - 0x34, 0x6c, 0xdb, 0x26, 0xf3, 0x84, 0x2e, 0xca, 0xad, 0x86, 0xb9, 0xce, 0x89, 0x3d, 0x17, 0x31, - 0xcf, 0x49, 0x43, 0xfa, 0x9b, 0x19, 0xa4, 0xbf, 0xb7, 0x40, 0xa1, 0xa3, 0x76, 0x15, 0x6c, 0x38, - 0xd6, 0x3e, 0x8d, 0xbb, 0xf3, 0x72, 0xbe, 0xa3, 0x76, 0x97, 0xc8, 0xf3, 0x3b, 0xb2, 0xfc, 0x79, - 0x2a, 0x9b, 0xcf, 0x57, 0x0a, 0x4f, 0x65, 0xf3, 0x85, 0x0a, 0x48, 0xaf, 0x65, 0xa0, 0xe4, 0x8f, - 0xc3, 0xc9, 0xb2, 0x46, 0xa3, 0x2e, 0x2b, 0x45, 0x8d, 0xda, 0xa9, 0xa1, 0x51, 0xfb, 0xdc, 0x02, - 0xf1, 0x65, 0xf5, 0x1c, 0x8b, 0x8e, 0x65, 0xc6, 0x49, 0xe2, 0x08, 0xa2, 0x6c, 0x98, 0x45, 0x23, - 0x79, 0x99, 0x3f, 0xa1, 0x0b, 0x90, 0x7b, 0xc1, 0xa6, 0xd8, 0x39, 0x8a, 0x7d, 0xc7, 0x70, 0xec, - 0xa7, 0xd6, 0x29, 0x78, 0xe1, 0xa9, 0x75, 0xe5, 0xd2, 0x65, 0x79, 0x75, 0x7e, 0x45, 0xe6, 0xec, - 0xe8, 0x38, 0x64, 0xdb, 0xea, 0x4b, 0xfb, 0x41, 0xaf, 0x47, 0x8b, 0x92, 0x0e, 0xc2, 0x71, 0xc8, - 0x5e, 0xc3, 0xea, 0x6e, 0xd0, 0xd7, 0xd0, 0xa2, 0xb7, 0x71, 0x32, 0x9c, 0x81, 0x51, 0x2a, 0x2f, - 0x04, 0xc0, 0x25, 0x56, 0x19, 0x41, 0x79, 0xc8, 0x2e, 0x5c, 0x96, 0xc9, 0x84, 0xa8, 0x40, 0x89, - 0x95, 0x2a, 0x6b, 0xcb, 0x4b, 0x0b, 0x4b, 0x95, 0xb4, 0xf4, 0x10, 0xe4, 0x98, 0x10, 0xc8, 0x64, - 0x71, 0xc5, 0x50, 0x19, 0xe1, 0x8f, 0x1c, 0x23, 0x25, 0xde, 0x6e, 0xae, 0x36, 0x96, 0xe4, 0x4a, - 0x3a, 0x38, 0xd4, 0xd9, 0xca, 0xa8, 0x64, 0x43, 0xc9, 0x1f, 0x88, 0xbf, 0x33, 0x8b, 0xec, 0xaf, - 0xa7, 0xa0, 0xe8, 0x0b, 0xac, 0x49, 0x44, 0xa4, 0xb6, 0xdb, 0xe6, 0x35, 0x45, 0x6d, 0xeb, 0xaa, - 0xcd, 0x55, 0x03, 0x68, 0xd1, 0x3c, 0x29, 0x49, 0x3a, 0x74, 0xef, 0xd0, 0x14, 0x19, 0xad, 0xe4, - 0xa4, 0xcf, 0xa6, 0xa0, 0x12, 0x8e, 0x6c, 0x43, 0xcd, 0x4c, 0xfd, 0x28, 0x9b, 0x29, 0x7d, 0x3a, - 0x05, 0xe5, 0x60, 0x38, 0x1b, 0x6a, 0xde, 0xed, 0x3f, 0xd2, 0xe6, 0xfd, 0x79, 0x1a, 0xc6, 0x03, - 0x41, 0x6c, 0xd2, 0xd6, 0xbd, 0x08, 0x93, 0x7a, 0x13, 0x77, 0xba, 0xa6, 0x83, 0x0d, 0x6d, 0x5f, - 0x69, 0xe3, 0xab, 0xb8, 0x3d, 0x23, 0x51, 0xa3, 0x71, 0x66, 0x78, 0x98, 0x3c, 0xb7, 0xec, 0xf1, - 0xad, 0x10, 0xb6, 0xfa, 0xd4, 0xf2, 0xe2, 0xd2, 0xea, 0xda, 0xe5, 0x8d, 0xa5, 0x4b, 0x0b, 0x1f, - 0x50, 0x36, 0x2f, 0x3d, 0x7d, 0xe9, 0xf2, 0xb3, 0x97, 0xe4, 0x8a, 0x1e, 0x22, 0x7b, 0x1b, 0xa7, - 0xfd, 0x1a, 0x54, 0xc2, 0x8d, 0x42, 0xc7, 0x20, 0xaa, 0x59, 0x95, 0x11, 0x34, 0x05, 0x13, 0x97, - 0x2e, 0x2b, 0xeb, 0xcb, 0x8b, 0x4b, 0xca, 0xd2, 0xf9, 0xf3, 0x4b, 0x0b, 0x1b, 0xeb, 0x2c, 0xf1, - 0xe1, 0x52, 0x6f, 0x04, 0x26, 0xb8, 0xf4, 0xa9, 0x0c, 0x4c, 0x45, 0xb4, 0x04, 0xcd, 0xf3, 0x25, - 0x0b, 0x5b, 0x45, 0xdd, 0x9f, 0xa4, 0xf5, 0x73, 0x24, 0x66, 0x58, 0x53, 0x2d, 0x87, 0xaf, 0x70, - 0x4e, 0x03, 0x91, 0x92, 0xe1, 0xe8, 0xdb, 0x3a, 0xb6, 0x78, 0x9e, 0x88, 0xad, 0x63, 0x26, 0xbc, - 0x72, 0x96, 0x2a, 0xba, 0x0f, 0x50, 0xd7, 0xb4, 0x75, 0x47, 0xbf, 0x8a, 0x15, 0xdd, 0x10, 0x49, - 0xa5, 0x2c, 0xdd, 0x65, 0xaa, 0x88, 0x37, 0xcb, 0x86, 0xe3, 0x52, 0x1b, 0xb8, 0xa5, 0x86, 0xa8, - 0x89, 0x31, 0xcf, 0xc8, 0x15, 0xf1, 0xc6, 0xa5, 0xbe, 0x1d, 0x4a, 0x4d, 0xb3, 0x47, 0x82, 0x3d, - 0x46, 0x47, 0x7c, 0x47, 0x4a, 0x2e, 0xb2, 0x32, 0x97, 0x84, 0x87, 0xf1, 0x5e, 0x36, 0xab, 0x24, - 0x17, 0x59, 0x19, 0x23, 0xb9, 0x1b, 0x26, 0xd4, 0x56, 0xcb, 0x22, 0xe0, 0x02, 0x88, 0x2d, 0x4c, - 0xca, 0x6e, 0x31, 0x25, 0xac, 0x3e, 0x05, 0x79, 0x21, 0x07, 0xe2, 0xaa, 0x89, 0x24, 0x94, 0x2e, - 0x5b, 0x6d, 0xa7, 0x67, 0x0b, 0x72, 0xde, 0x10, 0x2f, 0x6f, 0x87, 0x92, 0x6e, 0x2b, 0x5e, 0x72, - 0x3e, 0x7d, 0x32, 0x3d, 0x9b, 0x97, 0x8b, 0xba, 0xed, 0x26, 0x36, 0xa5, 0x2f, 0xa4, 0xa1, 0x1c, - 0xdc, 0x5c, 0x40, 0x8b, 0x90, 0x6f, 0x9b, 0x1a, 0xdd, 0x3d, 0xe4, 0x3b, 0x5b, 0xb3, 0x31, 0xfb, - 0x11, 0x73, 0x2b, 0x9c, 0x5e, 0x76, 0x39, 0xab, 0xff, 0x21, 0x05, 0x79, 0x51, 0x8c, 0x8e, 0x42, - 0xb6, 0xab, 0x3a, 0x3b, 0x14, 0x6e, 0xb4, 0x91, 0xae, 0xa4, 0x64, 0xfa, 0x4c, 0xca, 0xed, 0xae, - 0x6a, 0x50, 0x15, 0xe0, 0xe5, 0xe4, 0x99, 0x8c, 0x6b, 0x1b, 0xab, 0x4d, 0xba, 0xea, 0x31, 0x3b, - 0x1d, 0x6c, 0x38, 0xb6, 0x18, 0x57, 0x5e, 0xbe, 0xc0, 0x8b, 0xd1, 0xbd, 0x30, 0xe9, 0x58, 0xaa, - 0xde, 0x0e, 0xd0, 0x66, 0x29, 0x6d, 0x45, 0xbc, 0x70, 0x89, 0xeb, 0x70, 0x5c, 0xe0, 0x36, 0xb1, - 0xa3, 0x6a, 0x3b, 0xb8, 0xe9, 0x31, 0xe5, 0x68, 0x76, 0xe3, 0x18, 0x27, 0x58, 0xe4, 0xef, 0x05, - 0xaf, 0xf4, 0xad, 0x14, 0x4c, 0x8a, 0x75, 0x5a, 0xd3, 0x15, 0xd6, 0x2a, 0x80, 0x6a, 0x18, 0xa6, - 0xe3, 0x17, 0x57, 0xbf, 0x2a, 0xf7, 0xf1, 0xcd, 0xcd, 0xbb, 0x4c, 0xb2, 0x0f, 0xa0, 0xda, 0x01, - 0xf0, 0xde, 0x0c, 0x14, 0x5b, 0x0d, 0x8a, 0x7c, 0xe7, 0x88, 0x6e, 0x3f, 0xb2, 0x95, 0x3d, 0xb0, - 0x22, 0xb2, 0xa0, 0x43, 0xd3, 0x30, 0xba, 0x85, 0x5b, 0xba, 0xc1, 0xf3, 0xc1, 0xec, 0x41, 0xe4, - 0x5f, 0xb2, 0x6e, 0xfe, 0xa5, 0xf1, 0xf1, 0x14, 0x4c, 0x69, 0x66, 0x27, 0xdc, 0xde, 0x46, 0x25, - 0x94, 0x5e, 0xb0, 0x2f, 0xa6, 0x9e, 0x7f, 0xc2, 0xb7, 0xd3, 0xda, 0x32, 0xdb, 0xaa, 0xd1, 0xf2, - 0xf6, 0x4f, 0xe9, 0x0f, 0xed, 0xfe, 0x16, 0x36, 0xee, 0x6f, 0x99, 0xbe, 0xdd, 0xd4, 0x73, 0xde, - 0xcf, 0xbf, 0x4e, 0xa5, 0x3e, 0x9f, 0xce, 0x5c, 0x58, 0x6b, 0x7c, 0x31, 0x5d, 0xbd, 0xc0, 0xaa, - 0x5b, 0x13, 0xe2, 0x91, 0xf1, 0x76, 0x1b, 0x6b, 0xa4, 0xcb, 0xf0, 0xbd, 0x7b, 0x61, 0xba, 0x65, - 0xb6, 0x4c, 0x8a, 0x78, 0x86, 0xfc, 0xe2, 0x3b, 0xb2, 0x05, 0xb7, 0xb4, 0x1a, 0xbb, 0x7d, 0x5b, - 0xbf, 0x04, 0x53, 0x9c, 0x58, 0xa1, 0x5b, 0x42, 0x6c, 0x61, 0x83, 0x86, 0xa6, 0xd5, 0x66, 0x7e, - 0xff, 0x3b, 0xd4, 0xa1, 0xcb, 0x93, 0x9c, 0x95, 0xbc, 0x63, 0x6b, 0x9f, 0xba, 0x0c, 0x47, 0x02, - 0x78, 0x6c, 0xda, 0x62, 0x2b, 0x06, 0xf1, 0xdf, 0x72, 0xc4, 0x29, 0x1f, 0xe2, 0x3a, 0x67, 0xad, - 0x2f, 0xc0, 0xf8, 0x61, 0xb0, 0xfe, 0x1d, 0xc7, 0x2a, 0x61, 0x3f, 0xc8, 0x05, 0x98, 0xa0, 0x20, - 0x5a, 0xcf, 0x76, 0xcc, 0x0e, 0xb5, 0x89, 0xc3, 0x61, 0xfe, 0xe8, 0x3b, 0x6c, 0x1e, 0x95, 0x09, - 0xdb, 0x82, 0xcb, 0x55, 0xaf, 0x03, 0xdd, 0x05, 0x6b, 0x62, 0xad, 0x1d, 0x83, 0xf0, 0x0d, 0xde, - 0x10, 0x97, 0xbe, 0x7e, 0x05, 0xa6, 0xc9, 0x6f, 0x6a, 0xb2, 0xfc, 0x2d, 0x89, 0xcf, 0xc1, 0xcd, - 0x7c, 0xeb, 0xe7, 0xd8, 0x54, 0x9d, 0x72, 0x01, 0x7c, 0x6d, 0xf2, 0x8d, 0x62, 0x0b, 0x3b, 0x0e, - 0xb6, 0x6c, 0x45, 0x6d, 0x47, 0x35, 0xcf, 0x97, 0xc4, 0x98, 0xf9, 0x8d, 0x37, 0x82, 0xa3, 0x78, - 0x81, 0x71, 0xce, 0xb7, 0xdb, 0xf5, 0x4d, 0x38, 0x16, 0xa1, 0x15, 0x09, 0x30, 0x3f, 0xc5, 0x31, - 0xa7, 0xfb, 0x34, 0x83, 0xc0, 0xae, 0x81, 0x28, 0x77, 0xc7, 0x32, 0x01, 0xe6, 0x6f, 0x72, 0x4c, - 0xc4, 0x79, 0xc5, 0x90, 0x12, 0xc4, 0xa7, 0x60, 0xf2, 0x2a, 0xb6, 0xb6, 0x4c, 0x9b, 0x27, 0x8e, - 0x12, 0xc0, 0x7d, 0x9a, 0xc3, 0x4d, 0x70, 0x46, 0x9a, 0x49, 0x22, 0x58, 0x8f, 0x41, 0x7e, 0x5b, - 0xd5, 0x70, 0x02, 0x88, 0xcf, 0x70, 0x88, 0x31, 0x42, 0x4f, 0x58, 0xe7, 0xa1, 0xd4, 0x32, 0xb9, - 0xd7, 0x8a, 0x67, 0xff, 0x2c, 0x67, 0x2f, 0x0a, 0x1e, 0x0e, 0xd1, 0x35, 0xbb, 0xbd, 0x36, 0x71, - 0x69, 0xf1, 0x10, 0xbf, 0x25, 0x20, 0x04, 0x0f, 0x87, 0x38, 0x84, 0x58, 0x5f, 0x15, 0x10, 0xb6, - 0x4f, 0x9e, 0x4f, 0x42, 0xd1, 0x34, 0xda, 0xfb, 0xa6, 0x91, 0xa4, 0x11, 0x9f, 0xe3, 0x08, 0xc0, - 0x59, 0x08, 0xc0, 0x39, 0x28, 0x24, 0x1d, 0x88, 0x7f, 0xf8, 0x86, 0x98, 0x1e, 0x62, 0x04, 0x2e, - 0xc0, 0x84, 0x30, 0x50, 0xba, 0x69, 0x24, 0x80, 0xf8, 0x47, 0x1c, 0xa2, 0xec, 0x63, 0xe3, 0xdd, - 0x70, 0xb0, 0xed, 0xb4, 0x70, 0x12, 0x90, 0x2f, 0x88, 0x6e, 0x70, 0x16, 0x2e, 0xca, 0x2d, 0x6c, - 0x68, 0x3b, 0xc9, 0x10, 0x7e, 0x5b, 0x88, 0x52, 0xf0, 0x10, 0x88, 0x05, 0x18, 0xef, 0xa8, 0x96, - 0xbd, 0xa3, 0xb6, 0x13, 0x0d, 0xc7, 0x3f, 0xe6, 0x18, 0x25, 0x97, 0x89, 0x4b, 0xa4, 0x67, 0x1c, - 0x06, 0xe6, 0x8b, 0x42, 0x22, 0x3e, 0x36, 0x3e, 0xf5, 0x6c, 0x87, 0x66, 0xd9, 0x0e, 0x83, 0xf6, - 0x4f, 0xc4, 0xd4, 0x63, 0xbc, 0xab, 0x7e, 0xc4, 0x73, 0x50, 0xb0, 0xf5, 0x97, 0x12, 0xc1, 0xfc, - 0x53, 0x31, 0xd2, 0x94, 0x81, 0x30, 0x7f, 0x00, 0x8e, 0x47, 0xba, 0x89, 0x04, 0x60, 0xff, 0x8c, - 0x83, 0x1d, 0x8d, 0x70, 0x15, 0xdc, 0x24, 0x1c, 0x16, 0xf2, 0x77, 0x84, 0x49, 0xc0, 0x21, 0xac, - 0x35, 0xb2, 0x8e, 0xb0, 0xd5, 0xed, 0xc3, 0x49, 0xed, 0x77, 0x85, 0xd4, 0x18, 0x6f, 0x40, 0x6a, - 0x1b, 0x70, 0x94, 0x23, 0x1e, 0x6e, 0x5c, 0x7f, 0x4f, 0x18, 0x56, 0xc6, 0xbd, 0x19, 0x1c, 0xdd, - 0x0f, 0x42, 0xd5, 0x15, 0xa7, 0x08, 0x58, 0x6d, 0xa5, 0xa3, 0x76, 0x13, 0x20, 0xff, 0x3e, 0x47, - 0x16, 0x16, 0xdf, 0x8d, 0x78, 0xed, 0x55, 0xb5, 0x4b, 0xc0, 0x9f, 0x83, 0x19, 0x01, 0xde, 0x33, - 0x2c, 0xac, 0x99, 0x2d, 0x43, 0x7f, 0x09, 0x37, 0x13, 0x40, 0xff, 0xf3, 0xd0, 0x50, 0x6d, 0xfa, - 0xd8, 0x09, 0xf2, 0x32, 0x54, 0xdc, 0x58, 0x45, 0xd1, 0x3b, 0x5d, 0xd3, 0x72, 0x62, 0x10, 0xff, - 0x85, 0x18, 0x29, 0x97, 0x6f, 0x99, 0xb2, 0xd5, 0x97, 0xa0, 0x4c, 0x1f, 0x93, 0xaa, 0xe4, 0x97, - 0x38, 0xd0, 0xb8, 0xc7, 0xc5, 0x0d, 0x87, 0x66, 0x76, 0xba, 0xaa, 0x95, 0xc4, 0xfe, 0xfd, 0x4b, - 0x61, 0x38, 0x38, 0x0b, 0x37, 0x1c, 0xce, 0x7e, 0x17, 0x13, 0x6f, 0x9f, 0x00, 0xe1, 0xcb, 0xc2, - 0x70, 0x08, 0x1e, 0x0e, 0x21, 0x02, 0x86, 0x04, 0x10, 0x5f, 0x11, 0x10, 0x82, 0x87, 0x40, 0x3c, - 0xe3, 0x39, 0x5a, 0x0b, 0xb7, 0x74, 0xdb, 0xb1, 0x58, 0x98, 0x3c, 0x1c, 0xea, 0xab, 0x6f, 0x04, - 0x83, 0x30, 0xd9, 0xc7, 0x4a, 0x2c, 0x11, 0x4f, 0xbb, 0xd2, 0x55, 0x54, 0x7c, 0xc3, 0xbe, 0x26, - 0x2c, 0x91, 0x8f, 0x8d, 0xb4, 0xcd, 0x17, 0x21, 0x12, 0xb1, 0x6b, 0x64, 0xed, 0x90, 0x00, 0xee, - 0x0f, 0x42, 0x8d, 0x5b, 0x17, 0xbc, 0x04, 0xd3, 0x17, 0xff, 0xf4, 0x8c, 0x5d, 0xbc, 0x9f, 0x48, - 0x3b, 0xff, 0x30, 0x14, 0xff, 0x6c, 0x32, 0x4e, 0x66, 0x43, 0x26, 0x42, 0xf1, 0x14, 0x8a, 0x3b, - 0x3f, 0x34, 0xf3, 0xb7, 0xdf, 0xe4, 0xfd, 0x0d, 0x86, 0x53, 0xf5, 0x15, 0xa2, 0xe4, 0xc1, 0xa0, - 0x27, 0x1e, 0xec, 0xe7, 0xde, 0x74, 0xf5, 0x3c, 0x10, 0xf3, 0xd4, 0xcf, 0xc3, 0x78, 0x20, 0xe0, - 0x89, 0x87, 0xfa, 0x79, 0x0e, 0x55, 0xf2, 0xc7, 0x3b, 0xf5, 0x87, 0x20, 0x4b, 0x82, 0x97, 0x78, - 0xf6, 0x5f, 0xe0, 0xec, 0x94, 0xbc, 0xfe, 0x3e, 0xc8, 0x8b, 0xa0, 0x25, 0x9e, 0xf5, 0x17, 0x39, - 0xab, 0xcb, 0x42, 0xd8, 0x45, 0xc0, 0x12, 0xcf, 0xfe, 0x61, 0xc1, 0x2e, 0x58, 0x08, 0x7b, 0x72, - 0x11, 0x7e, 0xfd, 0xef, 0x64, 0xb9, 0xd3, 0x11, 0xb2, 0x3b, 0x07, 0x63, 0x3c, 0x52, 0x89, 0xe7, - 0xfe, 0x28, 0xaf, 0x5c, 0x70, 0xd4, 0x1f, 0x81, 0xd1, 0x84, 0x02, 0xff, 0x65, 0xce, 0xca, 0xe8, - 0xeb, 0x0b, 0x50, 0xf4, 0x45, 0x27, 0xf1, 0xec, 0xbf, 0xc2, 0xd9, 0xfd, 0x5c, 0xa4, 0xe9, 0x3c, - 0x3a, 0x89, 0x07, 0xf8, 0xb8, 0x68, 0x3a, 0xe7, 0x20, 0x62, 0x13, 0x81, 0x49, 0x3c, 0xf7, 0x27, - 0x84, 0xd4, 0x05, 0x4b, 0xfd, 0x49, 0x28, 0xb8, 0xce, 0x26, 0x9e, 0xff, 0xef, 0x72, 0x7e, 0x8f, - 0x87, 0x48, 0xc0, 0xe7, 0xec, 0xe2, 0x21, 0x3e, 0x29, 0x24, 0xe0, 0xe3, 0x22, 0xd3, 0x28, 0x1c, - 0xc0, 0xc4, 0x23, 0xfd, 0x3d, 0x31, 0x8d, 0x42, 0xf1, 0x0b, 0x19, 0x4d, 0x6a, 0xf3, 0xe3, 0x21, - 0x7e, 0x55, 0x8c, 0x26, 0xa5, 0x27, 0xcd, 0x08, 0x47, 0x04, 0xf1, 0x18, 0x7f, 0x5f, 0x34, 0x23, - 0x14, 0x10, 0xd4, 0xd7, 0x00, 0xf5, 0x47, 0x03, 0xf1, 0x78, 0xaf, 0x70, 0xbc, 0xc9, 0xbe, 0x60, - 0xa0, 0xfe, 0x2c, 0x1c, 0x8d, 0x8e, 0x04, 0xe2, 0x51, 0x7f, 0xe3, 0xcd, 0xd0, 0xda, 0xcd, 0x1f, - 0x08, 0xd4, 0x37, 0x3c, 0x97, 0xe2, 0x8f, 0x02, 0xe2, 0x61, 0x3f, 0xf5, 0x66, 0xd0, 0x70, 0xfb, - 0x83, 0x80, 0xfa, 0x3c, 0x80, 0xe7, 0x80, 0xe3, 0xb1, 0x3e, 0xcd, 0xb1, 0x7c, 0x4c, 0x64, 0x6a, - 0x70, 0xff, 0x1b, 0xcf, 0xff, 0x19, 0x31, 0x35, 0x38, 0x07, 0x99, 0x1a, 0xc2, 0xf5, 0xc6, 0x73, - 0x7f, 0x56, 0x4c, 0x0d, 0xc1, 0x42, 0x34, 0xdb, 0xe7, 0xdd, 0xe2, 0x11, 0x3e, 0x27, 0x34, 0xdb, - 0xc7, 0x55, 0xbf, 0x04, 0x93, 0x7d, 0x0e, 0x31, 0x1e, 0xea, 0xf3, 0x1c, 0xaa, 0x12, 0xf6, 0x87, - 0x7e, 0xe7, 0xc5, 0x9d, 0x61, 0x3c, 0xda, 0x3f, 0x08, 0x39, 0x2f, 0xee, 0x0b, 0xeb, 0xe7, 0x20, - 0x6f, 0xf4, 0xda, 0x6d, 0x32, 0x79, 0xd0, 0xf0, 0x33, 0x7f, 0x33, 0xff, 0xfd, 0x87, 0x5c, 0x3a, - 0x82, 0xa1, 0xfe, 0x10, 0x8c, 0xe2, 0xce, 0x16, 0x6e, 0xc6, 0x71, 0x7e, 0xef, 0x87, 0xc2, 0x60, - 0x12, 0xea, 0xfa, 0x93, 0x00, 0x2c, 0x35, 0x42, 0xb7, 0x07, 0x63, 0x78, 0xff, 0xc7, 0x0f, 0xf9, - 0x69, 0x1c, 0x8f, 0xc5, 0x03, 0x60, 0x67, 0x7b, 0x86, 0x03, 0xbc, 0x11, 0x04, 0xa0, 0x23, 0xf2, - 0x18, 0x8c, 0xbd, 0x60, 0x9b, 0x86, 0xa3, 0xb6, 0xe2, 0xb8, 0xff, 0x27, 0xe7, 0x16, 0xf4, 0x44, - 0x60, 0x1d, 0xd3, 0xc2, 0x8e, 0xda, 0xb2, 0xe3, 0x78, 0xff, 0x17, 0xe7, 0x75, 0x19, 0x08, 0xb3, - 0xa6, 0xda, 0x4e, 0x92, 0x7e, 0xff, 0x6f, 0xc1, 0x2c, 0x18, 0x48, 0xa3, 0xc9, 0xef, 0x5d, 0xbc, - 0x1f, 0xc7, 0xfb, 0x7d, 0xd1, 0x68, 0x4e, 0x5f, 0x7f, 0x1f, 0x14, 0xc8, 0x4f, 0x76, 0xc4, 0x2e, - 0x86, 0xf9, 0xff, 0x70, 0x66, 0x8f, 0x83, 0xd4, 0x6c, 0x3b, 0x4d, 0x47, 0x8f, 0x17, 0xf6, 0x75, - 0x3e, 0xd2, 0x82, 0xbe, 0x3e, 0x0f, 0x45, 0xdb, 0x69, 0x36, 0x7b, 0x3c, 0x3e, 0x8d, 0x61, 0xff, - 0xbf, 0x3f, 0x74, 0x53, 0x16, 0x2e, 0x0f, 0x19, 0xed, 0x6b, 0xbb, 0x4e, 0xd7, 0xa4, 0x5b, 0x20, - 0x71, 0x08, 0x6f, 0x72, 0x04, 0x1f, 0x4b, 0x7d, 0x01, 0x4a, 0xa4, 0x2f, 0x16, 0xee, 0x62, 0xba, - 0x5f, 0x15, 0x03, 0xf1, 0x97, 0x5c, 0x00, 0x01, 0xa6, 0xc6, 0x4f, 0x0f, 0xba, 0x77, 0x13, 0x9d, - 0x36, 0x86, 0x0b, 0xe6, 0x05, 0x93, 0x25, 0x8c, 0x9f, 0x97, 0x02, 0xe9, 0xe2, 0x96, 0xe9, 0x65, - 0x6b, 0xdd, 0x45, 0x0e, 0xfc, 0x41, 0x1a, 0xee, 0xa4, 0xc7, 0x7d, 0xad, 0x8e, 0x6e, 0x38, 0x67, - 0x34, 0x6b, 0xbf, 0xeb, 0x98, 0x67, 0x3a, 0xd8, 0xda, 0x6d, 0x63, 0xfe, 0x87, 0x67, 0x7f, 0x67, - 0x3c, 0xb2, 0x39, 0x46, 0x36, 0xc7, 0xde, 0x57, 0x23, 0xb3, 0xc5, 0xd2, 0x02, 0x8c, 0xad, 0x59, - 0xa6, 0xb9, 0x7d, 0xb9, 0x8b, 0x10, 0x3f, 0xc1, 0xcc, 0x4f, 0xc6, 0x51, 0x35, 0xe4, 0x37, 0x9e, - 0xd2, 0xde, 0x8d, 0x27, 0x04, 0xd9, 0xa6, 0xea, 0xa8, 0x34, 0x61, 0x5e, 0x92, 0xe9, 0x6f, 0xa9, - 0x01, 0xa3, 0x14, 0x04, 0x3d, 0x06, 0x19, 0xb3, 0x6b, 0xf3, 0xec, 0xfe, 0xed, 0x73, 0x83, 0xda, - 0x32, 0xc7, 0xab, 0x6c, 0x64, 0xbf, 0x71, 0x50, 0x1b, 0x91, 0x09, 0x4f, 0x63, 0xed, 0xaf, 0xbf, - 0x7d, 0x22, 0xf5, 0xdb, 0xaf, 0x9d, 0x48, 0x0d, 0xbc, 0xc1, 0x34, 0xe7, 0x13, 0x94, 0x4f, 0x18, - 0x83, 0xe4, 0xe2, 0xde, 0x63, 0xfa, 0xa5, 0x34, 0x9c, 0xf0, 0x11, 0xb5, 0xf5, 0x2d, 0xfb, 0xcc, - 0xee, 0x55, 0x76, 0xe5, 0x89, 0x4b, 0x0d, 0xf9, 0x5a, 0x4a, 0xde, 0xcf, 0xed, 0x5e, 0x1d, 0x20, - 0xaf, 0x39, 0xc8, 0xae, 0xa9, 0xba, 0x15, 0x71, 0x15, 0x6c, 0xda, 0x3b, 0xdc, 0x4a, 0xca, 0xd8, - 0x83, 0x74, 0x16, 0xf2, 0x4f, 0x2f, 0x3f, 0xfc, 0x60, 0x12, 0x9e, 0x0c, 0xe7, 0x69, 0xc8, 0x42, - 0x14, 0x5f, 0x8d, 0x10, 0xc7, 0xd7, 0x5f, 0x3f, 0x91, 0x8a, 0xbc, 0xd4, 0x15, 0x2d, 0x12, 0xde, - 0x5b, 0x57, 0x18, 0x9f, 0x48, 0x43, 0x2d, 0xbc, 0x2b, 0x40, 0xa6, 0xa2, 0xed, 0xa8, 0x9d, 0xee, - 0xa0, 0x3b, 0x5d, 0xe7, 0xa0, 0xb0, 0x21, 0x68, 0xd0, 0x0c, 0x8c, 0xd9, 0x58, 0x33, 0x8d, 0xa6, - 0x4d, 0x7b, 0x92, 0x91, 0xc5, 0x23, 0xe9, 0x8d, 0xa1, 0x1a, 0xa6, 0xcd, 0x8f, 0x9c, 0xb2, 0x87, - 0xc6, 0xaf, 0xa7, 0x0e, 0x37, 0x37, 0xca, 0x6e, 0x55, 0x74, 0x82, 0xac, 0xa5, 0x9e, 0xbf, 0x77, - 0xd8, 0x86, 0x0a, 0xbb, 0xb9, 0xe6, 0x76, 0xc1, 0xb7, 0x7b, 0x72, 0x22, 0xbc, 0x7b, 0xf2, 0x2c, - 0x6e, 0xb7, 0x9f, 0x36, 0xcc, 0x6b, 0xc6, 0x06, 0xe1, 0x71, 0x45, 0xf2, 0xb1, 0x34, 0x9c, 0xe8, - 0xdb, 0x28, 0xe1, 0xe6, 0x65, 0x90, 0x44, 0xea, 0x90, 0x5f, 0x14, 0x56, 0xeb, 0xb0, 0x02, 0xf9, - 0xd5, 0x43, 0x0a, 0x64, 0x5c, 0xd4, 0x24, 0xe4, 0x71, 0x4f, 0xbc, 0x3c, 0x44, 0xfb, 0x6f, 0x40, - 0x1c, 0x3f, 0xff, 0x04, 0xdc, 0xee, 0x53, 0x20, 0x75, 0x4b, 0xd3, 0xf9, 0xf5, 0x40, 0xff, 0x8c, - 0x39, 0xe2, 0x9b, 0x31, 0x84, 0x64, 0x8e, 0xbe, 0x8c, 0x9e, 0x34, 0xd5, 0x64, 0xb6, 0xab, 0x1a, - 0x33, 0x4b, 0xab, 0x71, 0x8a, 0x5b, 0x8d, 0x19, 0x46, 0xe9, 0xaf, 0x46, 0x61, 0x4c, 0xdc, 0xe5, - 0x7c, 0x14, 0xb2, 0x58, 0xdb, 0x31, 0xf9, 0x69, 0x77, 0x69, 0x2e, 0xb2, 0x3f, 0x73, 0x9c, 0x7a, - 0x49, 0xdb, 0x31, 0x2f, 0x8e, 0xc8, 0x94, 0x83, 0xde, 0x01, 0x6b, 0xf7, 0xec, 0x1d, 0x7e, 0x28, - 0xf9, 0xd4, 0x70, 0xd6, 0xf3, 0x84, 0xf4, 0xe2, 0x88, 0xcc, 0x78, 0x48, 0xb5, 0xf4, 0xfe, 0x5a, - 0x36, 0x49, 0xb5, 0xcb, 0xc6, 0x36, 0xad, 0x96, 0x70, 0xa0, 0x8b, 0x00, 0x36, 0x76, 0xc4, 0x51, - 0x86, 0x51, 0xca, 0x7f, 0xf7, 0x70, 0xfe, 0x75, 0xec, 0x30, 0xb7, 0x75, 0x71, 0x44, 0x2e, 0xd8, - 0xe2, 0x81, 0x20, 0xe9, 0x86, 0xee, 0x28, 0xda, 0x8e, 0xaa, 0x1b, 0x74, 0x0f, 0x3e, 0x16, 0x69, - 0xd9, 0xd0, 0x9d, 0x05, 0x42, 0x4e, 0x90, 0x74, 0xf1, 0x40, 0x44, 0x41, 0xef, 0x8c, 0xf2, 0x4b, - 0x56, 0x31, 0xa2, 0x78, 0x86, 0x90, 0x12, 0x51, 0x50, 0x1e, 0xf4, 0x34, 0x14, 0xe9, 0x76, 0xab, - 0xb2, 0xd5, 0x36, 0xb5, 0x5d, 0x7e, 0xb3, 0x64, 0x76, 0x38, 0x44, 0x83, 0x30, 0x34, 0x08, 0xfd, - 0xc5, 0x11, 0x19, 0xb6, 0xdc, 0x27, 0xd4, 0x80, 0x3c, 0x3b, 0xf6, 0xeb, 0xec, 0xf1, 0xbb, 0x81, - 0x77, 0x0e, 0x47, 0xa2, 0x27, 0x80, 0x37, 0xf6, 0x2e, 0x8e, 0xc8, 0x63, 0x1a, 0xfb, 0x89, 0x96, - 0xa0, 0x80, 0x8d, 0x26, 0x6f, 0x4e, 0x91, 0xdf, 0xa2, 0x1a, 0xae, 0x17, 0x46, 0x53, 0x34, 0x26, - 0x8f, 0xf9, 0x6f, 0xf4, 0x04, 0xe4, 0x34, 0xb3, 0xd3, 0xd1, 0x1d, 0x7a, 0xc7, 0xb0, 0x78, 0xf6, - 0x8e, 0x98, 0x86, 0x50, 0xda, 0x8b, 0x23, 0x32, 0xe7, 0x22, 0xc3, 0xd3, 0xc4, 0x6d, 0xfd, 0x2a, - 0xb6, 0x48, 0x67, 0xa6, 0x92, 0x0c, 0xcf, 0x22, 0xa3, 0xa7, 0xdd, 0x29, 0x34, 0xc5, 0x43, 0x63, - 0x8c, 0xbb, 0x17, 0xe9, 0x6e, 0x28, 0xfa, 0x34, 0x99, 0x58, 0x2c, 0xbe, 0x02, 0xe1, 0xce, 0x5e, - 0x3c, 0x4a, 0x65, 0x28, 0xf9, 0xf5, 0x56, 0xea, 0xb8, 0x8c, 0x74, 0x13, 0x7f, 0x06, 0xc6, 0xae, - 0x62, 0xcb, 0x66, 0x3b, 0xf8, 0x94, 0x91, 0x3f, 0xa2, 0x53, 0x30, 0x4e, 0xe5, 0xa6, 0x88, 0xf7, - 0xec, 0x5a, 0x72, 0x89, 0x16, 0x5e, 0xe1, 0x44, 0x35, 0x28, 0x76, 0xcf, 0x76, 0x5d, 0x12, 0x76, - 0x37, 0x1a, 0xba, 0x67, 0xbb, 0x9c, 0x40, 0xaa, 0x43, 0x25, 0xac, 0xba, 0x7e, 0xaf, 0x59, 0x88, - 0xf0, 0x9a, 0x05, 0xe1, 0x69, 0x7f, 0x2f, 0xed, 0x32, 0xbb, 0xda, 0x4a, 0xa6, 0x1b, 0x31, 0x12, - 0x94, 0xbb, 0x78, 0xb6, 0xda, 0x17, 0xda, 0xb9, 0xbe, 0xa6, 0x91, 0x27, 0xa1, 0xc8, 0x27, 0xfe, - 0xac, 0x96, 0x92, 0x29, 0x07, 0x3a, 0x4e, 0x14, 0x4a, 0xd5, 0x0d, 0x45, 0x6f, 0x8a, 0xdb, 0xc4, - 0xf4, 0x79, 0xb9, 0x89, 0x9e, 0x81, 0x8a, 0x66, 0x1a, 0x36, 0x36, 0xec, 0x9e, 0xad, 0x74, 0x55, - 0x4b, 0xed, 0x78, 0x97, 0xee, 0xa2, 0x87, 0x69, 0x41, 0x90, 0xaf, 0x51, 0x6a, 0x79, 0x42, 0x0b, - 0x16, 0xa0, 0x15, 0x80, 0xab, 0x6a, 0x5b, 0x6f, 0xaa, 0x8e, 0x69, 0xd9, 0xfc, 0x72, 0xca, 0x20, - 0xb0, 0x2b, 0x82, 0x70, 0xb3, 0xdb, 0x54, 0x1d, 0xcc, 0x83, 0x28, 0x1f, 0x3f, 0xba, 0x0b, 0x26, - 0xd4, 0x6e, 0x57, 0xb1, 0x1d, 0xd5, 0xc1, 0xca, 0xd6, 0xbe, 0x83, 0x6d, 0x6a, 0x2f, 0x4a, 0xf2, - 0xb8, 0xda, 0xed, 0xae, 0x93, 0xd2, 0x06, 0x29, 0x94, 0x9a, 0xee, 0x68, 0xd3, 0xa9, 0xe9, 0xc6, - 0x76, 0x29, 0x2f, 0xb6, 0x23, 0x65, 0xf4, 0x68, 0x05, 0x93, 0x81, 0x38, 0x8d, 0x92, 0xdb, 0xc1, - 0x7a, 0x6b, 0x87, 0x5d, 0x6f, 0xcf, 0xc8, 0xfc, 0x89, 0x0c, 0x4c, 0xd7, 0x32, 0xaf, 0x62, 0x7e, - 0xb3, 0x9d, 0x3d, 0x48, 0xbf, 0x96, 0x86, 0xc9, 0xbe, 0xe9, 0x4b, 0x70, 0xe9, 0x01, 0x7f, 0x5e, - 0x17, 0xf9, 0x8d, 0xce, 0x11, 0x5c, 0xb5, 0xc9, 0x2f, 0xad, 0x14, 0xcf, 0xde, 0x36, 0x40, 0x02, - 0x17, 0x29, 0x11, 0xef, 0x38, 0x67, 0x41, 0x9b, 0x50, 0x69, 0xab, 0xb6, 0xa3, 0xb0, 0x59, 0xc4, - 0x6e, 0x09, 0x67, 0x86, 0x5a, 0x82, 0x15, 0x55, 0xcc, 0x3e, 0xa2, 0xdc, 0x1c, 0xae, 0xdc, 0x0e, - 0x94, 0xa2, 0xe7, 0x60, 0x7a, 0x6b, 0xff, 0x25, 0xd5, 0x70, 0x74, 0x83, 0x1e, 0x36, 0x0a, 0x8e, - 0x51, 0x6d, 0x00, 0xf4, 0xd2, 0x55, 0xbd, 0x89, 0x0d, 0x4d, 0x0c, 0xce, 0x94, 0x0b, 0xe1, 0x0e, - 0x9e, 0x2d, 0x3d, 0x07, 0xe5, 0xa0, 0x2d, 0x42, 0x65, 0x48, 0x3b, 0x7b, 0x5c, 0x22, 0x69, 0x67, - 0x0f, 0x3d, 0xcc, 0x23, 0xf2, 0x34, 0x3d, 0x2d, 0x37, 0xc8, 0x59, 0x70, 0x6e, 0xef, 0x2e, 0xa1, - 0x24, 0xb9, 0x33, 0xc1, 0x35, 0x0c, 0x61, 0x6c, 0xe9, 0x34, 0x4c, 0x84, 0x8c, 0x98, 0x6f, 0x58, - 0x53, 0xfe, 0x61, 0x95, 0x26, 0x60, 0x3c, 0x60, 0xab, 0xa4, 0x3f, 0xce, 0x41, 0xde, 0xfd, 0x46, - 0xc1, 0x45, 0x28, 0xe0, 0x3d, 0x0d, 0x77, 0x1d, 0x61, 0x15, 0x86, 0x19, 0x71, 0xc6, 0xb3, 0x24, - 0xe8, 0x89, 0xb9, 0x72, 0x99, 0xd1, 0x63, 0x01, 0x97, 0x7c, 0x2a, 0x0e, 0xc4, 0xef, 0x93, 0x1f, - 0x0f, 0xfa, 0xe4, 0x3b, 0x62, 0x78, 0x43, 0x4e, 0xf9, 0xb1, 0x80, 0x53, 0x8e, 0xab, 0x38, 0xe0, - 0x95, 0x97, 0x23, 0xbc, 0x72, 0x5c, 0xf7, 0x07, 0xb8, 0xe5, 0xe5, 0x08, 0xb7, 0x3c, 0x1b, 0xdb, - 0x96, 0x48, 0xbf, 0xfc, 0x78, 0xd0, 0x2f, 0xc7, 0x89, 0x23, 0xe4, 0x98, 0x57, 0xa2, 0x1c, 0xf3, - 0xe9, 0x18, 0x8c, 0x81, 0x9e, 0x79, 0xa1, 0xcf, 0x33, 0xdf, 0x15, 0x03, 0x15, 0xe1, 0x9a, 0x97, - 0x03, 0x3e, 0x11, 0x12, 0xc9, 0x26, 0xda, 0x29, 0xa2, 0xf3, 0xfd, 0x5e, 0xfe, 0xee, 0x38, 0x55, - 0x8b, 0x72, 0xf3, 0x4f, 0x86, 0xdc, 0xfc, 0x9d, 0x71, 0xbd, 0x0a, 0xf9, 0x79, 0xcf, 0x3b, 0x9f, - 0x26, 0xf6, 0x31, 0x34, 0x33, 0x88, 0x2d, 0xc5, 0x96, 0x65, 0x5a, 0xdc, 0xf1, 0xb1, 0x07, 0x69, - 0x96, 0x58, 0x6c, 0x4f, 0xff, 0x87, 0x78, 0x72, 0x3a, 0x69, 0x7d, 0xda, 0x2e, 0x7d, 0x35, 0xe5, - 0xf1, 0x52, 0xcb, 0xe6, 0xb7, 0xf6, 0x05, 0x6e, 0xed, 0x7d, 0x0e, 0x3e, 0x1d, 0x74, 0xf0, 0x35, - 0x28, 0x12, 0x9f, 0x12, 0xf2, 0xdd, 0x6a, 0x57, 0xf8, 0x6e, 0x74, 0x0f, 0x4c, 0x52, 0xfb, 0xcb, - 0xc2, 0x00, 0x6e, 0x48, 0xb2, 0xd4, 0x90, 0x4c, 0x90, 0x17, 0x4c, 0x82, 0xcc, 0x51, 0xdc, 0x0f, - 0x53, 0x3e, 0x5a, 0x82, 0x4b, 0x7d, 0x01, 0x73, 0x52, 0x15, 0x97, 0x7a, 0xbe, 0xdb, 0xbd, 0xa8, - 0xda, 0x3b, 0xd2, 0xaa, 0x27, 0x20, 0x2f, 0x2e, 0x40, 0x90, 0xd5, 0xcc, 0x26, 0xeb, 0xf7, 0xb8, - 0x4c, 0x7f, 0x93, 0x58, 0xa1, 0x6d, 0xb6, 0xf8, 0x09, 0x48, 0xf2, 0x93, 0x50, 0xb9, 0x53, 0xbb, - 0xc0, 0xe6, 0xac, 0xf4, 0xa5, 0x94, 0x87, 0xe7, 0x85, 0x0a, 0x51, 0x5e, 0x3d, 0x75, 0x33, 0xbd, - 0x7a, 0xfa, 0xad, 0x79, 0x75, 0xe9, 0xcd, 0x94, 0x37, 0xa4, 0xae, 0xbf, 0xbe, 0x31, 0x11, 0x10, - 0xed, 0x62, 0x37, 0xc1, 0xd9, 0x49, 0x5d, 0xf6, 0x20, 0x42, 0xad, 0x5c, 0x44, 0x82, 0x62, 0xcc, - 0x97, 0xd4, 0x40, 0x0f, 0x51, 0x3f, 0x6f, 0x6e, 0x73, 0xd3, 0x50, 0x8b, 0x49, 0xf4, 0xc8, 0x8c, - 0xda, 0xe7, 0x5f, 0x0a, 0x81, 0xb0, 0xe1, 0x56, 0x28, 0x90, 0xa6, 0xb3, 0xeb, 0x4f, 0xc0, 0xd3, - 0x8b, 0xa2, 0x40, 0x6a, 0x02, 0xea, 0xb7, 0x31, 0xe8, 0x12, 0xe4, 0xf0, 0x55, 0x7a, 0x1a, 0x95, - 0x25, 0x9b, 0x6e, 0x1d, 0xe8, 0x88, 0xb1, 0xe1, 0x34, 0x66, 0x88, 0x30, 0xbf, 0x77, 0x50, 0xab, - 0x30, 0x9e, 0xfb, 0xcc, 0x8e, 0xee, 0xe0, 0x4e, 0xd7, 0xd9, 0x97, 0x39, 0x8a, 0xf4, 0xe1, 0x34, - 0xf1, 0x87, 0x01, 0xfb, 0x13, 0x29, 0x5e, 0x31, 0x69, 0xd2, 0xbe, 0x10, 0x29, 0x99, 0xc8, 0x6f, - 0x03, 0x68, 0xa9, 0xb6, 0x72, 0x4d, 0x35, 0x1c, 0xdc, 0xe4, 0x72, 0x2f, 0xb4, 0x54, 0xfb, 0x59, - 0x5a, 0x40, 0xe2, 0x4d, 0xf2, 0xba, 0x67, 0xe3, 0x26, 0x1d, 0x80, 0x8c, 0x3c, 0xd6, 0x52, 0xed, - 0x4d, 0x1b, 0x37, 0x7d, 0x7d, 0x1d, 0xbb, 0x19, 0x7d, 0x0d, 0xca, 0x3b, 0x1f, 0x96, 0xf7, 0x47, - 0xd3, 0xde, 0xec, 0xf0, 0xc2, 0x87, 0x1f, 0x4f, 0x59, 0x7c, 0x86, 0xae, 0x29, 0x82, 0x4e, 0x00, - 0x7d, 0x00, 0x26, 0xdd, 0x59, 0xa9, 0xf4, 0xe8, 0x6c, 0x15, 0x5a, 0x78, 0xb8, 0xc9, 0x5d, 0xb9, - 0x1a, 0x2c, 0xb6, 0xd1, 0xcf, 0xc0, 0xb1, 0x90, 0x0d, 0x72, 0x2b, 0x48, 0x1f, 0xca, 0x14, 0x1d, - 0x09, 0x9a, 0x22, 0x81, 0xef, 0x49, 0x2f, 0x73, 0x53, 0x66, 0xcd, 0x1d, 0x24, 0x84, 0xf5, 0xbb, - 0xb7, 0x28, 0x9d, 0x90, 0xfe, 0x24, 0x05, 0x13, 0xa1, 0x06, 0xa2, 0x47, 0x61, 0x94, 0x79, 0xe0, - 0xd4, 0xd0, 0x44, 0x08, 0x95, 0x38, 0xef, 0x13, 0x63, 0x40, 0xf3, 0x90, 0xc7, 0x3c, 0xba, 0xe6, - 0x42, 0xb9, 0x33, 0x26, 0x08, 0xe7, 0xfc, 0x2e, 0x1b, 0x5a, 0x84, 0x82, 0x2b, 0xfa, 0x98, 0x95, - 0x9b, 0x3b, 0x72, 0x1c, 0xc4, 0x63, 0x94, 0x16, 0xa0, 0xe8, 0x6b, 0x1e, 0xbb, 0x0b, 0xb8, 0xc7, - 0x97, 0x5b, 0x2c, 0x80, 0xce, 0x77, 0xd4, 0x3d, 0xba, 0xd2, 0x42, 0xc7, 0x60, 0x8c, 0xbc, 0x6c, - 0xf1, 0xcb, 0x52, 0x19, 0x39, 0xd7, 0x51, 0xf7, 0x2e, 0xa8, 0xb6, 0xf4, 0xb1, 0x14, 0x94, 0x83, - 0xed, 0x44, 0xf7, 0x02, 0x22, 0xb4, 0x6a, 0x0b, 0x2b, 0x46, 0xaf, 0xc3, 0x7c, 0xa4, 0x40, 0x9c, - 0xe8, 0xa8, 0x7b, 0xf3, 0x2d, 0x7c, 0xa9, 0xd7, 0xa1, 0x55, 0xdb, 0x68, 0x15, 0x2a, 0x82, 0x58, - 0x24, 0xbb, 0xb8, 0x54, 0x8e, 0xf7, 0x7f, 0xaf, 0x86, 0x13, 0xb0, 0xb5, 0xee, 0x2b, 0x64, 0xad, - 0x5b, 0x66, 0x78, 0xe2, 0x8d, 0xf4, 0x10, 0x4c, 0x84, 0x7a, 0x8c, 0x24, 0x18, 0xef, 0xf6, 0xb6, - 0x94, 0x5d, 0xbc, 0x4f, 0xaf, 0xbf, 0x33, 0x55, 0x2f, 0xc8, 0xc5, 0x6e, 0x6f, 0xeb, 0x69, 0xbc, - 0x4f, 0x73, 0x87, 0x92, 0x06, 0xe5, 0xe0, 0x62, 0x8a, 0x38, 0x0e, 0xcb, 0xec, 0x19, 0x4d, 0xf1, - 0x61, 0x03, 0xfa, 0x80, 0xce, 0xc1, 0xe8, 0x55, 0x93, 0x69, 0xf3, 0xb0, 0xd5, 0xd3, 0x15, 0xd3, - 0xc1, 0xbe, 0x25, 0x19, 0xe3, 0x91, 0x6c, 0x18, 0xa5, 0x7a, 0x19, 0xb9, 0x51, 0x71, 0x05, 0x40, - 0x75, 0x1c, 0x4b, 0xdf, 0xea, 0x79, 0xf0, 0x33, 0x73, 0xfd, 0x69, 0xfd, 0xb9, 0x35, 0x55, 0xb7, - 0x1a, 0xb7, 0x72, 0xcd, 0x9e, 0xf6, 0x78, 0x7c, 0xda, 0xed, 0x43, 0x92, 0xde, 0xc8, 0x42, 0x8e, - 0x2d, 0x37, 0xd1, 0x13, 0xc1, 0xe4, 0x47, 0xf1, 0xec, 0x89, 0x41, 0xcd, 0x67, 0x54, 0xbc, 0xf5, - 0x6e, 0x04, 0x75, 0x57, 0x38, 0xa3, 0xd0, 0x28, 0xbe, 0x76, 0x50, 0x1b, 0xa3, 0xd1, 0xc7, 0xf2, - 0xa2, 0x97, 0x5e, 0x18, 0xb4, 0xba, 0x16, 0xb9, 0x8c, 0xec, 0xa1, 0x73, 0x19, 0x17, 0x61, 0xdc, - 0x17, 0x6e, 0xe9, 0x4d, 0xbe, 0x4e, 0x39, 0x31, 0x6c, 0xd2, 0x2d, 0x2f, 0xf2, 0xf6, 0x17, 0xdd, - 0x70, 0x6c, 0xb9, 0x89, 0x66, 0x83, 0x8b, 0x6c, 0x1a, 0xb5, 0xb1, 0x70, 0xc1, 0xb7, 0x6e, 0xa6, - 0x77, 0xf2, 0x6f, 0x81, 0x02, 0xbd, 0xd8, 0x4c, 0x49, 0x58, 0xf4, 0x90, 0x27, 0x05, 0xf4, 0xe5, - 0xdd, 0x30, 0xe1, 0x05, 0x36, 0x8c, 0x24, 0xcf, 0x50, 0xbc, 0x62, 0x4a, 0xf8, 0x00, 0x4c, 0xd3, - 0x0f, 0xe0, 0x85, 0xa9, 0x0b, 0x94, 0x1a, 0x91, 0x77, 0x57, 0x82, 0x1c, 0x77, 0x42, 0xd9, 0x33, - 0xa1, 0x94, 0x16, 0x58, 0xea, 0xc3, 0x2d, 0xa5, 0x64, 0xc7, 0x21, 0xef, 0x86, 0x9d, 0x45, 0xf6, - 0x65, 0x3d, 0x95, 0x45, 0x9b, 0x6e, 0x20, 0x6b, 0x61, 0xbb, 0xd7, 0x76, 0x38, 0x48, 0x89, 0xd2, - 0xd0, 0x40, 0x56, 0x66, 0xe5, 0x94, 0xf6, 0x14, 0x8c, 0x0b, 0xab, 0xc2, 0xe8, 0xc6, 0x29, 0x5d, - 0x49, 0x14, 0x52, 0xa2, 0xd3, 0x50, 0xe9, 0x5a, 0x66, 0xd7, 0xb4, 0xb1, 0xa5, 0xa8, 0xcd, 0xa6, - 0x85, 0x6d, 0x7b, 0xa6, 0xcc, 0xf0, 0x44, 0xf9, 0x3c, 0x2b, 0x96, 0xde, 0x03, 0x63, 0x22, 0x9e, - 0x9e, 0x86, 0xd1, 0x86, 0x6b, 0x21, 0xb3, 0x32, 0x7b, 0x20, 0xfe, 0x75, 0xbe, 0xdb, 0xe5, 0xd9, - 0x35, 0xf2, 0x53, 0x6a, 0xc3, 0x18, 0x1f, 0xb0, 0xc8, 0x9c, 0xca, 0x2a, 0x94, 0xba, 0xaa, 0x45, - 0xba, 0xe1, 0xcf, 0xac, 0x0c, 0x5a, 0x11, 0xae, 0xa9, 0x96, 0xb3, 0x8e, 0x9d, 0x40, 0x82, 0xa5, - 0x48, 0xf9, 0x59, 0x91, 0xf4, 0x18, 0x8c, 0x07, 0x68, 0xbc, 0xef, 0x10, 0xf2, 0x89, 0x4e, 0x1f, - 0xdc, 0x96, 0xa4, 0xbd, 0x96, 0x48, 0xe7, 0xa0, 0xe0, 0x8e, 0x15, 0x59, 0x68, 0x08, 0x51, 0xf0, - 0x0f, 0x1b, 0xf2, 0x47, 0x9a, 0x44, 0x32, 0xaf, 0xf1, 0x4f, 0x34, 0x65, 0x64, 0xf6, 0x20, 0x61, - 0x9f, 0x61, 0x62, 0xde, 0x0c, 0x3d, 0x0e, 0x63, 0xdc, 0x30, 0xf1, 0xf9, 0x38, 0x28, 0x5d, 0xb4, - 0x46, 0x2d, 0x95, 0x48, 0x17, 0x31, 0xbb, 0xe5, 0x55, 0x93, 0xf6, 0x57, 0xf3, 0x21, 0xc8, 0x0b, - 0xe3, 0x13, 0xf4, 0x12, 0xac, 0x86, 0x93, 0x71, 0x5e, 0x82, 0x57, 0xe2, 0x31, 0x12, 0x6d, 0xb2, - 0xf5, 0x96, 0x81, 0x9b, 0x8a, 0x37, 0x05, 0xf9, 0x85, 0xd9, 0x09, 0xf6, 0x62, 0x45, 0xcc, 0x2f, - 0xe9, 0x01, 0xc8, 0xb1, 0xb6, 0x46, 0x9a, 0xb8, 0x28, 0xd7, 0xfa, 0x9d, 0x14, 0xe4, 0x85, 0xfb, - 0x88, 0x64, 0x0a, 0x74, 0x22, 0x7d, 0xa3, 0x9d, 0xb8, 0xf9, 0x26, 0xe9, 0x3e, 0x40, 0x54, 0x53, - 0x94, 0xab, 0xa6, 0xa3, 0x1b, 0x2d, 0x85, 0x8d, 0x05, 0xbf, 0x37, 0x48, 0xdf, 0x5c, 0xa1, 0x2f, - 0xd6, 0x48, 0xf9, 0x3d, 0xa7, 0xa0, 0xe8, 0xcb, 0x72, 0xa1, 0x31, 0xc8, 0x5c, 0xc2, 0xd7, 0x2a, - 0x23, 0xa8, 0x08, 0x63, 0x32, 0xa6, 0x39, 0x82, 0x4a, 0xea, 0xec, 0x1b, 0x63, 0x30, 0x31, 0xdf, - 0x58, 0x58, 0x9e, 0xef, 0x76, 0xdb, 0x3a, 0xbf, 0x4f, 0x77, 0x19, 0xb2, 0x74, 0x9d, 0x9c, 0x60, - 0x7f, 0xa7, 0x9a, 0x24, 0xe1, 0x84, 0x64, 0x18, 0xa5, 0xcb, 0x69, 0x94, 0x64, 0xdb, 0xa7, 0x9a, - 0x28, 0x0f, 0x45, 0x1a, 0x49, 0x15, 0x2e, 0xc1, 0x6e, 0x50, 0x35, 0x49, 0x72, 0x0a, 0xfd, 0x0c, - 0x14, 0xbc, 0x75, 0x72, 0xd2, 0x3d, 0xa2, 0x6a, 0xe2, 0xb4, 0x15, 0xc1, 0xf7, 0x56, 0x06, 0x49, - 0xb7, 0x26, 0xaa, 0x89, 0xf3, 0x35, 0xe8, 0x39, 0x18, 0x13, 0x6b, 0xb0, 0x64, 0xbb, 0x38, 0xd5, - 0x84, 0x29, 0x25, 0x32, 0x7c, 0x6c, 0xe9, 0x9c, 0x64, 0xab, 0xaa, 0x9a, 0x28, 0x6f, 0x86, 0x36, - 0x21, 0xc7, 0x83, 0xdf, 0x44, 0x3b, 0x3d, 0xd5, 0x64, 0x89, 0x22, 0x22, 0x64, 0x2f, 0x39, 0x91, - 0x74, 0x7b, 0xae, 0x9a, 0x38, 0x61, 0x88, 0x54, 0x00, 0xdf, 0x7a, 0x3a, 0xf1, 0xbe, 0x5b, 0x35, - 0x79, 0x22, 0x10, 0x7d, 0x10, 0xf2, 0xee, 0xaa, 0x29, 0xe1, 0x4e, 0x5a, 0x35, 0x69, 0x2e, 0xae, - 0xb1, 0x99, 0xf8, 0x94, 0xc4, 0xbd, 0xb1, 0xa7, 0x24, 0xbc, 0x4d, 0x6e, 0x77, 0x1b, 0xfc, 0x2f, - 0x53, 0x70, 0x3c, 0xbc, 0x9d, 0xac, 0x1a, 0xfb, 0x03, 0x0e, 0x04, 0x0c, 0x38, 0x2d, 0xf2, 0x38, - 0x64, 0xe6, 0x8d, 0x7d, 0x12, 0x6c, 0xd0, 0x6f, 0xfb, 0xf5, 0xac, 0xb6, 0x48, 0xd3, 0x91, 0xe7, - 0x4d, 0xab, 0x1d, 0x7d, 0x6a, 0xa4, 0x9e, 0xfd, 0xfe, 0xe7, 0x6a, 0x23, 0x8d, 0xdd, 0x88, 0x5e, - 0xc5, 0x9c, 0x15, 0xc8, 0xcf, 0x1b, 0xfb, 0xe2, 0x98, 0xc0, 0x28, 0xed, 0xd0, 0x61, 0xb7, 0xff, - 0x5f, 0x2f, 0x11, 0x64, 0xdf, 0xf7, 0x81, 0x79, 0x8f, 0x73, 0xec, 0x69, 0xc0, 0x0e, 0x7f, 0xfc, - 0x89, 0x81, 0xea, 0x60, 0x69, 0x4a, 0x17, 0x20, 0xbb, 0x60, 0xea, 0x34, 0xe4, 0x69, 0x62, 0xc3, - 0xec, 0x88, 0x9c, 0x27, 0x7d, 0x40, 0xa7, 0x20, 0xa7, 0x76, 0xcc, 0x9e, 0xe1, 0x88, 0xa8, 0x99, - 0xb8, 0x92, 0xff, 0x7a, 0x50, 0xcb, 0x2c, 0x1b, 0x8e, 0xcc, 0x5f, 0xd5, 0xb3, 0xdf, 0x7d, 0xb5, - 0x96, 0x92, 0x9e, 0x82, 0xb1, 0x45, 0xac, 0xdd, 0x08, 0xd6, 0x22, 0xd6, 0x42, 0x58, 0xa7, 0x21, - 0xbf, 0x6c, 0x38, 0xec, 0xa3, 0x61, 0xb7, 0x41, 0x46, 0x37, 0xd8, 0xb6, 0x48, 0xa8, 0x7e, 0x52, - 0x4e, 0x48, 0x17, 0xb1, 0xe6, 0x92, 0x36, 0xb1, 0x16, 0x26, 0x25, 0xf0, 0xa4, 0x5c, 0x6a, 0x40, - 0xe9, 0x8a, 0xda, 0xe6, 0xe1, 0x1e, 0xb6, 0xd1, 0x7d, 0x50, 0x50, 0xc5, 0x03, 0x5d, 0x59, 0x95, - 0x1a, 0xe5, 0x1f, 0x1c, 0xd4, 0xc0, 0x23, 0x92, 0x3d, 0x82, 0x7a, 0xf6, 0xe5, 0xff, 0x76, 0x32, - 0x25, 0x99, 0x30, 0x76, 0x41, 0xb5, 0xa9, 0xa5, 0x7f, 0x30, 0x90, 0x48, 0xa1, 0x91, 0x62, 0xe3, - 0xc8, 0xf5, 0x83, 0xda, 0xe4, 0xbe, 0xda, 0x69, 0xd7, 0x25, 0xef, 0x9d, 0xe4, 0xcf, 0xaf, 0xcc, - 0xf9, 0xf2, 0x2b, 0x34, 0x92, 0x6c, 0x4c, 0x5d, 0x3f, 0xa8, 0x4d, 0x78, 0x3c, 0xe4, 0x8d, 0xe4, - 0x26, 0x5d, 0xa4, 0x2e, 0xe4, 0x58, 0xd0, 0x1b, 0xb9, 0x43, 0xc8, 0x53, 0x3e, 0x69, 0x2f, 0xe5, - 0x53, 0x3f, 0x54, 0x9a, 0x81, 0xc7, 0x65, 0x8c, 0xa3, 0x9e, 0xfd, 0xc8, 0xab, 0xb5, 0x11, 0xc9, - 0x02, 0xb4, 0xae, 0x77, 0x7a, 0x6d, 0x76, 0xf1, 0x5b, 0x6c, 0x35, 0x3d, 0xc8, 0xda, 0x4d, 0xd3, - 0x49, 0x2c, 0x20, 0x9b, 0x98, 0xe3, 0x4a, 0xca, 0x05, 0xc2, 0xe2, 0x8c, 0x6f, 0x1e, 0xd4, 0x52, - 0xb4, 0xf5, 0x54, 0x46, 0x77, 0x41, 0x8e, 0x85, 0xf2, 0x3c, 0xfe, 0x29, 0x0b, 0x1e, 0xd6, 0x27, - 0x99, 0xbf, 0x95, 0x9e, 0x80, 0xb1, 0x55, 0xbb, 0xb5, 0x48, 0xba, 0x74, 0x1c, 0xf2, 0x1d, 0xbb, - 0xa5, 0xf8, 0xa2, 0xa9, 0xb1, 0x8e, 0xdd, 0xda, 0x18, 0x10, 0x85, 0xf1, 0x61, 0x79, 0x2f, 0xe4, - 0x36, 0xf6, 0x28, 0xfb, 0x29, 0x57, 0x4a, 0x19, 0x7f, 0x1b, 0x39, 0x7a, 0x80, 0xe9, 0xe7, 0x33, - 0x00, 0x1b, 0x7b, 0x6e, 0x0f, 0x07, 0x6c, 0xc1, 0x21, 0x09, 0x72, 0xce, 0x9e, 0x1b, 0x51, 0x17, - 0x1a, 0xf0, 0xda, 0x41, 0x2d, 0xb7, 0xb1, 0x47, 0x96, 0x17, 0x32, 0x7f, 0x13, 0x4c, 0x65, 0x65, - 0x42, 0xa9, 0x2c, 0x37, 0x81, 0x97, 0x8d, 0x48, 0xe0, 0x8d, 0xfa, 0x76, 0x00, 0x8e, 0xc1, 0x98, - 0xa5, 0x5e, 0x53, 0xc8, 0x88, 0xb2, 0xaf, 0x90, 0xe6, 0x2c, 0xf5, 0xda, 0x8a, 0xd9, 0x42, 0x0b, - 0x90, 0x6d, 0x9b, 0x2d, 0x91, 0x77, 0x3b, 0x2a, 0x3a, 0x45, 0x22, 0x2e, 0x7e, 0x9a, 0x78, 0xc5, - 0x6c, 0x35, 0x8e, 0x11, 0xf9, 0x7f, 0xf1, 0xcf, 0x6a, 0x13, 0xc1, 0x72, 0x5b, 0xa6, 0xcc, 0x6e, - 0x32, 0x30, 0x3f, 0x30, 0x19, 0x58, 0x18, 0x96, 0x0c, 0x84, 0x60, 0x32, 0xf0, 0x0e, 0xba, 0xa7, - 0xc9, 0xf6, 0x70, 0xa6, 0xfb, 0x82, 0xcf, 0x79, 0x63, 0x9f, 0xee, 0xa2, 0xde, 0x0a, 0x05, 0xf7, - 0xa0, 0x10, 0xff, 0xec, 0xb3, 0x57, 0xc0, 0xf5, 0xed, 0x23, 0x29, 0x28, 0x07, 0x5b, 0x4c, 0xf3, - 0x39, 0x76, 0x8b, 0x7f, 0x30, 0x95, 0xa5, 0x3d, 0x89, 0x52, 0x2c, 0x8b, 0x4c, 0x79, 0x48, 0xe7, - 0xe7, 0x43, 0x3a, 0x3f, 0x25, 0x04, 0xc4, 0xee, 0xee, 0x30, 0x55, 0x9f, 0xe6, 0xd2, 0x29, 0xf9, - 0x0a, 0x6d, 0x4f, 0xf5, 0xa9, 0x46, 0xfc, 0x2c, 0x14, 0x7d, 0x6f, 0x23, 0x83, 0xfa, 0x47, 0x22, - 0x92, 0x1d, 0x93, 0xee, 0x80, 0x88, 0x37, 0x62, 0x0b, 0xc1, 0x23, 0x75, 0x15, 0xb5, 0xe0, 0x12, - 0x25, 0x3d, 0x5e, 0xd1, 0x58, 0xfc, 0xd3, 0x6f, 0x9f, 0x18, 0x79, 0xf9, 0xb5, 0x13, 0x23, 0x03, - 0xcf, 0x67, 0x4a, 0xf1, 0x5f, 0x98, 0x77, 0xbd, 0xcc, 0x47, 0xdf, 0x0f, 0xb7, 0x72, 0x1a, 0xdb, - 0x51, 0x77, 0x75, 0xa3, 0x25, 0xfe, 0x72, 0x77, 0x53, 0xe6, 0xbd, 0xe1, 0xa5, 0x37, 0xee, 0x76, - 0xde, 0xea, 0xa1, 0xb1, 0x6a, 0x94, 0x37, 0x94, 0x0e, 0xb2, 0x80, 0x56, 0xed, 0xd6, 0x82, 0x85, - 0xd9, 0xc7, 0x46, 0xf8, 0x3a, 0x29, 0x78, 0xd9, 0x87, 0xdb, 0xa8, 0x5b, 0xe6, 0x82, 0x7d, 0x71, - 0xbf, 0x1b, 0xed, 0xe5, 0x88, 0x02, 0x57, 0x84, 0x96, 0x00, 0x68, 0x7a, 0xc5, 0xb6, 0xbd, 0x64, - 0x5e, 0x2d, 0x8c, 0xb1, 0xe0, 0x52, 0xc8, 0xaa, 0x83, 0x6d, 0x31, 0xd6, 0x1e, 0x23, 0xfa, 0x10, - 0x4c, 0x75, 0x74, 0x43, 0xb1, 0x71, 0x7b, 0x5b, 0x69, 0xe2, 0x36, 0xfd, 0x14, 0x0b, 0xdf, 0xb8, - 0x2b, 0x34, 0x56, 0xb8, 0x63, 0xba, 0x2b, 0x7e, 0xcc, 0xe6, 0x96, 0x0d, 0xe7, 0xfa, 0x41, 0xad, - 0xca, 0xbc, 0x43, 0x04, 0xa4, 0x24, 0x4f, 0x76, 0x74, 0x63, 0x1d, 0xb7, 0xb7, 0x17, 0xdd, 0x32, - 0xf4, 0x12, 0x4c, 0x72, 0x0a, 0xd3, 0x4b, 0x7a, 0x10, 0xdb, 0x53, 0x6a, 0xac, 0x5e, 0x3f, 0xa8, - 0xcd, 0x30, 0xb4, 0x3e, 0x12, 0xe9, 0x07, 0x07, 0xb5, 0xfb, 0x13, 0xb4, 0x69, 0x5e, 0xd3, 0x84, - 0x7b, 0xac, 0xb8, 0x20, 0xbc, 0x84, 0xd4, 0xed, 0x25, 0xe8, 0x45, 0xdd, 0xa3, 0xe1, 0xba, 0xfb, - 0x48, 0x92, 0xd6, 0xed, 0x73, 0xcd, 0x5e, 0x06, 0x5f, 0xd4, 0x7d, 0x14, 0x72, 0xdd, 0xde, 0x96, - 0xd8, 0x45, 0x2b, 0xc8, 0xfc, 0x09, 0xcd, 0xfa, 0x37, 0xd2, 0x8a, 0x67, 0x4b, 0x62, 0x3c, 0x49, - 0xac, 0xe2, 0xa6, 0x39, 0x59, 0xec, 0x47, 0xa3, 0x8f, 0xaf, 0x66, 0xa0, 0xb2, 0x6a, 0xb7, 0x96, - 0x9a, 0xba, 0x73, 0x93, 0xd5, 0xab, 0x1b, 0x25, 0x1d, 0xea, 0xcd, 0x1a, 0x0b, 0xd7, 0x0f, 0x6a, - 0x65, 0x26, 0x9d, 0x9b, 0x29, 0x93, 0x0e, 0x4c, 0x78, 0x7a, 0xa9, 0x58, 0xaa, 0xc3, 0xdd, 0x53, - 0x63, 0x31, 0xa1, 0x06, 0x2e, 0x62, 0xed, 0xfa, 0x41, 0xed, 0x28, 0x6b, 0x59, 0x08, 0x4a, 0x92, - 0xcb, 0x5a, 0x60, 0x2e, 0xa0, 0xbd, 0x68, 0xc5, 0xa7, 0xfb, 0x4f, 0x8d, 0x8b, 0x6f, 0xa3, 0xd2, - 0xf3, 0xa1, 0xfb, 0x4a, 0x1a, 0x8a, 0xc4, 0xd5, 0xb3, 0x72, 0x1c, 0x3d, 0x15, 0x52, 0x3f, 0xc2, - 0xa9, 0x90, 0x7e, 0x67, 0xa6, 0xc2, 0x3d, 0x6e, 0xac, 0x9d, 0x19, 0xa8, 0xf3, 0xc1, 0x90, 0xfb, - 0x3f, 0x66, 0xa8, 0x55, 0xa5, 0x2b, 0x48, 0x19, 0x37, 0xdf, 0x0d, 0x02, 0xfc, 0x85, 0x14, 0x1c, - 0xf1, 0xc4, 0x63, 0x5b, 0x5a, 0x48, 0x8a, 0xcf, 0x5c, 0x3f, 0xa8, 0xdd, 0x1a, 0x96, 0xa2, 0x8f, - 0xec, 0x06, 0x24, 0x39, 0xe5, 0x02, 0xad, 0x5b, 0x5a, 0x74, 0x3b, 0x9a, 0xb6, 0xe3, 0xb6, 0x23, - 0x33, 0xb8, 0x1d, 0x3e, 0xb2, 0xb7, 0xd4, 0x8e, 0x45, 0xdb, 0xe9, 0x1f, 0xd4, 0x6c, 0xc2, 0x41, - 0xfd, 0x5a, 0x1a, 0xc6, 0x57, 0xed, 0xd6, 0xa6, 0xd1, 0xfc, 0xc9, 0x84, 0x38, 0xec, 0x84, 0xf8, - 0x58, 0x0a, 0xca, 0x17, 0x75, 0xdb, 0x31, 0x2d, 0x5d, 0x53, 0xdb, 0x74, 0x35, 0xe3, 0x9d, 0x91, - 0x4c, 0x1d, 0xfe, 0x8c, 0xe4, 0x23, 0x90, 0xbb, 0xaa, 0xb6, 0xd9, 0xbf, 0x2b, 0xca, 0xd0, 0x3d, - 0xc2, 0x90, 0xef, 0x08, 0xe7, 0x80, 0x39, 0x39, 0x6f, 0xce, 0xef, 0xa6, 0x61, 0x22, 0x14, 0x78, - 0xa0, 0x06, 0x64, 0xa9, 0x45, 0x67, 0x0b, 0xde, 0xb9, 0x43, 0xc4, 0x15, 0x64, 0x4d, 0x4c, 0x79, - 0xd1, 0x4f, 0x41, 0xbe, 0xa3, 0xee, 0x31, 0xcf, 0xc0, 0xd6, 0x37, 0xf3, 0x87, 0xc3, 0xf1, 0x56, - 0xaf, 0x02, 0x47, 0x92, 0xc7, 0x3a, 0xea, 0x1e, 0xf5, 0x07, 0x5d, 0x98, 0x20, 0xa5, 0xda, 0x8e, - 0x6a, 0xb4, 0xb0, 0xdf, 0xfd, 0x5c, 0x3c, 0x74, 0x25, 0x47, 0xbd, 0x4a, 0x7c, 0x70, 0x92, 0x3c, - 0xde, 0x51, 0xf7, 0x16, 0x68, 0x01, 0xa9, 0xb1, 0x9e, 0x7f, 0xe5, 0xd5, 0xda, 0x08, 0x95, 0xd8, - 0xbf, 0x4f, 0x01, 0x78, 0x12, 0x43, 0x1b, 0x50, 0x09, 0xb9, 0x2f, 0x71, 0xc6, 0x28, 0x36, 0xc0, - 0xf3, 0x16, 0xb6, 0x13, 0x5a, 0x68, 0x08, 0x3e, 0x08, 0x45, 0x76, 0x4a, 0x40, 0xa1, 0xc9, 0xf8, - 0x74, 0x6c, 0x32, 0xfe, 0x04, 0xc1, 0xba, 0x7e, 0x50, 0x43, 0xac, 0x3b, 0x3e, 0x66, 0x89, 0xa6, - 0xe8, 0x81, 0x95, 0x10, 0x86, 0x60, 0x5f, 0x8a, 0xbe, 0xd8, 0x82, 0x9e, 0x3d, 0x33, 0x0d, 0x7d, - 0x17, 0x5b, 0xee, 0x1a, 0x99, 0x3d, 0xa2, 0x2a, 0xe4, 0xd9, 0x57, 0x05, 0x9d, 0x7d, 0xf1, 0xef, - 0x2a, 0xc4, 0x33, 0xe1, 0xba, 0x86, 0xb7, 0x6c, 0x5d, 0x8c, 0x82, 0x2c, 0x1e, 0xd1, 0x79, 0xa8, - 0xd8, 0x58, 0xeb, 0x59, 0xba, 0xb3, 0xaf, 0x68, 0xa6, 0xe1, 0xa8, 0x9a, 0xc3, 0x9d, 0xf6, 0x2d, - 0xd7, 0x0f, 0x6a, 0xc7, 0x58, 0x5b, 0xc3, 0x14, 0x92, 0x3c, 0x21, 0x8a, 0x16, 0x58, 0x09, 0xa9, - 0xa1, 0x89, 0x1d, 0x55, 0x6f, 0xdb, 0x7c, 0x61, 0x2b, 0x1e, 0x7d, 0x7d, 0xf9, 0x9d, 0x31, 0xff, - 0x66, 0xd4, 0x35, 0xa8, 0x98, 0x5d, 0x6c, 0x45, 0xd8, 0xa3, 0x15, 0xaf, 0xe6, 0x30, 0xc5, 0x0d, - 0x98, 0x84, 0x09, 0x81, 0x21, 0x2c, 0xc2, 0xf9, 0xc0, 0x99, 0x33, 0x16, 0x37, 0xa6, 0xc3, 0x5d, - 0x0e, 0x53, 0x48, 0xfe, 0x83, 0x66, 0x2c, 0xba, 0x3c, 0x0a, 0xb9, 0x17, 0x54, 0xbd, 0x2d, 0x3e, - 0xb5, 0x2a, 0xf3, 0x27, 0xb4, 0x0c, 0x39, 0xdb, 0x51, 0x9d, 0x1e, 0x0b, 0xbd, 0x47, 0x1b, 0xef, - 0x49, 0xd8, 0xe6, 0x86, 0x69, 0x34, 0xd7, 0x29, 0xa3, 0xcc, 0x01, 0xd0, 0x79, 0xc8, 0x39, 0xe6, - 0x2e, 0x36, 0xb8, 0x50, 0x0f, 0x35, 0xd3, 0x69, 0xa2, 0x8e, 0x71, 0x23, 0x07, 0x3c, 0xa3, 0xac, - 0xd8, 0x3b, 0xaa, 0x85, 0x6d, 0x16, 0x2a, 0x37, 0x96, 0x0f, 0x3d, 0x1d, 0x8f, 0x85, 0x3d, 0x05, - 0xc3, 0x93, 0xe4, 0x09, 0xb7, 0x68, 0x9d, 0x96, 0x84, 0x23, 0xe7, 0xb1, 0x1b, 0x8a, 0x9c, 0xcf, - 0x43, 0xa5, 0x67, 0x6c, 0x99, 0x06, 0xfd, 0x2c, 0x22, 0x4f, 0xd3, 0xe4, 0x4f, 0xa6, 0x66, 0x33, - 0xfe, 0xd1, 0x0a, 0x53, 0x48, 0xf2, 0x84, 0x5b, 0xc4, 0x4f, 0x3f, 0x36, 0xa1, 0xec, 0x51, 0xd1, - 0x29, 0x5b, 0x88, 0x9d, 0xb2, 0xb7, 0xf3, 0x29, 0x7b, 0x24, 0x5c, 0x8b, 0x37, 0x6b, 0xc7, 0xdd, - 0x42, 0xc2, 0x86, 0xde, 0x1f, 0x58, 0x46, 0x02, 0xaf, 0x61, 0xa0, 0x95, 0x49, 0xbe, 0x82, 0x2c, - 0xbe, 0x23, 0x2b, 0xc8, 0x7a, 0xe9, 0x23, 0xaf, 0xd6, 0x46, 0xdc, 0x09, 0xfb, 0x4b, 0x69, 0xc8, - 0x2d, 0x5e, 0xa1, 0xd7, 0x28, 0x7f, 0x4c, 0xc3, 0x07, 0x9f, 0xf5, 0x7a, 0x1f, 0x8c, 0x31, 0x59, - 0xd8, 0xe8, 0x2c, 0x8c, 0x76, 0xc9, 0x0f, 0x9e, 0x6b, 0x3c, 0xda, 0xa7, 0xd2, 0x94, 0x4e, 0xac, - 0x30, 0x29, 0xa9, 0xf4, 0xf9, 0x0c, 0xc0, 0xe2, 0x95, 0x2b, 0x1b, 0x96, 0xde, 0x6d, 0x63, 0xe7, - 0x27, 0xe1, 0xf5, 0xbb, 0x27, 0xbc, 0xf6, 0x8d, 0xf1, 0xd3, 0x50, 0xf4, 0xc6, 0xc8, 0x46, 0x8f, - 0x43, 0xde, 0xe1, 0xbf, 0xf9, 0x50, 0x57, 0xfb, 0x87, 0x5a, 0x90, 0xf3, 0xe1, 0x76, 0x39, 0xa4, - 0xff, 0x92, 0x06, 0x88, 0x4b, 0xce, 0xfc, 0x18, 0x04, 0xe0, 0xe7, 0x21, 0xc7, 0x3d, 0x4e, 0xe6, - 0x86, 0xa2, 0x55, 0xce, 0xed, 0x1b, 0xa5, 0x6f, 0xa7, 0x61, 0x6a, 0x53, 0x98, 0xdd, 0x9f, 0x48, - 0x18, 0x5d, 0x84, 0x31, 0x6c, 0x38, 0x96, 0x8e, 0x45, 0x1a, 0x7c, 0x36, 0xac, 0xa5, 0x11, 0xd2, - 0xa2, 0xff, 0x2e, 0x41, 0x9c, 0x96, 0xe3, 0xec, 0x3e, 0x19, 0x7f, 0x3c, 0x03, 0x33, 0x83, 0xb8, - 0xd0, 0x02, 0x4c, 0x68, 0x16, 0xa6, 0x05, 0x8a, 0x7f, 0xe7, 0xa4, 0x51, 0xf5, 0x65, 0x8c, 0x82, - 0x04, 0x92, 0x5c, 0x16, 0x25, 0xdc, 0x21, 0xb7, 0x68, 0x82, 0x8a, 0x4c, 0x15, 0x42, 0x95, 0x30, - 0x88, 0x96, 0xb8, 0x47, 0xf6, 0xd2, 0x52, 0x7e, 0x00, 0xe6, 0x92, 0xcb, 0x5e, 0x29, 0xf5, 0xc9, - 0x2f, 0xc2, 0x84, 0x6e, 0xe8, 0x8e, 0xae, 0xb6, 0x95, 0x2d, 0xb5, 0xad, 0x1a, 0xda, 0x8d, 0x2c, - 0x45, 0x98, 0x37, 0xe5, 0xd5, 0x86, 0xe0, 0x24, 0xb9, 0xcc, 0x4b, 0x1a, 0xac, 0x80, 0x8c, 0x88, - 0xa8, 0x2a, 0x7b, 0x43, 0x81, 0x9b, 0x60, 0xf7, 0x8d, 0xc8, 0x2f, 0x67, 0x60, 0xd2, 0xcd, 0xcf, - 0xfc, 0x64, 0x28, 0x92, 0x0e, 0xc5, 0x2a, 0x00, 0x33, 0x20, 0xc4, 0x73, 0xdc, 0xc0, 0x68, 0x10, - 0x13, 0x54, 0x60, 0x08, 0x8b, 0xb6, 0xe3, 0x1b, 0x8f, 0xbf, 0xc8, 0x40, 0xc9, 0x3f, 0x1e, 0x3f, - 0x71, 0xe9, 0xef, 0xa2, 0x8c, 0xd9, 0xbc, 0x67, 0x12, 0xb3, 0xfc, 0xbb, 0x28, 0x21, 0x93, 0xd8, - 0x37, 0x95, 0x06, 0xdb, 0xc2, 0xbf, 0x4a, 0x43, 0x8e, 0x9f, 0xcb, 0xd6, 0xfa, 0x56, 0x11, 0xa9, - 0xb8, 0x73, 0xdf, 0xc3, 0x17, 0x11, 0xaf, 0x44, 0x2e, 0x22, 0xca, 0x1d, 0x75, 0x4f, 0x09, 0xdc, - 0x62, 0x4a, 0xcd, 0x8e, 0x37, 0x8e, 0x7b, 0x28, 0xc1, 0xf7, 0x2c, 0x17, 0xe2, 0x9d, 0xc9, 0x45, - 0x8f, 0x40, 0x91, 0x50, 0x78, 0x5e, 0x81, 0xb0, 0x1f, 0xf5, 0x92, 0x0f, 0xbe, 0x97, 0x92, 0x0c, - 0x1d, 0x75, 0x6f, 0x89, 0x3d, 0xa0, 0x15, 0x40, 0x3b, 0x6e, 0xea, 0x4b, 0xf1, 0x44, 0x48, 0xf8, - 0x6f, 0xbb, 0x7e, 0x50, 0x3b, 0xce, 0xf8, 0xfb, 0x69, 0x24, 0x79, 0xd2, 0x2b, 0x14, 0x68, 0x0f, - 0x02, 0x90, 0x7e, 0x29, 0xec, 0x4c, 0x08, 0x5b, 0xc2, 0xfa, 0x0e, 0x4a, 0x78, 0xef, 0x24, 0xb9, - 0x40, 0x1e, 0x16, 0xc9, 0x6f, 0x9f, 0xe0, 0x7f, 0x25, 0x05, 0xc8, 0xf3, 0x3d, 0xee, 0x7e, 0xfd, - 0xfb, 0xe9, 0xbd, 0x44, 0xb1, 0x32, 0x4a, 0x45, 0x2f, 0xb2, 0x3c, 0x3e, 0xb1, 0xc8, 0xf2, 0x4d, - 0xd5, 0xfb, 0x3c, 0xfb, 0x9c, 0x1e, 0x98, 0x15, 0x8c, 0xb0, 0xc1, 0xff, 0x3a, 0x05, 0xc7, 0xfb, - 0x14, 0xc7, 0x6d, 0xd7, 0x15, 0x40, 0x96, 0xef, 0x25, 0xff, 0x0f, 0x45, 0x29, 0xfe, 0x1f, 0xff, - 0x12, 0xea, 0xdf, 0xa4, 0xd5, 0x67, 0xe3, 0x6f, 0x9e, 0x37, 0xe1, 0x19, 0xc5, 0x14, 0x4c, 0xfb, - 0xab, 0x77, 0x3b, 0x70, 0x1e, 0x4a, 0xfe, 0xda, 0x79, 0xd3, 0x6f, 0x1d, 0xd6, 0x74, 0xde, 0xea, - 0x00, 0x1f, 0x5a, 0xf6, 0x66, 0x9f, 0xf8, 0xa7, 0x93, 0x71, 0xbd, 0x77, 0x0f, 0xb2, 0x85, 0x66, - 0x21, 0x6b, 0xf1, 0xff, 0x4b, 0x41, 0x76, 0xcd, 0x34, 0xdb, 0xc8, 0x84, 0x49, 0xc3, 0x74, 0x14, - 0xa2, 0x2c, 0xb8, 0xa9, 0xf0, 0xdc, 0x08, 0xcb, 0x82, 0x2e, 0x1c, 0x4e, 0x28, 0xdf, 0x3b, 0xa8, - 0xf5, 0x43, 0xc9, 0x13, 0x86, 0xe9, 0x34, 0x68, 0xc9, 0x06, 0xcb, 0x9c, 0x7c, 0x08, 0xc6, 0x83, - 0x95, 0xb1, 0x4c, 0xd1, 0xb3, 0x87, 0xae, 0x2c, 0x08, 0x73, 0xfd, 0xa0, 0x36, 0xed, 0x4d, 0x02, - 0xb7, 0x58, 0x92, 0x4b, 0x5b, 0xbe, 0xda, 0xeb, 0x79, 0xd2, 0xfb, 0xef, 0xbf, 0x5a, 0x4b, 0x35, - 0xce, 0x0f, 0x3c, 0x01, 0x70, 0xdf, 0xd0, 0x26, 0xec, 0xb9, 0x5b, 0xfd, 0xc1, 0xb3, 0x00, 0xdf, - 0x3d, 0x03, 0xd5, 0xd0, 0x59, 0x00, 0x7a, 0x0f, 0x79, 0xc0, 0x49, 0x80, 0xe1, 0xff, 0xc0, 0x7f, - 0xc0, 0x41, 0x81, 0xa1, 0x87, 0x0d, 0xa4, 0x5d, 0x38, 0x4a, 0x8f, 0x72, 0x7a, 0x66, 0x4b, 0x7c, - 0x25, 0xe6, 0xa8, 0x9b, 0x40, 0x4b, 0xf1, 0xff, 0x17, 0xce, 0xb2, 0x61, 0x8f, 0x01, 0x78, 0x35, - 0xbb, 0x17, 0x6e, 0x78, 0x4b, 0x59, 0xeb, 0xd9, 0x3f, 0xf2, 0xa7, 0x30, 0xb2, 0x8f, 0x58, 0xfa, - 0xf5, 0x14, 0x1c, 0xeb, 0xab, 0x8d, 0x6b, 0xfd, 0x93, 0x81, 0x0b, 0xa3, 0xa9, 0x64, 0x39, 0x7a, - 0xff, 0x97, 0x1f, 0xea, 0x11, 0xed, 0xaa, 0x46, 0xb5, 0x8b, 0x55, 0x18, 0x68, 0xd8, 0x8b, 0x70, - 0x24, 0xd8, 0x2e, 0x21, 0x84, 0xe7, 0xa0, 0x1c, 0x5c, 0x2d, 0xf0, 0x50, 0xe2, 0x3d, 0x87, 0xf7, - 0x90, 0xe3, 0x81, 0x15, 0x83, 0xf4, 0x6c, 0x58, 0xf0, 0xae, 0x24, 0xde, 0xd7, 0x7f, 0xf8, 0x3e, - 0x56, 0x10, 0xbe, 0xbb, 0x59, 0x5f, 0x49, 0xc1, 0xc9, 0x20, 0xb2, 0x67, 0x84, 0xed, 0xb7, 0xbd, - 0x5f, 0x6f, 0x45, 0x3d, 0xfe, 0x53, 0x0a, 0x6e, 0x1f, 0xd2, 0x72, 0x2e, 0x1e, 0x0b, 0xa6, 0x7d, - 0xd6, 0xdd, 0xe2, 0xc5, 0x42, 0x65, 0xa4, 0xc1, 0x1e, 0xc8, 0x35, 0x6e, 0xb7, 0xf0, 0xa3, 0x48, - 0x53, 0xfd, 0xef, 0x6c, 0x79, 0xaa, 0xdf, 0x22, 0xbf, 0x35, 0xdd, 0xfa, 0x7a, 0x0a, 0x4e, 0x07, - 0x7b, 0x15, 0xb1, 0xa2, 0x7b, 0x77, 0x0f, 0xcc, 0xbf, 0x49, 0xc1, 0x3d, 0x49, 0xba, 0xc0, 0x47, - 0xe8, 0x79, 0x98, 0xf2, 0xe2, 0xab, 0xf0, 0x00, 0x9d, 0x4a, 0xb0, 0x2a, 0xe6, 0x4a, 0x8d, 0x5c, - 0x94, 0x9b, 0x33, 0x12, 0x7f, 0x9c, 0xe2, 0x73, 0xce, 0x3f, 0xee, 0xae, 0xd8, 0x83, 0x4b, 0x82, - 0x43, 0x8a, 0xdd, 0xb7, 0x2c, 0x18, 0x0f, 0x2c, 0x0b, 0x22, 0x06, 0x34, 0x7d, 0x93, 0x2c, 0xc8, - 0x2f, 0x0a, 0x6b, 0x1a, 0x11, 0x9c, 0xed, 0xc2, 0x54, 0xc4, 0x24, 0x71, 0x6f, 0x9c, 0xc6, 0xcf, - 0x91, 0xa3, 0x3f, 0x38, 0xa8, 0x45, 0x44, 0x7d, 0x32, 0xea, 0x9f, 0x1e, 0xd2, 0x7f, 0x4e, 0x41, - 0x8d, 0x36, 0x24, 0x62, 0x28, 0xff, 0x26, 0x0b, 0x18, 0x73, 0x43, 0x1a, 0xd9, 0x2d, 0x2e, 0xe8, - 0x79, 0xc8, 0x31, 0x2d, 0xe5, 0xb2, 0x3d, 0x84, 0x7a, 0x73, 0x46, 0xcf, 0x60, 0x2f, 0x8a, 0x7e, - 0x45, 0xdb, 0x85, 0xb7, 0x49, 0x7e, 0x6f, 0xc1, 0x2e, 0xfc, 0x2b, 0x61, 0xb0, 0xa3, 0x5b, 0xce, - 0x45, 0xf4, 0xc1, 0xb7, 0x6c, 0xb0, 0xf9, 0x97, 0x84, 0xde, 0x36, 0xcb, 0xec, 0x36, 0x3f, 0xc6, - 0x32, 0xbf, 0xfb, 0x46, 0xc0, 0xb5, 0xcc, 0x31, 0x5d, 0x78, 0x97, 0x5b, 0xe6, 0xeb, 0x69, 0x38, - 0x4e, 0xbb, 0xe1, 0x5f, 0x91, 0xbc, 0x03, 0x92, 0x57, 0x00, 0xd9, 0x96, 0xa6, 0xdc, 0x2c, 0xfb, - 0x51, 0xb1, 0x2d, 0xed, 0x4a, 0xc0, 0xe9, 0x2a, 0x80, 0x9a, 0xb6, 0x13, 0xae, 0x20, 0x73, 0xc3, - 0x15, 0x34, 0x6d, 0xe7, 0xca, 0x10, 0xaf, 0x9e, 0x3d, 0x8c, 0xee, 0xfc, 0x61, 0x0a, 0xaa, 0x51, - 0x42, 0xe7, 0xba, 0xa2, 0xc2, 0xd1, 0xc0, 0x3a, 0x3a, 0xac, 0x2e, 0x77, 0x0c, 0x5b, 0x4d, 0x86, - 0xa6, 0xee, 0x11, 0x0b, 0xdf, 0xec, 0xc9, 0xfb, 0x65, 0xe1, 0x74, 0x5c, 0xcd, 0xef, 0x5f, 0xc2, - 0xbc, 0x2b, 0xa7, 0xec, 0x6f, 0xf5, 0x99, 0xfb, 0x77, 0xdb, 0x6a, 0xe8, 0x4f, 0x52, 0x70, 0x62, - 0x40, 0x0b, 0xff, 0x26, 0xbb, 0xf3, 0x9f, 0x1d, 0xa8, 0x30, 0x37, 0x6b, 0xe9, 0xf5, 0x20, 0x9f, - 0x50, 0xc1, 0x73, 0x6b, 0xbe, 0x05, 0x75, 0xe4, 0x37, 0xe6, 0x9e, 0x81, 0x5b, 0x22, 0xb9, 0x78, - 0x9b, 0xce, 0x42, 0x76, 0x47, 0xb7, 0x1d, 0xf7, 0xc3, 0x0b, 0xa1, 0xe6, 0x84, 0xb8, 0x28, 0xad, - 0x84, 0xa0, 0x42, 0x21, 0xd7, 0x4c, 0xb3, 0xcd, 0xab, 0x97, 0x16, 0x60, 0xd2, 0x57, 0xc6, 0xc1, - 0xe7, 0x20, 0xdb, 0x35, 0xcd, 0x36, 0x07, 0x9f, 0x0e, 0x83, 0x13, 0x5a, 0xde, 0x4d, 0x4a, 0x27, - 0x4d, 0x03, 0x62, 0x20, 0xec, 0x93, 0x20, 0x1c, 0xfa, 0xc3, 0x29, 0x98, 0x0a, 0x14, 0xbb, 0x97, - 0x96, 0x72, 0x81, 0xaf, 0x49, 0xf5, 0x6d, 0xd1, 0x33, 0x7a, 0xf7, 0x7a, 0x3a, 0xcb, 0xee, 0xbe, - 0x05, 0xd5, 0x3d, 0xfb, 0x47, 0x25, 0x71, 0xcb, 0x55, 0x01, 0xf0, 0xa5, 0x62, 0xef, 0x0a, 0xd7, - 0x1c, 0x9d, 0xf4, 0xa8, 0xde, 0x1d, 0x4b, 0xc7, 0x63, 0xde, 0x11, 0xf4, 0x53, 0xfe, 0x63, 0x54, - 0x77, 0x0e, 0xe7, 0x13, 0xf0, 0x77, 0xc5, 0x91, 0xb9, 0xe8, 0x7f, 0x0b, 0xa6, 0xa3, 0x56, 0xc1, - 0xe8, 0x81, 0xe1, 0x08, 0xfd, 0x71, 0x4b, 0xf5, 0x3d, 0x87, 0xe0, 0x70, 0xab, 0x7f, 0x25, 0x05, - 0xb7, 0x0d, 0x5d, 0xec, 0xa1, 0xc7, 0x86, 0xc3, 0x0e, 0x89, 0xa4, 0xaa, 0xf5, 0x1b, 0x61, 0x75, - 0x9b, 0xa6, 0x04, 0xf6, 0xf3, 0xa3, 0x25, 0xda, 0xb7, 0xfe, 0x18, 0x30, 0xb0, 0xfd, 0xb1, 0xa6, - 0x34, 0x82, 0x5e, 0x8a, 0xde, 0xd7, 0x3e, 0x13, 0x89, 0x30, 0x78, 0xc9, 0x53, 0x7d, 0x20, 0x39, - 0x83, 0x7f, 0xd8, 0xa3, 0x62, 0xe9, 0x01, 0xc3, 0x3e, 0x64, 0xc1, 0x30, 0x60, 0xd8, 0x87, 0x05, - 0xea, 0x7c, 0xd8, 0x87, 0x46, 0x92, 0x03, 0x86, 0x3d, 0x49, 0x00, 0x3d, 0x60, 0xd8, 0x13, 0x05, - 0xae, 0xd2, 0x08, 0xda, 0x81, 0xf1, 0x40, 0x9c, 0x82, 0x4e, 0x47, 0xc2, 0x45, 0x05, 0x90, 0xd5, - 0x7b, 0x92, 0x90, 0xfa, 0xc7, 0x3f, 0xc2, 0x35, 0x0f, 0x18, 0xff, 0xc1, 0xd1, 0x47, 0xf5, 0x81, - 0xe4, 0x0c, 0x6e, 0xdd, 0xd7, 0xdc, 0xad, 0x16, 0x1f, 0x01, 0x9a, 0x4b, 0x88, 0x24, 0x6a, 0x3e, - 0x93, 0x98, 0xde, 0xad, 0x78, 0xb7, 0xef, 0xb4, 0x75, 0xb4, 0xd0, 0x22, 0x5d, 0x5b, 0xf5, 0xde, - 0x44, 0xb4, 0x6e, 0x65, 0xab, 0x7c, 0x1f, 0xe1, 0x64, 0x24, 0x9b, 0xcf, 0x69, 0x55, 0x6f, 0x1f, - 0x42, 0xe1, 0xc2, 0xad, 0xbb, 0x1b, 0x83, 0x52, 0x34, 0xb9, 0xdf, 0x59, 0x55, 0x4f, 0x0d, 0xa5, - 0x11, 0xa0, 0x37, 0x3d, 0xd5, 0xff, 0xa5, 0x7c, 0xdf, 0xb5, 0xbf, 0x16, 0x36, 0xb0, 0xad, 0xdb, - 0x87, 0xba, 0xf6, 0x37, 0x3c, 0x9b, 0xff, 0x8b, 0x39, 0x28, 0x5d, 0x60, 0xa8, 0xf4, 0x5b, 0xc7, - 0xe8, 0x89, 0x84, 0x1e, 0xb8, 0x4c, 0x3c, 0xf0, 0x0f, 0x0e, 0x6a, 0x5c, 0x90, 0xae, 0x2f, 0xb6, - 0xf9, 0x47, 0x8f, 0xd8, 0x07, 0x4b, 0xbc, 0xaf, 0xc6, 0x94, 0x0e, 0x75, 0x64, 0x95, 0x9d, 0x15, - 0xe0, 0xa7, 0x44, 0xc3, 0x78, 0x12, 0xfb, 0x7e, 0xd2, 0x06, 0x29, 0xa1, 0x9f, 0x3c, 0x41, 0x9f, - 0x4c, 0xc1, 0x11, 0x4a, 0xe5, 0x05, 0x82, 0x94, 0x52, 0x1c, 0xac, 0xe9, 0x1b, 0xe5, 0x15, 0xd5, - 0xb7, 0x2c, 0xa2, 0x18, 0x8d, 0x3a, 0xdf, 0xef, 0xbd, 0xd5, 0x57, 0x69, 0x18, 0x4e, 0xfa, 0xc1, - 0x41, 0x0d, 0xf5, 0xf3, 0xca, 0xf4, 0x03, 0x9d, 0xc1, 0xb2, 0xe8, 0xcf, 0x54, 0x0f, 0x89, 0x0d, - 0x27, 0xb9, 0x40, 0xbd, 0x18, 0x21, 0x10, 0x9e, 0xaf, 0x41, 0xd1, 0x67, 0x7c, 0x66, 0x46, 0x07, - 0x1c, 0x6b, 0xf3, 0xd6, 0xdd, 0x88, 0xe3, 0xf9, 0x7c, 0x9f, 0xec, 0x87, 0x40, 0xbf, 0x96, 0x82, - 0x23, 0xde, 0xda, 0xde, 0x0f, 0x9e, 0x4b, 0xbe, 0xba, 0x3f, 0x17, 0x94, 0x5a, 0x24, 0x1e, 0x91, - 0x5a, 0x94, 0x83, 0x94, 0xa7, 0x7b, 0x51, 0x0e, 0xe3, 0x39, 0x18, 0xf7, 0x2f, 0xfe, 0xbc, 0x8f, - 0x17, 0x0e, 0xdb, 0xce, 0x9c, 0xe6, 0xbd, 0x0d, 0x1c, 0xed, 0x90, 0x83, 0x40, 0xa8, 0x0a, 0x79, - 0xbc, 0xd7, 0x35, 0x2d, 0x07, 0x37, 0xe9, 0x59, 0xe4, 0xbc, 0xec, 0x3e, 0x4b, 0xd7, 0x20, 0x62, - 0x60, 0xd1, 0xd3, 0xa1, 0x2f, 0x2f, 0xdd, 0xc8, 0xa2, 0xa2, 0xff, 0x63, 0x4d, 0xfe, 0xaf, 0x28, - 0xdd, 0x6c, 0xb3, 0xf1, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x73, 0x3c, 0xb3, 0x75, 0xb7, 0x9b, - 0x00, 0x00, + 0x79, 0x1f, 0xf6, 0x81, 0xc5, 0xee, 0xb7, 0x8b, 0xdd, 0x45, 0x03, 0x77, 0xb7, 0xb7, 0x24, 0x6f, + 0x8f, 0x73, 0x7c, 0xe0, 0xf8, 0xc0, 0x51, 0x27, 0x3e, 0xf7, 0x28, 0x52, 0x58, 0x00, 0x77, 0x07, + 0x12, 0xb8, 0x03, 0x07, 0xc0, 0x91, 0xa2, 0x6c, 0xaf, 0x07, 0xb3, 0x8d, 0xc5, 0x10, 0xbb, 0x33, + 0xcb, 0x99, 0xd9, 0x3b, 0x80, 0xa5, 0x54, 0x31, 0x65, 0x59, 0x0f, 0x47, 0xb6, 0x64, 0xc7, 0x76, + 0x64, 0x45, 0x92, 0x29, 0xa5, 0x12, 0x39, 0x4a, 0xe2, 0x47, 0xa2, 0xe8, 0x61, 0xe7, 0x0f, 0xa5, + 0x9c, 0xc4, 0x4a, 0x95, 0x2b, 0x25, 0x25, 0x4e, 0xca, 0x95, 0x4a, 0xc1, 0x16, 0xa9, 0x2a, 0x2b, + 0x0a, 0x93, 0x28, 0x17, 0xda, 0xe5, 0x92, 0xfe, 0x48, 0xaa, 0x5f, 0xf3, 0xda, 0xd9, 0x9d, 0xc1, + 0xf1, 0x48, 0xd1, 0x25, 0xfd, 0x85, 0x9d, 0x9e, 0xef, 0xfb, 0x75, 0xf7, 0xd7, 0x5f, 0x7f, 0xdf, + 0xd7, 0x5f, 0x77, 0x0f, 0xe0, 0x8b, 0x49, 0xb8, 0x4d, 0x35, 0xac, 0xae, 0x61, 0x9d, 0x79, 0xb1, + 0x8f, 0xcd, 0xfd, 0x33, 0x3d, 0xa5, 0xad, 0xe9, 0x8a, 0xad, 0x19, 0xfa, 0x5c, 0xcf, 0x34, 0x6c, + 0x03, 0x15, 0xd8, 0xeb, 0x39, 0xfa, 0x5a, 0xd2, 0x21, 0xbf, 0xa6, 0xb4, 0xb1, 0x8c, 0x5f, 0xec, + 0x63, 0xcb, 0x46, 0x65, 0x48, 0xed, 0xe2, 0xfd, 0x4a, 0xe2, 0x64, 0x62, 0xb6, 0x20, 0x93, 0x9f, + 0xe8, 0x28, 0x64, 0x8c, 0xed, 0x6d, 0x0b, 0xdb, 0x95, 0xe4, 0xc9, 0xc4, 0x6c, 0x5a, 0xe6, 0x4f, + 0x68, 0x06, 0xc6, 0x3b, 0x5a, 0x57, 0xb3, 0x2b, 0x29, 0x5a, 0xcc, 0x1e, 0x50, 0x0d, 0xf2, 0xaa, + 0xd1, 0xd7, 0xed, 0xa6, 0x6d, 0xd8, 0x4a, 0xa7, 0x92, 0x3e, 0x99, 0x98, 0xcd, 0xca, 0x40, 0x8b, + 0x36, 0x48, 0x89, 0xf4, 0x24, 0x14, 0x58, 0x7d, 0x56, 0xcf, 0xd0, 0x2d, 0x8c, 0x8e, 0x43, 0x56, + 0xc7, 0x7b, 0x76, 0xd3, 0xad, 0x75, 0x82, 0x3c, 0x3f, 0x8d, 0xf7, 0x49, 0x0d, 0x0c, 0x85, 0x55, + 0xcc, 0x1e, 0x1a, 0x8d, 0x6f, 0xbc, 0x7a, 0x22, 0xf1, 0xcd, 0x57, 0x4f, 0x24, 0xfe, 0xfc, 0xd5, + 0x13, 0x89, 0x4f, 0xbc, 0x76, 0x62, 0xec, 0x9b, 0xaf, 0x9d, 0x18, 0xfb, 0xd3, 0xd7, 0x4e, 0x8c, + 0x3d, 0x3f, 0xdb, 0xd6, 0xec, 0x9d, 0xfe, 0xd6, 0x9c, 0x6a, 0x74, 0xcf, 0x70, 0x11, 0xb0, 0x3f, + 0xf7, 0x5b, 0xad, 0xdd, 0x33, 0xf6, 0x7e, 0x0f, 0x73, 0x99, 0x6c, 0x65, 0xa8, 0x24, 0xde, 0x0d, + 0x7f, 0x78, 0x0e, 0x4e, 0xb6, 0x0d, 0xa3, 0xdd, 0xc1, 0x67, 0x68, 0xc9, 0x56, 0x7f, 0xfb, 0x4c, + 0x0b, 0x5b, 0xaa, 0xa9, 0xf5, 0x6c, 0xc3, 0xe4, 0xf2, 0x2a, 0x31, 0x8a, 0x39, 0x41, 0x21, 0xad, + 0xc2, 0xd4, 0x79, 0xad, 0x83, 0x17, 0x1d, 0xc2, 0x75, 0x6c, 0xa3, 0x47, 0x21, 0xbd, 0xad, 0x75, + 0x70, 0x25, 0x71, 0x32, 0x35, 0x9b, 0x3f, 0x7b, 0xc7, 0x5c, 0x80, 0x69, 0xce, 0xcf, 0xb1, 0x46, + 0x8a, 0x65, 0xca, 0x21, 0x7d, 0x27, 0x0d, 0xd3, 0x21, 0x6f, 0x11, 0x82, 0xb4, 0xae, 0x74, 0x31, + 0x95, 0x4a, 0x4e, 0xa6, 0xbf, 0x51, 0x05, 0x26, 0x7a, 0x8a, 0xba, 0xab, 0xb4, 0x31, 0x15, 0x4a, + 0x4e, 0x16, 0x8f, 0xe8, 0x04, 0x40, 0x0b, 0xf7, 0xb0, 0xde, 0xc2, 0xba, 0xba, 0x5f, 0x49, 0x9d, + 0x4c, 0xcd, 0xe6, 0x64, 0x4f, 0x09, 0xba, 0x17, 0xa6, 0x7a, 0xfd, 0xad, 0x8e, 0xa6, 0x36, 0x3d, + 0x64, 0x70, 0x32, 0x35, 0x3b, 0x2e, 0x97, 0xd9, 0x8b, 0x45, 0x97, 0xf8, 0x6e, 0x28, 0x5d, 0xc3, + 0xca, 0xae, 0x97, 0x34, 0x4f, 0x49, 0x8b, 0xa4, 0xd8, 0x43, 0xb8, 0x00, 0x85, 0x2e, 0xb6, 0x2c, + 0xa5, 0x8d, 0x9b, 0x44, 0xbe, 0x95, 0x34, 0xed, 0xfd, 0xc9, 0x81, 0xde, 0x07, 0x7b, 0x9e, 0xe7, + 0x5c, 0x1b, 0xfb, 0x3d, 0x8c, 0xe6, 0x21, 0x87, 0xf5, 0x7e, 0x97, 0x21, 0x8c, 0x0f, 0x91, 0xdf, + 0x92, 0xde, 0xef, 0x06, 0x51, 0xb2, 0x84, 0x8d, 0x43, 0x4c, 0x58, 0xd8, 0xbc, 0xaa, 0xa9, 0xb8, + 0x92, 0xa1, 0x00, 0x77, 0x0f, 0x00, 0xac, 0xb3, 0xf7, 0x41, 0x0c, 0xc1, 0x87, 0x16, 0x20, 0x87, + 0xf7, 0x6c, 0xac, 0x5b, 0x9a, 0xa1, 0x57, 0x26, 0x28, 0xc8, 0x9d, 0x21, 0xa3, 0x88, 0x3b, 0xad, + 0x20, 0x84, 0xcb, 0x87, 0x1e, 0x86, 0x09, 0xa3, 0x47, 0xe6, 0x9a, 0x55, 0xc9, 0x9e, 0x4c, 0xcc, + 0xe6, 0xcf, 0xde, 0x1a, 0xaa, 0x08, 0x97, 0x19, 0x8d, 0x2c, 0x88, 0xd1, 0x32, 0x94, 0x2d, 0xa3, + 0x6f, 0xaa, 0xb8, 0xa9, 0x1a, 0x2d, 0xdc, 0xd4, 0xf4, 0x6d, 0xa3, 0x92, 0xa3, 0x00, 0xb5, 0xc1, + 0x8e, 0x50, 0xc2, 0x05, 0xa3, 0x85, 0x97, 0xf5, 0x6d, 0x43, 0x2e, 0x5a, 0xbe, 0x67, 0x32, 0x5f, + 0xad, 0x7d, 0xdd, 0x56, 0xf6, 0x2a, 0x05, 0xaa, 0x21, 0xfc, 0x49, 0xfa, 0x5a, 0x06, 0x4a, 0x71, + 0x54, 0xec, 0x1c, 0x8c, 0x6f, 0x93, 0x5e, 0x56, 0x92, 0x87, 0x91, 0x01, 0xe3, 0xf1, 0x0b, 0x31, + 0x73, 0x83, 0x42, 0x9c, 0x87, 0xbc, 0x8e, 0x2d, 0x1b, 0xb7, 0x98, 0x46, 0xa4, 0x62, 0xea, 0x14, + 0x30, 0xa6, 0x41, 0x95, 0x4a, 0xdf, 0x90, 0x4a, 0x3d, 0x07, 0x25, 0xa7, 0x49, 0x4d, 0x53, 0xd1, + 0xdb, 0x42, 0x37, 0xcf, 0x44, 0xb5, 0x64, 0x6e, 0x49, 0xf0, 0xc9, 0x84, 0x4d, 0x2e, 0x62, 0xdf, + 0x33, 0x5a, 0x04, 0x30, 0x74, 0x6c, 0x6c, 0x37, 0x5b, 0x58, 0xed, 0x54, 0xb2, 0x43, 0xa4, 0x74, + 0x99, 0x90, 0x0c, 0x48, 0xc9, 0x60, 0xa5, 0x6a, 0x07, 0x3d, 0xe6, 0xaa, 0xda, 0xc4, 0x10, 0x4d, + 0x59, 0x65, 0x93, 0x6c, 0x40, 0xdb, 0x36, 0xa1, 0x68, 0x62, 0xa2, 0xf7, 0xb8, 0xc5, 0x7b, 0x96, + 0xa3, 0x8d, 0x98, 0x8b, 0xec, 0x99, 0xcc, 0xd9, 0x58, 0xc7, 0x26, 0x4d, 0xef, 0x23, 0x3a, 0x05, + 0x4e, 0x41, 0x93, 0xaa, 0x15, 0x50, 0x2b, 0x54, 0x10, 0x85, 0x97, 0x94, 0x2e, 0xae, 0xbe, 0x04, + 0x45, 0xbf, 0x78, 0x88, 0x99, 0xb7, 0x6c, 0xc5, 0xb4, 0xa9, 0x16, 0x8e, 0xcb, 0xec, 0x81, 0x38, + 0x22, 0xac, 0xb7, 0xa8, 0x95, 0x1b, 0x97, 0xc9, 0x4f, 0xf4, 0x5e, 0xb7, 0xc3, 0x29, 0xda, 0xe1, + 0xbb, 0x06, 0x47, 0xd4, 0x87, 0x1c, 0xec, 0x77, 0xf5, 0x11, 0x98, 0xf4, 0x75, 0x20, 0x6e, 0xd5, + 0xd2, 0x07, 0xe0, 0x48, 0x28, 0x34, 0x7a, 0x0e, 0x66, 0xfa, 0xba, 0xa6, 0xdb, 0xd8, 0xec, 0x99, + 0x98, 0x68, 0x2c, 0xab, 0xaa, 0xf2, 0x17, 0x13, 0x43, 0x74, 0x6e, 0xd3, 0x4b, 0xcd, 0x50, 0xe4, + 0xe9, 0xfe, 0x60, 0xe1, 0x3d, 0xb9, 0xec, 0x77, 0x27, 0xca, 0x2f, 0xbf, 0xfc, 0xf2, 0xcb, 0x49, + 0xe9, 0x5f, 0x67, 0x60, 0x26, 0x6c, 0xce, 0x84, 0x4e, 0xdf, 0xa3, 0x90, 0xd1, 0xfb, 0xdd, 0x2d, + 0x6c, 0x52, 0x21, 0x8d, 0xcb, 0xfc, 0x09, 0xcd, 0xc3, 0x78, 0x47, 0xd9, 0xc2, 0xcc, 0x25, 0x17, + 0xcf, 0xde, 0x1b, 0x6b, 0x56, 0xce, 0xad, 0x10, 0x16, 0x99, 0x71, 0xa2, 0x27, 0x20, 0xcd, 0x4d, + 0x34, 0x41, 0xb8, 0x27, 0x1e, 0x02, 0x99, 0x4b, 0x32, 0xe5, 0x43, 0xb7, 0x40, 0x8e, 0xfc, 0x65, + 0xba, 0x91, 0xa1, 0x6d, 0xce, 0x92, 0x02, 0xa2, 0x17, 0xa8, 0x0a, 0x59, 0x3a, 0x4d, 0x5a, 0x58, + 0xb8, 0x36, 0xe7, 0x99, 0x28, 0x56, 0x0b, 0x6f, 0x2b, 0xfd, 0x8e, 0xdd, 0xbc, 0xaa, 0x74, 0xfa, + 0x98, 0x2a, 0x7c, 0x4e, 0x2e, 0xf0, 0xc2, 0x2b, 0xa4, 0x8c, 0x44, 0x1e, 0x6c, 0x56, 0x69, 0x7a, + 0x0b, 0xef, 0x51, 0xeb, 0x39, 0x2e, 0xb3, 0x89, 0xb6, 0x4c, 0x4a, 0x48, 0xf5, 0x2f, 0x58, 0x86, + 0x2e, 0x54, 0x93, 0x56, 0x41, 0x0a, 0x68, 0xf5, 0x8f, 0x04, 0x0d, 0xf7, 0x6d, 0xe1, 0xdd, 0x1b, + 0x98, 0x4b, 0x77, 0x43, 0x89, 0x05, 0x13, 0x7c, 0xe8, 0x95, 0x4e, 0x65, 0x8a, 0x06, 0x3d, 0x45, + 0x56, 0x7c, 0x99, 0x97, 0x4a, 0x5f, 0x4e, 0x42, 0x9a, 0x1a, 0x96, 0x12, 0xe4, 0x37, 0xde, 0xb7, + 0xb6, 0xd4, 0x5c, 0xbc, 0xbc, 0xd9, 0x58, 0x59, 0x2a, 0x27, 0x50, 0x11, 0x80, 0x16, 0x9c, 0x5f, + 0xb9, 0x3c, 0xbf, 0x51, 0x4e, 0x3a, 0xcf, 0xcb, 0x97, 0x36, 0x1e, 0x7e, 0xb0, 0x9c, 0x72, 0x18, + 0x36, 0x59, 0x41, 0xda, 0x4b, 0xf0, 0xee, 0xb3, 0xe5, 0x71, 0x54, 0x86, 0x02, 0x03, 0x58, 0x7e, + 0x6e, 0x69, 0xf1, 0xe1, 0x07, 0xcb, 0x19, 0x7f, 0xc9, 0xbb, 0xcf, 0x96, 0x27, 0xd0, 0x24, 0xe4, + 0x68, 0x49, 0xe3, 0xf2, 0xe5, 0x95, 0x72, 0xd6, 0xc1, 0x5c, 0xdf, 0x90, 0x97, 0x2f, 0x5d, 0x28, + 0xe7, 0x1c, 0xcc, 0x0b, 0xf2, 0xe5, 0xcd, 0xb5, 0x32, 0x38, 0x08, 0xab, 0x4b, 0xeb, 0xeb, 0xf3, + 0x17, 0x96, 0xca, 0x79, 0x87, 0xa2, 0xf1, 0xbe, 0x8d, 0xa5, 0xf5, 0x72, 0xc1, 0xd7, 0xac, 0x77, + 0x9f, 0x2d, 0x4f, 0x3a, 0x55, 0x2c, 0x5d, 0xda, 0x5c, 0x2d, 0x17, 0xd1, 0x14, 0x4c, 0xb2, 0x2a, + 0x44, 0x23, 0x4a, 0x81, 0xa2, 0x87, 0x1f, 0x2c, 0x97, 0xdd, 0x86, 0x30, 0x94, 0x29, 0x5f, 0xc1, + 0xc3, 0x0f, 0x96, 0x91, 0xb4, 0x00, 0xe3, 0x54, 0x0d, 0x11, 0x82, 0xe2, 0xca, 0x7c, 0x63, 0x69, + 0xa5, 0x79, 0x79, 0x6d, 0x63, 0xf9, 0xf2, 0xa5, 0xf9, 0x95, 0x72, 0xc2, 0x2d, 0x93, 0x97, 0x9e, + 0xd9, 0x5c, 0x96, 0x97, 0x16, 0xcb, 0x49, 0x6f, 0xd9, 0xda, 0xd2, 0xfc, 0xc6, 0xd2, 0x62, 0x39, + 0x25, 0xa9, 0x30, 0x13, 0x66, 0x50, 0x43, 0xa7, 0x90, 0x47, 0x17, 0x92, 0x43, 0x74, 0x81, 0x62, + 0x05, 0x75, 0x41, 0x7a, 0x2d, 0x09, 0xd3, 0x21, 0x4e, 0x25, 0xb4, 0x92, 0x27, 0x61, 0x9c, 0xe9, + 0x32, 0x73, 0xb3, 0xa7, 0x43, 0xbd, 0x13, 0xd5, 0xec, 0x01, 0x57, 0x4b, 0xf9, 0xbc, 0xa1, 0x46, + 0x6a, 0x48, 0xa8, 0x41, 0x20, 0x06, 0x14, 0xf6, 0xa7, 0x07, 0x8c, 0x3f, 0xf3, 0x8f, 0x0f, 0xc7, + 0xf1, 0x8f, 0xb4, 0xec, 0x70, 0x4e, 0x60, 0x3c, 0xc4, 0x09, 0x9c, 0x83, 0xa9, 0x01, 0xa0, 0xd8, + 0xc6, 0xf8, 0xe7, 0x12, 0x50, 0x19, 0x26, 0x9c, 0x08, 0x93, 0x98, 0xf4, 0x99, 0xc4, 0x73, 0x41, + 0x09, 0xde, 0x3e, 0x7c, 0x10, 0x06, 0xc6, 0xfa, 0x0b, 0x09, 0x38, 0x1a, 0x1e, 0x52, 0x86, 0xb6, + 0xe1, 0x09, 0xc8, 0x74, 0xb1, 0xbd, 0x63, 0x88, 0xb0, 0xea, 0xae, 0x10, 0x67, 0x4d, 0x5e, 0x07, + 0x07, 0x9b, 0x73, 0x79, 0xbd, 0x7d, 0x6a, 0x58, 0x5c, 0xc8, 0x5a, 0x33, 0xd0, 0xd2, 0x8f, 0x26, + 0xe1, 0x48, 0x28, 0x78, 0x68, 0x43, 0x6f, 0x03, 0xd0, 0xf4, 0x5e, 0xdf, 0x66, 0xa1, 0x13, 0xb3, + 0xc4, 0x39, 0x5a, 0x42, 0x8d, 0x17, 0xb1, 0xb2, 0x7d, 0xdb, 0x79, 0x9f, 0xa2, 0xef, 0x81, 0x15, + 0x51, 0x82, 0x47, 0xdd, 0x86, 0xa6, 0x69, 0x43, 0x4f, 0x0c, 0xe9, 0xe9, 0x80, 0x62, 0x3e, 0x00, + 0x65, 0xb5, 0xa3, 0x61, 0xdd, 0x6e, 0x5a, 0xb6, 0x89, 0x95, 0xae, 0xa6, 0xb7, 0xa9, 0xab, 0xc9, + 0xd6, 0xc7, 0xb7, 0x95, 0x8e, 0x85, 0xe5, 0x12, 0x7b, 0xbd, 0x2e, 0xde, 0x12, 0x0e, 0xaa, 0x40, + 0xa6, 0x87, 0x23, 0xe3, 0xe3, 0x60, 0xaf, 0x1d, 0x0e, 0xe9, 0x97, 0x73, 0x90, 0xf7, 0x04, 0xe0, + 0xe8, 0x76, 0x28, 0xbc, 0xa0, 0x5c, 0x55, 0x9a, 0x62, 0x51, 0xc5, 0x24, 0x91, 0x27, 0x65, 0x6b, + 0x7c, 0x61, 0xf5, 0x00, 0xcc, 0x50, 0x12, 0xa3, 0x6f, 0x63, 0xb3, 0xa9, 0x76, 0x14, 0xcb, 0xa2, + 0x42, 0xcb, 0x52, 0x52, 0x44, 0xde, 0x5d, 0x26, 0xaf, 0x16, 0xc4, 0x1b, 0xf4, 0x10, 0x4c, 0x53, + 0x8e, 0x6e, 0xbf, 0x63, 0x6b, 0xbd, 0x0e, 0x6e, 0x92, 0x65, 0x9e, 0x45, 0x5d, 0x8e, 0xd3, 0xb2, + 0x29, 0x42, 0xb1, 0xca, 0x09, 0x48, 0x8b, 0x2c, 0xb4, 0x08, 0xb7, 0x51, 0xb6, 0x36, 0xd6, 0xb1, + 0xa9, 0xd8, 0xb8, 0x89, 0x5f, 0xec, 0x2b, 0x1d, 0xab, 0xa9, 0xe8, 0xad, 0xe6, 0x8e, 0x62, 0xed, + 0x54, 0x66, 0x08, 0x40, 0x23, 0x59, 0x49, 0xc8, 0xc7, 0x09, 0xe1, 0x05, 0x4e, 0xb7, 0x44, 0xc9, + 0xe6, 0xf5, 0xd6, 0x45, 0xc5, 0xda, 0x41, 0x75, 0x38, 0x4a, 0x51, 0x2c, 0xdb, 0xd4, 0xf4, 0x76, + 0x53, 0xdd, 0xc1, 0xea, 0x6e, 0xb3, 0x6f, 0x6f, 0x3f, 0x5a, 0xb9, 0xc5, 0x5b, 0x3f, 0x6d, 0xe1, + 0x3a, 0xa5, 0x59, 0x20, 0x24, 0x9b, 0xf6, 0xf6, 0xa3, 0x68, 0x1d, 0x0a, 0x64, 0x30, 0xba, 0xda, + 0x4b, 0xb8, 0xb9, 0x6d, 0x98, 0xd4, 0x87, 0x16, 0x43, 0x4c, 0x93, 0x47, 0x82, 0x73, 0x97, 0x39, + 0xc3, 0xaa, 0xd1, 0xc2, 0xf5, 0xf1, 0xf5, 0xb5, 0xa5, 0xa5, 0x45, 0x39, 0x2f, 0x50, 0xce, 0x1b, + 0x26, 0x51, 0xa8, 0xb6, 0xe1, 0x08, 0x38, 0xcf, 0x14, 0xaa, 0x6d, 0x08, 0xf1, 0x3e, 0x04, 0xd3, + 0xaa, 0xca, 0xfa, 0xac, 0xa9, 0x4d, 0xbe, 0x18, 0xb3, 0x2a, 0x65, 0x9f, 0xb0, 0x54, 0xf5, 0x02, + 0x23, 0xe0, 0x3a, 0x6e, 0xa1, 0xc7, 0xe0, 0x88, 0x2b, 0x2c, 0x2f, 0xe3, 0xd4, 0x40, 0x2f, 0x83, + 0xac, 0x0f, 0xc1, 0x74, 0x6f, 0x7f, 0x90, 0x11, 0xf9, 0x6a, 0xec, 0xed, 0x07, 0xd9, 0x1e, 0x81, + 0x99, 0xde, 0x4e, 0x6f, 0x90, 0xef, 0x1e, 0x2f, 0x1f, 0xea, 0xed, 0xf4, 0x82, 0x8c, 0x77, 0xd2, + 0x95, 0xb9, 0x89, 0x55, 0xc5, 0xc6, 0xad, 0xca, 0x31, 0x2f, 0xb9, 0xe7, 0x05, 0x9a, 0x83, 0xb2, + 0xaa, 0x36, 0xb1, 0xae, 0x6c, 0x75, 0x70, 0x53, 0x31, 0xb1, 0xae, 0x58, 0x95, 0x1a, 0x25, 0x4e, + 0xdb, 0x66, 0x1f, 0xcb, 0x45, 0x55, 0x5d, 0xa2, 0x2f, 0xe7, 0xe9, 0x3b, 0x74, 0x0f, 0x4c, 0x19, + 0x5b, 0x2f, 0xa8, 0x4c, 0x23, 0x9b, 0x3d, 0x13, 0x6f, 0x6b, 0x7b, 0x95, 0x3b, 0xa8, 0x78, 0x4b, + 0xe4, 0x05, 0xd5, 0xc7, 0x35, 0x5a, 0x8c, 0x4e, 0x43, 0x59, 0xb5, 0x76, 0x14, 0xb3, 0x47, 0x4d, + 0xb2, 0xd5, 0x53, 0x54, 0x5c, 0xb9, 0x93, 0x91, 0xb2, 0xf2, 0x4b, 0xa2, 0x98, 0xcc, 0x08, 0xeb, + 0x9a, 0xb6, 0x6d, 0x0b, 0xc4, 0xbb, 0xd9, 0x8c, 0xa0, 0x65, 0x1c, 0x6d, 0x16, 0xca, 0x44, 0x12, + 0xbe, 0x8a, 0x67, 0x29, 0x59, 0xb1, 0xb7, 0xd3, 0xf3, 0xd6, 0x7b, 0x0a, 0x26, 0x09, 0xa5, 0x5b, + 0xe9, 0x69, 0x16, 0xb8, 0xf5, 0x76, 0x3c, 0x35, 0x3e, 0x08, 0x47, 0x09, 0x51, 0x17, 0xdb, 0x4a, + 0x4b, 0xb1, 0x15, 0x0f, 0xf5, 0x7d, 0x94, 0x9a, 0x88, 0x7d, 0x95, 0xbf, 0xf4, 0xb5, 0xd3, 0xec, + 0x6f, 0xed, 0x3b, 0x8a, 0x75, 0x3f, 0x6b, 0x27, 0x29, 0x13, 0xaa, 0xf5, 0x96, 0x05, 0xe7, 0x52, + 0x1d, 0x0a, 0x5e, 0xbd, 0x47, 0x39, 0x60, 0x9a, 0x5f, 0x4e, 0x90, 0x20, 0x68, 0xe1, 0xf2, 0x22, + 0x09, 0x5f, 0x9e, 0x5f, 0x2a, 0x27, 0x49, 0x18, 0xb5, 0xb2, 0xbc, 0xb1, 0xd4, 0x94, 0x37, 0x2f, + 0x6d, 0x2c, 0xaf, 0x2e, 0x95, 0x53, 0x9e, 0xc0, 0xfe, 0xa9, 0x74, 0xf6, 0xae, 0xf2, 0xdd, 0xd2, + 0xb7, 0x92, 0x50, 0xf4, 0xaf, 0xd4, 0xd0, 0xe3, 0x70, 0x4c, 0xa4, 0x55, 0x2c, 0x6c, 0x37, 0xaf, + 0x69, 0x26, 0x9d, 0x90, 0x5d, 0x85, 0x39, 0x47, 0x47, 0x7f, 0x66, 0x38, 0xd5, 0x3a, 0xb6, 0x9f, + 0xd5, 0x4c, 0x32, 0xdd, 0xba, 0x8a, 0x8d, 0x56, 0xa0, 0xa6, 0x1b, 0x4d, 0xcb, 0x56, 0xf4, 0x96, + 0x62, 0xb6, 0x9a, 0x6e, 0x42, 0xab, 0xa9, 0xa8, 0x2a, 0xb6, 0x2c, 0x83, 0x39, 0x42, 0x07, 0xe5, + 0x56, 0xdd, 0x58, 0xe7, 0xc4, 0xae, 0x87, 0x98, 0xe7, 0xa4, 0x01, 0xf5, 0x4d, 0x0d, 0x53, 0xdf, + 0x5b, 0x20, 0xd7, 0x55, 0x7a, 0x4d, 0xac, 0xdb, 0xe6, 0x3e, 0x8d, 0xcf, 0xb3, 0x72, 0xb6, 0xab, + 0xf4, 0x96, 0xc8, 0xf3, 0xdb, 0xb2, 0x4c, 0x7a, 0x2a, 0x9d, 0xcd, 0x96, 0x73, 0x4f, 0xa5, 0xb3, + 0xb9, 0x32, 0x48, 0xaf, 0xa6, 0xa0, 0xe0, 0x8d, 0xd7, 0xc9, 0xf2, 0x47, 0xa5, 0x1e, 0x2b, 0x41, + 0x6d, 0xda, 0xa9, 0x91, 0xd1, 0xfd, 0xdc, 0x02, 0x71, 0x65, 0xf5, 0x0c, 0x0b, 0x8e, 0x65, 0xc6, + 0x49, 0xc2, 0x08, 0xa2, 0x6c, 0x98, 0x05, 0x23, 0x59, 0x99, 0x3f, 0xa1, 0x0b, 0x90, 0x79, 0xc1, + 0xa2, 0xd8, 0x19, 0x8a, 0x7d, 0xc7, 0x68, 0xec, 0xa7, 0xd6, 0x29, 0x78, 0xee, 0xa9, 0xf5, 0xe6, + 0xa5, 0xcb, 0xf2, 0xea, 0xfc, 0x8a, 0xcc, 0xd9, 0xd1, 0x71, 0x48, 0x77, 0x94, 0x97, 0xf6, 0xfd, + 0x4e, 0x8f, 0x16, 0xc5, 0x1d, 0x84, 0xe3, 0x90, 0xbe, 0x86, 0x95, 0x5d, 0xbf, 0xab, 0xa1, 0x45, + 0x6f, 0xe1, 0x64, 0x38, 0x03, 0xe3, 0x54, 0x5e, 0x08, 0x80, 0x4b, 0xac, 0x3c, 0x86, 0xb2, 0x90, + 0x5e, 0xb8, 0x2c, 0x93, 0x09, 0x51, 0x86, 0x02, 0x2b, 0x6d, 0xae, 0x2d, 0x2f, 0x2d, 0x2c, 0x95, + 0x93, 0xd2, 0x43, 0x90, 0x61, 0x42, 0x20, 0x93, 0xc5, 0x11, 0x43, 0x79, 0x8c, 0x3f, 0x72, 0x8c, + 0x84, 0x78, 0xbb, 0xb9, 0xda, 0x58, 0x92, 0xcb, 0x49, 0xff, 0x50, 0xa7, 0xcb, 0xe3, 0x92, 0x05, + 0x05, 0x6f, 0x1c, 0xfe, 0xf6, 0x2c, 0xc6, 0xbf, 0x9e, 0x80, 0xbc, 0x27, 0xae, 0x26, 0x01, 0x91, + 0xd2, 0xe9, 0x18, 0xd7, 0x9a, 0x4a, 0x47, 0x53, 0x2c, 0xae, 0x1a, 0x40, 0x8b, 0xe6, 0x49, 0x49, + 0xdc, 0xa1, 0x7b, 0x9b, 0xa6, 0xc8, 0x78, 0x39, 0x23, 0x7d, 0x36, 0x01, 0xe5, 0x60, 0x60, 0x1b, + 0x68, 0x66, 0xe2, 0x47, 0xd9, 0x4c, 0xe9, 0xd3, 0x09, 0x28, 0xfa, 0xa3, 0xd9, 0x40, 0xf3, 0x6e, + 0xff, 0x91, 0x36, 0xef, 0xcf, 0x93, 0x30, 0xe9, 0x8b, 0x61, 0xe3, 0xb6, 0xee, 0x45, 0x98, 0xd2, + 0x5a, 0xb8, 0xdb, 0x33, 0x6c, 0xac, 0xab, 0xfb, 0xcd, 0x0e, 0xbe, 0x8a, 0x3b, 0x15, 0x89, 0x1a, + 0x8d, 0x33, 0xa3, 0xa3, 0xe4, 0xb9, 0x65, 0x97, 0x6f, 0x85, 0xb0, 0xd5, 0xa7, 0x97, 0x17, 0x97, + 0x56, 0xd7, 0x2e, 0x6f, 0x2c, 0x5d, 0x5a, 0x78, 0x5f, 0x73, 0xf3, 0xd2, 0xd3, 0x97, 0x2e, 0x3f, + 0x7b, 0x49, 0x2e, 0x6b, 0x01, 0xb2, 0xb7, 0x70, 0xda, 0xaf, 0x41, 0x39, 0xd8, 0x28, 0x74, 0x0c, + 0xc2, 0x9a, 0x55, 0x1e, 0x43, 0xd3, 0x50, 0xba, 0x74, 0xb9, 0xb9, 0xbe, 0xbc, 0xb8, 0xd4, 0x5c, + 0x3a, 0x7f, 0x7e, 0x69, 0x61, 0x63, 0x9d, 0xe5, 0x3d, 0x1c, 0xea, 0x0d, 0xdf, 0x04, 0x97, 0x3e, + 0x95, 0x82, 0xe9, 0x90, 0x96, 0xa0, 0x79, 0xbe, 0x62, 0x61, 0x8b, 0xa8, 0xfb, 0xe3, 0xb4, 0x7e, + 0x8e, 0xc4, 0x0c, 0x6b, 0x8a, 0x69, 0xf3, 0x05, 0xce, 0x69, 0x20, 0x52, 0xd2, 0x6d, 0x6d, 0x5b, + 0xc3, 0x26, 0xcf, 0x27, 0xb1, 0x65, 0x4c, 0xc9, 0x2d, 0x67, 0x29, 0xa5, 0xfb, 0x00, 0xf5, 0x0c, + 0x4b, 0xb3, 0xb5, 0xab, 0xb8, 0xa9, 0xe9, 0x22, 0xf9, 0x94, 0xa6, 0xbb, 0x51, 0x65, 0xf1, 0x66, + 0x59, 0xb7, 0x1d, 0x6a, 0x1d, 0xb7, 0x95, 0x00, 0x35, 0x31, 0xe6, 0x29, 0xb9, 0x2c, 0xde, 0x38, + 0xd4, 0xb7, 0x43, 0xa1, 0x65, 0xf4, 0x49, 0xac, 0xc7, 0xe8, 0x88, 0xef, 0x48, 0xc8, 0x79, 0x56, + 0xe6, 0x90, 0xf0, 0x28, 0xde, 0xcd, 0x7a, 0x15, 0xe4, 0x3c, 0x2b, 0x63, 0x24, 0x77, 0x43, 0x49, + 0x69, 0xb7, 0x4d, 0x02, 0x2e, 0x80, 0xd8, 0xba, 0xa4, 0xe8, 0x14, 0x53, 0xc2, 0xea, 0x53, 0x90, + 0x15, 0x72, 0x20, 0xae, 0x9a, 0x48, 0xa2, 0xd9, 0x63, 0x8b, 0xed, 0xe4, 0x6c, 0x4e, 0xce, 0xea, + 0xe2, 0xe5, 0xed, 0x50, 0xd0, 0xac, 0xa6, 0x9b, 0xc4, 0x4f, 0x9e, 0x4c, 0xce, 0x66, 0xe5, 0xbc, + 0x66, 0x39, 0x09, 0x50, 0xe9, 0x0b, 0x49, 0x28, 0xfa, 0x37, 0x21, 0xd0, 0x22, 0x64, 0x3b, 0x86, + 0x4a, 0x77, 0x19, 0xf9, 0x0e, 0xd8, 0x6c, 0xc4, 0xbe, 0xc5, 0xdc, 0x0a, 0xa7, 0x97, 0x1d, 0xce, + 0xea, 0x7f, 0x48, 0x40, 0x56, 0x14, 0xa3, 0xa3, 0x90, 0xee, 0x29, 0xf6, 0x0e, 0x85, 0x1b, 0x6f, + 0x24, 0xcb, 0x09, 0x99, 0x3e, 0x93, 0x72, 0xab, 0xa7, 0xe8, 0x54, 0x05, 0x78, 0x39, 0x79, 0x26, + 0xe3, 0xda, 0xc1, 0x4a, 0x8b, 0x2e, 0x7a, 0x8c, 0x6e, 0x17, 0xeb, 0xb6, 0x25, 0xc6, 0x95, 0x97, + 0x2f, 0xf0, 0x62, 0x74, 0x2f, 0x4c, 0xd9, 0xa6, 0xa2, 0x75, 0x7c, 0xb4, 0x69, 0x4a, 0x5b, 0x16, + 0x2f, 0x1c, 0xe2, 0x3a, 0x1c, 0x17, 0xb8, 0x2d, 0x6c, 0x2b, 0xea, 0x0e, 0x6e, 0xb9, 0x4c, 0x19, + 0x9a, 0xdc, 0x38, 0xc6, 0x09, 0x16, 0xf9, 0x7b, 0xc1, 0x2b, 0x7d, 0x2b, 0x01, 0x53, 0x62, 0x99, + 0xd6, 0x72, 0x84, 0xb5, 0x0a, 0xa0, 0xe8, 0xba, 0x61, 0x7b, 0xc5, 0x35, 0xa8, 0xca, 0x03, 0x7c, + 0x73, 0xf3, 0x0e, 0x93, 0xec, 0x01, 0xa8, 0x76, 0x01, 0xdc, 0x37, 0x43, 0xc5, 0x56, 0x83, 0x3c, + 0xdf, 0x61, 0xa2, 0xdb, 0x94, 0x6c, 0x61, 0x0f, 0xac, 0x88, 0xac, 0xe7, 0xd0, 0x0c, 0x8c, 0x6f, + 0xe1, 0xb6, 0xa6, 0xf3, 0xbc, 0x31, 0x7b, 0x10, 0xe9, 0x97, 0xb4, 0x93, 0x7e, 0x69, 0x7c, 0x3c, + 0x01, 0xd3, 0xaa, 0xd1, 0x0d, 0xb6, 0xb7, 0x51, 0x0e, 0x64, 0x17, 0xac, 0x8b, 0x89, 0xe7, 0x9f, + 0xf0, 0xec, 0xc8, 0xb6, 0x8d, 0x8e, 0xa2, 0xb7, 0xdd, 0x7d, 0x56, 0xfa, 0x43, 0xbd, 0xbf, 0x8d, + 0xf5, 0xfb, 0xdb, 0x86, 0x67, 0xd7, 0xf5, 0x9c, 0xfb, 0xf3, 0xaf, 0x13, 0x89, 0xcf, 0x27, 0x53, + 0x17, 0xd6, 0x1a, 0x5f, 0x4c, 0x56, 0x2f, 0xb0, 0xea, 0xd6, 0x84, 0x78, 0x64, 0xbc, 0xdd, 0xc1, + 0x2a, 0xe9, 0x32, 0x7c, 0xef, 0x5e, 0x98, 0x69, 0x1b, 0x6d, 0x83, 0x22, 0x9e, 0x21, 0xbf, 0xf8, + 0xce, 0x6d, 0xce, 0x29, 0xad, 0x46, 0x6e, 0xf3, 0xd6, 0x2f, 0xc1, 0x34, 0x27, 0x6e, 0xd2, 0xad, + 0x23, 0xb6, 0xb0, 0x41, 0x23, 0xb3, 0x6a, 0x95, 0xdf, 0xfb, 0x0e, 0x75, 0xe8, 0xf2, 0x14, 0x67, + 0x25, 0xef, 0xd8, 0xda, 0xa7, 0x2e, 0xc3, 0x11, 0x1f, 0x1e, 0x9b, 0xb6, 0xd8, 0x8c, 0x40, 0xfc, + 0xb7, 0x1c, 0x71, 0xda, 0x83, 0xb8, 0xce, 0x59, 0xeb, 0x0b, 0x30, 0x79, 0x18, 0xac, 0x7f, 0xc7, + 0xb1, 0x0a, 0xd8, 0x0b, 0x72, 0x01, 0x4a, 0x14, 0x44, 0xed, 0x5b, 0xb6, 0xd1, 0xa5, 0x36, 0x71, + 0x34, 0xcc, 0x1f, 0x7d, 0x87, 0xcd, 0xa3, 0x22, 0x61, 0x5b, 0x70, 0xb8, 0xea, 0x75, 0xa0, 0xbb, + 0x65, 0x2d, 0xac, 0x76, 0x22, 0x10, 0xbe, 0xc1, 0x1b, 0xe2, 0xd0, 0xd7, 0xaf, 0xc0, 0x0c, 0xf9, + 0x4d, 0x4d, 0x96, 0xb7, 0x25, 0xd1, 0x29, 0xb8, 0xca, 0xb7, 0x7e, 0x8e, 0x4d, 0xd5, 0x69, 0x07, + 0xc0, 0xd3, 0x26, 0xcf, 0x28, 0xb6, 0xb1, 0x6d, 0x63, 0xd3, 0x6a, 0x2a, 0x9d, 0xb0, 0xe6, 0x79, + 0x72, 0x18, 0x95, 0xdf, 0x78, 0xdd, 0x3f, 0x8a, 0x17, 0x18, 0xe7, 0x7c, 0xa7, 0x53, 0xdf, 0x84, + 0x63, 0x21, 0x5a, 0x11, 0x03, 0xf3, 0x53, 0x1c, 0x73, 0x66, 0x40, 0x33, 0x08, 0xec, 0x1a, 0x88, + 0x72, 0x67, 0x2c, 0x63, 0x60, 0xfe, 0x7d, 0x8e, 0x89, 0x38, 0xaf, 0x18, 0x52, 0x82, 0xf8, 0x14, + 0x4c, 0x5d, 0xc5, 0xe6, 0x96, 0x61, 0xf1, 0xbc, 0x51, 0x0c, 0xb8, 0x4f, 0x73, 0xb8, 0x12, 0x67, + 0xa4, 0x89, 0x24, 0x82, 0xf5, 0x18, 0x64, 0xb7, 0x15, 0x15, 0xc7, 0x80, 0xf8, 0x0c, 0x87, 0x98, + 0x20, 0xf4, 0x84, 0x75, 0x1e, 0x0a, 0x6d, 0x83, 0x7b, 0xad, 0x68, 0xf6, 0xcf, 0x72, 0xf6, 0xbc, + 0xe0, 0xe1, 0x10, 0x3d, 0xa3, 0xd7, 0xef, 0x10, 0x97, 0x16, 0x0d, 0xf1, 0x9b, 0x02, 0x42, 0xf0, + 0x70, 0x88, 0x43, 0x88, 0xf5, 0x15, 0x01, 0x61, 0x79, 0xe4, 0xf9, 0x24, 0xe4, 0x0d, 0xbd, 0xb3, + 0x6f, 0xe8, 0x71, 0x1a, 0xf1, 0x39, 0x8e, 0x00, 0x9c, 0x85, 0x00, 0x9c, 0x83, 0x5c, 0xdc, 0x81, + 0xf8, 0x87, 0xaf, 0x8b, 0xe9, 0x21, 0x46, 0xe0, 0x02, 0x94, 0x84, 0x81, 0xd2, 0x0c, 0x3d, 0x06, + 0xc4, 0x3f, 0xe2, 0x10, 0x45, 0x0f, 0x1b, 0xef, 0x86, 0x8d, 0x2d, 0xbb, 0x8d, 0xe3, 0x80, 0x7c, + 0x41, 0x74, 0x83, 0xb3, 0x70, 0x51, 0x6e, 0x61, 0x5d, 0xdd, 0x89, 0x87, 0xf0, 0x5b, 0x42, 0x94, + 0x82, 0x87, 0x40, 0x2c, 0xc0, 0x64, 0x57, 0x31, 0xad, 0x1d, 0xa5, 0x13, 0x6b, 0x38, 0xfe, 0x31, + 0xc7, 0x28, 0x38, 0x4c, 0x5c, 0x22, 0x7d, 0xfd, 0x30, 0x30, 0x5f, 0x14, 0x12, 0xf1, 0xb0, 0xf1, + 0xa9, 0x67, 0xd9, 0x34, 0xc9, 0x76, 0x18, 0xb4, 0x7f, 0x22, 0xa6, 0x1e, 0xe3, 0x5d, 0xf5, 0x22, + 0x9e, 0x83, 0x9c, 0xa5, 0xbd, 0x14, 0x0b, 0xe6, 0x9f, 0x8a, 0x91, 0xa6, 0x0c, 0x84, 0xf9, 0x7d, + 0x70, 0x3c, 0xd4, 0x4d, 0xc4, 0x00, 0xfb, 0x67, 0x1c, 0xec, 0x68, 0x88, 0xab, 0xe0, 0x26, 0xe1, + 0xb0, 0x90, 0xbf, 0x2d, 0x4c, 0x02, 0x0e, 0x60, 0xad, 0x91, 0x75, 0x84, 0xa5, 0x6c, 0x1f, 0x4e, + 0x6a, 0xbf, 0x23, 0xa4, 0xc6, 0x78, 0x7d, 0x52, 0xdb, 0x80, 0xa3, 0x1c, 0xf1, 0x70, 0xe3, 0xfa, + 0xbb, 0xc2, 0xb0, 0x32, 0xee, 0x4d, 0xff, 0xe8, 0xbe, 0x1f, 0xaa, 0x8e, 0x38, 0x45, 0xc0, 0x6a, + 0x35, 0xbb, 0x4a, 0x2f, 0x06, 0xf2, 0xef, 0x71, 0x64, 0x61, 0xf1, 0x9d, 0x88, 0xd7, 0x5a, 0x55, + 0x7a, 0x04, 0xfc, 0x39, 0xa8, 0x08, 0xf0, 0xbe, 0x6e, 0x62, 0xd5, 0x68, 0xeb, 0xda, 0x4b, 0xb8, + 0x15, 0x03, 0xfa, 0x9f, 0x07, 0x86, 0x6a, 0xd3, 0xc3, 0x4e, 0x90, 0x97, 0xa1, 0xec, 0xc4, 0x2a, + 0x4d, 0xad, 0xdb, 0x33, 0x4c, 0x3b, 0x02, 0xf1, 0x5f, 0x88, 0x91, 0x72, 0xf8, 0x96, 0x29, 0x5b, + 0x7d, 0x09, 0xd8, 0xce, 0x73, 0x5c, 0x95, 0xfc, 0x12, 0x07, 0x9a, 0x74, 0xb9, 0xb8, 0xe1, 0x50, + 0x8d, 0x6e, 0x4f, 0x31, 0xe3, 0xd8, 0xbf, 0x7f, 0x29, 0x0c, 0x07, 0x67, 0xe1, 0x86, 0xc3, 0xde, + 0xef, 0x61, 0xe2, 0xed, 0x63, 0x20, 0x7c, 0x59, 0x18, 0x0e, 0xc1, 0xc3, 0x21, 0x44, 0xc0, 0x10, + 0x03, 0xe2, 0x2b, 0x02, 0x42, 0xf0, 0x10, 0x88, 0x67, 0x5c, 0x47, 0x6b, 0xe2, 0xb6, 0x66, 0xd9, + 0x26, 0x0b, 0x93, 0x47, 0x43, 0x7d, 0xf5, 0x75, 0x7f, 0x10, 0x26, 0x7b, 0x58, 0x89, 0x25, 0xe2, + 0x69, 0x57, 0xba, 0x8a, 0x8a, 0x6e, 0xd8, 0xd7, 0x84, 0x25, 0xf2, 0xb0, 0x91, 0xb6, 0x79, 0x22, + 0x44, 0x22, 0x76, 0x95, 0xac, 0x1d, 0x62, 0xc0, 0xfd, 0x7e, 0xa0, 0x71, 0xeb, 0x82, 0x97, 0x60, + 0x7a, 0xe2, 0x9f, 0xbe, 0xbe, 0x8b, 0xf7, 0x63, 0x69, 0xe7, 0x1f, 0x04, 0xe2, 0x9f, 0x4d, 0xc6, + 0xc9, 0x6c, 0x48, 0x29, 0x10, 0x4f, 0xa1, 0xa8, 0x73, 0x46, 0x95, 0xbf, 0xfd, 0x06, 0xef, 0xaf, + 0x3f, 0x9c, 0xaa, 0xaf, 0x10, 0x25, 0xf7, 0x07, 0x3d, 0xd1, 0x60, 0x3f, 0xf7, 0x86, 0xa3, 0xe7, + 0xbe, 0x98, 0xa7, 0x7e, 0x1e, 0x26, 0x7d, 0x01, 0x4f, 0x34, 0xd4, 0x07, 0x39, 0x54, 0xc1, 0x1b, + 0xef, 0xd4, 0x1f, 0x82, 0x34, 0x09, 0x5e, 0xa2, 0xd9, 0x7f, 0x9e, 0xb3, 0x53, 0xf2, 0xfa, 0x7b, + 0x20, 0x2b, 0x82, 0x96, 0x68, 0xd6, 0x0f, 0x71, 0x56, 0x87, 0x85, 0xb0, 0x8b, 0x80, 0x25, 0x9a, + 0xfd, 0xc3, 0x82, 0x5d, 0xb0, 0x10, 0xf6, 0xf8, 0x22, 0xfc, 0xfa, 0xdf, 0x49, 0x73, 0xa7, 0x23, + 0x64, 0x77, 0x0e, 0x26, 0x78, 0xa4, 0x12, 0xcd, 0xfd, 0x51, 0x5e, 0xb9, 0xe0, 0xa8, 0x3f, 0x02, + 0xe3, 0x31, 0x05, 0xfe, 0x8b, 0x9c, 0x95, 0xd1, 0xd7, 0x17, 0x20, 0xef, 0x89, 0x4e, 0xa2, 0xd9, + 0x7f, 0x89, 0xb3, 0x7b, 0xb9, 0x48, 0xd3, 0x79, 0x74, 0x12, 0x0d, 0xf0, 0x71, 0xd1, 0x74, 0xce, + 0x41, 0xc4, 0x26, 0x02, 0x93, 0x68, 0xee, 0x4f, 0x08, 0xa9, 0x0b, 0x96, 0xfa, 0x93, 0x90, 0x73, + 0x9c, 0x4d, 0x34, 0xff, 0x2f, 0x73, 0x7e, 0x97, 0x87, 0x48, 0xc0, 0xe3, 0xec, 0xa2, 0x21, 0x7e, + 0x45, 0x48, 0xc0, 0xc3, 0x45, 0xa6, 0x51, 0x30, 0x80, 0x89, 0x46, 0xfa, 0xbb, 0x62, 0x1a, 0x05, + 0xe2, 0x17, 0x32, 0x9a, 0xd4, 0xe6, 0x47, 0x43, 0xfc, 0xaa, 0x18, 0x4d, 0x4a, 0x4f, 0x9a, 0x11, + 0x8c, 0x08, 0xa2, 0x31, 0xfe, 0x9e, 0x68, 0x46, 0x20, 0x20, 0xa8, 0xaf, 0x01, 0x1a, 0x8c, 0x06, + 0xa2, 0xf1, 0x3e, 0xc9, 0xf1, 0xa6, 0x06, 0x82, 0x81, 0xfa, 0xb3, 0x70, 0x34, 0x3c, 0x12, 0x88, + 0x46, 0xfd, 0x8d, 0x37, 0x02, 0x6b, 0x37, 0x6f, 0x20, 0x50, 0xdf, 0x70, 0x5d, 0x8a, 0x37, 0x0a, + 0x88, 0x86, 0xfd, 0xd4, 0x1b, 0x7e, 0xc3, 0xed, 0x0d, 0x02, 0xea, 0xf3, 0x00, 0xae, 0x03, 0x8e, + 0xc6, 0xfa, 0x34, 0xc7, 0xf2, 0x30, 0x91, 0xa9, 0xc1, 0xfd, 0x6f, 0x34, 0xff, 0x67, 0xc4, 0xd4, + 0xe0, 0x1c, 0x64, 0x6a, 0x08, 0xd7, 0x1b, 0xcd, 0xfd, 0x59, 0x31, 0x35, 0x04, 0x0b, 0xd1, 0x6c, + 0x8f, 0x77, 0x8b, 0x46, 0xf8, 0x9c, 0xd0, 0x6c, 0x0f, 0x57, 0xfd, 0x12, 0x4c, 0x0d, 0x38, 0xc4, + 0x68, 0xa8, 0xcf, 0x73, 0xa8, 0x72, 0xd0, 0x1f, 0x7a, 0x9d, 0x17, 0x77, 0x86, 0xd1, 0x68, 0xff, + 0x20, 0xe0, 0xbc, 0xb8, 0x2f, 0xac, 0x9f, 0x83, 0xac, 0xde, 0xef, 0x74, 0xc8, 0xe4, 0x41, 0xa3, + 0xcf, 0x06, 0x56, 0xfe, 0xfb, 0x0f, 0xb9, 0x74, 0x04, 0x43, 0xfd, 0x21, 0x18, 0xc7, 0xdd, 0x2d, + 0xdc, 0x8a, 0xe2, 0xfc, 0xde, 0x0f, 0x85, 0xc1, 0x24, 0xd4, 0xf5, 0x27, 0x01, 0x58, 0x6a, 0x84, + 0x6e, 0x0f, 0x46, 0xf0, 0xfe, 0x8f, 0x1f, 0xf2, 0xc3, 0x38, 0x2e, 0x8b, 0x0b, 0xc0, 0x8e, 0xf6, + 0x8c, 0x06, 0x78, 0xdd, 0x0f, 0x40, 0x47, 0xe4, 0x31, 0x98, 0x78, 0xc1, 0x32, 0x74, 0x5b, 0x69, + 0x47, 0x71, 0xff, 0x4f, 0xce, 0x2d, 0xe8, 0x89, 0xc0, 0xba, 0x86, 0x89, 0x6d, 0xa5, 0x6d, 0x45, + 0xf1, 0xfe, 0x2f, 0xce, 0xeb, 0x30, 0x10, 0x66, 0x55, 0xb1, 0xec, 0x38, 0xfd, 0xfe, 0xdf, 0x82, + 0x59, 0x30, 0x90, 0x46, 0x93, 0xdf, 0xbb, 0x78, 0x3f, 0x8a, 0xf7, 0xfb, 0xa2, 0xd1, 0x9c, 0xbe, + 0xfe, 0x1e, 0xc8, 0x91, 0x9f, 0xec, 0x84, 0x5d, 0x04, 0xf3, 0xff, 0xe1, 0xcc, 0x2e, 0x07, 0xa9, + 0xd9, 0xb2, 0x5b, 0xb6, 0x16, 0x2d, 0xec, 0xeb, 0x7c, 0xa4, 0x05, 0x7d, 0x7d, 0x1e, 0xf2, 0x96, + 0xdd, 0x6a, 0xf5, 0x79, 0x7c, 0x1a, 0xc1, 0xfe, 0x7f, 0x7f, 0xe8, 0xa4, 0x2c, 0x1c, 0x1e, 0x32, + 0xda, 0xd7, 0x76, 0xed, 0x9e, 0x41, 0xb7, 0x40, 0xa2, 0x10, 0xde, 0xe0, 0x08, 0x1e, 0x96, 0xfa, + 0x02, 0x14, 0x48, 0x5f, 0x4c, 0xdc, 0xc3, 0x74, 0xbf, 0x2a, 0x02, 0xe2, 0x2f, 0xb9, 0x00, 0x7c, + 0x4c, 0x8d, 0x9f, 0x1e, 0x76, 0x3f, 0x27, 0x3c, 0x6d, 0x0c, 0x17, 0x8c, 0x0b, 0x06, 0x4b, 0x18, + 0x3f, 0x2f, 0xf9, 0xd2, 0xc5, 0x6d, 0xc3, 0xcd, 0xd6, 0x3a, 0x8b, 0x1c, 0xf8, 0xfd, 0x24, 0xdc, + 0x49, 0x8f, 0x05, 0x9b, 0x5d, 0x4d, 0xb7, 0xcf, 0xa8, 0xe6, 0x7e, 0xcf, 0x36, 0xce, 0x74, 0xb1, + 0xb9, 0xdb, 0xc1, 0xfc, 0x0f, 0xcf, 0xfe, 0x56, 0x5c, 0xb2, 0x39, 0x46, 0x36, 0xc7, 0xde, 0x57, + 0x43, 0xb3, 0xc5, 0xd2, 0x02, 0x4c, 0xac, 0x99, 0x86, 0xb1, 0x7d, 0xb9, 0x87, 0x10, 0x3f, 0xe9, + 0xcc, 0x0f, 0xc6, 0x51, 0x35, 0xe4, 0x37, 0xa3, 0x92, 0xee, 0xcd, 0x28, 0x04, 0xe9, 0x96, 0x62, + 0x2b, 0x34, 0x61, 0x5e, 0x90, 0xe9, 0x6f, 0xa9, 0x01, 0xe3, 0x14, 0x04, 0x3d, 0x06, 0x29, 0xa3, + 0x67, 0xf1, 0xec, 0xfe, 0xed, 0x73, 0xc3, 0xda, 0x32, 0xc7, 0xab, 0x6c, 0xa4, 0xbf, 0x71, 0x50, + 0x1b, 0x93, 0x09, 0x4f, 0x63, 0xed, 0xaf, 0xbf, 0x7d, 0x22, 0xf1, 0x5b, 0xaf, 0x9e, 0x48, 0x0c, + 0xbd, 0xe9, 0x34, 0xe7, 0x11, 0x94, 0x47, 0x18, 0xc3, 0xe4, 0xe2, 0xdc, 0x77, 0xfa, 0x85, 0x24, + 0x9c, 0xf0, 0x10, 0x75, 0xb4, 0x2d, 0xeb, 0xcc, 0xee, 0x55, 0x76, 0x35, 0x8a, 0x4b, 0x0d, 0x79, + 0x5a, 0x4a, 0xde, 0xcf, 0xed, 0x5e, 0x1d, 0x22, 0xaf, 0x39, 0x48, 0xaf, 0x29, 0x9a, 0x19, 0x72, + 0x65, 0x6c, 0xc6, 0x3d, 0xdb, 0x4a, 0xca, 0xd8, 0x83, 0x74, 0x16, 0xb2, 0x4f, 0x2f, 0x3f, 0xfc, + 0x60, 0x1c, 0x9e, 0x14, 0xe7, 0x69, 0xc8, 0x42, 0x14, 0x5f, 0x0d, 0x11, 0xc7, 0xd7, 0x5f, 0x3b, + 0x91, 0x08, 0xbd, 0xfc, 0x15, 0x2e, 0x12, 0xde, 0x5b, 0x47, 0x18, 0x9f, 0x48, 0x42, 0x2d, 0xb8, + 0x2b, 0x40, 0xa6, 0xa2, 0x65, 0x2b, 0xdd, 0xde, 0xb0, 0xbb, 0x5f, 0xe7, 0x20, 0xb7, 0x21, 0x68, + 0x50, 0x05, 0x26, 0x2c, 0xac, 0x1a, 0x7a, 0xcb, 0xa2, 0x3d, 0x49, 0xc9, 0xe2, 0x91, 0xf4, 0x46, + 0x57, 0x74, 0xc3, 0xe2, 0x27, 0x4e, 0xd9, 0x43, 0xe3, 0xd7, 0x13, 0x87, 0x9b, 0x1b, 0x45, 0xa7, + 0x2a, 0x3a, 0x41, 0xd6, 0x12, 0xcf, 0xdf, 0x3b, 0x6a, 0x43, 0x85, 0xdd, 0x70, 0x73, 0xba, 0xe0, + 0xd9, 0x3d, 0x39, 0x11, 0xdc, 0x3d, 0x79, 0x16, 0x77, 0x3a, 0x4f, 0xeb, 0xc6, 0x35, 0x7d, 0x83, + 0xf0, 0x38, 0x22, 0xf9, 0x58, 0x12, 0x4e, 0x0c, 0x6c, 0x94, 0x70, 0xf3, 0x32, 0x4c, 0x22, 0x75, + 0xc8, 0x2e, 0x0a, 0xab, 0x75, 0x58, 0x81, 0xfc, 0xea, 0x21, 0x05, 0x32, 0x29, 0x6a, 0x12, 0xf2, + 0xb8, 0x27, 0x5a, 0x1e, 0xa2, 0xfd, 0x37, 0x20, 0x8e, 0x0f, 0x3e, 0x01, 0xb7, 0x7b, 0x14, 0x48, + 0xd9, 0x52, 0x35, 0x7e, 0x8d, 0xd0, 0x3b, 0x63, 0x8e, 0x78, 0x66, 0x0c, 0x21, 0x99, 0xa3, 0x2f, + 0xc3, 0x27, 0x4d, 0x35, 0x9e, 0xed, 0xaa, 0x46, 0xcc, 0xd2, 0x6a, 0x94, 0xe2, 0x56, 0x23, 0x86, + 0x51, 0xfa, 0xab, 0x71, 0x98, 0x10, 0x77, 0x3e, 0x1f, 0x85, 0x34, 0x56, 0x77, 0x0c, 0x7e, 0xd8, + 0x5d, 0x9a, 0x0b, 0xed, 0xcf, 0x1c, 0xa7, 0x5e, 0x52, 0x77, 0x8c, 0x8b, 0x63, 0x32, 0xe5, 0xa0, + 0x77, 0xc5, 0x3a, 0x7d, 0x6b, 0x87, 0x9f, 0x49, 0x3e, 0x35, 0x9a, 0xf5, 0x3c, 0x21, 0xbd, 0x38, + 0x26, 0x33, 0x1e, 0x52, 0x2d, 0xbd, 0xe7, 0x96, 0x8e, 0x53, 0xed, 0xb2, 0xbe, 0x4d, 0xab, 0x25, + 0x1c, 0xe8, 0x22, 0x80, 0x85, 0x6d, 0x71, 0x94, 0x61, 0x9c, 0xf2, 0xdf, 0x3d, 0x9a, 0x7f, 0x1d, + 0xdb, 0xcc, 0x6d, 0x5d, 0x1c, 0x93, 0x73, 0x96, 0x78, 0x20, 0x48, 0x9a, 0xae, 0xd9, 0x4d, 0x75, + 0x47, 0xd1, 0x74, 0xba, 0x07, 0x1f, 0x89, 0xb4, 0xac, 0x6b, 0xf6, 0x02, 0x21, 0x27, 0x48, 0x9a, + 0x78, 0x20, 0xa2, 0xa0, 0x77, 0x4b, 0xf9, 0x65, 0xac, 0x08, 0x51, 0x3c, 0x43, 0x48, 0x89, 0x28, + 0x28, 0x0f, 0x7a, 0x1a, 0xf2, 0x74, 0xbb, 0xb5, 0xb9, 0xd5, 0x31, 0xd4, 0x5d, 0x7e, 0x03, 0x65, + 0x76, 0x34, 0x44, 0x83, 0x30, 0x34, 0x08, 0xfd, 0xc5, 0x31, 0x19, 0xb6, 0x9c, 0x27, 0xd4, 0x80, + 0x2c, 0x3b, 0xf5, 0x6b, 0xef, 0xf1, 0x3b, 0x84, 0x77, 0x8e, 0x46, 0xa2, 0x07, 0x80, 0x37, 0xf6, + 0x2e, 0x8e, 0xc9, 0x13, 0x2a, 0xfb, 0x89, 0x96, 0x20, 0x87, 0xf5, 0x16, 0x6f, 0x4e, 0x9e, 0xdf, + 0xb6, 0x1a, 0xad, 0x17, 0x7a, 0x4b, 0x34, 0x26, 0x8b, 0xf9, 0x6f, 0xf4, 0x04, 0x64, 0x54, 0xa3, + 0xdb, 0xd5, 0x6c, 0x7a, 0x17, 0x31, 0x7f, 0xf6, 0x8e, 0x88, 0x86, 0x50, 0xda, 0x8b, 0x63, 0x32, + 0xe7, 0x22, 0xc3, 0xd3, 0xc2, 0x1d, 0xed, 0x2a, 0x36, 0x49, 0x67, 0xa6, 0xe3, 0x0c, 0xcf, 0x22, + 0xa3, 0xa7, 0xdd, 0xc9, 0xb5, 0xc4, 0x43, 0x63, 0x82, 0xbb, 0x17, 0xe9, 0x6e, 0xc8, 0x7b, 0x34, + 0x99, 0x58, 0x2c, 0xbe, 0x02, 0xe1, 0xce, 0x5e, 0x3c, 0x4a, 0x45, 0x28, 0x78, 0xf5, 0x56, 0xea, + 0x3a, 0x8c, 0x74, 0x13, 0xbf, 0x02, 0x13, 0x57, 0xb1, 0x69, 0xb1, 0x1d, 0x7c, 0xca, 0xc8, 0x1f, + 0xd1, 0x29, 0x98, 0xa4, 0x72, 0x6b, 0x8a, 0xf7, 0xec, 0xfa, 0x72, 0x81, 0x16, 0x5e, 0xe1, 0x44, + 0x35, 0xc8, 0xf7, 0xce, 0xf6, 0x1c, 0x12, 0x76, 0x87, 0x1a, 0x7a, 0x67, 0x7b, 0x9c, 0x40, 0xaa, + 0x43, 0x39, 0xa8, 0xba, 0x5e, 0xaf, 0x99, 0x0b, 0xf1, 0x9a, 0x39, 0xe1, 0x69, 0x7f, 0x37, 0xe9, + 0x30, 0x3b, 0xda, 0x4a, 0xa6, 0x1b, 0x31, 0x12, 0x94, 0x3b, 0x7f, 0xb6, 0x3a, 0x10, 0xda, 0x39, + 0xbe, 0xa6, 0x91, 0x25, 0xa1, 0xc8, 0x27, 0xfe, 0xac, 0x96, 0x90, 0x29, 0x07, 0x3a, 0x4e, 0x14, + 0x4a, 0xd1, 0xf4, 0xa6, 0xd6, 0x12, 0xb7, 0x8e, 0xe9, 0xf3, 0x72, 0x0b, 0x3d, 0x03, 0x65, 0xd5, + 0xd0, 0x2d, 0xac, 0x5b, 0x7d, 0xab, 0xd9, 0x53, 0x4c, 0xa5, 0xeb, 0x5e, 0xce, 0x0b, 0x1f, 0xa6, + 0x05, 0x41, 0xbe, 0x46, 0xa9, 0xe5, 0x92, 0xea, 0x2f, 0x40, 0x2b, 0x00, 0x57, 0x95, 0x8e, 0xd6, + 0x52, 0x6c, 0xc3, 0xb4, 0xf8, 0xdd, 0x94, 0x61, 0x60, 0x57, 0x04, 0xe1, 0x66, 0xaf, 0xa5, 0xd8, + 0x98, 0x07, 0x51, 0x1e, 0x7e, 0x74, 0x17, 0x94, 0x94, 0x5e, 0xaf, 0x69, 0xd9, 0x8a, 0x8d, 0x9b, + 0x5b, 0xfb, 0x36, 0xb6, 0xa8, 0xbd, 0x28, 0xc8, 0x93, 0x4a, 0xaf, 0xb7, 0x4e, 0x4a, 0x1b, 0xa4, + 0x50, 0x6a, 0x39, 0xa3, 0x4d, 0xa7, 0xa6, 0x13, 0xdb, 0x25, 0xdc, 0xd8, 0x8e, 0x94, 0xd1, 0xa3, + 0x15, 0x4c, 0x06, 0xe2, 0x34, 0x4a, 0x66, 0x07, 0x6b, 0xed, 0x1d, 0x76, 0x0d, 0x3e, 0x25, 0xf3, + 0x27, 0x32, 0x30, 0x3d, 0xd3, 0xb8, 0x8a, 0xf9, 0x0d, 0x78, 0xf6, 0x20, 0xfd, 0x5a, 0x12, 0xa6, + 0x06, 0xa6, 0x2f, 0xc1, 0xa5, 0xe7, 0xfb, 0x79, 0x5d, 0xe4, 0x37, 0x3a, 0x47, 0x70, 0x95, 0x16, + 0xbf, 0xb3, 0x92, 0x3f, 0x7b, 0xdb, 0x10, 0x09, 0x5c, 0xa4, 0x44, 0xbc, 0xe3, 0x9c, 0x05, 0x6d, + 0x42, 0xb9, 0xa3, 0x58, 0x76, 0x93, 0xcd, 0x22, 0x76, 0x9b, 0x38, 0x35, 0xd2, 0x12, 0xac, 0x28, + 0x62, 0xf6, 0x11, 0xe5, 0xe6, 0x70, 0xc5, 0x8e, 0xaf, 0x14, 0x3d, 0x07, 0x33, 0x5b, 0xfb, 0x2f, + 0x29, 0xba, 0xad, 0xe9, 0xf4, 0xb0, 0x91, 0x7f, 0x8c, 0x6a, 0x43, 0xa0, 0x97, 0xae, 0x6a, 0x2d, + 0xac, 0xab, 0x62, 0x70, 0xa6, 0x1d, 0x08, 0x67, 0xf0, 0x2c, 0xe9, 0x39, 0x28, 0xfa, 0x6d, 0x11, + 0x2a, 0x42, 0xd2, 0xde, 0xe3, 0x12, 0x49, 0xda, 0x7b, 0xe8, 0x61, 0x1e, 0x91, 0x27, 0xe9, 0x69, + 0xb9, 0x61, 0xce, 0x82, 0x73, 0xbb, 0x77, 0x0e, 0x25, 0xc9, 0x99, 0x09, 0x8e, 0x61, 0x08, 0x62, + 0x4b, 0xa7, 0xa1, 0x14, 0x30, 0x62, 0x9e, 0x61, 0x4d, 0x78, 0x87, 0x55, 0x2a, 0xc1, 0xa4, 0xcf, + 0x56, 0x49, 0x7f, 0x9c, 0x81, 0xac, 0xf3, 0x2d, 0x83, 0x8b, 0x90, 0xc3, 0x7b, 0x2a, 0xee, 0xd9, + 0xc2, 0x2a, 0x8c, 0x32, 0xe2, 0x8c, 0x67, 0x49, 0xd0, 0x13, 0x73, 0xe5, 0x30, 0xa3, 0xc7, 0x7c, + 0x2e, 0xf9, 0x54, 0x14, 0x88, 0xd7, 0x27, 0x3f, 0xee, 0xf7, 0xc9, 0x77, 0x44, 0xf0, 0x06, 0x9c, + 0xf2, 0x63, 0x3e, 0xa7, 0x1c, 0x55, 0xb1, 0xcf, 0x2b, 0x2f, 0x87, 0x78, 0xe5, 0xa8, 0xee, 0x0f, + 0x71, 0xcb, 0xcb, 0x21, 0x6e, 0x79, 0x36, 0xb2, 0x2d, 0xa1, 0x7e, 0xf9, 0x71, 0xbf, 0x5f, 0x8e, + 0x12, 0x47, 0xc0, 0x31, 0xaf, 0x84, 0x39, 0xe6, 0xd3, 0x11, 0x18, 0x43, 0x3d, 0xf3, 0xc2, 0x80, + 0x67, 0xbe, 0x2b, 0x02, 0x2a, 0xc4, 0x35, 0x2f, 0xfb, 0x7c, 0x22, 0xc4, 0x92, 0x4d, 0xb8, 0x53, + 0x44, 0xe7, 0x07, 0xbd, 0xfc, 0xdd, 0x51, 0xaa, 0x16, 0xe6, 0xe6, 0x9f, 0x0c, 0xb8, 0xf9, 0x3b, + 0xa3, 0x7a, 0x15, 0xf0, 0xf3, 0xae, 0x77, 0x3e, 0x4d, 0xec, 0x63, 0x60, 0x66, 0x10, 0x5b, 0x8a, + 0x4d, 0xd3, 0x30, 0xb9, 0xe3, 0x63, 0x0f, 0xd2, 0x2c, 0xb1, 0xd8, 0xae, 0xfe, 0x8f, 0xf0, 0xe4, + 0x74, 0xd2, 0x7a, 0xb4, 0x5d, 0xfa, 0x6a, 0xc2, 0xe5, 0xa5, 0x96, 0xcd, 0x6b, 0xed, 0x73, 0xdc, + 0xda, 0x7b, 0x1c, 0x7c, 0xd2, 0xef, 0xe0, 0x6b, 0x90, 0x27, 0x3e, 0x25, 0xe0, 0xbb, 0x95, 0x9e, + 0xf0, 0xdd, 0xe8, 0x1e, 0x98, 0xa2, 0xf6, 0x97, 0x85, 0x01, 0xdc, 0x90, 0xa4, 0xa9, 0x21, 0x29, + 0x91, 0x17, 0x4c, 0x82, 0xcc, 0x51, 0xdc, 0x0f, 0xd3, 0x1e, 0x5a, 0x82, 0x4b, 0x7d, 0x01, 0x73, + 0x52, 0x65, 0x87, 0x7a, 0xbe, 0xd7, 0xbb, 0xa8, 0x58, 0x3b, 0xd2, 0xaa, 0x2b, 0x20, 0x37, 0x2e, + 0x40, 0x90, 0x56, 0x8d, 0x16, 0xeb, 0xf7, 0xa4, 0x4c, 0x7f, 0x93, 0x58, 0xa1, 0x63, 0xb4, 0xf9, + 0x09, 0x48, 0xf2, 0x93, 0x50, 0x39, 0x53, 0x3b, 0xc7, 0xe6, 0xac, 0xf4, 0xa5, 0x84, 0x8b, 0xe7, + 0x86, 0x0a, 0x61, 0x5e, 0x3d, 0x71, 0x33, 0xbd, 0x7a, 0xf2, 0xcd, 0x79, 0x75, 0xe9, 0x8d, 0x84, + 0x3b, 0xa4, 0x8e, 0xbf, 0xbe, 0x31, 0x11, 0x10, 0xed, 0x62, 0x37, 0xc6, 0xd9, 0x49, 0x5d, 0xf6, + 0x20, 0x42, 0xad, 0x4c, 0x48, 0x82, 0x62, 0xc2, 0x93, 0xd4, 0x40, 0x0f, 0x51, 0x3f, 0x6f, 0x6c, + 0x73, 0xd3, 0x50, 0x8b, 0x48, 0xf4, 0xc8, 0x8c, 0xda, 0xe3, 0x5f, 0x72, 0xbe, 0xb0, 0xe1, 0x56, + 0xc8, 0x91, 0xa6, 0xb3, 0xeb, 0x4f, 0xc0, 0xd3, 0x8b, 0xa2, 0x40, 0x6a, 0x01, 0x1a, 0xb4, 0x31, + 0xe8, 0x12, 0x64, 0xf0, 0x55, 0x7a, 0x1a, 0x95, 0x25, 0x9b, 0x6e, 0x1d, 0xea, 0x88, 0xb1, 0x6e, + 0x37, 0x2a, 0x44, 0x98, 0xdf, 0x3b, 0xa8, 0x95, 0x19, 0xcf, 0x7d, 0x46, 0x57, 0xb3, 0x71, 0xb7, + 0x67, 0xef, 0xcb, 0x1c, 0x45, 0xfa, 0x70, 0x92, 0xf8, 0x43, 0x9f, 0xfd, 0x09, 0x15, 0xaf, 0x98, + 0x34, 0x49, 0x4f, 0x88, 0x14, 0x4f, 0xe4, 0xb7, 0x01, 0xb4, 0x15, 0xab, 0x79, 0x4d, 0xd1, 0x6d, + 0xdc, 0xe2, 0x72, 0xcf, 0xb5, 0x15, 0xeb, 0x59, 0x5a, 0x40, 0xe2, 0x4d, 0xf2, 0xba, 0x6f, 0xe1, + 0x16, 0x1d, 0x80, 0x94, 0x3c, 0xd1, 0x56, 0xac, 0x4d, 0x0b, 0xb7, 0x3c, 0x7d, 0x9d, 0xb8, 0x19, + 0x7d, 0xf5, 0xcb, 0x3b, 0x1b, 0x94, 0xf7, 0x47, 0x93, 0xee, 0xec, 0x70, 0xc3, 0x87, 0x1f, 0x4f, + 0x59, 0x7c, 0x86, 0xae, 0x29, 0xfc, 0x4e, 0x00, 0xbd, 0x0f, 0xa6, 0x9c, 0x59, 0xd9, 0xec, 0xd3, + 0xd9, 0x2a, 0xb4, 0xf0, 0x70, 0x93, 0xbb, 0x7c, 0xd5, 0x5f, 0x6c, 0xa1, 0x9f, 0x81, 0x63, 0x01, + 0x1b, 0xe4, 0x54, 0x90, 0x3c, 0x94, 0x29, 0x3a, 0xe2, 0x37, 0x45, 0x02, 0xdf, 0x95, 0x5e, 0xea, + 0xa6, 0xcc, 0x9a, 0x3b, 0x48, 0x08, 0xeb, 0x75, 0x6f, 0x61, 0x3a, 0x21, 0xfd, 0x49, 0x02, 0x4a, + 0x81, 0x06, 0xa2, 0x47, 0x61, 0x9c, 0x79, 0xe0, 0xc4, 0xc8, 0x44, 0x08, 0x95, 0x38, 0xef, 0x13, + 0x63, 0x40, 0xf3, 0x90, 0xc5, 0x3c, 0xba, 0xe6, 0x42, 0xb9, 0x33, 0x22, 0x08, 0xe7, 0xfc, 0x0e, + 0x1b, 0x5a, 0x84, 0x9c, 0x23, 0xfa, 0x88, 0x95, 0x9b, 0x33, 0x72, 0x1c, 0xc4, 0x65, 0x94, 0x16, + 0x20, 0xef, 0x69, 0x1e, 0xbb, 0x0b, 0xb8, 0xc7, 0x97, 0x5b, 0x2c, 0x80, 0xce, 0x76, 0x95, 0x3d, + 0xba, 0xd2, 0x42, 0xc7, 0x60, 0x82, 0xbc, 0x6c, 0xf3, 0xcb, 0x52, 0x29, 0x39, 0xd3, 0x55, 0xf6, + 0x2e, 0x28, 0x96, 0xf4, 0xb1, 0x04, 0x14, 0xfd, 0xed, 0x44, 0xf7, 0x02, 0x22, 0xb4, 0x4a, 0x1b, + 0x37, 0xf5, 0x7e, 0x97, 0xf9, 0x48, 0x81, 0x58, 0xea, 0x2a, 0x7b, 0xf3, 0x6d, 0x7c, 0xa9, 0xdf, + 0xa5, 0x55, 0x5b, 0x68, 0x15, 0xca, 0x82, 0x58, 0x24, 0xbb, 0xb8, 0x54, 0x8e, 0x0f, 0x7e, 0xd7, + 0x86, 0x13, 0xb0, 0xb5, 0xee, 0x27, 0xc9, 0x5a, 0xb7, 0xc8, 0xf0, 0xc4, 0x1b, 0xe9, 0x21, 0x28, + 0x05, 0x7a, 0x8c, 0x24, 0x98, 0xec, 0xf5, 0xb7, 0x9a, 0xbb, 0x78, 0x9f, 0xde, 0x7e, 0x67, 0xaa, + 0x9e, 0x93, 0xf3, 0xbd, 0xfe, 0xd6, 0xd3, 0x78, 0x9f, 0xe6, 0x0e, 0x25, 0x15, 0x8a, 0xfe, 0xc5, + 0x14, 0x71, 0x1c, 0xa6, 0xd1, 0xd7, 0x5b, 0xe2, 0xbb, 0x06, 0xf4, 0x01, 0x9d, 0x83, 0xf1, 0xab, + 0x06, 0xd3, 0xe6, 0x51, 0xab, 0xa7, 0x2b, 0x86, 0x8d, 0x3d, 0x4b, 0x32, 0xc6, 0x23, 0x59, 0x30, + 0x4e, 0xf5, 0x32, 0x74, 0xa3, 0xe2, 0x0a, 0x80, 0x62, 0xdb, 0xa6, 0xb6, 0xd5, 0x77, 0xe1, 0x2b, + 0x73, 0x83, 0x69, 0xfd, 0xb9, 0x35, 0x45, 0x33, 0x1b, 0xb7, 0x72, 0xcd, 0x9e, 0x71, 0x79, 0x3c, + 0xda, 0xed, 0x41, 0x92, 0x5e, 0x4f, 0x43, 0x86, 0x2d, 0x37, 0xd1, 0x13, 0xfe, 0xe4, 0x47, 0xfe, + 0xec, 0x89, 0x61, 0xcd, 0x67, 0x54, 0xbc, 0xf5, 0x4e, 0x04, 0x75, 0x57, 0x30, 0xa3, 0xd0, 0xc8, + 0xbf, 0x7a, 0x50, 0x9b, 0xa0, 0xd1, 0xc7, 0xf2, 0xa2, 0x9b, 0x5e, 0x18, 0xb6, 0xba, 0x16, 0xb9, + 0x8c, 0xf4, 0xa1, 0x73, 0x19, 0x17, 0x61, 0xd2, 0x13, 0x6e, 0x69, 0x2d, 0xbe, 0x4e, 0x39, 0x31, + 0x6a, 0xd2, 0x2d, 0x2f, 0xf2, 0xf6, 0xe7, 0x9d, 0x70, 0x6c, 0xb9, 0x85, 0x66, 0xfd, 0x8b, 0x6c, + 0x1a, 0xb5, 0xb1, 0x70, 0xc1, 0xb3, 0x6e, 0xa6, 0x57, 0xf2, 0x6f, 0x81, 0x1c, 0xbd, 0xd8, 0x4c, + 0x49, 0x58, 0xf4, 0x90, 0x25, 0x05, 0xf4, 0xe5, 0xdd, 0x50, 0x72, 0x03, 0x1b, 0x46, 0x92, 0x65, + 0x28, 0x6e, 0x31, 0x25, 0x7c, 0x00, 0x66, 0xe8, 0x87, 0xf2, 0x82, 0xd4, 0x39, 0x4a, 0x8d, 0xc8, + 0xbb, 0x2b, 0x7e, 0x8e, 0x3b, 0xa1, 0xe8, 0x9a, 0x50, 0x4a, 0x0b, 0x2c, 0xf5, 0xe1, 0x94, 0x52, + 0xb2, 0xe3, 0x90, 0x75, 0xc2, 0xce, 0x3c, 0xfb, 0x02, 0x9f, 0xc2, 0xa2, 0x4d, 0x27, 0x90, 0x35, + 0xb1, 0xd5, 0xef, 0xd8, 0x1c, 0xa4, 0x40, 0x69, 0x68, 0x20, 0x2b, 0xb3, 0x72, 0x4a, 0x7b, 0x0a, + 0x26, 0x85, 0x55, 0x61, 0x74, 0x93, 0x94, 0xae, 0x20, 0x0a, 0x29, 0xd1, 0x69, 0x28, 0xf7, 0x4c, + 0xa3, 0x67, 0x58, 0xd8, 0x6c, 0x2a, 0xad, 0x96, 0x89, 0x2d, 0xab, 0x52, 0x64, 0x78, 0xa2, 0x7c, + 0x9e, 0x15, 0x4b, 0xef, 0x82, 0x09, 0x11, 0x4f, 0xcf, 0xc0, 0x78, 0xc3, 0xb1, 0x90, 0x69, 0x99, + 0x3d, 0x10, 0xff, 0x3a, 0xdf, 0xeb, 0xf1, 0xec, 0x1a, 0xf9, 0x29, 0x75, 0x60, 0x82, 0x0f, 0x58, + 0x68, 0x4e, 0x65, 0x15, 0x0a, 0x3d, 0xc5, 0x24, 0xdd, 0xf0, 0x66, 0x56, 0x86, 0xad, 0x08, 0xd7, + 0x14, 0xd3, 0x5e, 0xc7, 0xb6, 0x2f, 0xc1, 0x92, 0xa7, 0xfc, 0xac, 0x48, 0x7a, 0x0c, 0x26, 0x7d, + 0x34, 0xee, 0xf7, 0x0a, 0xf9, 0x44, 0xa7, 0x0f, 0x4e, 0x4b, 0x92, 0x6e, 0x4b, 0xa4, 0x73, 0x90, + 0x73, 0xc6, 0x8a, 0x2c, 0x34, 0x84, 0x28, 0xf8, 0x07, 0x10, 0xf9, 0x23, 0x4d, 0x22, 0x19, 0xd7, + 0xf8, 0xa7, 0x9c, 0x52, 0x32, 0x7b, 0x90, 0xb0, 0xc7, 0x30, 0x31, 0x6f, 0x86, 0x1e, 0x87, 0x09, + 0x6e, 0x98, 0xf8, 0x7c, 0x1c, 0x96, 0x2e, 0x5a, 0xa3, 0x96, 0x4a, 0xa4, 0x8b, 0x98, 0xdd, 0x72, + 0xab, 0x49, 0x7a, 0xab, 0xf9, 0x00, 0x64, 0x85, 0xf1, 0xf1, 0x7b, 0x09, 0x56, 0xc3, 0xc9, 0x28, + 0x2f, 0xc1, 0x2b, 0x71, 0x19, 0x89, 0x36, 0x59, 0x5a, 0x5b, 0xc7, 0xad, 0xa6, 0x3b, 0x05, 0xf9, + 0x85, 0xd9, 0x12, 0x7b, 0xb1, 0x22, 0xe6, 0x97, 0xf4, 0x00, 0x64, 0x58, 0x5b, 0x43, 0x4d, 0x5c, + 0x98, 0x6b, 0xfd, 0x4e, 0x02, 0xb2, 0xc2, 0x7d, 0x84, 0x32, 0xf9, 0x3a, 0x91, 0xbc, 0xd1, 0x4e, + 0xdc, 0x7c, 0x93, 0x74, 0x1f, 0x20, 0xaa, 0x29, 0xcd, 0xab, 0x86, 0xad, 0xe9, 0xed, 0x26, 0x1b, + 0x0b, 0x7e, 0x6f, 0x90, 0xbe, 0xb9, 0x42, 0x5f, 0xac, 0x91, 0xf2, 0x7b, 0x4e, 0x41, 0xde, 0x93, + 0xe5, 0x42, 0x13, 0x90, 0xba, 0x84, 0xaf, 0x95, 0xc7, 0x50, 0x1e, 0x26, 0x64, 0x4c, 0x73, 0x04, + 0xe5, 0xc4, 0xd9, 0xd7, 0x27, 0xa0, 0x34, 0xdf, 0x58, 0x58, 0x9e, 0xef, 0xf5, 0x3a, 0x1a, 0xbf, + 0x4f, 0x77, 0x19, 0xd2, 0x74, 0x9d, 0x1c, 0x63, 0x7f, 0xa7, 0x1a, 0x27, 0xe1, 0x84, 0x64, 0x18, + 0xa7, 0xcb, 0x69, 0x14, 0x67, 0xdb, 0xa7, 0x1a, 0x2b, 0x0f, 0x45, 0x1a, 0x49, 0x15, 0x2e, 0xc6, + 0x6e, 0x50, 0x35, 0x4e, 0x72, 0x0a, 0xfd, 0x0c, 0xe4, 0xdc, 0x75, 0x72, 0xdc, 0x3d, 0xa2, 0x6a, + 0xec, 0xb4, 0x15, 0xc1, 0x77, 0x57, 0x06, 0x71, 0xb7, 0x26, 0xaa, 0xb1, 0xf3, 0x35, 0xe8, 0x39, + 0x98, 0x10, 0x6b, 0xb0, 0x78, 0xbb, 0x38, 0xd5, 0x98, 0x29, 0x25, 0x32, 0x7c, 0x6c, 0xe9, 0x1c, + 0x67, 0xab, 0xaa, 0x1a, 0x2b, 0x6f, 0x86, 0x36, 0x21, 0xc3, 0x83, 0xdf, 0x58, 0x3b, 0x3d, 0xd5, + 0x78, 0x89, 0x22, 0x22, 0x64, 0x37, 0x39, 0x11, 0x77, 0x7b, 0xae, 0x1a, 0x3b, 0x61, 0x88, 0x14, + 0x00, 0xcf, 0x7a, 0x3a, 0xf6, 0xbe, 0x5b, 0x35, 0x7e, 0x22, 0x10, 0xbd, 0x1f, 0xb2, 0xce, 0xaa, + 0x29, 0xe6, 0x4e, 0x5a, 0x35, 0x6e, 0x2e, 0xae, 0xb1, 0x19, 0xfb, 0x94, 0xc4, 0xbd, 0x91, 0xa7, + 0x24, 0xdc, 0x4d, 0x6e, 0x67, 0x1b, 0xfc, 0x2f, 0x13, 0x70, 0x3c, 0xb8, 0x9d, 0xac, 0xe8, 0xfb, + 0x43, 0x0e, 0x04, 0x0c, 0x39, 0x2d, 0xf2, 0x38, 0xa4, 0xe6, 0xf5, 0x7d, 0x12, 0x6c, 0xd0, 0x6f, + 0x00, 0xf6, 0xcd, 0x8e, 0x48, 0xd3, 0x91, 0xe7, 0x4d, 0xb3, 0x13, 0x7e, 0x6a, 0xa4, 0x9e, 0xfe, + 0xfe, 0xe7, 0x6a, 0x63, 0x8d, 0xdd, 0x90, 0x5e, 0x45, 0x9c, 0x15, 0xc8, 0xce, 0xeb, 0xfb, 0xe2, + 0x98, 0xc0, 0x38, 0xed, 0xd0, 0x61, 0xb7, 0xff, 0x5f, 0x2b, 0x10, 0x64, 0xcf, 0x77, 0x84, 0x79, + 0x8f, 0x33, 0xec, 0x69, 0xc8, 0x0e, 0x7f, 0xf4, 0x89, 0x81, 0xea, 0x70, 0x69, 0x4a, 0x17, 0x20, + 0xbd, 0x60, 0x68, 0x34, 0xe4, 0x69, 0x61, 0xdd, 0xe8, 0x8a, 0x9c, 0x27, 0x7d, 0x40, 0xa7, 0x20, + 0xa3, 0x74, 0x8d, 0xbe, 0x6e, 0x8b, 0xa8, 0x99, 0xb8, 0x92, 0xff, 0x7a, 0x50, 0x4b, 0x2d, 0xeb, + 0xb6, 0xcc, 0x5f, 0xd5, 0xd3, 0xdf, 0x7d, 0xa5, 0x96, 0x90, 0x9e, 0x82, 0x89, 0x45, 0xac, 0xde, + 0x08, 0xd6, 0x22, 0x56, 0x03, 0x58, 0xa7, 0x21, 0xbb, 0xac, 0xdb, 0xec, 0x9b, 0x61, 0xb7, 0x41, + 0x4a, 0xd3, 0xd9, 0xb6, 0x48, 0xa0, 0x7e, 0x52, 0x4e, 0x48, 0x17, 0xb1, 0xea, 0x90, 0xb6, 0xb0, + 0x1a, 0x24, 0x25, 0xf0, 0xa4, 0x5c, 0x6a, 0x40, 0xe1, 0x8a, 0xd2, 0xe1, 0xe1, 0x1e, 0xb6, 0xd0, + 0x7d, 0x90, 0x53, 0xc4, 0x03, 0x5d, 0x59, 0x15, 0x1a, 0xc5, 0x1f, 0x1c, 0xd4, 0xc0, 0x25, 0x92, + 0x5d, 0x82, 0x7a, 0xfa, 0xe5, 0xff, 0x76, 0x32, 0x21, 0x19, 0x30, 0x71, 0x41, 0xb1, 0xa8, 0xa5, + 0x7f, 0xd0, 0x97, 0x48, 0xa1, 0x91, 0x62, 0xe3, 0xc8, 0xf5, 0x83, 0xda, 0xd4, 0xbe, 0xd2, 0xed, + 0xd4, 0x25, 0xf7, 0x9d, 0xe4, 0xcd, 0xaf, 0xcc, 0x79, 0xf2, 0x2b, 0x34, 0x92, 0x6c, 0x4c, 0x5f, + 0x3f, 0xa8, 0x95, 0x5c, 0x1e, 0xf2, 0x46, 0x72, 0x92, 0x2e, 0x52, 0x0f, 0x32, 0x2c, 0xe8, 0x0d, + 0xdd, 0x21, 0xe4, 0x29, 0x9f, 0xa4, 0x9b, 0xf2, 0xa9, 0x1f, 0x2a, 0xcd, 0xc0, 0xe3, 0x32, 0xc6, + 0x51, 0x4f, 0x7f, 0xe4, 0x95, 0xda, 0x98, 0x64, 0x02, 0x5a, 0xd7, 0xba, 0xfd, 0x0e, 0xbb, 0xf8, + 0x2d, 0xb6, 0x9a, 0x1e, 0x64, 0xed, 0xa6, 0xe9, 0x24, 0x16, 0x90, 0x95, 0xe6, 0xb8, 0x92, 0x72, + 0x81, 0xb0, 0x38, 0xe3, 0x9b, 0x07, 0xb5, 0x04, 0x6d, 0x3d, 0x95, 0xd1, 0x5d, 0x90, 0x61, 0xa1, + 0x3c, 0x8f, 0x7f, 0x8a, 0x82, 0x87, 0xf5, 0x49, 0xe6, 0x6f, 0xa5, 0x27, 0x60, 0x62, 0xd5, 0x6a, + 0x2f, 0x92, 0x2e, 0x1d, 0x87, 0x6c, 0xd7, 0x6a, 0x37, 0x3d, 0xd1, 0xd4, 0x44, 0xd7, 0x6a, 0x6f, + 0x0c, 0x89, 0xc2, 0xf8, 0xb0, 0xbc, 0x1b, 0x32, 0x1b, 0x7b, 0x94, 0xfd, 0x94, 0x23, 0xa5, 0x94, + 0xb7, 0x8d, 0x1c, 0xdd, 0xc7, 0xf4, 0xc1, 0x14, 0xc0, 0xc6, 0x9e, 0xd3, 0xc3, 0x21, 0x5b, 0x70, + 0x48, 0x82, 0x8c, 0xbd, 0xe7, 0x44, 0xd4, 0xb9, 0x06, 0xbc, 0x7a, 0x50, 0xcb, 0x6c, 0xec, 0x91, + 0xe5, 0x85, 0xcc, 0xdf, 0xf8, 0x53, 0x59, 0xa9, 0x40, 0x2a, 0xcb, 0x49, 0xe0, 0xa5, 0x43, 0x12, + 0x78, 0xe3, 0x9e, 0x1d, 0x80, 0x63, 0x30, 0x61, 0x2a, 0xd7, 0x9a, 0x64, 0x44, 0xd9, 0xd7, 0x4a, + 0x33, 0xa6, 0x72, 0x6d, 0xc5, 0x68, 0xa3, 0x05, 0x48, 0x77, 0x8c, 0xb6, 0xc8, 0xbb, 0x1d, 0x15, + 0x9d, 0x22, 0x11, 0x17, 0x3f, 0x4d, 0xbc, 0x62, 0xb4, 0x1b, 0xc7, 0x88, 0xfc, 0xbf, 0xf8, 0x67, + 0xb5, 0x92, 0xbf, 0xdc, 0x92, 0x29, 0xb3, 0x93, 0x0c, 0xcc, 0x0e, 0x4d, 0x06, 0xe6, 0x46, 0x25, + 0x03, 0xc1, 0x9f, 0x0c, 0xbc, 0x83, 0xee, 0x69, 0xb2, 0x3d, 0x9c, 0x99, 0x81, 0xe0, 0x73, 0x5e, + 0xdf, 0xa7, 0xbb, 0xa8, 0xb7, 0x42, 0xce, 0x39, 0x28, 0xc4, 0x3f, 0x0f, 0xed, 0x16, 0x70, 0x7d, + 0xfb, 0x48, 0x02, 0x8a, 0xfe, 0x16, 0xd3, 0x7c, 0x8e, 0xd5, 0xe6, 0x1f, 0x56, 0x65, 0x69, 0x4f, + 0xa2, 0x14, 0xcb, 0x22, 0x53, 0x1e, 0xd0, 0xf9, 0xf9, 0x80, 0xce, 0x4f, 0x0b, 0x01, 0xb1, 0xbb, + 0x3b, 0x4c, 0xd5, 0x67, 0xb8, 0x74, 0x0a, 0x9e, 0x42, 0xcb, 0x55, 0x7d, 0xaa, 0x11, 0x3f, 0x0b, + 0x79, 0xcf, 0xdb, 0xd0, 0xa0, 0xfe, 0x91, 0x90, 0x64, 0xc7, 0x94, 0x33, 0x20, 0xe2, 0x8d, 0xd8, + 0x42, 0x70, 0x49, 0x1d, 0x45, 0xcd, 0x39, 0x44, 0x71, 0x8f, 0x57, 0x34, 0x16, 0xff, 0xf4, 0xdb, + 0x27, 0xc6, 0x5e, 0x7e, 0xf5, 0xc4, 0xd8, 0xd0, 0xf3, 0x99, 0x52, 0xf4, 0x97, 0xe8, 0x1d, 0x2f, + 0xf3, 0xd1, 0xf7, 0xc2, 0xad, 0x9c, 0xc6, 0xb2, 0x95, 0x5d, 0x4d, 0x6f, 0x8b, 0xbf, 0xdc, 0xdd, + 0x14, 0x79, 0x6f, 0x78, 0xe9, 0x8d, 0xbb, 0x9d, 0x37, 0x7b, 0x68, 0xac, 0x1a, 0xe6, 0x0d, 0xa5, + 0x83, 0x34, 0xa0, 0x55, 0xab, 0xbd, 0x60, 0x62, 0xf6, 0xb1, 0x11, 0xbe, 0x4e, 0xf2, 0x5f, 0xf6, + 0xe1, 0x36, 0xea, 0x96, 0x39, 0x7f, 0x5f, 0x9c, 0xef, 0x4b, 0xbb, 0x39, 0x22, 0xdf, 0x15, 0xa1, + 0x25, 0x00, 0x9a, 0x5e, 0xb1, 0x2c, 0x37, 0x99, 0x57, 0x0b, 0x62, 0x2c, 0x38, 0x14, 0xb2, 0x62, + 0x63, 0x4b, 0x8c, 0xb5, 0xcb, 0x88, 0x3e, 0x00, 0xd3, 0x5d, 0x4d, 0x6f, 0x5a, 0xb8, 0xb3, 0xdd, + 0x6c, 0xe1, 0x0e, 0xfd, 0x14, 0x0b, 0xdf, 0xb8, 0xcb, 0x35, 0x56, 0xb8, 0x63, 0xba, 0x2b, 0x7a, + 0xcc, 0xe6, 0x96, 0x75, 0xfb, 0xfa, 0x41, 0xad, 0xca, 0xbc, 0x43, 0x08, 0xa4, 0x24, 0x4f, 0x75, + 0x35, 0x7d, 0x1d, 0x77, 0xb6, 0x17, 0x9d, 0x32, 0xf4, 0x12, 0x4c, 0x71, 0x0a, 0xc3, 0x4d, 0x7a, + 0x10, 0xdb, 0x53, 0x68, 0xac, 0x5e, 0x3f, 0xa8, 0x55, 0x18, 0xda, 0x00, 0x89, 0xf4, 0x83, 0x83, + 0xda, 0xfd, 0x31, 0xda, 0x34, 0xaf, 0xaa, 0xc2, 0x3d, 0x96, 0x1d, 0x10, 0x5e, 0x42, 0xea, 0x76, + 0x13, 0xf4, 0xa2, 0xee, 0xf1, 0x60, 0xdd, 0x03, 0x24, 0x71, 0xeb, 0xf6, 0xb8, 0x66, 0x37, 0x83, + 0x2f, 0xea, 0x3e, 0x0a, 0x99, 0x5e, 0x7f, 0x4b, 0xec, 0xa2, 0xe5, 0x64, 0xfe, 0x84, 0x66, 0xbd, + 0x1b, 0x69, 0xf9, 0xb3, 0x05, 0x31, 0x9e, 0x24, 0x56, 0x71, 0xd2, 0x9c, 0x2c, 0xf6, 0xa3, 0xd1, + 0xc7, 0x57, 0x53, 0x50, 0x5e, 0xb5, 0xda, 0x4b, 0x2d, 0xcd, 0xbe, 0xc9, 0xea, 0xd5, 0x0b, 0x93, + 0x0e, 0xf5, 0x66, 0x8d, 0x85, 0xeb, 0x07, 0xb5, 0x22, 0x93, 0xce, 0xcd, 0x94, 0x49, 0x17, 0x4a, + 0xae, 0x5e, 0x36, 0x4d, 0xc5, 0xe6, 0xee, 0xa9, 0xb1, 0x18, 0x53, 0x03, 0x17, 0xb1, 0x7a, 0xfd, + 0xa0, 0x76, 0x94, 0xb5, 0x2c, 0x00, 0x25, 0xc9, 0x45, 0xd5, 0x37, 0x17, 0xd0, 0x5e, 0xb8, 0xe2, + 0xd3, 0xfd, 0xa7, 0xc6, 0xc5, 0xb7, 0x50, 0xe9, 0xf9, 0xd0, 0x7d, 0x25, 0x09, 0x79, 0xe2, 0xea, + 0x59, 0x39, 0x0e, 0x9f, 0x0a, 0x89, 0x1f, 0xe1, 0x54, 0x48, 0xbe, 0x3d, 0x53, 0xe1, 0x1e, 0x27, + 0xd6, 0x4e, 0x0d, 0xd5, 0x79, 0x7f, 0xc8, 0xfd, 0x1f, 0x53, 0xd4, 0xaa, 0xd2, 0x15, 0xa4, 0x8c, + 0x5b, 0xef, 0x04, 0x01, 0xfe, 0x7c, 0x02, 0x8e, 0xb8, 0xe2, 0xb1, 0x4c, 0x35, 0x20, 0xc5, 0x67, + 0xae, 0x1f, 0xd4, 0x6e, 0x0d, 0x4a, 0xd1, 0x43, 0x76, 0x03, 0x92, 0x9c, 0x76, 0x80, 0xd6, 0x4d, + 0x35, 0xbc, 0x1d, 0x2d, 0xcb, 0x76, 0xda, 0x91, 0x1a, 0xde, 0x0e, 0x0f, 0xd9, 0x9b, 0x6a, 0xc7, + 0xa2, 0x65, 0x0f, 0x0e, 0x6a, 0x3a, 0xe6, 0xa0, 0x7e, 0x2d, 0x09, 0x93, 0xab, 0x56, 0x7b, 0x53, + 0x6f, 0xfd, 0x64, 0x42, 0x1c, 0x76, 0x42, 0x7c, 0x2c, 0x01, 0xc5, 0x8b, 0x9a, 0x65, 0x1b, 0xa6, + 0xa6, 0x2a, 0x1d, 0xba, 0x9a, 0x71, 0xcf, 0x48, 0x26, 0x0e, 0x7f, 0x46, 0xf2, 0x11, 0xc8, 0x5c, + 0x55, 0x3a, 0xec, 0xdf, 0x1a, 0xa5, 0xe8, 0x1e, 0x61, 0xc0, 0x77, 0x04, 0x73, 0xc0, 0x9c, 0x9c, + 0x37, 0xe7, 0x77, 0x92, 0x50, 0x0a, 0x04, 0x1e, 0xa8, 0x01, 0x69, 0x6a, 0xd1, 0xd9, 0x82, 0x77, + 0xee, 0x10, 0x71, 0x05, 0x59, 0x13, 0x53, 0x5e, 0xf4, 0x53, 0x90, 0xed, 0x2a, 0x7b, 0xcc, 0x33, + 0xb0, 0xf5, 0xcd, 0xfc, 0xe1, 0x70, 0xdc, 0xd5, 0xab, 0xc0, 0x91, 0xe4, 0x89, 0xae, 0xb2, 0x47, + 0xfd, 0x41, 0x0f, 0x4a, 0xa4, 0x54, 0xdd, 0x51, 0xf4, 0x36, 0xf6, 0xba, 0x9f, 0x8b, 0x87, 0xae, + 0xe4, 0xa8, 0x5b, 0x89, 0x07, 0x4e, 0x92, 0x27, 0xbb, 0xca, 0xde, 0x02, 0x2d, 0x20, 0x35, 0xd6, + 0xb3, 0x9f, 0x7c, 0xa5, 0x36, 0x46, 0x25, 0xf6, 0xef, 0x13, 0x00, 0xae, 0xc4, 0xd0, 0x06, 0x94, + 0x03, 0xee, 0x4b, 0x9c, 0x31, 0x8a, 0x0c, 0xf0, 0xdc, 0x85, 0x6d, 0x49, 0x0d, 0x0c, 0xc1, 0xfb, + 0x21, 0xcf, 0x4e, 0x09, 0x34, 0x69, 0x32, 0x3e, 0x19, 0x99, 0x8c, 0x3f, 0x41, 0xb0, 0xae, 0x1f, + 0xd4, 0x10, 0xeb, 0x8e, 0x87, 0x59, 0xa2, 0x29, 0x7a, 0x60, 0x25, 0x84, 0xc1, 0xdf, 0x97, 0xbc, + 0x27, 0xb6, 0xa0, 0x67, 0xcf, 0x0c, 0x5d, 0xdb, 0xc5, 0xa6, 0xb3, 0x46, 0x66, 0x8f, 0xa8, 0x0a, + 0x59, 0xf6, 0x55, 0x41, 0x7b, 0x5f, 0xfc, 0x5b, 0x0b, 0xf1, 0x4c, 0xb8, 0xae, 0xe1, 0x2d, 0x4b, + 0x13, 0xa3, 0x20, 0x8b, 0x47, 0x74, 0x1e, 0xca, 0x16, 0x56, 0xfb, 0xa6, 0x66, 0xef, 0x37, 0x55, + 0x43, 0xb7, 0x15, 0xd5, 0xe6, 0x4e, 0xfb, 0x96, 0xeb, 0x07, 0xb5, 0x63, 0xac, 0xad, 0x41, 0x0a, + 0x49, 0x2e, 0x89, 0xa2, 0x05, 0x56, 0x42, 0x6a, 0x68, 0x61, 0x5b, 0xd1, 0x3a, 0x16, 0x5f, 0xd8, + 0x8a, 0x47, 0x4f, 0x5f, 0x7e, 0x7b, 0xc2, 0xbb, 0x19, 0x75, 0x0d, 0xca, 0x46, 0x0f, 0x9b, 0x21, + 0xf6, 0x68, 0xc5, 0xad, 0x39, 0x48, 0x71, 0x03, 0x26, 0xa1, 0x24, 0x30, 0x84, 0x45, 0x38, 0xef, + 0x3b, 0x73, 0xc6, 0xe2, 0xc6, 0x64, 0xb0, 0xcb, 0x41, 0x0a, 0xc9, 0x7b, 0xd0, 0x8c, 0x45, 0x97, + 0x47, 0x21, 0xf3, 0x82, 0xa2, 0x75, 0xc4, 0xa7, 0x56, 0x65, 0xfe, 0x84, 0x96, 0x21, 0x63, 0xd9, + 0x8a, 0xdd, 0x67, 0xa1, 0xf7, 0x78, 0xe3, 0x5d, 0x31, 0xdb, 0xdc, 0x30, 0xf4, 0xd6, 0x3a, 0x65, + 0x94, 0x39, 0x00, 0x3a, 0x0f, 0x19, 0xdb, 0xd8, 0xc5, 0x3a, 0x17, 0xea, 0xa1, 0x66, 0x3a, 0x4d, + 0xd4, 0x31, 0x6e, 0x64, 0x83, 0x6b, 0x94, 0x9b, 0xd6, 0x8e, 0x62, 0x62, 0x8b, 0x85, 0xca, 0x8d, + 0xe5, 0x43, 0x4f, 0xc7, 0x63, 0x41, 0x4f, 0xc1, 0xf0, 0x24, 0xb9, 0xe4, 0x14, 0xad, 0xd3, 0x92, + 0x60, 0xe4, 0x3c, 0x71, 0x43, 0x91, 0xf3, 0x79, 0x28, 0xf7, 0xf5, 0x2d, 0x43, 0xa7, 0x9f, 0x45, + 0xe4, 0x69, 0x9a, 0xec, 0xc9, 0xc4, 0x6c, 0xca, 0x3b, 0x5a, 0x41, 0x0a, 0x49, 0x2e, 0x39, 0x45, + 0xfc, 0xf4, 0x63, 0x0b, 0x8a, 0x2e, 0x15, 0x9d, 0xb2, 0xb9, 0xc8, 0x29, 0x7b, 0x3b, 0x9f, 0xb2, + 0x47, 0x82, 0xb5, 0xb8, 0xb3, 0x76, 0xd2, 0x29, 0x24, 0x6c, 0xe8, 0xbd, 0xbe, 0x65, 0x24, 0xf0, + 0x1a, 0x86, 0x5a, 0x99, 0xf8, 0x2b, 0xc8, 0xfc, 0xdb, 0xb2, 0x82, 0xac, 0x17, 0x3e, 0xf2, 0x4a, + 0x6d, 0xcc, 0x99, 0xb0, 0xbf, 0x90, 0x84, 0xcc, 0xe2, 0x15, 0x7a, 0x8d, 0xf2, 0xc7, 0x34, 0x7c, + 0xf0, 0x58, 0xaf, 0xf7, 0xc0, 0x04, 0x93, 0x85, 0x85, 0xce, 0xc2, 0x78, 0x8f, 0xfc, 0xe0, 0xb9, + 0xc6, 0xa3, 0x03, 0x2a, 0x4d, 0xe9, 0xc4, 0x0a, 0x93, 0x92, 0x4a, 0x9f, 0x4f, 0x01, 0x2c, 0x5e, + 0xb9, 0xb2, 0x61, 0x6a, 0xbd, 0x0e, 0xb6, 0x7f, 0x12, 0x5e, 0xbf, 0x73, 0xc2, 0x6b, 0xcf, 0x18, + 0x3f, 0x0d, 0x79, 0x77, 0x8c, 0x2c, 0xf4, 0x38, 0x64, 0x6d, 0xfe, 0x9b, 0x0f, 0x75, 0x75, 0x70, + 0xa8, 0x05, 0x39, 0x1f, 0x6e, 0x87, 0x43, 0xfa, 0x2f, 0x49, 0x80, 0xa8, 0xe4, 0xcc, 0x8f, 0x41, + 0x00, 0x7e, 0x1e, 0x32, 0xdc, 0xe3, 0xa4, 0x6e, 0x28, 0x5a, 0xe5, 0xdc, 0x9e, 0x51, 0xfa, 0x76, + 0x12, 0xa6, 0x37, 0x85, 0xd9, 0xfd, 0x89, 0x84, 0xd1, 0x45, 0x98, 0xc0, 0xba, 0x6d, 0x6a, 0x58, + 0xa4, 0xc1, 0x67, 0x83, 0x5a, 0x1a, 0x22, 0x2d, 0xfa, 0xef, 0x12, 0xc4, 0x69, 0x39, 0xce, 0xee, + 0x91, 0xf1, 0xc7, 0x53, 0x50, 0x19, 0xc6, 0x85, 0x16, 0xa0, 0xa4, 0x9a, 0x98, 0x16, 0x34, 0xbd, + 0x3b, 0x27, 0x8d, 0xaa, 0x27, 0x63, 0xe4, 0x27, 0x90, 0xe4, 0xa2, 0x28, 0xe1, 0x0e, 0xb9, 0x4d, + 0x13, 0x54, 0x64, 0xaa, 0x10, 0xaa, 0x98, 0x41, 0xb4, 0xc4, 0x3d, 0xb2, 0x9b, 0x96, 0xf2, 0x02, + 0x30, 0x97, 0x5c, 0x74, 0x4b, 0xa9, 0x4f, 0x7e, 0x11, 0x4a, 0x9a, 0xae, 0xd9, 0x9a, 0xd2, 0x69, + 0x6e, 0x29, 0x1d, 0x45, 0x57, 0x6f, 0x64, 0x29, 0xc2, 0xbc, 0x29, 0xaf, 0x36, 0x00, 0x27, 0xc9, + 0x45, 0x5e, 0xd2, 0x60, 0x05, 0x64, 0x44, 0x44, 0x55, 0xe9, 0x1b, 0x0a, 0xdc, 0x04, 0xbb, 0x67, + 0x44, 0x7e, 0x31, 0x05, 0x53, 0x4e, 0x7e, 0xe6, 0x27, 0x43, 0x11, 0x77, 0x28, 0x56, 0x01, 0x98, + 0x01, 0x21, 0x9e, 0xe3, 0x06, 0x46, 0x83, 0x98, 0xa0, 0x1c, 0x43, 0x58, 0xb4, 0x6c, 0xcf, 0x78, + 0xfc, 0x45, 0x0a, 0x0a, 0xde, 0xf1, 0xf8, 0x89, 0x4b, 0x7f, 0x07, 0x65, 0xcc, 0xe6, 0x5d, 0x93, + 0x98, 0xe6, 0xdf, 0x45, 0x09, 0x98, 0xc4, 0x81, 0xa9, 0x34, 0xdc, 0x16, 0xfe, 0x55, 0x12, 0x32, + 0xfc, 0x5c, 0xb6, 0x3a, 0xb0, 0x8a, 0x48, 0x44, 0x9d, 0xfb, 0x1e, 0xbd, 0x88, 0xf8, 0x64, 0xe8, + 0x22, 0xa2, 0xd8, 0x55, 0xf6, 0x9a, 0xbe, 0x5b, 0x4c, 0x89, 0xd9, 0xc9, 0xc6, 0x71, 0x17, 0xc5, + 0xff, 0x9e, 0xe5, 0x42, 0xdc, 0x33, 0xb9, 0xe8, 0x11, 0xc8, 0x13, 0x0a, 0xd7, 0x2b, 0x10, 0xf6, + 0xa3, 0x6e, 0xf2, 0xc1, 0xf3, 0x52, 0x92, 0xa1, 0xab, 0xec, 0x2d, 0xb1, 0x07, 0xb4, 0x02, 0x68, + 0xc7, 0x49, 0x7d, 0x35, 0x5d, 0x11, 0x12, 0xfe, 0xdb, 0xae, 0x1f, 0xd4, 0x8e, 0x33, 0xfe, 0x41, + 0x1a, 0x49, 0x9e, 0x72, 0x0b, 0x05, 0xda, 0x83, 0x00, 0xa4, 0x5f, 0x4d, 0x76, 0x26, 0x84, 0x2d, + 0x61, 0x3d, 0x07, 0x25, 0xdc, 0x77, 0x92, 0x9c, 0x23, 0x0f, 0x8b, 0xe4, 0xb7, 0x47, 0xf0, 0xbf, + 0x94, 0x00, 0xe4, 0xfa, 0x1e, 0x67, 0xbf, 0xfe, 0xbd, 0xf4, 0x5e, 0xa2, 0x58, 0x19, 0x25, 0xc2, + 0x17, 0x59, 0x2e, 0x9f, 0x58, 0x64, 0x79, 0xa6, 0xea, 0x7d, 0xae, 0x7d, 0x4e, 0x0e, 0xcd, 0x0a, + 0x86, 0xd8, 0xe0, 0x3f, 0x4c, 0xc0, 0xf1, 0x01, 0xc5, 0x71, 0xda, 0x75, 0x05, 0x90, 0xe9, 0x79, + 0xc9, 0xff, 0x43, 0x51, 0x82, 0xff, 0xc3, 0xbf, 0x98, 0xfa, 0x37, 0x65, 0x0e, 0xd8, 0xf8, 0x9b, + 0xe7, 0x4d, 0x78, 0x46, 0x31, 0x01, 0x33, 0xde, 0xea, 0x9d, 0x0e, 0x9c, 0x87, 0x82, 0xb7, 0x76, + 0xde, 0xf4, 0x5b, 0x47, 0x35, 0x9d, 0xb7, 0xda, 0xc7, 0x87, 0x96, 0xdd, 0xd9, 0x27, 0xfe, 0xe7, + 0x64, 0x54, 0xef, 0x9d, 0x83, 0x6c, 0x81, 0x59, 0xc8, 0x5a, 0xfc, 0xff, 0x12, 0x90, 0x5e, 0x33, + 0x8c, 0x0e, 0x32, 0x60, 0x4a, 0x37, 0xec, 0x26, 0x51, 0x16, 0xdc, 0x6a, 0xf2, 0xdc, 0x08, 0xcb, + 0x82, 0x2e, 0x1c, 0x4e, 0x28, 0xdf, 0x3b, 0xa8, 0x0d, 0x42, 0xc9, 0x25, 0xdd, 0xb0, 0x1b, 0xb4, + 0x64, 0x83, 0x65, 0x4e, 0x3e, 0x00, 0x93, 0xfe, 0xca, 0x58, 0xa6, 0xe8, 0xd9, 0x43, 0x57, 0xe6, + 0x87, 0xb9, 0x7e, 0x50, 0x9b, 0x71, 0x27, 0x81, 0x53, 0x2c, 0xc9, 0x85, 0x2d, 0x4f, 0xed, 0xf5, + 0x2c, 0xe9, 0xfd, 0xf7, 0x5f, 0xa9, 0x25, 0x1a, 0xe7, 0x87, 0x9e, 0x00, 0xb8, 0x6f, 0x64, 0x13, + 0xf6, 0x9c, 0xad, 0x7e, 0xff, 0x59, 0x80, 0xef, 0x9e, 0x81, 0x6a, 0xe0, 0x2c, 0x00, 0xbd, 0x87, + 0x3c, 0xe4, 0x24, 0xc0, 0xe8, 0x7f, 0xf4, 0x3f, 0xe4, 0xa0, 0xc0, 0xc8, 0xc3, 0x06, 0xd2, 0x2e, + 0x1c, 0xa5, 0x47, 0x39, 0x5d, 0xb3, 0x25, 0xbe, 0x12, 0x73, 0xd4, 0x49, 0xa0, 0x25, 0xf8, 0xff, + 0x15, 0x67, 0xd9, 0xb0, 0xc7, 0x00, 0xdc, 0x9a, 0x9d, 0x0b, 0x37, 0xbc, 0xa5, 0xac, 0xf5, 0xec, + 0x1f, 0xfe, 0x53, 0x18, 0xd9, 0x43, 0x2c, 0xfd, 0x7a, 0x02, 0x8e, 0x0d, 0xd4, 0xc6, 0xb5, 0xfe, + 0x49, 0xdf, 0x85, 0xd1, 0x44, 0xbc, 0x1c, 0xbd, 0xf7, 0xcb, 0x0f, 0xf5, 0x90, 0x76, 0x55, 0xc3, + 0xda, 0xc5, 0x2a, 0xf4, 0x35, 0xec, 0x45, 0x38, 0xe2, 0x6f, 0x97, 0x10, 0xc2, 0x73, 0x50, 0xf4, + 0xaf, 0x16, 0x78, 0x28, 0xf1, 0xae, 0xc3, 0x7b, 0xc8, 0x49, 0xdf, 0x8a, 0x41, 0x7a, 0x36, 0x28, + 0x78, 0x47, 0x12, 0xef, 0x19, 0x3c, 0x7c, 0x1f, 0x29, 0x08, 0xcf, 0xdd, 0xac, 0xaf, 0x24, 0xe0, + 0xa4, 0x1f, 0xd9, 0x35, 0xc2, 0xd6, 0x5b, 0xde, 0xaf, 0x37, 0xa3, 0x1e, 0xff, 0x29, 0x01, 0xb7, + 0x8f, 0x68, 0x39, 0x17, 0x8f, 0x09, 0x33, 0x1e, 0xeb, 0x6e, 0xf2, 0x62, 0xa1, 0x32, 0xd2, 0x70, + 0x0f, 0xe4, 0x18, 0xb7, 0x5b, 0xf8, 0x51, 0xa4, 0xe9, 0xc1, 0x77, 0x96, 0x3c, 0x3d, 0x68, 0x91, + 0xdf, 0x9c, 0x6e, 0x7d, 0x3d, 0x01, 0xa7, 0xfd, 0xbd, 0x0a, 0x59, 0xd1, 0xbd, 0xb3, 0x07, 0xe6, + 0xdf, 0x24, 0xe0, 0x9e, 0x38, 0x5d, 0xe0, 0x23, 0xf4, 0x3c, 0x4c, 0xbb, 0xf1, 0x55, 0x70, 0x80, + 0x4e, 0xc5, 0x58, 0x15, 0x73, 0xa5, 0x46, 0x0e, 0xca, 0xcd, 0x19, 0x89, 0x3f, 0x4e, 0xf0, 0x39, + 0xe7, 0x1d, 0x77, 0x47, 0xec, 0xfe, 0x25, 0xc1, 0x21, 0xc5, 0xee, 0x59, 0x16, 0x4c, 0xfa, 0x96, + 0x05, 0x21, 0x03, 0x9a, 0xbc, 0x49, 0x16, 0xe4, 0x43, 0xc2, 0x9a, 0x86, 0x04, 0x67, 0xbb, 0x30, + 0x1d, 0x32, 0x49, 0x9c, 0x1b, 0xa7, 0xd1, 0x73, 0xe4, 0xe8, 0x0f, 0x0e, 0x6a, 0x21, 0x51, 0x9f, + 0x8c, 0x06, 0xa7, 0x87, 0xf4, 0x9f, 0x13, 0x50, 0xa3, 0x0d, 0x09, 0x19, 0xca, 0xbf, 0xc9, 0x02, + 0xc6, 0xdc, 0x90, 0x86, 0x76, 0x8b, 0x0b, 0x7a, 0x1e, 0x32, 0x4c, 0x4b, 0xb9, 0x6c, 0x0f, 0xa1, + 0xde, 0x9c, 0xd1, 0x35, 0xd8, 0x8b, 0xa2, 0x5f, 0xe1, 0x76, 0xe1, 0x2d, 0x92, 0xdf, 0x9b, 0xb0, + 0x0b, 0xff, 0x4a, 0x18, 0xec, 0xf0, 0x96, 0x73, 0x11, 0xbd, 0xff, 0x4d, 0x1b, 0x6c, 0xfe, 0x25, + 0xa1, 0xb7, 0xcc, 0x32, 0x3b, 0xcd, 0x8f, 0xb0, 0xcc, 0xef, 0xbc, 0x11, 0x70, 0x2c, 0x73, 0x44, + 0x17, 0xde, 0xe1, 0x96, 0xf9, 0x7a, 0x12, 0x8e, 0xd3, 0x6e, 0x78, 0x57, 0x24, 0x6f, 0x83, 0xe4, + 0x9b, 0x80, 0x2c, 0x53, 0x6d, 0xde, 0x2c, 0xfb, 0x51, 0xb6, 0x4c, 0xf5, 0x8a, 0xcf, 0xe9, 0x36, + 0x01, 0xb5, 0x2c, 0x3b, 0x58, 0x41, 0xea, 0x86, 0x2b, 0x68, 0x59, 0xf6, 0x95, 0x11, 0x5e, 0x3d, + 0x7d, 0x18, 0xdd, 0xf9, 0x83, 0x04, 0x54, 0xc3, 0x84, 0xce, 0x75, 0x45, 0x81, 0xa3, 0xbe, 0x75, + 0x74, 0x50, 0x5d, 0xee, 0x18, 0xb5, 0x9a, 0x0c, 0x4c, 0xdd, 0x23, 0x26, 0xbe, 0xd9, 0x93, 0xf7, + 0xcb, 0xc2, 0xe9, 0x38, 0x9a, 0x3f, 0xb8, 0x84, 0x79, 0x47, 0x4e, 0xd9, 0xdf, 0x1c, 0x30, 0xf7, + 0xef, 0xb4, 0xd5, 0xd0, 0x9f, 0x24, 0xe0, 0xc4, 0x90, 0x16, 0xfe, 0x4d, 0x76, 0xe7, 0x3f, 0x3b, + 0x54, 0x61, 0x6e, 0xd6, 0xd2, 0xeb, 0x41, 0x3e, 0xa1, 0xfc, 0xe7, 0xd6, 0x3c, 0x0b, 0xea, 0xd0, + 0x6f, 0xcc, 0x3d, 0x03, 0xb7, 0x84, 0x72, 0xf1, 0x36, 0x9d, 0x85, 0xf4, 0x8e, 0x66, 0xd9, 0xce, + 0x87, 0x17, 0x02, 0xcd, 0x09, 0x70, 0x51, 0x5a, 0x09, 0x41, 0x99, 0x42, 0xae, 0x19, 0x46, 0x87, + 0x57, 0x2f, 0x2d, 0xc0, 0x94, 0xa7, 0x8c, 0x83, 0xcf, 0x41, 0xba, 0x67, 0x18, 0x1d, 0x0e, 0x3e, + 0x13, 0x04, 0x27, 0xb4, 0xbc, 0x9b, 0x94, 0x4e, 0x9a, 0x01, 0xc4, 0x40, 0xd8, 0x27, 0x41, 0x38, + 0xf4, 0x87, 0x13, 0x30, 0xed, 0x2b, 0x76, 0x2e, 0x2d, 0x65, 0x7c, 0x5f, 0x93, 0x1a, 0xd8, 0xa2, + 0x67, 0xf4, 0xce, 0xf5, 0x74, 0x96, 0xdd, 0x7d, 0x13, 0xaa, 0x7b, 0xf6, 0x8f, 0x0a, 0xe2, 0x96, + 0x6b, 0x13, 0xc0, 0x93, 0x8a, 0xbd, 0x2b, 0x58, 0x73, 0x78, 0xd2, 0xa3, 0x7a, 0x77, 0x24, 0x1d, + 0x8f, 0x79, 0xc7, 0xd0, 0x4f, 0x79, 0x8f, 0x51, 0xdd, 0x39, 0x9a, 0x4f, 0xc0, 0xdf, 0x15, 0x45, + 0xe6, 0xa0, 0xff, 0x2d, 0x98, 0x09, 0x5b, 0x05, 0xa3, 0x07, 0x46, 0x23, 0x0c, 0xc6, 0x2d, 0xd5, + 0x77, 0x1d, 0x82, 0xc3, 0xa9, 0xfe, 0x93, 0x09, 0xb8, 0x6d, 0xe4, 0x62, 0x0f, 0x3d, 0x36, 0x1a, + 0x76, 0x44, 0x24, 0x55, 0xad, 0xdf, 0x08, 0xab, 0xd3, 0xb4, 0xa6, 0x6f, 0x3f, 0x3f, 0x5c, 0xa2, + 0x03, 0xeb, 0x8f, 0x21, 0x03, 0x3b, 0x18, 0x6b, 0x4a, 0x63, 0xe8, 0xa5, 0xf0, 0x7d, 0xed, 0x33, + 0xa1, 0x08, 0xc3, 0x97, 0x3c, 0xd5, 0x07, 0xe2, 0x33, 0x78, 0x87, 0x3d, 0x2c, 0x96, 0x1e, 0x32, + 0xec, 0x23, 0x16, 0x0c, 0x43, 0x86, 0x7d, 0x54, 0xa0, 0xce, 0x87, 0x7d, 0x64, 0x24, 0x39, 0x64, + 0xd8, 0xe3, 0x04, 0xd0, 0x43, 0x86, 0x3d, 0x56, 0xe0, 0x2a, 0x8d, 0xa1, 0x1d, 0x98, 0xf4, 0xc5, + 0x29, 0xe8, 0x74, 0x28, 0x5c, 0x58, 0x00, 0x59, 0xbd, 0x27, 0x0e, 0xa9, 0x77, 0xfc, 0x43, 0x5c, + 0xf3, 0x90, 0xf1, 0x1f, 0x1e, 0x7d, 0x54, 0x1f, 0x88, 0xcf, 0xe0, 0xd4, 0x7d, 0xcd, 0xd9, 0x6a, + 0xf1, 0x10, 0xa0, 0xb9, 0x98, 0x48, 0xa2, 0xe6, 0x33, 0xb1, 0xe9, 0x9d, 0x8a, 0x77, 0x07, 0x4e, + 0x5b, 0x87, 0x0b, 0x2d, 0xd4, 0xb5, 0x55, 0xef, 0x8d, 0x45, 0xeb, 0x54, 0xb6, 0xca, 0xf7, 0x11, + 0x4e, 0x86, 0xb2, 0x79, 0x9c, 0x56, 0xf5, 0xf6, 0x11, 0x14, 0x0e, 0xdc, 0xba, 0xb3, 0x31, 0x28, + 0x85, 0x93, 0x7b, 0x9d, 0x55, 0xf5, 0xd4, 0x48, 0x1a, 0x01, 0x7a, 0xd3, 0x53, 0xfd, 0x5f, 0xca, + 0x0e, 0x5c, 0xfb, 0x6b, 0x63, 0x1d, 0x5b, 0x9a, 0x75, 0xa8, 0x6b, 0x7f, 0xa3, 0xb3, 0xf9, 0x1f, + 0xca, 0x40, 0xe1, 0x02, 0x43, 0xa5, 0xdf, 0x3a, 0x46, 0x4f, 0xc4, 0xf4, 0xc0, 0x45, 0xe2, 0x81, + 0x7f, 0x70, 0x50, 0xe3, 0x82, 0x74, 0x7c, 0xb1, 0xc5, 0x3f, 0x7a, 0xc4, 0x3e, 0x58, 0xe2, 0x7e, + 0x35, 0xa6, 0x70, 0xa8, 0x23, 0xab, 0xec, 0xac, 0x00, 0x3f, 0x25, 0x1a, 0xc4, 0x93, 0xd8, 0xf7, + 0x93, 0x36, 0x48, 0x09, 0xfd, 0xe4, 0x09, 0xfa, 0x95, 0x04, 0x1c, 0xa1, 0x54, 0x6e, 0x20, 0x48, + 0x29, 0xc5, 0xc1, 0x9a, 0x81, 0x51, 0x5e, 0x51, 0x3c, 0xcb, 0x22, 0x8a, 0xd1, 0xa8, 0xf3, 0xfd, + 0xde, 0x5b, 0x3d, 0x95, 0x06, 0xe1, 0xa4, 0x1f, 0x1c, 0xd4, 0xd0, 0x20, 0xaf, 0x4c, 0x3f, 0xd0, + 0xe9, 0x2f, 0x0b, 0xff, 0x4c, 0xf5, 0x88, 0xd8, 0x70, 0x8a, 0x0b, 0xd4, 0x8d, 0x11, 0x7c, 0xe1, + 0xf9, 0x1a, 0xe4, 0x3d, 0xc6, 0xa7, 0x32, 0x3e, 0xe4, 0x58, 0x9b, 0xbb, 0xee, 0x46, 0x1c, 0xcf, + 0xe3, 0xfb, 0x64, 0x2f, 0x04, 0xfa, 0xb5, 0x04, 0x1c, 0x71, 0xd7, 0xf6, 0x5e, 0xf0, 0x4c, 0xfc, + 0xd5, 0xfd, 0x39, 0xbf, 0xd4, 0x42, 0xf1, 0x88, 0xd4, 0xc2, 0x1c, 0xa4, 0x3c, 0xd3, 0x0f, 0x73, + 0x18, 0xcf, 0xc1, 0xa4, 0x77, 0xf1, 0xe7, 0x7e, 0xbc, 0x70, 0xd4, 0x76, 0xe6, 0x0c, 0xef, 0xad, + 0xef, 0x68, 0x87, 0xec, 0x07, 0x42, 0x55, 0xc8, 0xe2, 0xbd, 0x9e, 0x61, 0xda, 0xb8, 0x45, 0xcf, + 0x22, 0x67, 0x65, 0xe7, 0x59, 0xba, 0x06, 0x21, 0x03, 0x8b, 0x9e, 0x0e, 0x7c, 0x79, 0xe9, 0x46, + 0x16, 0x15, 0x83, 0x1f, 0x6b, 0xf2, 0x7e, 0x45, 0xe9, 0x66, 0x9b, 0x8d, 0xff, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x4c, 0x9f, 0xbf, 0xb3, 0xdf, 0x9b, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From e09f3653e22e107ced19382809454d58eb1ae5a5 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Thu, 30 Jul 2020 18:29:48 -0400 Subject: [PATCH 13/14] Lint --- x/auth/tx/legacy_amino_json.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/x/auth/tx/legacy_amino_json.go b/x/auth/tx/legacy_amino_json.go index 78076905d880..4310c9612a36 100644 --- a/x/auth/tx/legacy_amino_json.go +++ b/x/auth/tx/legacy_amino_json.go @@ -35,24 +35,26 @@ func (s signModeLegacyAminoJSONHandler) GetSignBytes(mode signingtypes.SignMode, } if protoTx.txBodyHasUnknownNonCriticals { - return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, - fmt.Sprintf(aminoNonCriticalFieldsError)) + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, aminoNonCriticalFieldsError) } body := protoTx.tx.Body if len(body.ExtensionOptions) != 0 || len(body.NonCriticalExtensionOptions) != 0 { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, - fmt.Sprintf("SIGN_MODE_LEGACY_AMINO_JSON does not support protobuf extension options.")) + "SIGN_MODE_LEGACY_AMINO_JSON does not support protobuf extension options.") } if body.TimeoutHeight != 0 { return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, - fmt.Sprintf("SIGN_MODE_LEGACY_AMINO_JSON does not support timeout height.")) + "SIGN_MODE_LEGACY_AMINO_JSON does not support timeout height.") } return types.StdSignBytes( - data.ChainID, data.AccountNumber, data.AccountSequence, types.StdFee{Amount: protoTx.GetFee(), Gas: protoTx.GetGas()}, tx.GetMsgs(), protoTx.GetMemo(), + data.ChainID, data.AccountNumber, data.AccountSequence, + //nolint:staticcheck + types.StdFee{Amount: protoTx.GetFee(), Gas: protoTx.GetGas()}, + tx.GetMsgs(), protoTx.GetMemo(), ), nil } From 8180e3838a3ab36b8ecb520185122e946e4c8ad6 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 3 Aug 2020 11:50:27 -0400 Subject: [PATCH 14/14] Address review comments --- codec/unknownproto/doc.go | 2 +- codec/unknownproto/unknown_fields.go | 2 +- go.mod | 1 - go.sum | 4 ---- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/codec/unknownproto/doc.go b/codec/unknownproto/doc.go index 0a1cc81c7907..0e0a46342291 100644 --- a/codec/unknownproto/doc.go +++ b/codec/unknownproto/doc.go @@ -15,7 +15,7 @@ Its API signature is similar to proto.Unmarshal([]byte, proto.Message) in the st and ideally should be added before invoking proto.Unmarshal, if you'd like to enforce the features mentioned above. By default, for security we report every single field that's unknown, whether a non-critical field or not. To customize -this behavior, please pass the boolean glag allowUnknownNonCriticals to true to RejectUnknownFields: +this behavior, please set the boolean parameter allowUnknownNonCriticals to true to RejectUnknownFields: if err := RejectUnknownFields(protoBlob, protoMessage, true); err != nil { // Handle the error. diff --git a/codec/unknownproto/unknown_fields.go b/codec/unknownproto/unknown_fields.go index 8e5ee9b789e6..2a7d09607016 100644 --- a/codec/unknownproto/unknown_fields.go +++ b/codec/unknownproto/unknown_fields.go @@ -117,7 +117,7 @@ func RejectUnknownFields(bz []byte, msg proto.Message, allowUnknownNonCriticals if protoMessageName == ".google.protobuf.Any" { // Firstly typecheck types.Any to ensure nothing snuck in. - hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, &types.Any{}, allowUnknownNonCriticals) + hasUnknownNonCriticalsChild, err := RejectUnknownFields(fieldBytes, (*types.Any)(nil), allowUnknownNonCriticals) hasUnknownNonCriticals = hasUnknownNonCriticals || hasUnknownNonCriticalsChild if err != nil { return hasUnknownNonCriticals, err diff --git a/go.mod b/go.mod index 960794df245b..8aec1c24bfb7 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d github.com/cosmos/ledger-cosmos-go v0.11.1 github.com/enigmampc/btcutil v1.0.3-0.20200723161021-e2fb6adb2a25 - github.com/gibson042/canonicaljson-go v1.0.3 github.com/gogo/protobuf v1.3.1 github.com/golang/mock v1.4.4 github.com/golang/protobuf v1.4.2 diff --git a/go.sum b/go.sum index a83ed880d4a5..2edc8237367d 100644 --- a/go.sum +++ b/go.sum @@ -144,8 +144,6 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gibson042/canonicaljson-go v1.0.3 h1:EAyF8L74AWabkyUmrvEFHEt/AGFQeD6RfwbAuf0j1bI= -github.com/gibson042/canonicaljson-go v1.0.3/go.mod h1:DsLpJTThXyGNO+KZlI85C1/KDcImpP67k/RKVjcaEqo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -480,8 +478,6 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=