From c903df251edf870169d81443ed7e520413976243 Mon Sep 17 00:00:00 2001 From: Cyson Date: Tue, 14 Mar 2023 23:41:14 -0700 Subject: [PATCH 1/4] Revert EventAttribute types --- abci/example/kvstore/kvstore.go | 8 +- abci/types/types.pb.go | 498 +++++++++--------- internal/eventbus/event_bus.go | 12 +- internal/eventbus/event_bus_test.go | 28 +- internal/eventlog/item.go | 6 +- internal/pubsub/example_test.go | 2 +- internal/pubsub/pubsub_test.go | 22 +- internal/pubsub/query/bench_test.go | 16 +- internal/pubsub/query/query.go | 4 +- internal/pubsub/query/query_test.go | 32 +- internal/state/indexer/block/kv/kv.go | 4 +- internal/state/indexer/block/kv/kv_test.go | 16 +- internal/state/indexer/sink/kv/kv_test.go | 36 +- internal/state/indexer/sink/psql/psql.go | 4 +- internal/state/indexer/sink/psql/psql_test.go | 2 +- internal/state/indexer/tx/kv/kv.go | 4 +- internal/state/indexer/tx/kv/kv_bench_test.go | 4 +- internal/state/indexer/tx/kv/kv_test.go | 26 +- internal/state/state_test.go | 8 +- proto/tendermint/abci/types.proto | 4 +- proto/tendermint/crypto/keys.pb.go | 1 - proto/tendermint/mempool/types.pb.go | 1 - proto/tendermint/p2p/conn.pb.go | 1 - proto/tendermint/types/types.pb.go | 1 - rpc/coretypes/responses.go | 2 + test/e2e/app/app.go | 8 +- types/events.go | 18 +- 27 files changed, 384 insertions(+), 384 deletions(-) diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go index bbb2fbe34..de9888bff 100644 --- a/abci/example/kvstore/kvstore.go +++ b/abci/example/kvstore/kvstore.go @@ -149,10 +149,10 @@ func (app *Application) handleTx(tx []byte) *types.ExecTxResult { { Type: "app", Attributes: []types.EventAttribute{ - {Key: "creator", Value: "Cosmoshi Netowoko", Index: true}, - {Key: "key", Value: key, Index: true}, - {Key: "index_key", Value: "index is working", Index: true}, - {Key: "noindex_key", Value: "index is working", Index: false}, + {Key: []byte("creator"), Value: []byte("Cosmoshi Netowoko"), Index: true}, + {Key: []byte("key"), Value: []byte(key), Index: true}, + {Key: []byte("index_key"), Value: []byte("index is working"), Index: true}, + {Key: []byte("noindex_key"), Value: []byte("index is working"), Index: false}, }, }, } diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 04e143a53..7894e52ad 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -1766,7 +1766,6 @@ func (m *RequestEndBlock) GetHeight() int64 { type Response struct { // Types that are valid to be assigned to Value: - // // *Response_Exception // *Response_Echo // *Response_Flush @@ -3515,8 +3514,8 @@ func (m *Event) GetAttributes() []EventAttribute { // EventAttribute is a single key-value pair, associated with an event. type EventAttribute struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` Index bool `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"` } @@ -3553,18 +3552,18 @@ func (m *EventAttribute) XXX_DiscardUnknown() { var xxx_messageInfo_EventAttribute proto.InternalMessageInfo -func (m *EventAttribute) GetKey() string { +func (m *EventAttribute) GetKey() []byte { if m != nil { return m.Key } - return "" + return nil } -func (m *EventAttribute) GetValue() string { +func (m *EventAttribute) GetValue() []byte { if m != nil { return m.Value } - return "" + return nil } func (m *EventAttribute) GetIndex() bool { @@ -4457,236 +4456,235 @@ func init() { func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) } var fileDescriptor_252557cfdd89a31a = []byte{ - // 3650 bytes of a gzipped FileDescriptorProto + // 3648 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x73, 0x1b, 0xd7, - 0x91, 0xc7, 0xf7, 0x47, 0x83, 0x04, 0x86, 0x8f, 0x14, 0x05, 0x41, 0x12, 0x49, 0x8d, 0x4b, 0xb6, - 0x24, 0xdb, 0xa4, 0x97, 0x5a, 0xd9, 0xd2, 0xca, 0x5e, 0x2d, 0x09, 0x82, 0x06, 0x29, 0x8a, 0xa4, - 0x87, 0x20, 0xbd, 0xde, 0x5d, 0x6b, 0x3c, 0x04, 0x1e, 0x81, 0xb1, 0x00, 0xcc, 0x78, 0x66, 0x40, - 0x83, 0x3e, 0x6d, 0xed, 0xc6, 0x17, 0xe7, 0xe2, 0x5b, 0x72, 0x88, 0x6f, 0x49, 0x55, 0xf2, 0x1f, - 0xa4, 0x72, 0xf0, 0x29, 0x07, 0x1f, 0x72, 0xf0, 0x29, 0x95, 0x4b, 0x9c, 0x94, 0x7d, 0xf3, 0x3f, - 0x90, 0x5b, 0x92, 0x7a, 0x1f, 0xf3, 0x05, 0xcc, 0x00, 0xa0, 0xa5, 0x72, 0x55, 0x2a, 0xbe, 0xcd, - 0xeb, 0xe9, 0xee, 0xf7, 0xd5, 0xd3, 0xdd, 0xef, 0xd7, 0x6f, 0xe0, 0xb2, 0x85, 0xbb, 0x0d, 0x6c, - 0x74, 0xd4, 0xae, 0xb5, 0xa2, 0x1c, 0xd7, 0xd5, 0x15, 0xeb, 0x4c, 0xc7, 0xe6, 0xb2, 0x6e, 0x68, - 0x96, 0x86, 0x0a, 0xee, 0xcb, 0x65, 0xf2, 0xb2, 0x74, 0xd5, 0xc3, 0x5d, 0x37, 0xce, 0x74, 0x4b, - 0x5b, 0xd1, 0x0d, 0x4d, 0x3b, 0x61, 0xfc, 0xa5, 0x2b, 0xc3, 0xaf, 0x9f, 0xe0, 0x33, 0xae, 0xcd, - 0x27, 0x4c, 0x7b, 0x59, 0xd1, 0x15, 0x43, 0xe9, 0x98, 0x01, 0xc2, 0xec, 0xb5, 0x67, 0x28, 0xa5, - 0xc5, 0xa6, 0xa6, 0x35, 0xdb, 0x78, 0x85, 0xb6, 0x8e, 0x7b, 0x27, 0x2b, 0x96, 0xda, 0xc1, 0xa6, - 0xa5, 0x74, 0x74, 0xce, 0x30, 0xd7, 0xd4, 0x9a, 0x1a, 0x7d, 0x5c, 0x21, 0x4f, 0x8c, 0x2a, 0x7e, - 0x9c, 0x83, 0xb4, 0x84, 0x3f, 0xe8, 0x61, 0xd3, 0x42, 0xab, 0x90, 0xc0, 0xf5, 0x96, 0x56, 0x8c, - 0x2e, 0x45, 0x6f, 0xe4, 0x56, 0xaf, 0x2c, 0x0f, 0x4c, 0x6e, 0x99, 0xf3, 0x55, 0xea, 0x2d, 0xad, - 0x1a, 0x91, 0x28, 0x2f, 0xba, 0x03, 0xc9, 0x93, 0x76, 0xcf, 0x6c, 0x15, 0x63, 0x54, 0xe8, 0x6a, - 0x98, 0xd0, 0x26, 0x61, 0xaa, 0x46, 0x24, 0xc6, 0x4d, 0xba, 0x52, 0xbb, 0x27, 0x5a, 0x31, 0x3e, - 0xba, 0xab, 0xad, 0xee, 0x09, 0xed, 0x8a, 0xf0, 0xa2, 0x75, 0x00, 0xb5, 0xab, 0x5a, 0x72, 0xbd, - 0xa5, 0xa8, 0xdd, 0x62, 0x82, 0x4a, 0x5e, 0x0b, 0x97, 0x54, 0xad, 0x32, 0x61, 0xac, 0x46, 0xa4, - 0xac, 0x6a, 0x37, 0xc8, 0x70, 0x3f, 0xe8, 0x61, 0xe3, 0xac, 0x98, 0x1c, 0x3d, 0xdc, 0xb7, 0x08, - 0x13, 0x19, 0x2e, 0xe5, 0x46, 0xaf, 0x43, 0xa6, 0xde, 0xc2, 0xf5, 0x27, 0xb2, 0xd5, 0x2f, 0xa6, - 0xa9, 0xe4, 0x62, 0x98, 0x64, 0x99, 0xf0, 0xd5, 0xfa, 0xd5, 0x88, 0x94, 0xae, 0xb3, 0x47, 0x74, - 0x17, 0x52, 0x75, 0xad, 0xd3, 0x51, 0xad, 0x22, 0x50, 0xd9, 0x85, 0x50, 0x59, 0xca, 0x55, 0x8d, - 0x48, 0x9c, 0x1f, 0xed, 0x42, 0xbe, 0xad, 0x9a, 0x96, 0x6c, 0x76, 0x15, 0xdd, 0x6c, 0x69, 0x96, - 0x59, 0xcc, 0x51, 0x0d, 0xd7, 0xc3, 0x34, 0xec, 0xa8, 0xa6, 0x75, 0x60, 0x33, 0x57, 0x23, 0xd2, - 0x74, 0xdb, 0x4b, 0x20, 0xfa, 0xb4, 0x93, 0x13, 0x6c, 0x38, 0x0a, 0x8b, 0x53, 0xa3, 0xf5, 0xed, - 0x11, 0x6e, 0x5b, 0x9e, 0xe8, 0xd3, 0xbc, 0x04, 0xf4, 0xdf, 0x30, 0xdb, 0xd6, 0x94, 0x86, 0xa3, - 0x4e, 0xae, 0xb7, 0x7a, 0xdd, 0x27, 0xc5, 0x69, 0xaa, 0xf4, 0x66, 0xe8, 0x20, 0x35, 0xa5, 0x61, - 0xab, 0x28, 0x13, 0x81, 0x6a, 0x44, 0x9a, 0x69, 0x0f, 0x12, 0xd1, 0x63, 0x98, 0x53, 0x74, 0xbd, - 0x7d, 0x36, 0xa8, 0x3d, 0x4f, 0xb5, 0xdf, 0x0a, 0xd3, 0xbe, 0x46, 0x64, 0x06, 0xd5, 0x23, 0x65, - 0x88, 0x8a, 0x6a, 0x20, 0xe8, 0x06, 0xd6, 0x15, 0x03, 0xcb, 0xba, 0xa1, 0xe9, 0x9a, 0xa9, 0xb4, - 0x8b, 0x05, 0xaa, 0xfb, 0x85, 0x30, 0xdd, 0xfb, 0x8c, 0x7f, 0x9f, 0xb3, 0x57, 0x23, 0x52, 0x41, - 0xf7, 0x93, 0x98, 0x56, 0xad, 0x8e, 0x4d, 0xd3, 0xd5, 0x2a, 0x8c, 0xd3, 0x4a, 0xf9, 0xfd, 0x5a, - 0x7d, 0x24, 0x54, 0x81, 0x1c, 0xee, 0x13, 0x71, 0xf9, 0x54, 0xb3, 0x70, 0x71, 0x86, 0x2a, 0x14, - 0x43, 0xbf, 0x50, 0xca, 0x7a, 0xa4, 0x59, 0xb8, 0x1a, 0x91, 0x00, 0x3b, 0x2d, 0xa4, 0xc0, 0x85, - 0x53, 0x6c, 0xa8, 0x27, 0x67, 0x54, 0x8d, 0x4c, 0xdf, 0x98, 0xaa, 0xd6, 0x2d, 0x22, 0xaa, 0xf0, - 0xc5, 0x30, 0x85, 0x47, 0x54, 0x88, 0xa8, 0xa8, 0xd8, 0x22, 0xd5, 0x88, 0x34, 0x7b, 0x3a, 0x4c, - 0x26, 0x26, 0x76, 0xa2, 0x76, 0x95, 0xb6, 0xfa, 0x11, 0x96, 0x8f, 0xdb, 0x5a, 0xfd, 0x49, 0x71, - 0x76, 0xb4, 0x89, 0x6d, 0x72, 0xee, 0x75, 0xc2, 0x4c, 0x4c, 0xec, 0xc4, 0x4b, 0x20, 0x33, 0x3f, - 0xc6, 0x4d, 0xb5, 0xcb, 0x95, 0xcd, 0x8d, 0x9e, 0xf9, 0x3a, 0x61, 0xb5, 0x35, 0xc1, 0xb1, 0xd3, - 0x22, 0xce, 0xa3, 0x81, 0xdb, 0xea, 0x29, 0x36, 0xc8, 0x37, 0x7c, 0x61, 0xb4, 0xf3, 0xd8, 0x60, - 0x9c, 0xf4, 0x2b, 0xce, 0x36, 0xec, 0x06, 0x7a, 0x00, 0x59, 0xb2, 0x03, 0x6c, 0x20, 0xf3, 0x54, - 0xc5, 0x52, 0xe8, 0x16, 0x74, 0x1b, 0xf6, 0x30, 0x32, 0x98, 0x3f, 0xaf, 0xa7, 0x21, 0x79, 0xaa, - 0xb4, 0x7b, 0x78, 0x3b, 0x91, 0x49, 0x09, 0xe9, 0xed, 0x44, 0x26, 0x23, 0x64, 0xb7, 0x13, 0x99, - 0xac, 0x00, 0xe2, 0x0b, 0x90, 0xf3, 0xb8, 0x57, 0x54, 0x84, 0x74, 0x07, 0x9b, 0xa6, 0xd2, 0xc4, - 0xd4, 0x1b, 0x67, 0x25, 0xbb, 0x29, 0xe6, 0x61, 0xca, 0xeb, 0x52, 0xc5, 0x4f, 0xa3, 0x8e, 0x24, - 0xf1, 0x96, 0x44, 0xf2, 0x14, 0x1b, 0x74, 0x53, 0xb9, 0x24, 0x6f, 0xa2, 0xe7, 0x60, 0x9a, 0x0e, - 0x5d, 0xb6, 0xdf, 0x13, 0x97, 0x9d, 0x90, 0xa6, 0x28, 0xf1, 0x88, 0x33, 0x2d, 0x42, 0x4e, 0x5f, - 0xd5, 0x1d, 0x96, 0x38, 0x65, 0x01, 0x7d, 0x55, 0xb7, 0x19, 0xae, 0xc1, 0x14, 0x99, 0xa7, 0xc3, - 0x91, 0xa0, 0x9d, 0xe4, 0x08, 0x8d, 0xb3, 0x88, 0xbf, 0x8b, 0x81, 0x30, 0xe8, 0x86, 0xd1, 0x5d, - 0x48, 0x90, 0x88, 0xc4, 0x83, 0x4b, 0x69, 0x99, 0x85, 0xab, 0x65, 0x3b, 0x5c, 0x2d, 0xd7, 0xec, - 0x70, 0xb5, 0x9e, 0xf9, 0xe2, 0xab, 0xc5, 0xc8, 0xa7, 0x7f, 0x5a, 0x8c, 0x4a, 0x54, 0x02, 0x5d, - 0x22, 0xce, 0x57, 0x51, 0xbb, 0xb2, 0xda, 0xa0, 0x43, 0xce, 0x12, 0xcf, 0xaa, 0xa8, 0xdd, 0xad, - 0x06, 0xda, 0x01, 0xa1, 0xae, 0x75, 0x4d, 0xdc, 0x35, 0x7b, 0xa6, 0xcc, 0x82, 0x25, 0x0f, 0x29, - 0xbe, 0xbd, 0x65, 0x71, 0xb2, 0x6c, 0x73, 0xee, 0x53, 0x46, 0xa9, 0x50, 0xf7, 0x13, 0xd0, 0x26, - 0xc0, 0xa9, 0xd2, 0x56, 0x1b, 0x8a, 0xa5, 0x19, 0x66, 0x31, 0xb1, 0x14, 0x0f, 0xdc, 0xe0, 0x23, - 0x9b, 0xe5, 0x50, 0x6f, 0x28, 0x16, 0x5e, 0x4f, 0x90, 0xe1, 0x4a, 0x1e, 0x49, 0xf4, 0x3c, 0x14, - 0x14, 0x5d, 0x97, 0x4d, 0x4b, 0xb1, 0xb0, 0x7c, 0x7c, 0x66, 0x61, 0x93, 0x86, 0x9b, 0x29, 0x69, - 0x5a, 0xd1, 0xf5, 0x03, 0x42, 0x5d, 0x27, 0x44, 0x74, 0x1d, 0xf2, 0x24, 0x32, 0xa9, 0x4a, 0x5b, - 0x6e, 0x61, 0xb5, 0xd9, 0xb2, 0x8a, 0xa9, 0xa5, 0xe8, 0x8d, 0xb8, 0x34, 0xcd, 0xa9, 0x55, 0x4a, - 0x14, 0x1b, 0xce, 0x8e, 0xd3, 0xa8, 0x84, 0x10, 0x24, 0x1a, 0x8a, 0xa5, 0xd0, 0x95, 0x9c, 0x92, - 0xe8, 0x33, 0xa1, 0xe9, 0x8a, 0xd5, 0xe2, 0xeb, 0x43, 0x9f, 0xd1, 0x3c, 0xa4, 0xb8, 0xda, 0x38, - 0x55, 0xcb, 0x5b, 0x68, 0x0e, 0x92, 0xba, 0xa1, 0x9d, 0x62, 0xba, 0x75, 0x19, 0x89, 0x35, 0x44, - 0x09, 0xf2, 0xfe, 0x08, 0x86, 0xf2, 0x10, 0xb3, 0xfa, 0xbc, 0x97, 0x98, 0xd5, 0x47, 0xaf, 0x40, - 0x82, 0x2c, 0x24, 0xed, 0x23, 0x1f, 0x10, 0xb3, 0xb9, 0x5c, 0xed, 0x4c, 0xc7, 0x12, 0xe5, 0x14, - 0x0b, 0x30, 0xed, 0x8b, 0x6c, 0xe2, 0x3c, 0xcc, 0x05, 0x05, 0x2a, 0xb1, 0xe5, 0xd0, 0x7d, 0x01, - 0x07, 0xdd, 0x81, 0x8c, 0x13, 0xa9, 0x98, 0xe1, 0x5c, 0x1a, 0xea, 0xd6, 0x66, 0x96, 0x1c, 0x56, - 0x62, 0x31, 0x64, 0x03, 0x5a, 0x0a, 0xcf, 0x4b, 0xa6, 0xa4, 0xb4, 0xa2, 0xeb, 0x55, 0xc5, 0x6c, - 0x89, 0xef, 0x41, 0x31, 0x2c, 0x0a, 0x79, 0x16, 0x2c, 0x4a, 0xcd, 0xde, 0x5e, 0xb0, 0x79, 0x48, - 0x9d, 0x68, 0x46, 0x47, 0xb1, 0xa8, 0xb2, 0x69, 0x89, 0xb7, 0xc8, 0x42, 0xb2, 0x88, 0x14, 0xa7, - 0x64, 0xd6, 0x10, 0x65, 0xb8, 0x14, 0x1a, 0x89, 0x88, 0x88, 0xda, 0x6d, 0x60, 0xb6, 0xac, 0xd3, - 0x12, 0x6b, 0xb8, 0x8a, 0xd8, 0x60, 0x59, 0x83, 0x74, 0x6b, 0xd2, 0xb9, 0x52, 0xfd, 0x59, 0x89, - 0xb7, 0xc4, 0x5f, 0xc5, 0x61, 0x3e, 0x38, 0x1e, 0xa1, 0x25, 0x98, 0xea, 0x28, 0x7d, 0xd9, 0xea, - 0x73, 0xb3, 0x8b, 0xd2, 0x8d, 0x87, 0x8e, 0xd2, 0xaf, 0xf5, 0x99, 0xcd, 0x09, 0x10, 0xb7, 0xfa, - 0x66, 0x31, 0xb6, 0x14, 0xbf, 0x31, 0x25, 0x91, 0x47, 0x74, 0x08, 0x33, 0x6d, 0xad, 0xae, 0xb4, - 0xe5, 0xb6, 0x62, 0x5a, 0x32, 0x4f, 0x54, 0xd8, 0x47, 0xf4, 0xdc, 0xd0, 0x62, 0xb3, 0xc8, 0x82, - 0x1b, 0x6c, 0x3f, 0x89, 0xc3, 0xe1, 0xf6, 0x5f, 0xa0, 0x3a, 0x76, 0x14, 0x7b, 0xab, 0xd1, 0x21, - 0xcc, 0x1d, 0x9f, 0x7d, 0xa4, 0x74, 0x2d, 0xb5, 0x8b, 0xe5, 0xa1, 0xcf, 0x6a, 0xd8, 0x7a, 0x1e, - 0xa9, 0xe6, 0x31, 0x6e, 0x29, 0xa7, 0xaa, 0x66, 0x70, 0x95, 0xb3, 0x8e, 0xfc, 0x91, 0xfb, 0x6d, - 0xb9, 0x7b, 0x94, 0xf4, 0x19, 0xb5, 0xed, 0x5e, 0x52, 0xe7, 0x76, 0x2f, 0xaf, 0xc0, 0x5c, 0x17, - 0xf7, 0x2d, 0xcf, 0x18, 0x99, 0xe1, 0xa4, 0xe9, 0x5e, 0x20, 0xf2, 0xce, 0xed, 0x9f, 0xd8, 0x10, - 0xba, 0x49, 0x43, 0xbc, 0xae, 0x99, 0xd8, 0x90, 0x95, 0x46, 0xc3, 0xc0, 0xa6, 0x59, 0xcc, 0x50, - 0xee, 0x82, 0x4d, 0x5f, 0x63, 0x64, 0xf1, 0x73, 0xef, 0x5e, 0xf9, 0x43, 0x3a, 0xdf, 0x89, 0xa8, - 0xbb, 0x13, 0x07, 0x30, 0xc7, 0xe5, 0x1b, 0xbe, 0xcd, 0x60, 0xa9, 0xf5, 0xe5, 0xe1, 0x0f, 0x6e, - 0x70, 0x13, 0x90, 0x2d, 0x3e, 0xc1, 0x3e, 0xc4, 0x9f, 0x6e, 0x1f, 0x10, 0x24, 0xe8, 0x2a, 0x25, - 0x98, 0x13, 0x22, 0xcf, 0xff, 0x60, 0x7b, 0x43, 0xe2, 0xa1, 0xa9, 0x36, 0x4d, 0x99, 0x66, 0x31, - 0x2a, 0x6e, 0x14, 0xb3, 0x4b, 0xf1, 0x1b, 0x19, 0x69, 0x8a, 0x10, 0x8f, 0x38, 0x4d, 0x7c, 0x00, - 0x33, 0x43, 0x49, 0x95, 0x33, 0xf9, 0x68, 0xe0, 0xe4, 0x63, 0xde, 0xc9, 0x8b, 0x3f, 0x8b, 0x42, - 0x29, 0x3c, 0x8b, 0x0a, 0x54, 0xf5, 0x22, 0xcc, 0x38, 0x13, 0x76, 0x26, 0xc1, 0x5c, 0x83, 0xe0, - 0xbc, 0xb0, 0x67, 0x11, 0xe6, 0xe5, 0xaf, 0x43, 0x7e, 0x20, 0xc7, 0x63, 0x5b, 0x35, 0x7d, 0xea, - 0xed, 0x5f, 0xfc, 0x4d, 0xdc, 0x71, 0xbd, 0xbe, 0x44, 0x2c, 0xc0, 0x3c, 0xdf, 0x82, 0xd9, 0x06, - 0xae, 0xab, 0x8d, 0xef, 0x6a, 0x9d, 0x33, 0x5c, 0xfa, 0x07, 0xe3, 0x7c, 0x56, 0xc6, 0xf9, 0xa3, - 0x98, 0x63, 0x9d, 0x6e, 0xe2, 0x1b, 0x68, 0x52, 0xaf, 0x92, 0xd9, 0x2b, 0x24, 0x96, 0xb0, 0xed, - 0x2a, 0x0e, 0xa7, 0x47, 0x55, 0xfa, 0x9e, 0x2f, 0x2b, 0xe7, 0x46, 0x7b, 0x20, 0x78, 0xf6, 0x5a, - 0xf6, 0x9c, 0xd9, 0x87, 0x0f, 0xc0, 0xee, 0xbe, 0x7a, 0x36, 0x3d, 0xdf, 0xf6, 0x51, 0x91, 0x34, - 0x32, 0x2c, 0x0c, 0x47, 0xf7, 0xca, 0xa9, 0xda, 0xc0, 0xdd, 0x3a, 0x1e, 0xb1, 0xdd, 0x62, 0xc5, - 0x49, 0x37, 0x9d, 0xc4, 0x7d, 0x28, 0x79, 0xb9, 0x06, 0x64, 0xe9, 0xdc, 0xe5, 0x8c, 0xd1, 0xdc, - 0x27, 0x67, 0xaa, 0x4d, 0x67, 0x35, 0x6f, 0x42, 0x61, 0x20, 0x79, 0x1f, 0xc8, 0x08, 0xdc, 0x8f, - 0xfa, 0x8f, 0x39, 0xc8, 0x48, 0xd8, 0xd4, 0x49, 0x02, 0x89, 0xd6, 0x21, 0x8b, 0xfb, 0x75, 0xac, - 0x5b, 0x76, 0xce, 0x1d, 0x7c, 0x3e, 0x61, 0xdc, 0x15, 0x9b, 0x93, 0x1c, 0x2d, 0x1c, 0x31, 0x74, - 0x9b, 0x43, 0x2f, 0xe1, 0x28, 0x0a, 0x17, 0xf7, 0x62, 0x2f, 0xaf, 0xda, 0xd8, 0x4b, 0x3c, 0x14, - 0x56, 0x60, 0x52, 0x03, 0xe0, 0xcb, 0x6d, 0x0e, 0xbe, 0x24, 0xc6, 0x74, 0xe6, 0x43, 0x5f, 0xca, - 0x3e, 0xf4, 0x25, 0x39, 0x66, 0x9a, 0x21, 0xf0, 0xcb, 0xab, 0x36, 0xfc, 0x92, 0x1a, 0x33, 0xe2, - 0x01, 0xfc, 0xe5, 0x0d, 0x0f, 0xfe, 0x92, 0x09, 0x3d, 0x78, 0x31, 0xd1, 0x00, 0x00, 0xe6, 0x9e, - 0x03, 0xc0, 0xe4, 0x42, 0xc1, 0x1b, 0x2e, 0x3c, 0x88, 0xc0, 0xec, 0x0d, 0x21, 0x30, 0x0c, 0x31, - 0x79, 0x3e, 0x54, 0xc5, 0x18, 0x08, 0x66, 0x6f, 0x08, 0x82, 0x99, 0x1e, 0xa3, 0x70, 0x0c, 0x06, - 0xf3, 0x3f, 0xc1, 0x18, 0x4c, 0x38, 0x4a, 0xc2, 0x87, 0x39, 0x19, 0x08, 0x23, 0x87, 0x80, 0x30, - 0x85, 0x50, 0xc0, 0x80, 0xa9, 0x9f, 0x18, 0x85, 0x39, 0x0c, 0x40, 0x61, 0x18, 0x5e, 0x72, 0x23, - 0x54, 0xf9, 0x04, 0x30, 0xcc, 0x61, 0x00, 0x0c, 0x33, 0x33, 0x56, 0xed, 0x58, 0x1c, 0x66, 0xd3, - 0x8f, 0xc3, 0xa0, 0x90, 0x34, 0xd9, 0xfd, 0xda, 0x43, 0x80, 0x98, 0xe3, 0x30, 0x20, 0x86, 0x81, - 0x25, 0x2f, 0x85, 0x6a, 0x3c, 0x07, 0x12, 0xb3, 0x37, 0x84, 0xc4, 0xcc, 0x8d, 0xb1, 0xb4, 0x31, - 0x50, 0xcc, 0xa6, 0x1f, 0x8a, 0xb9, 0x30, 0x66, 0xf2, 0xa1, 0x58, 0x4c, 0xd9, 0x87, 0xc5, 0xcc, - 0x8f, 0x71, 0x25, 0x21, 0x60, 0xcc, 0x7f, 0x78, 0xc1, 0x98, 0x8b, 0xa1, 0x78, 0x0e, 0xdf, 0x87, - 0x31, 0x68, 0x4c, 0x5a, 0xc8, 0x30, 0x1c, 0x66, 0x3b, 0x91, 0x01, 0x21, 0x27, 0xde, 0x24, 0x71, - 0x75, 0xc0, 0x61, 0x93, 0x53, 0x1a, 0x36, 0x0c, 0xcd, 0xe0, 0xb8, 0x0a, 0x6b, 0x88, 0x37, 0xc8, - 0xe9, 0xdc, 0x75, 0xce, 0x23, 0x90, 0x1b, 0x7a, 0x1a, 0xf6, 0x38, 0x64, 0xf1, 0xd7, 0x51, 0x57, - 0x96, 0x06, 0x47, 0xef, 0xc9, 0x3e, 0xcb, 0x4f, 0xf6, 0x1e, 0x3c, 0x27, 0xe6, 0xc7, 0x73, 0x16, - 0x21, 0x47, 0x4e, 0xb9, 0x03, 0x50, 0x8d, 0xa2, 0x3b, 0x50, 0xcd, 0x2d, 0x98, 0xa1, 0xc1, 0x9b, - 0xa1, 0x3e, 0x3c, 0x90, 0x25, 0x68, 0x20, 0x2b, 0x90, 0x17, 0x6c, 0x49, 0x58, 0x1a, 0xf4, 0x32, - 0xcc, 0x7a, 0x78, 0x9d, 0xd3, 0x33, 0xc3, 0x2d, 0x04, 0x87, 0x7b, 0x8d, 0x1f, 0xa3, 0x7f, 0x1b, - 0x75, 0x57, 0xc8, 0xc5, 0x78, 0x82, 0xe0, 0x98, 0xe8, 0x33, 0x82, 0x63, 0x62, 0xdf, 0x19, 0x8e, - 0xf1, 0xa2, 0x01, 0x71, 0x3f, 0x1a, 0xf0, 0x97, 0xa8, 0xbb, 0x27, 0x0e, 0xb8, 0x52, 0xd7, 0x1a, - 0x98, 0x9f, 0xcf, 0xe9, 0x33, 0x49, 0x85, 0xdb, 0x5a, 0x93, 0x9f, 0xc2, 0xc9, 0x23, 0xe1, 0x72, - 0x22, 0x68, 0x96, 0x07, 0x48, 0xe7, 0x68, 0xcf, 0xf2, 0x4b, 0x7e, 0xb4, 0x17, 0x20, 0xfe, 0x04, - 0xb3, 0x78, 0x37, 0x25, 0x91, 0x47, 0xc2, 0x47, 0xcd, 0x8e, 0xe7, 0x89, 0xac, 0x81, 0xee, 0x42, - 0x96, 0x16, 0x8a, 0x64, 0x4d, 0x37, 0x79, 0x88, 0xf3, 0xa5, 0xd4, 0xac, 0x5a, 0xb4, 0xbc, 0x4f, - 0x78, 0xf6, 0x74, 0x53, 0xca, 0xe8, 0xfc, 0xc9, 0x93, 0xa3, 0x64, 0x7d, 0x89, 0xed, 0x15, 0xc8, - 0x92, 0xd1, 0x9b, 0xba, 0x52, 0xc7, 0xb4, 0xf0, 0x90, 0x95, 0x5c, 0x82, 0xf8, 0x18, 0xd0, 0xf0, - 0x77, 0x8a, 0xaa, 0x90, 0xc2, 0xa7, 0xb8, 0x6b, 0xb1, 0xbc, 0x3f, 0xb7, 0x3a, 0x1f, 0x90, 0x8f, - 0xe1, 0xae, 0xb5, 0x5e, 0x24, 0x8b, 0xfc, 0xed, 0x57, 0x8b, 0x02, 0xe3, 0x7e, 0x49, 0xeb, 0xa8, - 0x16, 0xee, 0xe8, 0xd6, 0x99, 0xc4, 0xe5, 0xc5, 0x2f, 0xa2, 0x24, 0x9b, 0xf2, 0x45, 0xe4, 0xc0, - 0xb5, 0xb5, 0x4d, 0x3e, 0xe6, 0x01, 0xb3, 0xae, 0x02, 0x34, 0x15, 0x53, 0xfe, 0x50, 0xe9, 0x5a, - 0xb8, 0xc1, 0x97, 0x33, 0xdb, 0x54, 0xcc, 0xb7, 0x29, 0xc1, 0x3f, 0xb1, 0xcc, 0xc0, 0xc4, 0x3c, - 0xa8, 0x49, 0xd6, 0x8b, 0x9a, 0xa0, 0x12, 0x64, 0x74, 0x43, 0xd5, 0x0c, 0xd5, 0x3a, 0xa3, 0xab, - 0x11, 0x97, 0x9c, 0xf6, 0x76, 0x22, 0x13, 0x17, 0x12, 0xdb, 0x89, 0x4c, 0x42, 0x48, 0x3a, 0xd0, - 0x2c, 0x73, 0x09, 0x39, 0x61, 0x4a, 0xfc, 0x38, 0xe6, 0xda, 0xba, 0x9b, 0x60, 0x4e, 0x3a, 0x99, - 0xc9, 0x8c, 0x67, 0x21, 0x60, 0xca, 0x1e, 0x0a, 0x19, 0x3d, 0x69, 0xf5, 0x4c, 0xdc, 0xe0, 0x20, - 0xa1, 0xd3, 0xf6, 0x6c, 0x5a, 0xfa, 0xe9, 0x36, 0x6d, 0xf4, 0xca, 0x8a, 0x3f, 0xa6, 0xb0, 0xae, - 0xdf, 0xa1, 0xa2, 0x03, 0xef, 0x59, 0xb5, 0x47, 0x3f, 0x41, 0xdb, 0x78, 0x26, 0xfd, 0x56, 0xdd, - 0x33, 0x2d, 0x23, 0x9b, 0xe8, 0x3f, 0xe1, 0xe2, 0x80, 0x1f, 0x71, 0x54, 0xc7, 0x42, 0xb2, 0xbf, - 0x41, 0x6f, 0x72, 0xc1, 0xef, 0x4d, 0x6c, 0xcd, 0xee, 0x5a, 0xc5, 0x9f, 0xd2, 0xc0, 0xef, 0x40, - 0xde, 0x9f, 0x34, 0x92, 0x23, 0x9b, 0x81, 0x2d, 0x45, 0xed, 0xca, 0xbe, 0x03, 0xf9, 0x14, 0x23, - 0x72, 0x30, 0x77, 0x1f, 0x2e, 0x04, 0x26, 0x8a, 0xe8, 0x35, 0xc8, 0xba, 0x39, 0x66, 0x34, 0xe4, - 0x34, 0xe4, 0x60, 0x9d, 0x2e, 0xaf, 0xf8, 0x79, 0xd4, 0x55, 0xe9, 0x47, 0x4f, 0x2b, 0x90, 0x32, - 0xb0, 0xd9, 0x6b, 0xb3, 0xd3, 0x4b, 0x7e, 0xf5, 0xe5, 0xc9, 0x52, 0x4c, 0x42, 0xed, 0xb5, 0x2d, - 0x89, 0x0b, 0x8b, 0x8f, 0x21, 0xc5, 0x28, 0x28, 0x07, 0xe9, 0xc3, 0xdd, 0x87, 0xbb, 0x7b, 0x6f, - 0xef, 0x0a, 0x11, 0x04, 0x90, 0x5a, 0x2b, 0x97, 0x2b, 0xfb, 0x35, 0x21, 0x8a, 0xb2, 0x90, 0x5c, - 0x5b, 0xdf, 0x93, 0x6a, 0x42, 0x8c, 0x90, 0xa5, 0xca, 0x76, 0xa5, 0x5c, 0x13, 0xe2, 0x68, 0x06, - 0xa6, 0xd9, 0xb3, 0xbc, 0xb9, 0x27, 0x3d, 0x5a, 0xab, 0x09, 0x09, 0x0f, 0xe9, 0xa0, 0xb2, 0xbb, - 0x51, 0x91, 0x84, 0xa4, 0xf8, 0x2f, 0x70, 0x29, 0x34, 0x29, 0x75, 0xa1, 0xd1, 0xa8, 0x07, 0x1a, - 0x15, 0x7f, 0x1a, 0x83, 0x52, 0x78, 0xa6, 0x89, 0xb6, 0x07, 0x26, 0xbe, 0x7a, 0x8e, 0x34, 0x75, - 0x60, 0xf6, 0xe8, 0x3a, 0xe4, 0x0d, 0x7c, 0x82, 0xad, 0x7a, 0x8b, 0x65, 0xbe, 0x2c, 0x12, 0x4d, - 0x4b, 0xd3, 0x9c, 0x4a, 0x85, 0x4c, 0xc6, 0xf6, 0x3e, 0xae, 0x5b, 0x32, 0xf3, 0x37, 0xcc, 0xc0, - 0xb2, 0x84, 0x8d, 0x50, 0x0f, 0x18, 0x51, 0x7c, 0xef, 0x5c, 0x6b, 0x99, 0x85, 0xa4, 0x54, 0xa9, - 0x49, 0xef, 0x08, 0x71, 0x84, 0x20, 0x4f, 0x1f, 0xe5, 0x83, 0xdd, 0xb5, 0xfd, 0x83, 0xea, 0x1e, - 0x59, 0xcb, 0x59, 0x28, 0xd8, 0x6b, 0x69, 0x13, 0x93, 0xe2, 0xef, 0x63, 0x70, 0x31, 0x24, 0x4f, - 0x46, 0x77, 0x01, 0xac, 0xbe, 0x6c, 0xe0, 0xba, 0x66, 0x34, 0xc2, 0x8d, 0xac, 0xd6, 0x97, 0x28, - 0x87, 0x94, 0xb5, 0xf8, 0x93, 0x39, 0x02, 0x51, 0x47, 0xaf, 0x73, 0xa5, 0x64, 0x56, 0xf6, 0x67, - 0x75, 0x35, 0x00, 0x38, 0xc6, 0x75, 0xa2, 0x98, 0xae, 0x2d, 0x55, 0x4c, 0xf9, 0xd1, 0xa3, 0x20, - 0xff, 0x31, 0x61, 0xe9, 0x25, 0xc0, 0x73, 0xbc, 0x13, 0xee, 0x39, 0x92, 0x93, 0x26, 0x22, 0xc1, - 0xae, 0x43, 0xfc, 0x79, 0xdc, 0xbb, 0xb0, 0xfe, 0x63, 0xc1, 0x1e, 0xa4, 0x4c, 0x4b, 0xb1, 0x7a, - 0x26, 0x37, 0xb8, 0xd7, 0x26, 0x3d, 0x63, 0x2c, 0xdb, 0x0f, 0x07, 0x54, 0x5c, 0xe2, 0x6a, 0x7e, - 0x58, 0x6f, 0xea, 0x60, 0xfd, 0x8b, 0x13, 0xfe, 0xc9, 0xb8, 0x3e, 0x27, 0x26, 0xde, 0x77, 0x13, - 0x1b, 0x0f, 0x62, 0x3b, 0x8c, 0x86, 0x46, 0x83, 0xd0, 0xd0, 0x5f, 0x44, 0xe1, 0xf2, 0x88, 0x93, - 0x16, 0x7a, 0x6b, 0x60, 0x9f, 0xef, 0x9d, 0xe7, 0x9c, 0xb6, 0xcc, 0x68, 0xfe, 0x9d, 0x16, 0x6f, - 0xc3, 0x94, 0x97, 0x3e, 0xd9, 0x24, 0xbf, 0x8d, 0xb9, 0x3e, 0xdf, 0x0f, 0xdb, 0x3e, 0xb3, 0x0c, - 0x6e, 0xc0, 0xce, 0x62, 0xe7, 0xb4, 0xb3, 0xc0, 0xbc, 0x20, 0xfe, 0x94, 0x79, 0xc1, 0x08, 0x6b, - 0x4b, 0x3c, 0x9d, 0xb5, 0xf9, 0x3e, 0xb8, 0xa4, 0xff, 0x90, 0xf0, 0x0e, 0x80, 0x07, 0xc0, 0x9c, - 0x83, 0xa4, 0xa1, 0xf5, 0xba, 0x0d, 0x6a, 0x01, 0x49, 0x89, 0x35, 0xd0, 0x1d, 0x48, 0x12, 0x4b, - 0xb2, 0xd7, 0x69, 0xd8, 0xa9, 0x12, 0x4b, 0xf0, 0xc0, 0xa2, 0x8c, 0x5b, 0x7c, 0x17, 0xf2, 0x7e, - 0xd4, 0xf4, 0xd9, 0xaa, 0x57, 0x01, 0x0d, 0x17, 0xec, 0x42, 0xba, 0x78, 0xc3, 0xdf, 0xc5, 0xb5, - 0xd0, 0xd2, 0x5f, 0x70, 0x57, 0x1f, 0x41, 0x92, 0x1a, 0x16, 0xc9, 0x6e, 0x69, 0x95, 0x98, 0x9f, - 0x61, 0xc9, 0x33, 0x7a, 0x17, 0x40, 0xb1, 0x2c, 0x43, 0x3d, 0xee, 0xb9, 0x1d, 0x2c, 0x06, 0x1b, - 0xe6, 0x9a, 0xcd, 0xb7, 0x7e, 0x85, 0x5b, 0xe8, 0x9c, 0x2b, 0xea, 0xb1, 0x52, 0x8f, 0x42, 0x71, - 0x17, 0xf2, 0x7e, 0x59, 0xfb, 0xd4, 0xc5, 0xc6, 0xe0, 0x3f, 0x75, 0xb1, 0x43, 0x34, 0x3f, 0x75, - 0x39, 0x67, 0xb6, 0x38, 0x2b, 0x85, 0xd3, 0x86, 0xf8, 0xd7, 0x28, 0x4c, 0x79, 0xed, 0xfa, 0x19, - 0xe7, 0xfa, 0x63, 0x8e, 0x37, 0x97, 0x86, 0x52, 0xfd, 0x74, 0x53, 0x31, 0x0f, 0xbf, 0xcf, 0x4c, - 0xff, 0xe3, 0x28, 0x64, 0x9c, 0xc9, 0x87, 0x60, 0xe0, 0xee, 0xda, 0xc5, 0xbc, 0xa5, 0x6c, 0x86, - 0xbb, 0xc7, 0x1d, 0xdc, 0xfd, 0xbe, 0x93, 0x8a, 0x85, 0xa1, 0xcd, 0xde, 0x95, 0xb6, 0xab, 0x0f, - 0x3c, 0xf3, 0xfc, 0x09, 0x1f, 0x07, 0xc9, 0x41, 0xd0, 0xbf, 0x41, 0x4a, 0xa9, 0x3b, 0x18, 0x7b, - 0x3e, 0x00, 0x31, 0xb2, 0x59, 0x97, 0x6b, 0xfd, 0x35, 0xca, 0x29, 0x71, 0x09, 0x3e, 0xaa, 0x98, - 0x3d, 0x2a, 0xf1, 0x01, 0xd1, 0xcb, 0x78, 0xfc, 0x0e, 0x37, 0x0f, 0x70, 0xb8, 0xfb, 0x68, 0x6f, - 0x63, 0x6b, 0x73, 0xab, 0xb2, 0xc1, 0x93, 0xb1, 0x8d, 0x8d, 0xca, 0x86, 0x10, 0x23, 0x7c, 0x52, - 0xe5, 0xd1, 0xde, 0x51, 0x65, 0x43, 0x88, 0x8b, 0x65, 0xc8, 0x51, 0x7f, 0xcb, 0xa1, 0x8a, 0xcb, - 0x90, 0xed, 0x28, 0xfe, 0xa2, 0x7b, 0xa6, 0xa3, 0xf0, 0x92, 0xfb, 0x45, 0x48, 0x93, 0x97, 0x4d, - 0xc5, 0xb4, 0x4b, 0x83, 0x1d, 0xa5, 0xff, 0xa6, 0x62, 0x8a, 0x7f, 0x8b, 0x42, 0x61, 0xc0, 0x3d, - 0xa1, 0x55, 0x48, 0x32, 0x48, 0x2b, 0xec, 0x12, 0xa6, 0xa7, 0x5b, 0x89, 0xb1, 0xa2, 0xd7, 0x21, - 0x83, 0x79, 0x99, 0x24, 0xe8, 0x7c, 0xc4, 0xfc, 0xa0, 0x5d, 0x48, 0xe1, 0xa2, 0x8e, 0x04, 0x7a, - 0x00, 0x59, 0xc7, 0xd1, 0x86, 0x5f, 0x9e, 0x71, 0x5c, 0x34, 0x97, 0x77, 0x65, 0xd0, 0x3d, 0x17, - 0xa1, 0x4a, 0x0c, 0xc3, 0xeb, 0x5c, 0x9c, 0x31, 0x70, 0x61, 0x9b, 0x5f, 0xbc, 0x0f, 0x59, 0x47, - 0x31, 0x2a, 0x42, 0xda, 0x2e, 0x8a, 0x45, 0xb9, 0x07, 0xe6, 0xc5, 0xb0, 0x39, 0x48, 0xea, 0xda, - 0x87, 0xfc, 0x22, 0x44, 0x5c, 0x62, 0x0d, 0xb1, 0x01, 0x85, 0x81, 0xc0, 0x81, 0xee, 0x43, 0x5a, - 0xef, 0x1d, 0xcb, 0xf6, 0xb7, 0x3f, 0xb0, 0x7e, 0x36, 0x86, 0xd2, 0x3b, 0x6e, 0xab, 0xf5, 0x87, - 0xf8, 0xcc, 0xb6, 0x36, 0xbd, 0x77, 0xfc, 0x90, 0xb9, 0x08, 0xd6, 0x4b, 0xcc, 0xdb, 0xcb, 0x29, - 0x64, 0x6c, 0x8f, 0x87, 0xfe, 0xdd, 0xbb, 0x54, 0xf6, 0x45, 0xa6, 0xd0, 0x60, 0xc6, 0xd5, 0x7b, - 0x56, 0xea, 0x16, 0xcc, 0x98, 0x6a, 0xb3, 0x6b, 0x17, 0x50, 0xd9, 0x46, 0xb3, 0x4a, 0x54, 0x81, - 0xbd, 0xd8, 0xb1, 0x81, 0x36, 0x92, 0x8a, 0x08, 0x83, 0x2e, 0xf7, 0xfb, 0x1c, 0x40, 0x40, 0xca, - 0x14, 0x0f, 0x4a, 0x99, 0xfe, 0x3f, 0x06, 0x39, 0x4f, 0x59, 0x16, 0xfd, 0xab, 0xc7, 0xff, 0xe7, - 0x03, 0x62, 0xbd, 0x87, 0xd7, 0xbd, 0x29, 0xe4, 0x9f, 0x58, 0xec, 0xfc, 0x13, 0x0b, 0xab, 0x82, - 0xdb, 0xd5, 0xdd, 0xc4, 0xb9, 0xab, 0xbb, 0x2f, 0x01, 0xb2, 0x34, 0x4b, 0x69, 0xcb, 0xa7, 0x9a, - 0xa5, 0x76, 0x9b, 0x32, 0x33, 0x0d, 0xe6, 0xad, 0x05, 0xfa, 0xe6, 0x88, 0xbe, 0xd8, 0xa7, 0x56, - 0xf2, 0xbf, 0x31, 0xc8, 0xd8, 0x5f, 0xd8, 0x3f, 0xe9, 0x12, 0xfc, 0x5f, 0x14, 0x32, 0x0e, 0xf4, - 0x70, 0xde, 0xab, 0x54, 0xf3, 0x90, 0xe2, 0xa7, 0x6b, 0x76, 0x97, 0x8a, 0xb7, 0x02, 0x2b, 0xf9, - 0x25, 0xc8, 0x74, 0xb0, 0xa5, 0xd0, 0xe8, 0xcb, 0x52, 0x35, 0xa7, 0x7d, 0xeb, 0x1e, 0xe4, 0x3c, - 0xd7, 0xd0, 0x48, 0x40, 0xde, 0xad, 0xbc, 0x2d, 0x44, 0x4a, 0xe9, 0x4f, 0x3e, 0x5b, 0x8a, 0xef, - 0xe2, 0x0f, 0x89, 0x93, 0x91, 0x2a, 0xe5, 0x6a, 0xa5, 0xfc, 0x50, 0x88, 0x96, 0x72, 0x9f, 0x7c, - 0xb6, 0x94, 0x96, 0x30, 0x2d, 0x13, 0xde, 0x7a, 0x08, 0x85, 0x81, 0x8d, 0xf1, 0x87, 0x06, 0x04, - 0xf9, 0x8d, 0xc3, 0xfd, 0x9d, 0xad, 0xf2, 0x5a, 0xad, 0x22, 0x1f, 0xed, 0xd5, 0x2a, 0x42, 0x14, - 0x5d, 0x84, 0xd9, 0x9d, 0xad, 0x37, 0xab, 0x35, 0xb9, 0xbc, 0xb3, 0x55, 0xd9, 0xad, 0xc9, 0x6b, - 0xb5, 0xda, 0x5a, 0xf9, 0xa1, 0x10, 0x5b, 0xfd, 0x65, 0x0e, 0x0a, 0x6b, 0xeb, 0xe5, 0xad, 0x35, - 0x5d, 0x6f, 0xab, 0x75, 0x85, 0x06, 0x9a, 0x32, 0x24, 0x68, 0x85, 0x60, 0xe4, 0xc5, 0xfa, 0xd2, - 0xe8, 0xda, 0x2f, 0xda, 0x84, 0x24, 0x2d, 0x1e, 0xa0, 0xd1, 0x37, 0xed, 0x4b, 0x63, 0x8a, 0xc1, - 0x64, 0x30, 0xd4, 0xa3, 0x8c, 0xbc, 0x7a, 0x5f, 0x1a, 0x5d, 0x1b, 0x46, 0x3b, 0x90, 0xb6, 0xb1, - 0xdd, 0x71, 0xf7, 0xe1, 0x4b, 0x63, 0x0b, 0xb6, 0x64, 0x6a, 0x0c, 0x83, 0x1f, 0x7d, 0x2b, 0xbf, - 0x34, 0xa6, 0x6a, 0x8c, 0xb6, 0x20, 0xc5, 0x11, 0xb9, 0x31, 0x17, 0xed, 0x4b, 0xe3, 0xea, 0xc0, - 0x48, 0x82, 0xac, 0x5b, 0xdd, 0x18, 0xff, 0xaf, 0x41, 0x69, 0x82, 0x82, 0x38, 0x7a, 0x0c, 0xd3, - 0x7e, 0xe4, 0x6f, 0xb2, 0xcb, 0xfc, 0xa5, 0x09, 0x2b, 0xce, 0x44, 0xbf, 0x1f, 0x06, 0x9c, 0xec, - 0x72, 0x7f, 0x69, 0xc2, 0x02, 0x34, 0x7a, 0x1f, 0x66, 0x86, 0x61, 0xba, 0xc9, 0xef, 0xfa, 0x97, - 0xce, 0x51, 0x92, 0x46, 0x1d, 0x40, 0x01, 0xf0, 0xde, 0x39, 0xae, 0xfe, 0x97, 0xce, 0x53, 0xa1, - 0x46, 0x0d, 0x28, 0x0c, 0x42, 0x66, 0x93, 0xfe, 0x0a, 0x50, 0x9a, 0xb8, 0x5a, 0xcd, 0x7a, 0xf1, - 0xe3, 0x47, 0x93, 0xfe, 0x1a, 0x50, 0x9a, 0xb8, 0x78, 0x8d, 0x0e, 0x01, 0x3c, 0xf8, 0xc7, 0x04, - 0xbf, 0x0a, 0x94, 0x26, 0x29, 0x63, 0x23, 0x1d, 0x66, 0x83, 0x80, 0x91, 0xf3, 0xfc, 0x39, 0x50, - 0x3a, 0x57, 0x75, 0x9b, 0xd8, 0xb3, 0x1f, 0xe2, 0x98, 0xec, 0x4f, 0x82, 0xd2, 0x84, 0x65, 0xee, - 0xf5, 0xca, 0x17, 0x5f, 0x2f, 0x44, 0xbf, 0xfc, 0x7a, 0x21, 0xfa, 0xe7, 0xaf, 0x17, 0xa2, 0x9f, - 0x7e, 0xb3, 0x10, 0xf9, 0xf2, 0x9b, 0x85, 0xc8, 0x1f, 0xbe, 0x59, 0x88, 0xfc, 0xd7, 0x8b, 0x4d, - 0xd5, 0x6a, 0xf5, 0x8e, 0x97, 0xeb, 0x5a, 0x67, 0xc5, 0xfb, 0xef, 0x55, 0xd0, 0x0f, 0x61, 0xc7, - 0x29, 0x1a, 0x50, 0x6f, 0xff, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x54, 0xe4, 0xfa, 0x30, 0x36, - 0x00, 0x00, + 0x91, 0xc7, 0xe0, 0x1b, 0x0d, 0x12, 0x18, 0x3e, 0x52, 0x14, 0x04, 0x49, 0x24, 0x35, 0x2e, 0xd9, + 0x92, 0x6c, 0x93, 0x5e, 0x6a, 0x65, 0x4b, 0x2b, 0x7b, 0xb5, 0x24, 0x08, 0x1a, 0xa4, 0x28, 0x92, + 0x1e, 0x82, 0xf4, 0x7a, 0x77, 0xad, 0xf1, 0x10, 0x78, 0x04, 0xc6, 0x02, 0x30, 0x63, 0xcc, 0x80, + 0x06, 0x7d, 0xda, 0xda, 0x8d, 0x2f, 0xce, 0xc5, 0xb7, 0xe4, 0x10, 0xdf, 0x92, 0xaa, 0xe4, 0x3f, + 0x48, 0xe5, 0xe0, 0x53, 0x0e, 0x3e, 0xe4, 0xe0, 0x53, 0x2a, 0x97, 0x38, 0x29, 0xfb, 0xe6, 0x7f, + 0x20, 0xb7, 0x24, 0xf5, 0x3e, 0xe6, 0x0b, 0x98, 0x01, 0x40, 0x4b, 0xe5, 0xaa, 0x54, 0x7c, 0x9b, + 0xd7, 0xd3, 0xdd, 0xef, 0xab, 0xa7, 0xbb, 0xdf, 0xaf, 0xdf, 0xc0, 0x65, 0x0b, 0x77, 0xea, 0xb8, + 0xdb, 0xd6, 0x3a, 0xd6, 0x8a, 0x7a, 0x5c, 0xd3, 0x56, 0xac, 0x33, 0x03, 0x9b, 0xcb, 0x46, 0x57, + 0xb7, 0x74, 0x94, 0x77, 0x5f, 0x2e, 0x93, 0x97, 0xc5, 0xab, 0x1e, 0xee, 0x5a, 0xf7, 0xcc, 0xb0, + 0xf4, 0x15, 0xa3, 0xab, 0xeb, 0x27, 0x8c, 0xbf, 0x78, 0x65, 0xf8, 0xf5, 0x13, 0x7c, 0xc6, 0xb5, + 0xf9, 0x84, 0x69, 0x2f, 0x2b, 0x86, 0xda, 0x55, 0xdb, 0x66, 0x80, 0x30, 0x7b, 0xed, 0x19, 0x4a, + 0x71, 0xb1, 0xa1, 0xeb, 0x8d, 0x16, 0x5e, 0xa1, 0xad, 0xe3, 0xde, 0xc9, 0x8a, 0xa5, 0xb5, 0xb1, + 0x69, 0xa9, 0x6d, 0x83, 0x33, 0xcc, 0x35, 0xf4, 0x86, 0x4e, 0x1f, 0x57, 0xc8, 0x13, 0xa3, 0x4a, + 0x1f, 0x67, 0x21, 0x25, 0xe3, 0x0f, 0x7a, 0xd8, 0xb4, 0xd0, 0x2a, 0xc4, 0x71, 0xad, 0xa9, 0x17, + 0x84, 0x25, 0xe1, 0x46, 0x76, 0xf5, 0xca, 0xf2, 0xc0, 0xe4, 0x96, 0x39, 0x5f, 0xb9, 0xd6, 0xd4, + 0x2b, 0x11, 0x99, 0xf2, 0xa2, 0x3b, 0x90, 0x38, 0x69, 0xf5, 0xcc, 0x66, 0x21, 0x4a, 0x85, 0xae, + 0x86, 0x09, 0x6d, 0x12, 0xa6, 0x4a, 0x44, 0x66, 0xdc, 0xa4, 0x2b, 0xad, 0x73, 0xa2, 0x17, 0x62, + 0xa3, 0xbb, 0xda, 0xea, 0x9c, 0xd0, 0xae, 0x08, 0x2f, 0x5a, 0x07, 0xd0, 0x3a, 0x9a, 0xa5, 0xd4, + 0x9a, 0xaa, 0xd6, 0x29, 0xc4, 0xa9, 0xe4, 0xb5, 0x70, 0x49, 0xcd, 0x2a, 0x11, 0xc6, 0x4a, 0x44, + 0xce, 0x68, 0x76, 0x83, 0x0c, 0xf7, 0x83, 0x1e, 0xee, 0x9e, 0x15, 0x12, 0xa3, 0x87, 0xfb, 0x16, + 0x61, 0x22, 0xc3, 0xa5, 0xdc, 0xe8, 0x75, 0x48, 0xd7, 0x9a, 0xb8, 0xf6, 0x44, 0xb1, 0xfa, 0x85, + 0x14, 0x95, 0x5c, 0x0c, 0x93, 0x2c, 0x11, 0xbe, 0x6a, 0xbf, 0x12, 0x91, 0x53, 0x35, 0xf6, 0x88, + 0xee, 0x42, 0xb2, 0xa6, 0xb7, 0xdb, 0x9a, 0x55, 0x00, 0x2a, 0xbb, 0x10, 0x2a, 0x4b, 0xb9, 0x2a, + 0x11, 0x99, 0xf3, 0xa3, 0x5d, 0xc8, 0xb5, 0x34, 0xd3, 0x52, 0xcc, 0x8e, 0x6a, 0x98, 0x4d, 0xdd, + 0x32, 0x0b, 0x59, 0xaa, 0xe1, 0x7a, 0x98, 0x86, 0x1d, 0xcd, 0xb4, 0x0e, 0x6c, 0xe6, 0x4a, 0x44, + 0x9e, 0x6e, 0x79, 0x09, 0x44, 0x9f, 0x7e, 0x72, 0x82, 0xbb, 0x8e, 0xc2, 0xc2, 0xd4, 0x68, 0x7d, + 0x7b, 0x84, 0xdb, 0x96, 0x27, 0xfa, 0x74, 0x2f, 0x01, 0xfd, 0x37, 0xcc, 0xb6, 0x74, 0xb5, 0xee, + 0xa8, 0x53, 0x6a, 0xcd, 0x5e, 0xe7, 0x49, 0x61, 0x9a, 0x2a, 0xbd, 0x19, 0x3a, 0x48, 0x5d, 0xad, + 0xdb, 0x2a, 0x4a, 0x44, 0xa0, 0x12, 0x91, 0x67, 0x5a, 0x83, 0x44, 0xf4, 0x18, 0xe6, 0x54, 0xc3, + 0x68, 0x9d, 0x0d, 0x6a, 0xcf, 0x51, 0xed, 0xb7, 0xc2, 0xb4, 0xaf, 0x11, 0x99, 0x41, 0xf5, 0x48, + 0x1d, 0xa2, 0xa2, 0x2a, 0x88, 0x46, 0x17, 0x1b, 0x6a, 0x17, 0x2b, 0x46, 0x57, 0x37, 0x74, 0x53, + 0x6d, 0x15, 0xf2, 0x54, 0xf7, 0x0b, 0x61, 0xba, 0xf7, 0x19, 0xff, 0x3e, 0x67, 0xaf, 0x44, 0xe4, + 0xbc, 0xe1, 0x27, 0x31, 0xad, 0x7a, 0x0d, 0x9b, 0xa6, 0xab, 0x55, 0x1c, 0xa7, 0x95, 0xf2, 0xfb, + 0xb5, 0xfa, 0x48, 0xa8, 0x0c, 0x59, 0xdc, 0x27, 0xe2, 0xca, 0xa9, 0x6e, 0xe1, 0xc2, 0x0c, 0x55, + 0x28, 0x85, 0x7e, 0xa1, 0x94, 0xf5, 0x48, 0xb7, 0x70, 0x25, 0x22, 0x03, 0x76, 0x5a, 0x48, 0x85, + 0x0b, 0xa7, 0xb8, 0xab, 0x9d, 0x9c, 0x51, 0x35, 0x0a, 0x7d, 0x63, 0x6a, 0x7a, 0xa7, 0x80, 0xa8, + 0xc2, 0x17, 0xc3, 0x14, 0x1e, 0x51, 0x21, 0xa2, 0xa2, 0x6c, 0x8b, 0x54, 0x22, 0xf2, 0xec, 0xe9, + 0x30, 0x99, 0x98, 0xd8, 0x89, 0xd6, 0x51, 0x5b, 0xda, 0x47, 0x58, 0x39, 0x6e, 0xe9, 0xb5, 0x27, + 0x85, 0xd9, 0xd1, 0x26, 0xb6, 0xc9, 0xb9, 0xd7, 0x09, 0x33, 0x31, 0xb1, 0x13, 0x2f, 0x81, 0xcc, + 0xfc, 0x18, 0x37, 0xb4, 0x0e, 0x57, 0x36, 0x37, 0x7a, 0xe6, 0xeb, 0x84, 0xd5, 0xd6, 0x04, 0xc7, + 0x4e, 0x8b, 0x38, 0x8f, 0x3a, 0x6e, 0x69, 0xa7, 0xb8, 0x4b, 0xbe, 0xe1, 0x0b, 0xa3, 0x9d, 0xc7, + 0x06, 0xe3, 0xa4, 0x5f, 0x71, 0xa6, 0x6e, 0x37, 0xd0, 0x03, 0xc8, 0x90, 0x1d, 0x60, 0x03, 0x99, + 0xa7, 0x2a, 0x96, 0x42, 0xb7, 0xa0, 0x53, 0xb7, 0x87, 0x91, 0xc6, 0xfc, 0x79, 0x3d, 0x05, 0x89, + 0x53, 0xb5, 0xd5, 0xc3, 0xdb, 0xf1, 0x74, 0x52, 0x4c, 0x6d, 0xc7, 0xd3, 0x69, 0x31, 0xb3, 0x1d, + 0x4f, 0x67, 0x44, 0x90, 0x5e, 0x80, 0xac, 0xc7, 0xbd, 0xa2, 0x02, 0xa4, 0xda, 0xd8, 0x34, 0xd5, + 0x06, 0xa6, 0xde, 0x38, 0x23, 0xdb, 0x4d, 0x29, 0x07, 0x53, 0x5e, 0x97, 0x2a, 0x7d, 0x2a, 0x38, + 0x92, 0xc4, 0x5b, 0x12, 0xc9, 0x53, 0xdc, 0xa5, 0x9b, 0xca, 0x25, 0x79, 0x13, 0x3d, 0x07, 0xd3, + 0x74, 0xe8, 0x8a, 0xfd, 0x9e, 0xb8, 0xec, 0xb8, 0x3c, 0x45, 0x89, 0x47, 0x9c, 0x69, 0x11, 0xb2, + 0xc6, 0xaa, 0xe1, 0xb0, 0xc4, 0x28, 0x0b, 0x18, 0xab, 0x86, 0xcd, 0x70, 0x0d, 0xa6, 0xc8, 0x3c, + 0x1d, 0x8e, 0x38, 0xed, 0x24, 0x4b, 0x68, 0x9c, 0x45, 0xfa, 0x5d, 0x14, 0xc4, 0x41, 0x37, 0x8c, + 0xee, 0x42, 0x9c, 0x44, 0x24, 0x1e, 0x5c, 0x8a, 0xcb, 0x2c, 0x5c, 0x2d, 0xdb, 0xe1, 0x6a, 0xb9, + 0x6a, 0x87, 0xab, 0xf5, 0xf4, 0x17, 0x5f, 0x2d, 0x46, 0x3e, 0xfd, 0xd3, 0xa2, 0x20, 0x53, 0x09, + 0x74, 0x89, 0x38, 0x5f, 0x55, 0xeb, 0x28, 0x5a, 0x9d, 0x0e, 0x39, 0x43, 0x3c, 0xab, 0xaa, 0x75, + 0xb6, 0xea, 0x68, 0x07, 0xc4, 0x9a, 0xde, 0x31, 0x71, 0xc7, 0xec, 0x99, 0x0a, 0x0b, 0x96, 0x3c, + 0xa4, 0xf8, 0xf6, 0x96, 0xc5, 0xc9, 0x92, 0xcd, 0xb9, 0x4f, 0x19, 0xe5, 0x7c, 0xcd, 0x4f, 0x40, + 0x9b, 0x00, 0xa7, 0x6a, 0x4b, 0xab, 0xab, 0x96, 0xde, 0x35, 0x0b, 0xf1, 0xa5, 0x58, 0xe0, 0x06, + 0x1f, 0xd9, 0x2c, 0x87, 0x46, 0x5d, 0xb5, 0xf0, 0x7a, 0x9c, 0x0c, 0x57, 0xf6, 0x48, 0xa2, 0xe7, + 0x21, 0xaf, 0x1a, 0x86, 0x62, 0x5a, 0xaa, 0x85, 0x95, 0xe3, 0x33, 0x0b, 0x9b, 0x34, 0xdc, 0x4c, + 0xc9, 0xd3, 0xaa, 0x61, 0x1c, 0x10, 0xea, 0x3a, 0x21, 0xa2, 0xeb, 0x90, 0x23, 0x91, 0x49, 0x53, + 0x5b, 0x4a, 0x13, 0x6b, 0x8d, 0xa6, 0x55, 0x48, 0x2e, 0x09, 0x37, 0x62, 0xf2, 0x34, 0xa7, 0x56, + 0x28, 0x51, 0xaa, 0x3b, 0x3b, 0x4e, 0xa3, 0x12, 0x42, 0x10, 0xaf, 0xab, 0x96, 0x4a, 0x57, 0x72, + 0x4a, 0xa6, 0xcf, 0x84, 0x66, 0xa8, 0x56, 0x93, 0xaf, 0x0f, 0x7d, 0x46, 0xf3, 0x90, 0xe4, 0x6a, + 0x63, 0x54, 0x2d, 0x6f, 0xa1, 0x39, 0x48, 0x18, 0x5d, 0xfd, 0x14, 0xd3, 0xad, 0x4b, 0xcb, 0xac, + 0x21, 0xc9, 0x90, 0xf3, 0x47, 0x30, 0x94, 0x83, 0xa8, 0xd5, 0xe7, 0xbd, 0x44, 0xad, 0x3e, 0x7a, + 0x05, 0xe2, 0x64, 0x21, 0x69, 0x1f, 0xb9, 0x80, 0x98, 0xcd, 0xe5, 0xaa, 0x67, 0x06, 0x96, 0x29, + 0xa7, 0x94, 0x87, 0x69, 0x5f, 0x64, 0x93, 0xe6, 0x61, 0x2e, 0x28, 0x50, 0x49, 0x4d, 0x87, 0xee, + 0x0b, 0x38, 0xe8, 0x0e, 0xa4, 0x9d, 0x48, 0xc5, 0x0c, 0xe7, 0xd2, 0x50, 0xb7, 0x36, 0xb3, 0xec, + 0xb0, 0x12, 0x8b, 0x21, 0x1b, 0xd0, 0x54, 0x79, 0x5e, 0x32, 0x25, 0xa7, 0x54, 0xc3, 0xa8, 0xa8, + 0x66, 0x53, 0x7a, 0x0f, 0x0a, 0x61, 0x51, 0xc8, 0xb3, 0x60, 0x02, 0x35, 0x7b, 0x7b, 0xc1, 0xe6, + 0x21, 0x79, 0xa2, 0x77, 0xdb, 0xaa, 0x45, 0x95, 0x4d, 0xcb, 0xbc, 0x45, 0x16, 0x92, 0x45, 0xa4, + 0x18, 0x25, 0xb3, 0x86, 0xa4, 0xc0, 0xa5, 0xd0, 0x48, 0x44, 0x44, 0xb4, 0x4e, 0x1d, 0xb3, 0x65, + 0x9d, 0x96, 0x59, 0xc3, 0x55, 0xc4, 0x06, 0xcb, 0x1a, 0xa4, 0x5b, 0x93, 0xce, 0x95, 0xea, 0xcf, + 0xc8, 0xbc, 0x25, 0xfd, 0x2a, 0x06, 0xf3, 0xc1, 0xf1, 0x08, 0x2d, 0xc1, 0x54, 0x5b, 0xed, 0x2b, + 0x56, 0x9f, 0x9b, 0x9d, 0x40, 0x37, 0x1e, 0xda, 0x6a, 0xbf, 0xda, 0x67, 0x36, 0x27, 0x42, 0xcc, + 0xea, 0x9b, 0x85, 0xe8, 0x52, 0xec, 0xc6, 0x94, 0x4c, 0x1e, 0xd1, 0x21, 0xcc, 0xb4, 0xf4, 0x9a, + 0xda, 0x52, 0x5a, 0xaa, 0x69, 0x29, 0x3c, 0x51, 0x61, 0x1f, 0xd1, 0x73, 0x43, 0x8b, 0xcd, 0x22, + 0x0b, 0xae, 0xb3, 0xfd, 0x24, 0x0e, 0x87, 0xdb, 0x7f, 0x9e, 0xea, 0xd8, 0x51, 0xed, 0xad, 0x46, + 0x87, 0x30, 0x77, 0x7c, 0xf6, 0x91, 0xda, 0xb1, 0xb4, 0x0e, 0x56, 0x86, 0x3e, 0xab, 0x61, 0xeb, + 0x79, 0xa4, 0x99, 0xc7, 0xb8, 0xa9, 0x9e, 0x6a, 0x7a, 0x97, 0xab, 0x9c, 0x75, 0xe4, 0x8f, 0xdc, + 0x6f, 0xcb, 0xdd, 0xa3, 0x84, 0xcf, 0xa8, 0x6d, 0xf7, 0x92, 0x3c, 0xb7, 0x7b, 0x79, 0x05, 0xe6, + 0x3a, 0xb8, 0x6f, 0x79, 0xc6, 0xc8, 0x0c, 0x27, 0x45, 0xf7, 0x02, 0x91, 0x77, 0x6e, 0xff, 0xc4, + 0x86, 0xd0, 0x4d, 0x1a, 0xe2, 0x0d, 0xdd, 0xc4, 0x5d, 0x45, 0xad, 0xd7, 0xbb, 0xd8, 0x34, 0x0b, + 0x69, 0xca, 0x9d, 0xb7, 0xe9, 0x6b, 0x8c, 0x2c, 0x7d, 0xee, 0xdd, 0x2b, 0x7f, 0x48, 0xe7, 0x3b, + 0x21, 0xb8, 0x3b, 0x71, 0x00, 0x73, 0x5c, 0xbe, 0xee, 0xdb, 0x0c, 0x96, 0x5a, 0x5f, 0x1e, 0xfe, + 0xe0, 0x06, 0x37, 0x01, 0xd9, 0xe2, 0x13, 0xec, 0x43, 0xec, 0xe9, 0xf6, 0x01, 0x41, 0x9c, 0xae, + 0x52, 0x9c, 0x39, 0x21, 0xf2, 0xfc, 0x0f, 0xb6, 0x37, 0x24, 0x1e, 0x9a, 0x5a, 0xc3, 0x54, 0x68, + 0x16, 0xa3, 0xe1, 0x7a, 0x21, 0xb3, 0x14, 0xbb, 0x91, 0x96, 0xa7, 0x08, 0xf1, 0x88, 0xd3, 0xa4, + 0x07, 0x30, 0x33, 0x94, 0x54, 0x39, 0x93, 0x17, 0x02, 0x27, 0x1f, 0xf5, 0x4e, 0x5e, 0xfa, 0x99, + 0x00, 0xc5, 0xf0, 0x2c, 0x2a, 0x50, 0xd5, 0x8b, 0x30, 0xe3, 0x4c, 0xd8, 0x99, 0x04, 0x73, 0x0d, + 0xa2, 0xf3, 0xc2, 0x9e, 0x45, 0x98, 0x97, 0xbf, 0x0e, 0xb9, 0x81, 0x1c, 0x8f, 0x6d, 0xd5, 0xf4, + 0xa9, 0xb7, 0x7f, 0xe9, 0x37, 0x31, 0xc7, 0xf5, 0xfa, 0x12, 0xb1, 0x00, 0xf3, 0x7c, 0x0b, 0x66, + 0xeb, 0xb8, 0xa6, 0xd5, 0xbf, 0xab, 0x75, 0xce, 0x70, 0xe9, 0x1f, 0x8c, 0xf3, 0x59, 0x19, 0xe7, + 0x8f, 0xa2, 0x8e, 0x75, 0xba, 0x89, 0x6f, 0xa0, 0x49, 0xbd, 0x4a, 0x66, 0xaf, 0x92, 0x58, 0xc2, + 0xb6, 0xab, 0x30, 0x9c, 0x1e, 0x55, 0xe8, 0x7b, 0xbe, 0xac, 0x9c, 0x1b, 0xed, 0x81, 0xe8, 0xd9, + 0x6b, 0xc5, 0x73, 0x66, 0x1f, 0x3e, 0x00, 0xbb, 0xfb, 0xea, 0xd9, 0xf4, 0x5c, 0xcb, 0x47, 0x45, + 0xf2, 0xc8, 0xb0, 0x30, 0x1c, 0xdd, 0xcb, 0xa7, 0x5a, 0x1d, 0x77, 0x6a, 0x78, 0xc4, 0x76, 0x4b, + 0x65, 0x27, 0xdd, 0x74, 0x12, 0xf7, 0xa1, 0xe4, 0xe5, 0x1a, 0x90, 0xa5, 0x73, 0x97, 0x33, 0x4a, + 0x73, 0x9f, 0xac, 0xa9, 0x35, 0x9c, 0xd5, 0xbc, 0x09, 0xf9, 0x81, 0xe4, 0x7d, 0x20, 0x23, 0x70, + 0x3f, 0xea, 0x3f, 0x66, 0x21, 0x2d, 0x63, 0xd3, 0x20, 0x09, 0x24, 0x5a, 0x87, 0x0c, 0xee, 0xd7, + 0xb0, 0x61, 0xd9, 0x39, 0x77, 0xf0, 0xf9, 0x84, 0x71, 0x97, 0x6d, 0x4e, 0x72, 0xb4, 0x70, 0xc4, + 0xd0, 0x6d, 0x0e, 0xbd, 0x84, 0xa3, 0x28, 0x5c, 0xdc, 0x8b, 0xbd, 0xbc, 0x6a, 0x63, 0x2f, 0xb1, + 0x50, 0x58, 0x81, 0x49, 0x0d, 0x80, 0x2f, 0xb7, 0x39, 0xf8, 0x12, 0x1f, 0xd3, 0x99, 0x0f, 0x7d, + 0x29, 0xf9, 0xd0, 0x97, 0xc4, 0x98, 0x69, 0x86, 0xc0, 0x2f, 0xaf, 0xda, 0xf0, 0x4b, 0x72, 0xcc, + 0x88, 0x07, 0xf0, 0x97, 0x37, 0x3c, 0xf8, 0x4b, 0x3a, 0xf4, 0xe0, 0xc5, 0x44, 0x03, 0x00, 0x98, + 0x7b, 0x0e, 0x00, 0x93, 0x0d, 0x05, 0x6f, 0xb8, 0xf0, 0x20, 0x02, 0xb3, 0x37, 0x84, 0xc0, 0x30, + 0xc4, 0xe4, 0xf9, 0x50, 0x15, 0x63, 0x20, 0x98, 0xbd, 0x21, 0x08, 0x66, 0x7a, 0x8c, 0xc2, 0x31, + 0x18, 0xcc, 0xff, 0x04, 0x63, 0x30, 0xe1, 0x28, 0x09, 0x1f, 0xe6, 0x64, 0x20, 0x8c, 0x12, 0x02, + 0xc2, 0xe4, 0x43, 0x01, 0x03, 0xa6, 0x7e, 0x62, 0x14, 0xe6, 0x30, 0x00, 0x85, 0x61, 0x78, 0xc9, + 0x8d, 0x50, 0xe5, 0x13, 0xc0, 0x30, 0x87, 0x01, 0x30, 0xcc, 0xcc, 0x58, 0xb5, 0x63, 0x71, 0x98, + 0x4d, 0x3f, 0x0e, 0x83, 0x42, 0xd2, 0x64, 0xf7, 0x6b, 0x0f, 0x01, 0x62, 0x8e, 0xc3, 0x80, 0x18, + 0x06, 0x96, 0xbc, 0x14, 0xaa, 0xf1, 0x1c, 0x48, 0xcc, 0xde, 0x10, 0x12, 0x33, 0x37, 0xc6, 0xd2, + 0xc6, 0x40, 0x31, 0x9b, 0x7e, 0x28, 0xe6, 0xc2, 0x98, 0xc9, 0x87, 0x62, 0x31, 0x25, 0x1f, 0x16, + 0x33, 0x3f, 0xc6, 0x95, 0x84, 0x80, 0x31, 0xff, 0xe1, 0x05, 0x63, 0x2e, 0x86, 0xe2, 0x39, 0x7c, + 0x1f, 0xc6, 0xa0, 0x31, 0x29, 0x31, 0xcd, 0x70, 0x98, 0xed, 0x78, 0x1a, 0xc4, 0xac, 0x74, 0x93, + 0xc4, 0xd5, 0x01, 0x87, 0x4d, 0x4e, 0x69, 0xb8, 0xdb, 0xd5, 0xbb, 0x1c, 0x57, 0x61, 0x0d, 0xe9, + 0x06, 0x39, 0x9d, 0xbb, 0xce, 0x79, 0x04, 0x72, 0x43, 0x4f, 0xc3, 0x1e, 0x87, 0x2c, 0xfd, 0x5a, + 0x70, 0x65, 0x69, 0x70, 0xf4, 0x9e, 0xec, 0x33, 0xfc, 0x64, 0xef, 0xc1, 0x73, 0xa2, 0x7e, 0x3c, + 0x67, 0x11, 0xb2, 0xe4, 0x94, 0x3b, 0x00, 0xd5, 0xa8, 0x86, 0x03, 0xd5, 0xdc, 0x82, 0x19, 0x1a, + 0xbc, 0x19, 0xea, 0xc3, 0x03, 0x59, 0x9c, 0x06, 0xb2, 0x3c, 0x79, 0xc1, 0x96, 0x84, 0xa5, 0x41, + 0x2f, 0xc3, 0xac, 0x87, 0xd7, 0x39, 0x3d, 0x33, 0xdc, 0x42, 0x74, 0xb8, 0xd7, 0xf8, 0x31, 0xfa, + 0xb7, 0x82, 0xbb, 0x42, 0x2e, 0xc6, 0x13, 0x04, 0xc7, 0x08, 0xcf, 0x08, 0x8e, 0x89, 0x7e, 0x67, + 0x38, 0xc6, 0x8b, 0x06, 0xc4, 0xfc, 0x68, 0xc0, 0x5f, 0x04, 0x77, 0x4f, 0x1c, 0x70, 0xa5, 0xa6, + 0xd7, 0x31, 0x3f, 0x9f, 0xd3, 0x67, 0x92, 0x0a, 0xb7, 0xf4, 0x06, 0x3f, 0x85, 0x93, 0x47, 0xc2, + 0xe5, 0x44, 0xd0, 0x0c, 0x0f, 0x90, 0xce, 0xd1, 0x9e, 0xe5, 0x97, 0xfc, 0x68, 0x2f, 0x42, 0xec, + 0x09, 0x66, 0xf1, 0x6e, 0x4a, 0x26, 0x8f, 0x84, 0x8f, 0x9a, 0x1d, 0xcf, 0x13, 0x59, 0x03, 0xdd, + 0x85, 0x0c, 0x2d, 0x14, 0x29, 0xba, 0x61, 0xf2, 0x10, 0xe7, 0x4b, 0xa9, 0x59, 0xb5, 0x68, 0x79, + 0x9f, 0xf0, 0xec, 0x19, 0xa6, 0x9c, 0x36, 0xf8, 0x93, 0x27, 0x47, 0xc9, 0xf8, 0x12, 0xdb, 0x2b, + 0x90, 0x21, 0xa3, 0x37, 0x0d, 0xb5, 0x86, 0x69, 0xe1, 0x21, 0x23, 0xbb, 0x04, 0xe9, 0x31, 0xa0, + 0xe1, 0xef, 0x14, 0x55, 0x20, 0x89, 0x4f, 0x71, 0xc7, 0x62, 0x79, 0x7f, 0x76, 0x75, 0x3e, 0x20, + 0x1f, 0xc3, 0x1d, 0x6b, 0xbd, 0x40, 0x16, 0xf9, 0xdb, 0xaf, 0x16, 0x45, 0xc6, 0xfd, 0x92, 0xde, + 0xd6, 0x2c, 0xdc, 0x36, 0xac, 0x33, 0x99, 0xcb, 0x4b, 0x5f, 0x08, 0x24, 0x9b, 0xf2, 0x45, 0xe4, + 0xc0, 0xb5, 0xb5, 0x4d, 0x3e, 0xea, 0x01, 0xb3, 0xae, 0x02, 0x34, 0x54, 0x53, 0xf9, 0x50, 0xed, + 0x58, 0xb8, 0xce, 0x97, 0x33, 0xd3, 0x50, 0xcd, 0xb7, 0x29, 0xc1, 0x3f, 0xb1, 0xf4, 0xc0, 0xc4, + 0x3c, 0xa8, 0x49, 0xc6, 0x8b, 0x9a, 0xa0, 0x22, 0xa4, 0x8d, 0xae, 0xa6, 0x77, 0x35, 0xeb, 0x8c, + 0xae, 0x46, 0x4c, 0x76, 0xda, 0xdb, 0xf1, 0x74, 0x4c, 0x8c, 0x6f, 0xc7, 0xd3, 0x71, 0x31, 0xe1, + 0x40, 0xb3, 0xcc, 0x25, 0x64, 0xc5, 0x29, 0xe9, 0xe3, 0xa8, 0x6b, 0xeb, 0x6e, 0x82, 0x39, 0xe9, + 0x64, 0x26, 0x33, 0x9e, 0x85, 0x80, 0x29, 0x7b, 0x28, 0x64, 0xf4, 0xa4, 0xd5, 0x33, 0x71, 0x9d, + 0x83, 0x84, 0x4e, 0xdb, 0xb3, 0x69, 0xa9, 0xa7, 0xdb, 0xb4, 0xd1, 0x2b, 0x2b, 0xfd, 0x98, 0xc2, + 0xba, 0x7e, 0x87, 0x8a, 0x0e, 0xbc, 0x67, 0xd5, 0x1e, 0xfd, 0x04, 0x6d, 0xe3, 0x99, 0xf4, 0x5b, + 0x75, 0xcf, 0xb4, 0x8c, 0x6c, 0xa2, 0xff, 0x84, 0x8b, 0x03, 0x7e, 0xc4, 0x51, 0x1d, 0x0d, 0xc9, + 0xfe, 0x06, 0xbd, 0xc9, 0x05, 0xbf, 0x37, 0xb1, 0x35, 0xbb, 0x6b, 0x15, 0x7b, 0x4a, 0x03, 0xbf, + 0x03, 0x39, 0x7f, 0xd2, 0x48, 0x8e, 0x6c, 0x5d, 0x6c, 0xa9, 0x5a, 0x47, 0xf1, 0x1d, 0xc8, 0xa7, + 0x18, 0x91, 0x83, 0xb9, 0xfb, 0x70, 0x21, 0x30, 0x51, 0x44, 0xaf, 0x41, 0xc6, 0xcd, 0x31, 0x85, + 0x90, 0xd3, 0x90, 0x83, 0x75, 0xba, 0xbc, 0xd2, 0xe7, 0x82, 0xab, 0xd2, 0x8f, 0x9e, 0x96, 0x21, + 0xd9, 0xc5, 0x66, 0xaf, 0xc5, 0x4e, 0x2f, 0xb9, 0xd5, 0x97, 0x27, 0x4b, 0x31, 0x09, 0xb5, 0xd7, + 0xb2, 0x64, 0x2e, 0x2c, 0x3d, 0x86, 0x24, 0xa3, 0xa0, 0x2c, 0xa4, 0x0e, 0x77, 0x1f, 0xee, 0xee, + 0xbd, 0xbd, 0x2b, 0x46, 0x10, 0x40, 0x72, 0xad, 0x54, 0x2a, 0xef, 0x57, 0x45, 0x01, 0x65, 0x20, + 0xb1, 0xb6, 0xbe, 0x27, 0x57, 0xc5, 0x28, 0x21, 0xcb, 0xe5, 0xed, 0x72, 0xa9, 0x2a, 0xc6, 0xd0, + 0x0c, 0x4c, 0xb3, 0x67, 0x65, 0x73, 0x4f, 0x7e, 0xb4, 0x56, 0x15, 0xe3, 0x1e, 0xd2, 0x41, 0x79, + 0x77, 0xa3, 0x2c, 0x8b, 0x09, 0xe9, 0x5f, 0xe0, 0x52, 0x68, 0x52, 0xea, 0x42, 0xa3, 0x82, 0x07, + 0x1a, 0x95, 0x7e, 0x1a, 0x85, 0x62, 0x78, 0xa6, 0x89, 0xb6, 0x07, 0x26, 0xbe, 0x7a, 0x8e, 0x34, + 0x75, 0x60, 0xf6, 0xe8, 0x3a, 0xe4, 0xba, 0xf8, 0x04, 0x5b, 0xb5, 0x26, 0xcb, 0x7c, 0x59, 0x24, + 0x9a, 0x96, 0xa7, 0x39, 0x95, 0x0a, 0x99, 0x8c, 0xed, 0x7d, 0x5c, 0xb3, 0x14, 0xe6, 0x6f, 0x98, + 0x81, 0x65, 0x08, 0x1b, 0xa1, 0x1e, 0x30, 0xa2, 0xf4, 0xde, 0xb9, 0xd6, 0x32, 0x03, 0x09, 0xb9, + 0x5c, 0x95, 0xdf, 0x11, 0x63, 0x08, 0x41, 0x8e, 0x3e, 0x2a, 0x07, 0xbb, 0x6b, 0xfb, 0x07, 0x95, + 0x3d, 0xb2, 0x96, 0xb3, 0x90, 0xb7, 0xd7, 0xd2, 0x26, 0x26, 0xa4, 0xdf, 0x47, 0xe1, 0x62, 0x48, + 0x9e, 0x8c, 0xee, 0x02, 0x58, 0x7d, 0xa5, 0x8b, 0x6b, 0x7a, 0xb7, 0x1e, 0x6e, 0x64, 0xd5, 0xbe, + 0x4c, 0x39, 0xe4, 0x8c, 0xc5, 0x9f, 0xcc, 0x11, 0x88, 0x3a, 0x7a, 0x9d, 0x2b, 0x25, 0xb3, 0xb2, + 0x3f, 0xab, 0xab, 0x01, 0xc0, 0x31, 0xae, 0x11, 0xc5, 0x74, 0x6d, 0xa9, 0x62, 0xca, 0x8f, 0x1e, + 0x05, 0xf9, 0x8f, 0x09, 0x4b, 0x2f, 0x01, 0x9e, 0xe3, 0x9d, 0x70, 0xcf, 0x91, 0x98, 0x34, 0x11, + 0x09, 0x76, 0x1d, 0xd2, 0xcf, 0x63, 0xde, 0x85, 0xf5, 0x1f, 0x0b, 0xf6, 0x20, 0x69, 0x5a, 0xaa, + 0xd5, 0x33, 0xb9, 0xc1, 0xbd, 0x36, 0xe9, 0x19, 0x63, 0xd9, 0x7e, 0x38, 0xa0, 0xe2, 0x32, 0x57, + 0xf3, 0xc3, 0x7a, 0x53, 0x07, 0xeb, 0x5f, 0x9c, 0xf0, 0x4f, 0xc6, 0xf5, 0x39, 0x51, 0xe9, 0xbe, + 0x9b, 0xd8, 0x78, 0x10, 0xdb, 0x61, 0x34, 0x54, 0x08, 0x42, 0x43, 0x7f, 0x21, 0xc0, 0xe5, 0x11, + 0x27, 0x2d, 0xf4, 0xd6, 0xc0, 0x3e, 0xdf, 0x3b, 0xcf, 0x39, 0x6d, 0x99, 0xd1, 0xfc, 0x3b, 0x2d, + 0xdd, 0x86, 0x29, 0x2f, 0x7d, 0xb2, 0x49, 0x7e, 0x1b, 0x75, 0x7d, 0xbe, 0x1f, 0xb6, 0x7d, 0x66, + 0x19, 0xdc, 0x80, 0x9d, 0x45, 0xcf, 0x69, 0x67, 0x81, 0x79, 0x41, 0xec, 0x29, 0xf3, 0x82, 0x11, + 0xd6, 0x16, 0x7f, 0x3a, 0x6b, 0xf3, 0x7d, 0x70, 0x09, 0xff, 0x21, 0xe1, 0x1d, 0x00, 0x0f, 0x80, + 0x39, 0x07, 0x89, 0xae, 0xde, 0xeb, 0xd4, 0xa9, 0x05, 0x24, 0x64, 0xd6, 0x40, 0x77, 0x20, 0x41, + 0x2c, 0xc9, 0x5e, 0xa7, 0x61, 0xa7, 0x4a, 0x2c, 0xc1, 0x03, 0x8b, 0x32, 0x6e, 0xe9, 0x5d, 0xc8, + 0xf9, 0x51, 0xd3, 0x67, 0xab, 0x5e, 0x03, 0x34, 0x5c, 0xb0, 0x0b, 0xe9, 0xe2, 0x0d, 0x7f, 0x17, + 0xd7, 0x42, 0x4b, 0x7f, 0xc1, 0x5d, 0x7d, 0x04, 0x09, 0x6a, 0x58, 0x24, 0xbb, 0xa5, 0x55, 0x62, + 0x7e, 0x86, 0x25, 0xcf, 0xe8, 0x5d, 0x00, 0xd5, 0xb2, 0xba, 0xda, 0x71, 0xcf, 0xed, 0x60, 0x31, + 0xd8, 0x30, 0xd7, 0x6c, 0xbe, 0xf5, 0x2b, 0xdc, 0x42, 0xe7, 0x5c, 0x51, 0x8f, 0x95, 0x7a, 0x14, + 0x4a, 0xbb, 0x90, 0xf3, 0xcb, 0xda, 0xa7, 0x2e, 0x21, 0xe0, 0xd4, 0x15, 0xf5, 0x9e, 0xba, 0x9c, + 0x33, 0x5b, 0x8c, 0x95, 0xc2, 0x69, 0x43, 0xfa, 0xab, 0x00, 0x53, 0x5e, 0xbb, 0x7e, 0xc6, 0xb9, + 0xfe, 0x98, 0xe3, 0xcd, 0xa5, 0xa1, 0x54, 0x3f, 0xd5, 0x50, 0xcd, 0xc3, 0xef, 0x33, 0xd3, 0xff, + 0x58, 0x80, 0xb4, 0x33, 0xf9, 0x10, 0x0c, 0xdc, 0x5d, 0xbb, 0xa8, 0xb7, 0x94, 0xcd, 0x70, 0xf7, + 0x98, 0x83, 0xbb, 0xdf, 0x77, 0x52, 0xb1, 0x30, 0xb4, 0xd9, 0xbb, 0xd2, 0x76, 0xf5, 0x81, 0x67, + 0x9e, 0x3f, 0xe1, 0xe3, 0x20, 0x39, 0x08, 0xfa, 0x37, 0x48, 0xaa, 0x35, 0x07, 0x63, 0xcf, 0x05, + 0x20, 0x46, 0x36, 0xeb, 0x72, 0xb5, 0xbf, 0x46, 0x39, 0x65, 0x2e, 0xc1, 0x47, 0x15, 0xb5, 0x47, + 0x25, 0x3d, 0x20, 0x7a, 0x19, 0x8f, 0xdf, 0xe1, 0xe6, 0x00, 0x0e, 0x77, 0x1f, 0xed, 0x6d, 0x6c, + 0x6d, 0x6e, 0x95, 0x37, 0x78, 0x32, 0xb6, 0xb1, 0x51, 0xde, 0x10, 0xa3, 0x84, 0x4f, 0x2e, 0x3f, + 0xda, 0x3b, 0x2a, 0x6f, 0x88, 0x31, 0xa9, 0x04, 0x59, 0xea, 0x6f, 0x39, 0x54, 0x71, 0x19, 0x32, + 0x6d, 0xd5, 0x5f, 0x74, 0x4f, 0xb7, 0x55, 0x5e, 0x72, 0xbf, 0x08, 0x29, 0xf2, 0xb2, 0xa1, 0x9a, + 0x76, 0x69, 0xb0, 0xad, 0xf6, 0xdf, 0x54, 0x4d, 0xe9, 0x6f, 0x02, 0xe4, 0x07, 0xdc, 0x13, 0x5a, + 0x85, 0x04, 0x83, 0xb4, 0xc2, 0x2e, 0x61, 0x7a, 0xba, 0x95, 0x19, 0x2b, 0x7a, 0x1d, 0xd2, 0x98, + 0x97, 0x49, 0x82, 0xce, 0x47, 0xcc, 0x0f, 0xda, 0x85, 0x14, 0x2e, 0xea, 0x48, 0xa0, 0x07, 0x90, + 0x71, 0x1c, 0x6d, 0xf8, 0xe5, 0x19, 0xc7, 0x45, 0x73, 0x79, 0x57, 0x06, 0xdd, 0x73, 0x11, 0xaa, + 0xf8, 0x30, 0xbc, 0xce, 0xc5, 0x19, 0x03, 0x17, 0xb6, 0xf9, 0xa5, 0xfb, 0x90, 0x71, 0x14, 0xa3, + 0x02, 0xa4, 0xec, 0xa2, 0x98, 0xc0, 0x3d, 0x30, 0x2f, 0x86, 0xcd, 0x41, 0xc2, 0xd0, 0x3f, 0xe4, + 0x17, 0x21, 0x62, 0x32, 0x6b, 0x48, 0x75, 0xc8, 0x0f, 0x04, 0x0e, 0x74, 0x1f, 0x52, 0x46, 0xef, + 0x58, 0xb1, 0xbf, 0xfd, 0x81, 0xf5, 0xb3, 0x31, 0x94, 0xde, 0x71, 0x4b, 0xab, 0x3d, 0xc4, 0x67, + 0xb6, 0xb5, 0x19, 0xbd, 0xe3, 0x87, 0xcc, 0x45, 0xb0, 0x5e, 0xa2, 0xde, 0x5e, 0x4e, 0x21, 0x6d, + 0x7b, 0x3c, 0xf4, 0xef, 0xde, 0xa5, 0xb2, 0x2f, 0x32, 0x85, 0x06, 0x33, 0xae, 0xde, 0xb3, 0x52, + 0xb7, 0x60, 0xc6, 0xd4, 0x1a, 0x1d, 0xbb, 0x80, 0xca, 0x36, 0x9a, 0x55, 0xa2, 0xf2, 0xec, 0xc5, + 0x8e, 0x0d, 0xb4, 0x91, 0x54, 0x44, 0x1c, 0x74, 0xb9, 0xdf, 0xe7, 0x00, 0x02, 0x52, 0xa6, 0x58, + 0x50, 0xca, 0xf4, 0xff, 0x51, 0xc8, 0x7a, 0xca, 0xb2, 0xe8, 0x5f, 0x3d, 0xfe, 0x3f, 0x17, 0x10, + 0xeb, 0x3d, 0xbc, 0xee, 0x4d, 0x21, 0xff, 0xc4, 0xa2, 0xe7, 0x9f, 0x58, 0x58, 0x15, 0xdc, 0xae, + 0xee, 0xc6, 0xcf, 0x5d, 0xdd, 0x7d, 0x09, 0x90, 0xa5, 0x5b, 0x6a, 0x4b, 0x39, 0xd5, 0x2d, 0xad, + 0xd3, 0x50, 0x98, 0x69, 0x30, 0x6f, 0x2d, 0xd2, 0x37, 0x47, 0xf4, 0xc5, 0x3e, 0xb5, 0x92, 0xff, + 0x8d, 0x42, 0xda, 0xfe, 0xc2, 0xfe, 0x49, 0x97, 0xe0, 0xff, 0x04, 0x48, 0x3b, 0xd0, 0xc3, 0x79, + 0xaf, 0x52, 0xcd, 0x43, 0x92, 0x9f, 0xae, 0xd9, 0x5d, 0x2a, 0xde, 0x0a, 0xac, 0xe4, 0x17, 0x21, + 0xdd, 0xc6, 0x96, 0x4a, 0xa3, 0x2f, 0x4b, 0xd5, 0x9c, 0xf6, 0xad, 0x7b, 0x90, 0xf5, 0x5c, 0x43, + 0x23, 0x01, 0x79, 0xb7, 0xfc, 0xb6, 0x18, 0x29, 0xa6, 0x3e, 0xf9, 0x6c, 0x29, 0xb6, 0x8b, 0x3f, + 0x24, 0x4e, 0x46, 0x2e, 0x97, 0x2a, 0xe5, 0xd2, 0x43, 0x51, 0x28, 0x66, 0x3f, 0xf9, 0x6c, 0x29, + 0x25, 0x63, 0x5a, 0x26, 0xbc, 0xf5, 0x10, 0xf2, 0x03, 0x1b, 0xe3, 0x0f, 0x0d, 0x08, 0x72, 0x1b, + 0x87, 0xfb, 0x3b, 0x5b, 0xa5, 0xb5, 0x6a, 0x59, 0x39, 0xda, 0xab, 0x96, 0x45, 0x01, 0x5d, 0x84, + 0xd9, 0x9d, 0xad, 0x37, 0x2b, 0x55, 0xa5, 0xb4, 0xb3, 0x55, 0xde, 0xad, 0x2a, 0x6b, 0xd5, 0xea, + 0x5a, 0xe9, 0xa1, 0x18, 0x5d, 0xfd, 0x65, 0x16, 0xf2, 0x6b, 0xeb, 0xa5, 0xad, 0x35, 0xc3, 0x68, + 0x69, 0x35, 0x95, 0x06, 0x9a, 0x12, 0xc4, 0x69, 0x85, 0x60, 0xe4, 0xc5, 0xfa, 0xe2, 0xe8, 0xda, + 0x2f, 0xda, 0x84, 0x04, 0x2d, 0x1e, 0xa0, 0xd1, 0x37, 0xed, 0x8b, 0x63, 0x8a, 0xc1, 0x64, 0x30, + 0xd4, 0xa3, 0x8c, 0xbc, 0x7a, 0x5f, 0x1c, 0x5d, 0x1b, 0x46, 0x3b, 0x90, 0xb2, 0xb1, 0xdd, 0x71, + 0xf7, 0xe1, 0x8b, 0x63, 0x0b, 0xb6, 0x64, 0x6a, 0x0c, 0x83, 0x1f, 0x7d, 0x2b, 0xbf, 0x38, 0xa6, + 0x6a, 0x8c, 0xb6, 0x20, 0xc9, 0x11, 0xb9, 0x31, 0x17, 0xed, 0x8b, 0xe3, 0xea, 0xc0, 0x48, 0x86, + 0x8c, 0x5b, 0xdd, 0x18, 0xff, 0xaf, 0x41, 0x71, 0x82, 0x82, 0x38, 0x7a, 0x0c, 0xd3, 0x7e, 0xe4, + 0x6f, 0xb2, 0xcb, 0xfc, 0xc5, 0x09, 0x2b, 0xce, 0x44, 0xbf, 0x1f, 0x06, 0x9c, 0xec, 0x72, 0x7f, + 0x71, 0xc2, 0x02, 0x34, 0x7a, 0x1f, 0x66, 0x86, 0x61, 0xba, 0xc9, 0xef, 0xfa, 0x17, 0xcf, 0x51, + 0x92, 0x46, 0x6d, 0x40, 0x01, 0xf0, 0xde, 0x39, 0xae, 0xfe, 0x17, 0xcf, 0x53, 0xa1, 0x46, 0x75, + 0xc8, 0x0f, 0x42, 0x66, 0x93, 0xfe, 0x0a, 0x50, 0x9c, 0xb8, 0x5a, 0xcd, 0x7a, 0xf1, 0xe3, 0x47, + 0x93, 0xfe, 0x1a, 0x50, 0x9c, 0xb8, 0x78, 0x8d, 0x0e, 0x01, 0x3c, 0xf8, 0xc7, 0x04, 0xbf, 0x0a, + 0x14, 0x27, 0x29, 0x63, 0x23, 0x03, 0x66, 0x83, 0x80, 0x91, 0xf3, 0xfc, 0x39, 0x50, 0x3c, 0x57, + 0x75, 0x9b, 0xd8, 0xb3, 0x1f, 0xe2, 0x98, 0xec, 0x4f, 0x82, 0xe2, 0x84, 0x65, 0xee, 0xf5, 0xf2, + 0x17, 0x5f, 0x2f, 0x08, 0x5f, 0x7e, 0xbd, 0x20, 0xfc, 0xf9, 0xeb, 0x05, 0xe1, 0xd3, 0x6f, 0x16, + 0x22, 0x5f, 0x7e, 0xb3, 0x10, 0xf9, 0xc3, 0x37, 0x0b, 0x91, 0xff, 0x7a, 0xb1, 0xa1, 0x59, 0xcd, + 0xde, 0xf1, 0x72, 0x4d, 0x6f, 0xaf, 0x78, 0xff, 0xbd, 0x0a, 0xfa, 0x21, 0xec, 0x38, 0x49, 0x03, + 0xea, 0xed, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0x51, 0xd2, 0xc4, 0xf3, 0x30, 0x36, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -18364,7 +18362,7 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -18374,29 +18372,31 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = string(dAtA[iNdEx:postIndex]) + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -18406,23 +18406,25 @@ func (m *EventAttribute) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } iNdEx = postIndex case 3: if wireType != 0 { diff --git a/internal/eventbus/event_bus.go b/internal/eventbus/event_bus.go index 697454dbd..16aa33150 100644 --- a/internal/eventbus/event_bus.go +++ b/internal/eventbus/event_bus.go @@ -72,8 +72,8 @@ func (b *EventBus) Publish(eventValue string, eventData types.EventData) error { Type: tokens[0], Attributes: []abci.EventAttribute{ { - Key: tokens[1], - Value: eventValue, + Key: []byte(tokens[1]), + Value: []byte(eventValue), }, }, } @@ -137,8 +137,8 @@ func (b *EventBus) PublishEventTx(data types.EventDataTx) error { Type: tokens[0], Attributes: []abci.EventAttribute{ { - Key: tokens[1], - Value: fmt.Sprintf("%X", types.Tx(data.Tx).Hash()), + Key: []byte(tokens[1]), + Value: []byte(fmt.Sprintf("%X", types.Tx(data.Tx).Hash())), }, }, }) @@ -148,8 +148,8 @@ func (b *EventBus) PublishEventTx(data types.EventDataTx) error { Type: tokens[0], Attributes: []abci.EventAttribute{ { - Key: tokens[1], - Value: fmt.Sprintf("%d", data.Height), + Key: []byte(tokens[1]), + Value: []byte(fmt.Sprintf("%d", data.Height)), }, }, }) diff --git a/internal/eventbus/event_bus_test.go b/internal/eventbus/event_bus_test.go index 6fd8a2d72..2ed396814 100644 --- a/internal/eventbus/event_bus_test.go +++ b/internal/eventbus/event_bus_test.go @@ -30,7 +30,7 @@ func TestEventBusPublishEventTx(t *testing.T) { result := abci.ExecTxResult{ Data: []byte("bar"), Events: []abci.Event{ - {Type: "testType", Attributes: []abci.EventAttribute{{Key: "baz", Value: "1"}}}, + {Type: "testType", Attributes: []abci.EventAttribute{{Key:[]byte( "baz"), Value: []byte("1")}}}, }, } @@ -86,8 +86,8 @@ func TestEventBusPublishEventNewBlock(t *testing.T) { resultFinalizeBlock := abci.ResponseFinalizeBlock{ Events: []abci.Event{ {Type: "testType", Attributes: []abci.EventAttribute{ - {Key: "baz", Value: "1"}, - {Key: "foz", Value: "2"}, + {Key: []byte("baz"), Value: []byte("1")}, + {Key: []byte("foz"), Value: []byte("2")}, }}, }, } @@ -140,25 +140,25 @@ func TestEventBusPublishEventTxDuplicateKeys(t *testing.T) { { Type: "transfer", Attributes: []abci.EventAttribute{ - {Key: "sender", Value: "foo"}, - {Key: "recipient", Value: "bar"}, - {Key: "amount", Value: "5"}, + {Key: []byte("sender"), Value: []byte("foo")}, + {Key: []byte("recipient"), Value: []byte("bar")}, + {Key: []byte("amount"), Value: []byte("5")}, }, }, { Type: "transfer", Attributes: []abci.EventAttribute{ - {Key: "sender", Value: "baz"}, - {Key: "recipient", Value: "cat"}, - {Key: "amount", Value: "13"}, + {Key: []byte("sender"), Value: []byte("baz")}, + {Key: []byte("recipient"), Value: []byte("cat")}, + {Key: []byte("amount"), Value: []byte("13")}, }, }, { Type: "withdraw.rewards", Attributes: []abci.EventAttribute{ - {Key: "address", Value: "bar"}, - {Key: "source", Value: "iceman"}, - {Key: "amount", Value: "33"}, + {Key: []byte("address"), Value: []byte("bar")}, + {Key: []byte("source"), Value: []byte("iceman")}, + {Key: []byte("amount"), Value: []byte("33")}, }, }, }, @@ -255,8 +255,8 @@ func TestEventBusPublishEventNewBlockHeader(t *testing.T) { resultFinalizeBlock := abci.ResponseFinalizeBlock{ Events: []abci.Event{ {Type: "testType", Attributes: []abci.EventAttribute{ - {Key: "baz", Value: "1"}, - {Key: "foz", Value: "2"}, + {Key: []byte("baz"), Value: []byte("1")}, + {Key: []byte("foz"), Value: []byte("2")}, }}, }, } diff --git a/internal/eventlog/item.go b/internal/eventlog/item.go index f1f43b46d..59d9dffa7 100644 --- a/internal/eventlog/item.go +++ b/internal/eventlog/item.go @@ -52,7 +52,7 @@ func makeEvents(etype string, data types.EventData) []abci.Event { base := []abci.Event{{ Type: tmTypeTag, Attributes: []abci.EventAttribute{{ - Key: tmTypeKey, Value: etype, + Key: []byte(tmTypeKey), Value: []byte(etype), }}, }} if evt, ok := data.(ABCIEventer); ok { @@ -69,8 +69,8 @@ func FindType(events []abci.Event) (string, bool) { continue } for _, attr := range evt.Attributes { - if attr.Key == tmTypeKey { - return attr.Value, true + if string(attr.Key) == tmTypeKey { + return string(attr.Value), true } } } diff --git a/internal/pubsub/example_test.go b/internal/pubsub/example_test.go index c4b5dc5c9..c74f13903 100644 --- a/internal/pubsub/example_test.go +++ b/internal/pubsub/example_test.go @@ -26,7 +26,7 @@ func TestExample(t *testing.T) { events := []abci.Event{ { Type: "abci.account", - Attributes: []abci.EventAttribute{{Key: "name", Value: "John"}}, + Attributes: []abci.EventAttribute{{Key: []byte("name"), Value: []byte("John")}}, }, } require.NoError(t, s.PublishWithEvents(pubstring("Tombstone"), events)) diff --git a/internal/pubsub/pubsub_test.go b/internal/pubsub/pubsub_test.go index e366977b5..6e916b3e9 100644 --- a/internal/pubsub/pubsub_test.go +++ b/internal/pubsub/pubsub_test.go @@ -173,7 +173,7 @@ func TestDifferentClients(t *testing.T) { events := []abci.Event{{ Type: "tm.events", - Attributes: []abci.EventAttribute{{Key: "type", Value: "NewBlock"}}, + Attributes: []abci.EventAttribute{{Key: []byte("type"), Value: []byte("NewBlock")}}, }} require.NoError(t, s.PublishWithEvents(pubstring("Iceman"), events)) @@ -187,11 +187,11 @@ func TestDifferentClients(t *testing.T) { events = []abci.Event{ { Type: "tm.events", - Attributes: []abci.EventAttribute{{Key: "type", Value: "NewBlock"}}, + Attributes: []abci.EventAttribute{{Key: []byte("type"), Value: []byte("NewBlock")}}, }, { Type: "abci.account", - Attributes: []abci.EventAttribute{{Key: "name", Value: "Igor"}}, + Attributes: []abci.EventAttribute{{Key: []byte("name"), Value: []byte("Igor")}}, }, } @@ -207,7 +207,7 @@ func TestDifferentClients(t *testing.T) { events = []abci.Event{{ Type: "tm.events", - Attributes: []abci.EventAttribute{{Key: "type", Value: "NewRoundStep"}}, + Attributes: []abci.EventAttribute{{Key: []byte("type"), Value: []byte("NewRoundStep")}}, }} require.NoError(t, s.PublishWithEvents(pubstring("Valeria Richards"), events)) @@ -244,17 +244,17 @@ func TestSubscribeDuplicateKeys(t *testing.T) { { Type: "transfer", Attributes: []abci.EventAttribute{ - {Key: "sender", Value: "foo"}, - {Key: "sender", Value: "bar"}, - {Key: "sender", Value: "baz"}, + {Key: []byte("sender"), Value: []byte("foo")}, + {Key: []byte("sender"), Value: []byte("bar")}, + {Key: []byte("sender"), Value: []byte("baz")}, }, }, { Type: "withdraw", Attributes: []abci.EventAttribute{ - {Key: "rewards", Value: "1"}, - {Key: "rewards", Value: "17"}, - {Key: "rewards", Value: "22"}, + {Key: []byte("rewards"), Value: []byte("1")}, + {Key: []byte("rewards"), Value: []byte("17")}, + {Key: []byte("rewards"), Value: []byte("22")}, }, }, } @@ -280,7 +280,7 @@ func TestClientSubscribesTwice(t *testing.T) { q := query.MustCompile(`tm.events.type='NewBlock'`) events := []abci.Event{{ Type: "tm.events", - Attributes: []abci.EventAttribute{{Key: "type", Value: "NewBlock"}}, + Attributes: []abci.EventAttribute{{Key: []byte("type"), Value: []byte("NewBlock")}}, }} sub1 := newTestSub(t).must(s.SubscribeWithArgs(ctx, pubsub.SubscribeArgs{ diff --git a/internal/pubsub/query/bench_test.go b/internal/pubsub/query/bench_test.go index 0916e9c8a..4307be4dd 100644 --- a/internal/pubsub/query/bench_test.go +++ b/internal/pubsub/query/bench_test.go @@ -13,21 +13,21 @@ var testEvents = []types.Event{ { Type: "tm.events", Attributes: []types.EventAttribute{{ - Key: "index", - Value: "25", + Key: []byte("index"), + Value: []byte("25"), }, { - Key: "type", - Value: "NewBlock", + Key: []byte("type"), + Value: []byte("NewBlock"), }}, }, { Type: "abci.account", Attributes: []types.EventAttribute{{ - Key: "name", - Value: "Anya", + Key: []byte("name"), + Value: []byte("Anya"), }, { - Key: "name", - Value: "Igor", + Key: []byte("name"), + Value: []byte("Igor"), }}, }, } diff --git a/internal/pubsub/query/query.go b/internal/pubsub/query/query.go index 23510a75d..3fa3b6298 100644 --- a/internal/pubsub/query/query.go +++ b/internal/pubsub/query/query.go @@ -116,9 +116,9 @@ func (c condition) findAttr(event types.Event) ([]string, bool) { } var vals []string for _, attr := range event.Attributes { - fullName := event.Type + "." + attr.Key + fullName := event.Type + "." + string(attr.Key) if fullName == c.tag { - vals = append(vals, attr.Value) + vals = append(vals, string(attr.Value)) } } return vals, false diff --git a/internal/pubsub/query/query_test.go b/internal/pubsub/query/query_test.go index fc5fd82f0..b8c86a96a 100644 --- a/internal/pubsub/query/query_test.go +++ b/internal/pubsub/query/query_test.go @@ -24,35 +24,35 @@ var apiEvents = []types.Event{ { Type: "tm", Attributes: []types.EventAttribute{ - {Key: "event", Value: "Tx"}, - {Key: "hash", Value: "XYZ"}, - {Key: "height", Value: "5"}, + {Key: []byte("event"), Value: []byte("Tx")}, + {Key: []byte("hash"), Value: []byte("XYZ")}, + {Key: []byte("height"), Value: []byte("5")}, }, }, { Type: "rewards.withdraw", Attributes: []types.EventAttribute{ - {Key: "address", Value: "AddrA"}, - {Key: "source", Value: "SrcX"}, - {Key: "amount", Value: "100"}, - {Key: "balance", Value: "1500"}, + {Key: []byte("address"), Value: []byte("AddrA")}, + {Key: []byte("source"), Value: []byte("SrcX")}, + {Key: []byte("amount"), Value: []byte("100")}, + {Key: []byte("balance"), Value: []byte("1500")}, }, }, { Type: "rewards.withdraw", Attributes: []types.EventAttribute{ - {Key: "address", Value: "AddrB"}, - {Key: "source", Value: "SrcY"}, - {Key: "amount", Value: "45"}, - {Key: "balance", Value: "999"}, + {Key: []byte("address"), Value: []byte("AddrB")}, + {Key: []byte("source"), Value: []byte("SrcY")}, + {Key: []byte("amount"), Value: []byte("45")}, + {Key: []byte("balance"), Value: []byte("999")}, }, }, { Type: "transfer", Attributes: []types.EventAttribute{ - {Key: "sender", Value: "AddrC"}, - {Key: "recipient", Value: "AddrD"}, - {Key: "amount", Value: "160"}, + {Key: []byte("sender"), Value: []byte("AddrC")}, + {Key: []byte("recipient"), Value: []byte("AddrD")}, + {Key: []byte("amount"), Value: []byte("160")}, }, }, } @@ -242,8 +242,8 @@ func newTestEvent(s string) types.Event { for _, kv := range parts[1:] { key, val := splitKV(kv) event.Attributes = append(event.Attributes, types.EventAttribute{ - Key: key, - Value: val, + Key: []byte(key), + Value: []byte(val), }) } return event diff --git a/internal/state/indexer/block/kv/kv.go b/internal/state/indexer/block/kv/kv.go index 1b9a3120b..838e3aca5 100644 --- a/internal/state/indexer/block/kv/kv.go +++ b/internal/state/indexer/block/kv/kv.go @@ -463,13 +463,13 @@ func (idx *BlockerIndexer) indexEvents(batch dbm.Batch, events []abci.Event, typ } // index iff the event specified index:true and it's not a reserved event - compositeKey := fmt.Sprintf("%s.%s", event.Type, attr.Key) + compositeKey := fmt.Sprintf("%s.%s", event.Type, string(attr.Key)) if compositeKey == types.BlockHeightKey { return fmt.Errorf("event type and attribute key \"%s\" is reserved; please use a different key", compositeKey) } if attr.GetIndex() { - key, err := eventKey(compositeKey, typ, attr.Value, height) + key, err := eventKey(compositeKey, typ, string(attr.Value), height) if err != nil { return fmt.Errorf("failed to create block index key: %w", err) } diff --git a/internal/state/indexer/block/kv/kv_test.go b/internal/state/indexer/block/kv/kv_test.go index 0bca43848..a3e68f57d 100644 --- a/internal/state/indexer/block/kv/kv_test.go +++ b/internal/state/indexer/block/kv/kv_test.go @@ -26,8 +26,8 @@ func TestBlockIndexer(t *testing.T) { Type: "finalize_event1", Attributes: []abci.EventAttribute{ { - Key: "proposer", - Value: "FCAA001", + Key: []byte("proposer"), + Value: []byte("FCAA001"), Index: true, }, }, @@ -36,8 +36,8 @@ func TestBlockIndexer(t *testing.T) { Type: "finalize_event2", Attributes: []abci.EventAttribute{ { - Key: "foo", - Value: "100", + Key: []byte("foo"), + Value: []byte("100"), Index: true, }, }, @@ -59,8 +59,8 @@ func TestBlockIndexer(t *testing.T) { Type: "finalize_event1", Attributes: []abci.EventAttribute{ { - Key: "proposer", - Value: "FCAA001", + Key: []byte("proposer"), + Value: []byte("FCAA001"), Index: true, }, }, @@ -69,8 +69,8 @@ func TestBlockIndexer(t *testing.T) { Type: "finalize_event2", Attributes: []abci.EventAttribute{ { - Key: "foo", - Value: fmt.Sprintf("%d", i), + Key: []byte("foo"), + Value: []byte(fmt.Sprintf("%d", i)), Index: index, }, }, diff --git a/internal/state/indexer/sink/kv/kv_test.go b/internal/state/indexer/sink/kv/kv_test.go index d4b110f4a..811b4c195 100644 --- a/internal/state/indexer/sink/kv/kv_test.go +++ b/internal/state/indexer/sink/kv/kv_test.go @@ -40,8 +40,8 @@ func TestBlockFuncs(t *testing.T) { Type: "finalize_eventA", Attributes: []abci.EventAttribute{ { - Key: "proposer", - Value: "FCAA001", + Key: []byte("proposer"), + Value: []byte("FCAA001"), Index: true, }, }, @@ -50,8 +50,8 @@ func TestBlockFuncs(t *testing.T) { Type: "finalize_eventB", Attributes: []abci.EventAttribute{ { - Key: "foo", - Value: "100", + Key: []byte("foo"), + Value: []byte("100"), Index: true, }, }, @@ -78,8 +78,8 @@ func TestBlockFuncs(t *testing.T) { Type: "finalize_eventA", Attributes: []abci.EventAttribute{ { - Key: "proposer", - Value: "FCAA001", + Key: []byte("proposer"), + Value: []byte("FCAA001"), Index: true, }, }, @@ -88,8 +88,8 @@ func TestBlockFuncs(t *testing.T) { Type: "finalize_eventB", Attributes: []abci.EventAttribute{ { - Key: "foo", - Value: fmt.Sprintf("%d", i), + Key: []byte("foo"), + Value: []byte(fmt.Sprintf("%d", i)), Index: index, }, }, @@ -158,9 +158,9 @@ func TestTxSearchWithCancelation(t *testing.T) { indexer := NewEventSink(dbm.NewMemDB()) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, - {Type: "account", Attributes: []abci.EventAttribute{{Key: "owner", Value: "Ivan", Index: true}}}, - {Type: "", Attributes: []abci.EventAttribute{{Key: "not_allowed", Value: "Vlad", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("owner"), Value: []byte("Ivan"), Index: true}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad"), Index: true}}}, }) err := indexer.IndexTxEvents([]*abci.TxResult{txResult}) require.NoError(t, err) @@ -182,7 +182,7 @@ func TestTxSearchDeprecatedIndexing(t *testing.T) { // index tx using events indexing (composite key) txResult1 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, }) hash1 := types.Tx(txResult1.Tx).Hash() @@ -260,8 +260,8 @@ func TestTxSearchOneTxWithMultipleSameTagsButDifferentValues(t *testing.T) { indexer := NewEventSink(dbm.NewMemDB()) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "2", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2"), Index: true}}}, }) err := indexer.IndexTxEvents([]*abci.TxResult{txResult}) @@ -283,7 +283,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed first, but bigger height (to test the order of transactions) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, }) txResult.Tx = types.Tx("Bob's account") @@ -294,7 +294,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed second, but smaller height (to test the order of transactions) txResult2 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "2", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2"), Index: true}}}, }) txResult2.Tx = types.Tx("Alice's account") txResult2.Height = 1 @@ -305,7 +305,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed third (to test the order of transactions) txResult3 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "3", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("3"), Index: true}}}, }) txResult3.Tx = types.Tx("Jack's account") txResult3.Height = 1 @@ -316,7 +316,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed fourth (to test we don't include txs with similar events) // https://github.com/tendermint/tendermint/issues/2908 txResult4 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number.id", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number.id"), Value: []byte("1"), Index: true}}}, }) txResult4.Tx = types.Tx("Mike's account") txResult4.Height = 2 diff --git a/internal/state/indexer/sink/psql/psql.go b/internal/state/indexer/sink/psql/psql.go index c06383264..083b824c5 100644 --- a/internal/state/indexer/sink/psql/psql.go +++ b/internal/state/indexer/sink/psql/psql.go @@ -117,7 +117,7 @@ INSERT INTO `+tableEvents+` (block_id, tx_id, type) VALUES ($1, $2, $3) if !attr.Index { continue } - compositeKey := evt.Type + "." + attr.Key + compositeKey := evt.Type + "." + string(attr.Key) if _, err := dbtx.Exec(` INSERT INTO `+tableAttributes+` (event_id, key, composite_key, value) VALUES ($1, $2, $3, $4); @@ -139,7 +139,7 @@ func makeIndexedEvent(compositeKey, value string) abci.Event { return abci.Event{Type: compositeKey} } return abci.Event{Type: compositeKey[:i], Attributes: []abci.EventAttribute{ - {Key: compositeKey[i+1:], Value: value, Index: true}, + {Key: []byte(compositeKey[i+1:]), Value: []byte(value), Index: true}, }} } diff --git a/internal/state/indexer/sink/psql/psql_test.go b/internal/state/indexer/sink/psql/psql_test.go index 72d14b5d8..e52986a24 100644 --- a/internal/state/indexer/sink/psql/psql_test.go +++ b/internal/state/indexer/sink/psql/psql_test.go @@ -184,7 +184,7 @@ func TestIndexing(t *testing.T) { makeIndexedEvent("account.owner", "Ivan"), makeIndexedEvent("account.owner", "Yulieta"), - {Type: "", Attributes: []abci.EventAttribute{{Key: "not_allowed", Value: "Vlad", Index: true}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad"), Index: true}}}, }) require.NoError(t, indexer.IndexTxEvents([]*abci.TxResult{txResult})) diff --git a/internal/state/indexer/tx/kv/kv.go b/internal/state/indexer/tx/kv/kv.go index 108700523..387131deb 100644 --- a/internal/state/indexer/tx/kv/kv.go +++ b/internal/state/indexer/tx/kv/kv.go @@ -109,13 +109,13 @@ func (txi *TxIndex) indexEvents(result *abci.TxResult, hash []byte, store dbm.Ba } // index if `index: true` is set - compositeTag := fmt.Sprintf("%s.%s", event.Type, attr.Key) + compositeTag := fmt.Sprintf("%s.%s", event.Type, string(attr.Key)) // ensure event does not conflict with a reserved prefix key if compositeTag == types.TxHashKey || compositeTag == types.TxHeightKey { return fmt.Errorf("event type and attribute key \"%s\" is reserved; please use a different key", compositeTag) } if attr.GetIndex() { - err := store.Set(keyFromEvent(compositeTag, attr.Value, result), hash) + err := store.Set(keyFromEvent(compositeTag, string(attr.Value), result), hash) if err != nil { return err } diff --git a/internal/state/indexer/tx/kv/kv_bench_test.go b/internal/state/indexer/tx/kv/kv_bench_test.go index 7007d5bb5..219399b94 100644 --- a/internal/state/indexer/tx/kv/kv_bench_test.go +++ b/internal/state/indexer/tx/kv/kv_bench_test.go @@ -28,8 +28,8 @@ func BenchmarkTxSearch(b *testing.B) { { Type: "transfer", Attributes: []abci.EventAttribute{ - {Key: "address", Value: fmt.Sprintf("address_%d", i%100), Index: true}, - {Key: "amount", Value: "50", Index: true}, + {Key: []byte("address"), Value: []byte(fmt.Sprintf("address_%d", i%100)), Index: true}, + {Key: []byte("amount"), Value: []byte("50"), Index: true}, }, }, } diff --git a/internal/state/indexer/tx/kv/kv_test.go b/internal/state/indexer/tx/kv/kv_test.go index 8004c0f27..6c6827afc 100644 --- a/internal/state/indexer/tx/kv/kv_test.go +++ b/internal/state/indexer/tx/kv/kv_test.go @@ -67,9 +67,9 @@ func TestTxSearch(t *testing.T) { indexer := NewTxIndex(dbm.NewMemDB()) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, - {Type: "account", Attributes: []abci.EventAttribute{{Key: "owner", Value: "Ivan", Index: true}}}, - {Type: "", Attributes: []abci.EventAttribute{{Key: "not_allowed", Value: "Vlad", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("owner"), Value: []byte("Ivan"), Index: true}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad"), Index: true}}}, }) hash := types.Tx(txResult.Tx).Hash() @@ -147,9 +147,9 @@ func TestTxSearchWithCancelation(t *testing.T) { indexer := NewTxIndex(dbm.NewMemDB()) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, - {Type: "account", Attributes: []abci.EventAttribute{{Key: "owner", Value: "Ivan", Index: true}}}, - {Type: "", Attributes: []abci.EventAttribute{{Key: "not_allowed", Value: "Vlad", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("owner"), Value: []byte("Ivan"), Index: true}}}, + {Type: "", Attributes: []abci.EventAttribute{{Key: []byte("not_allowed"), Value: []byte("Vlad"), Index: true}}}, }) err := indexer.Index([]*abci.TxResult{txResult}) require.NoError(t, err) @@ -166,7 +166,7 @@ func TestTxSearchDeprecatedIndexing(t *testing.T) { // index tx using events indexing (composite key) txResult1 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, }) hash1 := types.Tx(txResult1.Tx).Hash() @@ -244,8 +244,8 @@ func TestTxSearchOneTxWithMultipleSameTagsButDifferentValues(t *testing.T) { indexer := NewTxIndex(dbm.NewMemDB()) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "2", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2"), Index: true}}}, }) err := indexer.Index([]*abci.TxResult{txResult}) @@ -267,7 +267,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed first, but bigger height (to test the order of transactions) txResult := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("1"), Index: true}}}, }) txResult.Tx = types.Tx("Bob's account") @@ -278,7 +278,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed second, but smaller height (to test the order of transactions) txResult2 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "2", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("2"), Index: true}}}, }) txResult2.Tx = types.Tx("Alice's account") txResult2.Height = 1 @@ -289,7 +289,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed third (to test the order of transactions) txResult3 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number", Value: "3", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number"), Value: []byte("3"), Index: true}}}, }) txResult3.Tx = types.Tx("Jack's account") txResult3.Height = 1 @@ -300,7 +300,7 @@ func TestTxSearchMultipleTxs(t *testing.T) { // indexed fourth (to test we don't include txs with similar events) // https://github.com/tendermint/tendermint/issues/2908 txResult4 := txResultWithEvents([]abci.Event{ - {Type: "account", Attributes: []abci.EventAttribute{{Key: "number.id", Value: "1", Index: true}}}, + {Type: "account", Attributes: []abci.EventAttribute{{Key: []byte("number.id"), Value: []byte("1"), Index: true}}}, }) txResult4.Tx = types.Tx("Mike's account") txResult4.Height = 2 diff --git a/internal/state/state_test.go b/internal/state/state_test.go index de1164c5d..c30b14636 100644 --- a/internal/state/state_test.go +++ b/internal/state/state_test.go @@ -162,16 +162,16 @@ func TestFinalizeBlockResponsesSaveLoad2(t *testing.T) { { Data: []byte("Gotcha!"), Events: []abci.Event{ - {Type: "type1", Attributes: []abci.EventAttribute{{Key: "a", Value: "1"}}}, - {Type: "type2", Attributes: []abci.EventAttribute{{Key: "build", Value: "stuff"}}}, + {Type: "type1", Attributes: []abci.EventAttribute{{Key: []byte("a"), Value: []byte("1")}}}, + {Type: "type2", Attributes: []abci.EventAttribute{{Key: []byte("build"), Value: []byte("stuff")}}}, }, }, }, []*abci.ExecTxResult{ {Code: 383, Data: nil}, {Code: 0, Data: []byte("Gotcha!"), Events: []abci.Event{ - {Type: "type1", Attributes: []abci.EventAttribute{{Key: "a", Value: "1"}}}, - {Type: "type2", Attributes: []abci.EventAttribute{{Key: "build", Value: "stuff"}}}, + {Type: "type1", Attributes: []abci.EventAttribute{{Key: []byte("a"), Value: []byte("1")}}}, + {Type: "type2", Attributes: []abci.EventAttribute{{Key: []byte("build"), Value: []byte("stuff")}}}, }}, }, }, diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto index 6a66e8934..794e3e4e5 100644 --- a/proto/tendermint/abci/types.proto +++ b/proto/tendermint/abci/types.proto @@ -405,8 +405,8 @@ message Event { // EventAttribute is a single key-value pair, associated with an event. message EventAttribute { - string key = 1; - string value = 2; + bytes key = 1; + bytes value = 2; bool index = 3; // nondeterministic } diff --git a/proto/tendermint/crypto/keys.pb.go b/proto/tendermint/crypto/keys.pb.go index 62a109cbd..24c6c1b1b 100644 --- a/proto/tendermint/crypto/keys.pb.go +++ b/proto/tendermint/crypto/keys.pb.go @@ -27,7 +27,6 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // PublicKey defines the keys available for use with Tendermint Validators type PublicKey struct { // Types that are valid to be assigned to Sum: - // // *PublicKey_Ed25519 // *PublicKey_Secp256K1 // *PublicKey_Sr25519 diff --git a/proto/tendermint/mempool/types.pb.go b/proto/tendermint/mempool/types.pb.go index ffe5ab359..11e259551 100644 --- a/proto/tendermint/mempool/types.pb.go +++ b/proto/tendermint/mempool/types.pb.go @@ -68,7 +68,6 @@ func (m *Txs) GetTxs() [][]byte { type Message struct { // Types that are valid to be assigned to Sum: - // // *Message_Txs Sum isMessage_Sum `protobuf_oneof:"sum"` } diff --git a/proto/tendermint/p2p/conn.pb.go b/proto/tendermint/p2p/conn.pb.go index 16ee463a6..47a3bb0cd 100644 --- a/proto/tendermint/p2p/conn.pb.go +++ b/proto/tendermint/p2p/conn.pb.go @@ -158,7 +158,6 @@ func (m *PacketMsg) GetData() []byte { type Packet struct { // Types that are valid to be assigned to Sum: - // // *Packet_PacketPing // *Packet_PacketPong // *Packet_PacketMsg diff --git a/proto/tendermint/types/types.pb.go b/proto/tendermint/types/types.pb.go index 1fdefc056..3671bf7a1 100644 --- a/proto/tendermint/types/types.pb.go +++ b/proto/tendermint/types/types.pb.go @@ -1294,7 +1294,6 @@ func (m *TxProof) GetProof() *crypto.Proof { type Evidence struct { // Types that are valid to be assigned to Sum: - // // *Evidence_DuplicateVoteEvidence // *Evidence_LightClientAttackEvidence Sum isEvidence_Sum `protobuf_oneof:"sum"` diff --git a/rpc/coretypes/responses.go b/rpc/coretypes/responses.go index cde125fa2..f079bfbb6 100644 --- a/rpc/coretypes/responses.go +++ b/rpc/coretypes/responses.go @@ -241,7 +241,9 @@ type ResultConsensusState struct { type ResultBroadcastTx struct { Code uint32 `json:"code"` Data bytes.HexBytes `json:"data"` + Log string `json:"log"` Codespace string `json:"codespace"` + Hash bytes.HexBytes `json:"hash"` } diff --git a/test/e2e/app/app.go b/test/e2e/app/app.go index 771b72643..7c912e1f0 100644 --- a/test/e2e/app/app.go +++ b/test/e2e/app/app.go @@ -216,12 +216,12 @@ func (app *Application) FinalizeBlock(_ context.Context, req *abci.RequestFinali Type: "val_updates", Attributes: []abci.EventAttribute{ { - Key: "size", - Value: strconv.Itoa(valUpdates.Len()), + Key: []byte("size"), + Value: []byte(strconv.Itoa(valUpdates.Len())), }, { - Key: "height", - Value: strconv.Itoa(int(req.Height)), + Key: []byte("height"), + Value: []byte(strconv.Itoa(int(req.Height))), }, }, }, diff --git a/types/events.go b/types/events.go index c818144db..4a85fdc11 100644 --- a/types/events.go +++ b/types/events.go @@ -51,8 +51,8 @@ var ( Type: strings.Split(EventTypeKey, ".")[0], Attributes: []abci.EventAttribute{ { - Key: strings.Split(EventTypeKey, ".")[1], - Value: EventNewBlockValue, + Key: []byte(strings.Split(EventTypeKey, ".")[1]), + Value: []byte(EventNewBlockValue), }, }, } @@ -61,8 +61,8 @@ var ( Type: strings.Split(EventTypeKey, ".")[0], Attributes: []abci.EventAttribute{ { - Key: strings.Split(EventTypeKey, ".")[1], - Value: EventNewBlockHeaderValue, + Key: []byte(strings.Split(EventTypeKey, ".")[1]), + Value: []byte(EventNewBlockHeaderValue), }, }, } @@ -71,8 +71,8 @@ var ( Type: strings.Split(EventTypeKey, ".")[0], Attributes: []abci.EventAttribute{ { - Key: strings.Split(EventTypeKey, ".")[1], - Value: EventNewEvidenceValue, + Key: []byte(strings.Split(EventTypeKey, ".")[1]), + Value: []byte(EventNewEvidenceValue), }, }, } @@ -81,8 +81,8 @@ var ( Type: strings.Split(EventTypeKey, ".")[0], Attributes: []abci.EventAttribute{ { - Key: strings.Split(EventTypeKey, ".")[1], - Value: EventTxValue, + Key: []byte(strings.Split(EventTypeKey, ".")[1]), + Value: []byte(EventTxValue), }, }, } @@ -331,7 +331,7 @@ func eventWithAttr(etype, value string) abci.Event { return abci.Event{ Type: parts[0], Attributes: []abci.EventAttribute{{ - Key: parts[1], Value: value, + Key: []byte(parts[1]), Value: []byte(value), }}, } } From 4d7cf479e457dac8e94dcb5618ef6567dcb17c01 Mon Sep 17 00:00:00 2001 From: Cyson Date: Wed, 15 Mar 2023 17:04:46 -0700 Subject: [PATCH 2/4] test --- rpc/jsonrpc/server/rpc_func.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rpc/jsonrpc/server/rpc_func.go b/rpc/jsonrpc/server/rpc_func.go index 947f8be5b..6ee108c7e 100644 --- a/rpc/jsonrpc/server/rpc_func.go +++ b/rpc/jsonrpc/server/rpc_func.go @@ -11,6 +11,7 @@ import ( "strings" "time" + tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/libs/log" rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types" ) @@ -108,7 +109,7 @@ func (rf *RPCFunc) parseParams(ctx context.Context, params json.RawMessage) ([]r return nil, invalidParamsError(err.Error()) } arg := reflect.New(rf.param) - if err := json.Unmarshal(bits, arg.Interface()); err != nil { + if err := tmjson.Unmarshal(bits, arg.Interface()); err != nil { return nil, invalidParamsError(err.Error()) } return []reflect.Value{reflect.ValueOf(ctx), arg}, nil @@ -120,7 +121,7 @@ func (rf *RPCFunc) adjustParams(data []byte) (json.RawMessage, error) { base := bytes.TrimSpace(data) if bytes.HasPrefix(base, []byte("[")) { var args []json.RawMessage - if err := json.Unmarshal(base, &args); err != nil { + if err := tmjson.Unmarshal(base, &args); err != nil { return nil, err } else if len(args) != len(rf.args) { return nil, fmt.Errorf("got %d arguments, want %d", len(args), len(rf.args)) @@ -129,7 +130,7 @@ func (rf *RPCFunc) adjustParams(data []byte) (json.RawMessage, error) { for i, arg := range args { m[rf.args[i].name] = arg } - return json.Marshal(m) + return tmjson.Marshal(m) } else if bytes.HasPrefix(base, []byte("{")) || bytes.Equal(base, []byte("null")) { return base, nil } From a1f84a8f9e01f319bb61c5571526638d428aa6b1 Mon Sep 17 00:00:00 2001 From: Cyson Date: Wed, 15 Mar 2023 18:24:52 -0700 Subject: [PATCH 3/4] test --- rpc/jsonrpc/server/rpc_func.go | 7 +++---- rpc/jsonrpc/types/types.go | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/rpc/jsonrpc/server/rpc_func.go b/rpc/jsonrpc/server/rpc_func.go index 6ee108c7e..947f8be5b 100644 --- a/rpc/jsonrpc/server/rpc_func.go +++ b/rpc/jsonrpc/server/rpc_func.go @@ -11,7 +11,6 @@ import ( "strings" "time" - tmjson "github.com/tendermint/tendermint/libs/json" "github.com/tendermint/tendermint/libs/log" rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types" ) @@ -109,7 +108,7 @@ func (rf *RPCFunc) parseParams(ctx context.Context, params json.RawMessage) ([]r return nil, invalidParamsError(err.Error()) } arg := reflect.New(rf.param) - if err := tmjson.Unmarshal(bits, arg.Interface()); err != nil { + if err := json.Unmarshal(bits, arg.Interface()); err != nil { return nil, invalidParamsError(err.Error()) } return []reflect.Value{reflect.ValueOf(ctx), arg}, nil @@ -121,7 +120,7 @@ func (rf *RPCFunc) adjustParams(data []byte) (json.RawMessage, error) { base := bytes.TrimSpace(data) if bytes.HasPrefix(base, []byte("[")) { var args []json.RawMessage - if err := tmjson.Unmarshal(base, &args); err != nil { + if err := json.Unmarshal(base, &args); err != nil { return nil, err } else if len(args) != len(rf.args) { return nil, fmt.Errorf("got %d arguments, want %d", len(args), len(rf.args)) @@ -130,7 +129,7 @@ func (rf *RPCFunc) adjustParams(data []byte) (json.RawMessage, error) { for i, arg := range args { m[rf.args[i].name] = arg } - return tmjson.Marshal(m) + return json.Marshal(m) } else if bytes.HasPrefix(base, []byte("{")) || bytes.Equal(base, []byte("null")) { return base, nil } diff --git a/rpc/jsonrpc/types/types.go b/rpc/jsonrpc/types/types.go index 0c0500bf0..d809b22bc 100644 --- a/rpc/jsonrpc/types/types.go +++ b/rpc/jsonrpc/types/types.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/tendermint/tendermint/rpc/coretypes" + tmjson "github.com/tendermint/tendermint/libs/json" ) // ErrorCode is the type of JSON-RPC error codes. @@ -115,7 +116,9 @@ func (req RPCRequest) String() string { // MakeResponse constructs a success response to req with the given result. If // there is an error marshaling result to JSON, it returns an error response. func (req RPCRequest) MakeResponse(result interface{}) RPCResponse { - data, err := json.Marshal(result) + fmt.Println("printing MakeResponse ", result) + + data, err := tmjson.Marshal(result) if err != nil { return req.MakeErrorf(CodeInternalError, "marshaling result: %v", err) } From 5188e84055e0b455201e2dcbffd77096bd8c246c Mon Sep 17 00:00:00 2001 From: Cyson Date: Wed, 15 Mar 2023 22:31:55 -0700 Subject: [PATCH 4/4] test --- rpc/jsonrpc/client/decode.go | 5 +++-- rpc/jsonrpc/types/types.go | 2 -- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/rpc/jsonrpc/client/decode.go b/rpc/jsonrpc/client/decode.go index 643fc56b5..96a1f600c 100644 --- a/rpc/jsonrpc/client/decode.go +++ b/rpc/jsonrpc/client/decode.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + tmjson "github.com/tendermint/tendermint/libs/json" rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types" ) @@ -11,7 +12,7 @@ func unmarshalResponseBytes(responseBytes []byte, expectedID string, result inte // Read response. If rpc/core/types is imported, the result will unmarshal // into the correct type. var response rpctypes.RPCResponse - if err := json.Unmarshal(responseBytes, &response); err != nil { + if err := tmjson.Unmarshal(responseBytes, &response); err != nil { return fmt.Errorf("unmarshaling response test: %w, bytes: %d", err, len(responseBytes)) } @@ -24,7 +25,7 @@ func unmarshalResponseBytes(responseBytes []byte, expectedID string, result inte } // Unmarshal the RawMessage into the result. - if err := json.Unmarshal(response.Result, result); err != nil { + if err := tmjson.Unmarshal(response.Result, result); err != nil { return fmt.Errorf("error unmarshaling result: %w", err) } return nil diff --git a/rpc/jsonrpc/types/types.go b/rpc/jsonrpc/types/types.go index d809b22bc..5b7d5b9bc 100644 --- a/rpc/jsonrpc/types/types.go +++ b/rpc/jsonrpc/types/types.go @@ -116,8 +116,6 @@ func (req RPCRequest) String() string { // MakeResponse constructs a success response to req with the given result. If // there is an error marshaling result to JSON, it returns an error response. func (req RPCRequest) MakeResponse(result interface{}) RPCResponse { - fmt.Println("printing MakeResponse ", result) - data, err := tmjson.Marshal(result) if err != nil { return req.MakeErrorf(CodeInternalError, "marshaling result: %v", err)