From cd1d4ee7977d29b644740a4de959d713b848a644 Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 6 Sep 2024 14:22:32 +0200 Subject: [PATCH 01/20] GO-3964 ListRelationsByValue rpc --- clientlibrary/service/service.pb.go | 650 +++--- core/block/relation.go | 182 ++ core/block/relation_test.go | 119 + core/relations.go | 26 +- docs/proto.md | 78 + pb/commands.pb.go | 3255 +++++++++++++++++---------- pb/protos/commands.proto | 24 + pb/protos/service/service.proto | 1 + pb/service/service.pb.go | 649 +++--- pkg/lib/localstore/addr/addr.go | 7 + 10 files changed, 3216 insertions(+), 1775 deletions(-) create mode 100644 core/block/relation_test.go diff --git a/clientlibrary/service/service.pb.go b/clientlibrary/service/service.pb.go index 3db798fa6f..b119bc5ea7 100644 --- a/clientlibrary/service/service.pb.go +++ b/clientlibrary/service/service.pb.go @@ -25,316 +25,317 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 4931 bytes of a gzipped FileDescriptorProto + // 4950 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49, 0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xa8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f, 0x8f, 0xdb, 0xb3, 0x33, 0xfb, 0x71, 0xec, 0x21, 0x21, 0x8f, 0x3d, 0xf6, 0x9a, 0xb3, 0x3d, 0xc6, 0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0x53, 0x1d, 0x6e, 0x17, 0xae, 0xae, 0xac, 0xab, 0xca, 0x6e, - 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xd7, 0xf0, - 0x78, 0x12, 0x2f, 0xf0, 0x86, 0x76, 0xff, 0x91, 0x53, 0x65, 0x66, 0xe5, 0x47, 0x54, 0x46, 0x56, - 0x79, 0x9f, 0x66, 0xd4, 0xf1, 0x8b, 0x88, 0xcc, 0xca, 0xcc, 0xc8, 0xc8, 0x8f, 0x2a, 0x47, 0xd7, - 0xcb, 0x37, 0x1b, 0x65, 0xc5, 0x38, 0xab, 0x37, 0x6a, 0xa8, 0x96, 0x59, 0x0a, 0xed, 0xbf, 0x63, - 0xf1, 0x73, 0xfc, 0x6e, 0x52, 0xac, 0xf8, 0xaa, 0x84, 0x8f, 0x3e, 0x34, 0x64, 0xca, 0xe6, 0xf3, - 0xa4, 0x98, 0xd6, 0x12, 0xf9, 0xe8, 0x03, 0x23, 0x81, 0x25, 0x14, 0x5c, 0xfd, 0xfe, 0xf4, 0x7f, - 0xfe, 0x6f, 0x14, 0xbd, 0xb7, 0x95, 0x67, 0x50, 0xf0, 0x2d, 0xa5, 0x11, 0x7f, 0x15, 0x7d, 0x77, - 0xb3, 0x2c, 0x77, 0x81, 0xbf, 0x82, 0xaa, 0xce, 0x58, 0x11, 0xdf, 0x1e, 0x2b, 0x07, 0xe3, 0xe3, - 0x32, 0x1d, 0x6f, 0x96, 0xe5, 0xd8, 0x08, 0xc7, 0xc7, 0xf0, 0x93, 0x05, 0xd4, 0xfc, 0xa3, 0x3b, - 0x61, 0xa8, 0x2e, 0x59, 0x51, 0x43, 0x7c, 0x16, 0xfd, 0xc6, 0x66, 0x59, 0x4e, 0x80, 0x6f, 0x43, - 0x53, 0x81, 0x09, 0x4f, 0x38, 0xc4, 0xf7, 0x3b, 0xaa, 0x2e, 0xa0, 0x7d, 0x3c, 0xe8, 0x07, 0x95, - 0x9f, 0x93, 0xe8, 0x3b, 0x8d, 0x9f, 0xf3, 0x05, 0x9f, 0xb2, 0xcb, 0x22, 0xbe, 0xd9, 0x55, 0x54, - 0x22, 0x6d, 0xfb, 0x56, 0x08, 0x51, 0x56, 0x5f, 0x47, 0xbf, 0xfa, 0x3a, 0xc9, 0x73, 0xe0, 0x5b, - 0x15, 0x34, 0x05, 0x77, 0x75, 0xa4, 0x68, 0x2c, 0x65, 0xda, 0xee, 0xed, 0x20, 0xa3, 0x0c, 0x7f, - 0x15, 0x7d, 0x57, 0x4a, 0x8e, 0x21, 0x65, 0x4b, 0xa8, 0x62, 0xaf, 0x96, 0x12, 0x12, 0x8f, 0xbc, - 0x03, 0x61, 0xdb, 0x5b, 0xac, 0x58, 0x42, 0xc5, 0xfd, 0xb6, 0x95, 0x30, 0x6c, 0xdb, 0x40, 0xca, - 0xf6, 0xdf, 0x8d, 0xa2, 0xef, 0x6f, 0xa6, 0x29, 0x5b, 0x14, 0x7c, 0x9f, 0xa5, 0x49, 0xbe, 0x9f, - 0x15, 0x17, 0x87, 0x70, 0xb9, 0x75, 0xde, 0xf0, 0xc5, 0x0c, 0xe2, 0x67, 0xee, 0x53, 0x95, 0xe8, - 0x58, 0xb3, 0x63, 0x1b, 0xd6, 0xbe, 0x3f, 0xb9, 0x9a, 0x92, 0x2a, 0xcb, 0x3f, 0x8d, 0xa2, 0x6b, - 0xb8, 0x2c, 0x13, 0x96, 0x2f, 0xc1, 0x94, 0xe6, 0xd3, 0x1e, 0xc3, 0x2e, 0xae, 0xcb, 0xf3, 0xd9, - 0x55, 0xd5, 0x54, 0x89, 0xf2, 0xe8, 0x7d, 0xbb, 0xbb, 0x4c, 0xa0, 0x16, 0xc3, 0xe9, 0x21, 0xdd, - 0x23, 0x14, 0xa2, 0x3d, 0x3f, 0x1a, 0x82, 0x2a, 0x6f, 0x59, 0x14, 0x2b, 0x6f, 0x39, 0xab, 0xb5, - 0xb3, 0x07, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0x3d, 0x1c, 0x40, 0x2a, 0x57, 0x7f, 0x1c, 0xfd, 0xda, - 0x6b, 0x56, 0x5d, 0xd4, 0x65, 0x92, 0x82, 0x1a, 0x0a, 0x77, 0x5d, 0xed, 0x56, 0x8a, 0x47, 0xc3, - 0xbd, 0x3e, 0xcc, 0xea, 0xb4, 0xad, 0xf0, 0x65, 0x09, 0x38, 0x06, 0x19, 0xc5, 0x46, 0x48, 0x75, - 0x5a, 0x0c, 0x29, 0xdb, 0x17, 0x51, 0x6c, 0x6c, 0xbf, 0xf9, 0x13, 0x48, 0xf9, 0xe6, 0x74, 0x8a, - 0x5b, 0xc5, 0xe8, 0x0a, 0x62, 0xbc, 0x39, 0x9d, 0x52, 0xad, 0xe2, 0x47, 0x95, 0xb3, 0xcb, 0xe8, - 0x03, 0xe4, 0x6c, 0x3f, 0xab, 0x85, 0xc3, 0xf5, 0xb0, 0x15, 0x85, 0x69, 0xa7, 0xe3, 0xa1, 0xb8, - 0x72, 0xfc, 0x17, 0xa3, 0xe8, 0x7b, 0x1e, 0xcf, 0xc7, 0x30, 0x67, 0x4b, 0x88, 0x9f, 0xf4, 0x5b, - 0x93, 0xa4, 0xf6, 0xff, 0xf1, 0x15, 0x34, 0x3c, 0xdd, 0x64, 0x02, 0x39, 0xa4, 0x9c, 0xec, 0x26, - 0x52, 0xdc, 0xdb, 0x4d, 0x34, 0x66, 0x8d, 0xb0, 0x56, 0xb8, 0x0b, 0x7c, 0x6b, 0x51, 0x55, 0x50, - 0x70, 0xb2, 0x2d, 0x0d, 0xd2, 0xdb, 0x96, 0x0e, 0xea, 0xa9, 0xcf, 0x2e, 0xf0, 0xcd, 0x3c, 0x27, - 0xeb, 0x23, 0xc5, 0xbd, 0xf5, 0xd1, 0x98, 0xf2, 0x90, 0x46, 0xbf, 0x6e, 0x3d, 0x31, 0xbe, 0x57, - 0x9c, 0xb1, 0x98, 0x7e, 0x16, 0x42, 0xae, 0x7d, 0xdc, 0xef, 0xe5, 0x3c, 0xd5, 0x78, 0xf1, 0xb6, - 0x64, 0x15, 0xdd, 0x2c, 0x52, 0xdc, 0x5b, 0x0d, 0x8d, 0x29, 0x0f, 0x7f, 0x14, 0xbd, 0xa7, 0xa2, - 0x64, 0x3b, 0x9f, 0xdd, 0xf1, 0x86, 0x50, 0x3c, 0xa1, 0xdd, 0xed, 0xa1, 0x4c, 0x70, 0x50, 0x32, - 0x15, 0x7c, 0x6e, 0x7b, 0xf5, 0x50, 0xe8, 0xb9, 0x13, 0x86, 0x3a, 0xb6, 0xb7, 0x21, 0x07, 0xd2, - 0xb6, 0x14, 0xf6, 0xd8, 0xd6, 0x90, 0xb2, 0x5d, 0x45, 0xbf, 0xa5, 0x1f, 0x4b, 0x33, 0x8f, 0x0a, - 0x79, 0x13, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0x78, 0x18, 0xdc, 0xa9, 0x8f, 0x1a, - 0x81, 0xfe, 0xfa, 0xa0, 0xf1, 0x77, 0x27, 0x0c, 0x29, 0xdb, 0x7f, 0x3f, 0x8a, 0x7e, 0xa0, 0x64, - 0x2f, 0x8a, 0xe4, 0x4d, 0x0e, 0x62, 0x4a, 0x3c, 0x04, 0x7e, 0xc9, 0xaa, 0x8b, 0xc9, 0xaa, 0x48, - 0x89, 0xe9, 0xdf, 0x0f, 0xf7, 0x4c, 0xff, 0xa4, 0x92, 0x95, 0xf1, 0xa9, 0x8a, 0x72, 0x56, 0xe2, - 0x8c, 0xaf, 0xad, 0x01, 0x67, 0x25, 0x95, 0xf1, 0xb9, 0x48, 0xc7, 0xea, 0x41, 0x13, 0x36, 0xfd, - 0x56, 0x0f, 0xec, 0x38, 0x79, 0x2b, 0x84, 0x98, 0xb0, 0xd5, 0x76, 0x60, 0x56, 0x9c, 0x65, 0xb3, - 0xd3, 0x72, 0xda, 0x74, 0xe3, 0x87, 0xfe, 0x1e, 0x6a, 0x21, 0x44, 0xd8, 0x22, 0x50, 0xe5, 0xed, - 0x1f, 0x4d, 0x62, 0xa4, 0x86, 0xd2, 0x4e, 0xc5, 0xe6, 0xfb, 0x30, 0x4b, 0xd2, 0x95, 0x1a, 0xff, - 0x9f, 0x84, 0x06, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa2, 0x96, 0x2a, 0xcf, 0x7f, 0x8e, 0xa2, - 0x3b, 0x6d, 0xf5, 0xcf, 0x93, 0x62, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0x37, 0x8b, 0xe9, 0x31, 0xd4, - 0x3c, 0xa9, 0x78, 0xfc, 0x85, 0xbf, 0x92, 0x21, 0x1d, 0x5d, 0xb6, 0x1f, 0x7d, 0x2b, 0x5d, 0xd3, - 0xea, 0x93, 0x26, 0xb0, 0xa9, 0x10, 0xe0, 0xb6, 0xba, 0x90, 0xe0, 0x00, 0x70, 0x2b, 0x84, 0x98, - 0x56, 0x17, 0x82, 0xbd, 0x62, 0x99, 0x71, 0xd8, 0x85, 0x02, 0xaa, 0x6e, 0xab, 0x4b, 0x55, 0x17, - 0x21, 0x5a, 0x9d, 0x40, 0x4d, 0xb0, 0x71, 0xbc, 0xe9, 0xc9, 0x71, 0x2d, 0x60, 0xa4, 0x33, 0x3d, - 0x3e, 0x1e, 0x06, 0x9b, 0xd5, 0x9d, 0xe5, 0xf3, 0x18, 0x96, 0xec, 0x02, 0xaf, 0xee, 0x6c, 0x13, - 0x12, 0x20, 0x56, 0x77, 0x5e, 0xd0, 0xcc, 0x60, 0x96, 0x9f, 0x57, 0x19, 0x5c, 0xa2, 0x19, 0xcc, - 0x56, 0x6e, 0xc4, 0xc4, 0x0c, 0xe6, 0xc1, 0x94, 0x87, 0xc3, 0xe8, 0x57, 0x84, 0xf0, 0x0f, 0x58, - 0x56, 0xc4, 0xd7, 0x3d, 0x4a, 0x8d, 0x40, 0x5b, 0xbd, 0x41, 0x03, 0xa8, 0xc4, 0xcd, 0xaf, 0x5b, - 0x49, 0x91, 0x42, 0xee, 0x2d, 0xb1, 0x11, 0x07, 0x4b, 0xec, 0x60, 0x26, 0x75, 0x10, 0xc2, 0x26, - 0x7e, 0x4d, 0xce, 0x93, 0x2a, 0x2b, 0x66, 0xb1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f, 0x43, - 0x5d, 0x58, 0x29, 0x6e, 0x96, 0x65, 0xd5, 0x84, 0x45, 0x5f, 0x17, 0x76, 0x91, 0x60, 0x17, 0xee, - 0xa0, 0x7e, 0x6f, 0xdb, 0x90, 0xe6, 0x59, 0x11, 0xf4, 0xa6, 0x90, 0x21, 0xde, 0x0c, 0x8a, 0x3a, - 0xef, 0x3e, 0x24, 0x4b, 0x68, 0x6b, 0xe6, 0x7b, 0x32, 0x36, 0x10, 0xec, 0xbc, 0x08, 0x34, 0xeb, - 0x34, 0x21, 0x3e, 0x48, 0x2e, 0xa0, 0x79, 0xc0, 0xd0, 0xcc, 0x6b, 0xb1, 0x4f, 0xdf, 0x21, 0x88, - 0x75, 0x9a, 0x9f, 0x54, 0xae, 0x16, 0xd1, 0x07, 0x42, 0x7e, 0x94, 0x54, 0x3c, 0x4b, 0xb3, 0x32, - 0x29, 0xda, 0xfc, 0xdf, 0x37, 0xae, 0x3b, 0x94, 0x76, 0xb9, 0x3e, 0x90, 0x56, 0x6e, 0xff, 0x7d, - 0x14, 0xdd, 0xc4, 0x7e, 0x8f, 0xa0, 0x9a, 0x67, 0x62, 0x19, 0x59, 0xcb, 0x20, 0x1c, 0x7f, 0x1e, - 0x36, 0xda, 0x51, 0xd0, 0xa5, 0xf9, 0xe1, 0xd5, 0x15, 0x55, 0xc1, 0xfe, 0x30, 0x8a, 0xe4, 0x72, - 0x45, 0x2c, 0x29, 0xdd, 0x51, 0xab, 0xd6, 0x31, 0xce, 0x7a, 0xf2, 0x66, 0x80, 0x30, 0x53, 0x85, - 0xfc, 0x5d, 0xac, 0x94, 0x63, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0x27, 0xe7, - 0xec, 0xd2, 0x5f, 0xd0, 0x46, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f, 0xef, - 0xaa, 0x2d, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xd3, 0x36, 0xfc, 0x9c, 0xb1, - 0x8b, 0x79, 0x52, 0x5d, 0xc4, 0x8f, 0x68, 0xe5, 0x96, 0xd1, 0x8e, 0xd6, 0x06, 0xb1, 0x26, 0x2c, - 0xd8, 0x0e, 0x9b, 0x44, 0xe3, 0xb4, 0xca, 0x51, 0x58, 0x70, 0x6c, 0x28, 0x84, 0x08, 0x0b, 0x04, - 0x6a, 0x22, 0xb7, 0xed, 0x6d, 0x02, 0x78, 0xb5, 0xe4, 0xa8, 0x4f, 0x80, 0x5a, 0x2d, 0x79, 0x30, - 0xdc, 0x85, 0x76, 0xab, 0xa4, 0x3c, 0xf7, 0x77, 0x21, 0x21, 0x0a, 0x77, 0xa1, 0x16, 0xc1, 0xed, - 0x3d, 0x81, 0xa4, 0x4a, 0xcf, 0xfd, 0xed, 0x2d, 0x65, 0xe1, 0xf6, 0xd6, 0x0c, 0x6e, 0x6f, 0x29, - 0x78, 0x9d, 0xf1, 0xf3, 0x03, 0xe0, 0x89, 0xbf, 0xbd, 0x5d, 0x26, 0xdc, 0xde, 0x1d, 0xd6, 0x64, - 0x32, 0xb6, 0xc3, 0xc9, 0xe2, 0x4d, 0x9d, 0x56, 0xd9, 0x1b, 0x88, 0x03, 0x56, 0x34, 0x44, 0x64, - 0x32, 0x24, 0x6c, 0x82, 0xb4, 0xf2, 0xd9, 0xca, 0xf6, 0xa6, 0x35, 0x0a, 0xd2, 0xad, 0x0d, 0x8b, - 0x20, 0x82, 0xb4, 0x9f, 0xc4, 0xd5, 0xdb, 0xad, 0xd8, 0xa2, 0xac, 0x7b, 0xaa, 0x87, 0xa0, 0x70, - 0xf5, 0xba, 0xb0, 0xf2, 0xf9, 0x36, 0xfa, 0x6d, 0xfb, 0x91, 0x9e, 0x16, 0xb5, 0xf6, 0xba, 0x4e, - 0x3f, 0x27, 0x0b, 0x23, 0xb6, 0xa5, 0x02, 0xb8, 0x49, 0x53, 0x5a, 0xcf, 0x7c, 0x1b, 0x78, 0x92, - 0xe5, 0x75, 0x7c, 0xcf, 0x6f, 0xa3, 0x95, 0x13, 0x69, 0x8a, 0x8f, 0xc3, 0x63, 0x76, 0x7b, 0x51, - 0xe6, 0x59, 0xda, 0xdd, 0x9f, 0x54, 0xba, 0x5a, 0x1c, 0x1e, 0xb3, 0x36, 0x86, 0x63, 0xd0, 0x04, - 0xb8, 0xfc, 0xcf, 0xc9, 0xaa, 0x04, 0x7f, 0x0c, 0x72, 0x90, 0x70, 0x0c, 0xc2, 0x28, 0xae, 0xcf, - 0x04, 0xf8, 0x7e, 0xb2, 0x62, 0x0b, 0x22, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66, 0x32, 0x05, - 0xed, 0x61, 0xaf, 0xe0, 0x50, 0x15, 0x49, 0xbe, 0x93, 0x27, 0xb3, 0x3a, 0x26, 0xc6, 0x8d, 0x4b, - 0x11, 0x99, 0x02, 0x4d, 0x7b, 0x1e, 0xe3, 0x5e, 0xbd, 0x93, 0x2c, 0x59, 0x95, 0x71, 0xfa, 0x31, - 0x1a, 0xa4, 0xf7, 0x31, 0x3a, 0xa8, 0xd7, 0xdb, 0x66, 0x95, 0x9e, 0x67, 0x4b, 0x98, 0x06, 0xbc, - 0xb5, 0xc8, 0x00, 0x6f, 0x16, 0xea, 0x69, 0xb4, 0x09, 0x5b, 0x54, 0x29, 0x90, 0x8d, 0x26, 0xc5, - 0xbd, 0x8d, 0xa6, 0x31, 0xe5, 0xe1, 0xaf, 0x47, 0xd1, 0xef, 0x48, 0xa9, 0xbd, 0x69, 0xb8, 0x9d, - 0xd4, 0xe7, 0x6f, 0x58, 0x52, 0x4d, 0xe3, 0x8f, 0x7d, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0xf4, 0x2a, - 0x2a, 0xf8, 0xb1, 0xee, 0x67, 0xb5, 0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3, - 0x38, 0x80, 0x08, 0xb9, 0x5c, 0xa0, 0xdf, 0x23, 0xf5, 0xdd, 0x55, 0xfa, 0xfd, 0x5e, 0x0e, 0xc7, - 0xc7, 0x46, 0xe8, 0xf6, 0x96, 0x75, 0xca, 0x86, 0xbf, 0xc7, 0x8c, 0x87, 0xe2, 0xa4, 0x67, 0x3d, - 0x2a, 0xc2, 0x9e, 0x3b, 0x23, 0x63, 0x3c, 0x14, 0x27, 0x3c, 0x5b, 0x61, 0x2d, 0xe4, 0xd9, 0x13, - 0xda, 0xc6, 0x43, 0x71, 0x9c, 0x51, 0x28, 0xa6, 0x9d, 0x17, 0x1e, 0x05, 0xec, 0xe0, 0xb9, 0x61, - 0x6d, 0x10, 0xab, 0x1c, 0xfe, 0xed, 0x28, 0xfa, 0xbe, 0xf1, 0x78, 0xc0, 0xa6, 0xd9, 0xd9, 0x4a, - 0x42, 0xaf, 0x92, 0x7c, 0x01, 0x75, 0xfc, 0x94, 0xb2, 0xd6, 0x65, 0x75, 0x09, 0x9e, 0x5d, 0x49, - 0x07, 0x8f, 0x9d, 0xcd, 0xb2, 0xcc, 0x57, 0x27, 0x30, 0x2f, 0x73, 0x72, 0xec, 0x38, 0x48, 0x78, - 0xec, 0x60, 0x14, 0x67, 0x9a, 0x27, 0xac, 0xc9, 0x63, 0xbd, 0x99, 0xa6, 0x10, 0x85, 0x33, 0xcd, - 0x16, 0xc1, 0xb9, 0xd2, 0x09, 0xdb, 0x62, 0x79, 0x0e, 0x29, 0xef, 0x1e, 0x3c, 0x6a, 0x4d, 0x43, - 0x84, 0x73, 0x25, 0x44, 0x9a, 0x35, 0x7a, 0xbb, 0x2e, 0x4a, 0x2a, 0x78, 0xbe, 0xda, 0xcf, 0x8a, - 0x8b, 0xd8, 0x9f, 0x16, 0x18, 0x80, 0x58, 0xa3, 0x7b, 0x41, 0xbc, 0xfe, 0x3a, 0x2d, 0xa6, 0xcc, - 0xbf, 0xfe, 0x6a, 0x24, 0xe1, 0xf5, 0x97, 0x22, 0xb0, 0xc9, 0x63, 0xa0, 0x4c, 0x36, 0x92, 0xb0, - 0x49, 0x45, 0xf8, 0x42, 0xa1, 0xda, 0xc9, 0x25, 0x43, 0x21, 0xda, 0xbb, 0xbd, 0xdf, 0xcb, 0xe1, - 0x1e, 0xda, 0x2e, 0xc4, 0x76, 0x80, 0xa7, 0xe7, 0xfe, 0x1e, 0xea, 0x20, 0xe1, 0x1e, 0x8a, 0x51, - 0x5c, 0xa5, 0x13, 0xa6, 0x17, 0x92, 0xf7, 0xfc, 0xfd, 0xa3, 0xb3, 0x88, 0xbc, 0xdf, 0xcb, 0xe1, - 0xa5, 0xd1, 0xde, 0x5c, 0x3c, 0x33, 0x6f, 0x27, 0x97, 0xb2, 0xf0, 0xd2, 0x48, 0x33, 0xb8, 0xf4, - 0x52, 0xd0, 0x3c, 0x4e, 0x7f, 0xe9, 0x8d, 0x3c, 0x5c, 0x7a, 0x87, 0x53, 0x4e, 0xfe, 0x75, 0x14, - 0x5d, 0xb7, 0xbd, 0x1c, 0xb2, 0x66, 0x8c, 0xbc, 0x4a, 0xf2, 0x6c, 0x9a, 0x70, 0x38, 0x61, 0x17, - 0x50, 0xa0, 0xbd, 0x15, 0xb7, 0xb4, 0x92, 0x1f, 0x3b, 0x0a, 0xc4, 0xde, 0xca, 0x20, 0x45, 0xdc, - 0x4f, 0x24, 0x7d, 0x5a, 0xc3, 0x56, 0x52, 0x13, 0x91, 0xcc, 0x41, 0xc2, 0xfd, 0x04, 0xa3, 0x38, - 0x5f, 0x95, 0xf2, 0x17, 0x6f, 0x4b, 0xa8, 0x32, 0x28, 0x52, 0xf0, 0xe7, 0xab, 0x98, 0x0a, 0xe7, - 0xab, 0x1e, 0xba, 0xb3, 0xf5, 0xa0, 0x83, 0x53, 0xf7, 0xee, 0x00, 0x26, 0x02, 0x77, 0x07, 0x08, - 0x14, 0x57, 0xd2, 0x00, 0xde, 0xed, 0xbb, 0x8e, 0x95, 0xe0, 0xf6, 0x1d, 0x4d, 0x77, 0x36, 0x74, - 0x34, 0x33, 0x69, 0x86, 0x49, 0x4f, 0xd1, 0x27, 0xf6, 0x70, 0x59, 0x1b, 0xc4, 0xfa, 0x77, 0x90, - 0x8e, 0x21, 0x4f, 0xc4, 0x14, 0x12, 0xd8, 0xa6, 0x69, 0x99, 0x21, 0x3b, 0x48, 0x16, 0xab, 0x1c, - 0xfe, 0xe5, 0x28, 0xfa, 0xc8, 0xe7, 0xf1, 0x65, 0x29, 0xfc, 0x3e, 0xe9, 0xb7, 0x25, 0x49, 0xe2, - 0x72, 0x44, 0x58, 0x43, 0x95, 0xe1, 0x4f, 0xa3, 0x0f, 0x5b, 0x91, 0xb9, 0x3b, 0xa1, 0x0a, 0xe0, - 0x26, 0x50, 0xba, 0xfc, 0x98, 0xd3, 0xee, 0x37, 0x06, 0xf3, 0x66, 0x6d, 0xe2, 0x96, 0xab, 0x46, - 0x6b, 0x13, 0x6d, 0x43, 0x89, 0x89, 0xb5, 0x89, 0x07, 0xc3, 0x33, 0x75, 0x8b, 0x34, 0xe3, 0xc4, - 0x17, 0xe3, 0xb4, 0x09, 0x7b, 0x94, 0x3c, 0xe8, 0x07, 0x71, 0xdf, 0x69, 0xc5, 0x6a, 0x49, 0xf0, - 0x28, 0x64, 0x01, 0x2d, 0x0b, 0xd6, 0x06, 0xb1, 0xca, 0xe1, 0x9f, 0x47, 0xdf, 0xeb, 0x54, 0x6c, - 0x07, 0x12, 0xbe, 0xa8, 0x60, 0x1a, 0x6f, 0xf4, 0x94, 0xbb, 0x05, 0xb5, 0xeb, 0x27, 0xc3, 0x15, - 0x3a, 0xb9, 0x6b, 0xcb, 0xc9, 0x26, 0xd6, 0x65, 0x78, 0x1a, 0x32, 0xe9, 0xb2, 0xc1, 0xdc, 0x95, - 0xd6, 0xe9, 0x2c, 0x3f, 0xed, 0x8e, 0xbc, 0xb9, 0x4c, 0xb2, 0x5c, 0x1c, 0x69, 0x7c, 0x1c, 0x32, - 0xea, 0xa0, 0xc1, 0xe5, 0x27, 0xa9, 0xd2, 0x89, 0x92, 0x62, 0xbc, 0x59, 0xcb, 0x96, 0xc7, 0xf4, - 0xa8, 0xf4, 0xac, 0x5a, 0xd6, 0x07, 0xd2, 0xca, 0x2d, 0x6f, 0xb7, 0xed, 0x9a, 0x9f, 0xed, 0x4e, - 0xee, 0xf3, 0xaa, 0x54, 0x3d, 0x3d, 0x7d, 0x7d, 0x20, 0xad, 0xbc, 0xfe, 0x59, 0xf4, 0x61, 0xd7, - 0xab, 0x9a, 0x14, 0x36, 0x7a, 0x4d, 0xa1, 0x79, 0xe1, 0xc9, 0x70, 0x05, 0x93, 0xea, 0x7f, 0x99, - 0xd5, 0x9c, 0x55, 0xab, 0xc9, 0x39, 0xbb, 0x6c, 0xef, 0x07, 0xbb, 0xa3, 0x55, 0x01, 0x63, 0x8b, - 0x20, 0x52, 0x7d, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x11, 0xd7, 0x84, 0x2b, 0x8b, 0xe8, 0x71, 0xe5, - 0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x97, 0x9e, 0xef, 0xfb, 0x8b, 0xda, 0xbd, 0xf8, 0xfc, 0xa0, - 0x1f, 0x34, 0xd9, 0x83, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, 0xfe, 0x92, 0xda, 0x08, 0x91, - 0x3d, 0x10, 0xa8, 0x49, 0x46, 0x77, 0xb2, 0x1c, 0xc4, 0xf9, 0xd8, 0xcb, 0xb3, 0xb3, 0x9c, 0x25, - 0x53, 0x94, 0x8c, 0x36, 0xe2, 0xb1, 0x2d, 0x27, 0x92, 0x51, 0x1f, 0x67, 0xae, 0x17, 0x35, 0xd2, - 0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0x2e, 0x25, 0x34, 0xb5, 0x90, 0xb8, 0x5e, 0xd4, 0x81, - 0xcc, 0x24, 0xd5, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, 0xd1, 0x12, 0x13, 0x93, 0x94, - 0x07, 0x33, 0x6b, 0xb2, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, 0x5a, 0x52, 0x42, 0xac, 0xc9, - 0x5c, 0xc2, 0xac, 0x2d, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, 0xde, 0xea, 0xaa, 0xb4, 0x32, - 0x62, 0x6d, 0x81, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, 0x15, 0x2b, 0xe3, 0x6b, 0x1e, - 0x85, 0xca, 0xba, 0xd9, 0x74, 0x9d, 0x94, 0x9b, 0x0b, 0x7a, 0xba, 0x6f, 0x9c, 0xd6, 0xc9, 0x0c, - 0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x41, 0xaf, 0x4b, 0xb9, 0xbd, 0xe2, 0x90, 0x4d, 0x95, - 0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x1c, 0x97, 0x1c, 0x26, 0xcb, 0x6c, 0xa6, - 0x27, 0x1c, 0x19, 0xb7, 0x6a, 0x74, 0x5c, 0x62, 0x98, 0xb1, 0x05, 0x11, 0xc7, 0x25, 0x24, 0xac, - 0x7c, 0xfe, 0xcb, 0x28, 0xba, 0x61, 0x98, 0xdd, 0x76, 0x17, 0x6b, 0xaf, 0x38, 0x63, 0xaf, 0x33, - 0x7e, 0xbe, 0x9f, 0x15, 0x17, 0x75, 0xfc, 0x19, 0x65, 0xd2, 0xcf, 0xeb, 0xa2, 0x7c, 0x7e, 0x65, - 0x3d, 0x93, 0x41, 0xb6, 0x5b, 0x3c, 0xe6, 0xec, 0x52, 0x6a, 0xa0, 0x0c, 0x52, 0xef, 0x04, 0x61, - 0x8e, 0xc8, 0x20, 0x43, 0xbc, 0x69, 0x62, 0xed, 0x3c, 0x67, 0x05, 0x6e, 0x62, 0x63, 0xa1, 0x11, - 0x12, 0x4d, 0xdc, 0x81, 0x4c, 0x3c, 0x6e, 0x45, 0x72, 0x37, 0x62, 0x33, 0xcf, 0x51, 0x3c, 0xd6, - 0xaa, 0x1a, 0x20, 0xe2, 0xb1, 0x17, 0x54, 0x7e, 0x8e, 0xa3, 0xef, 0x34, 0x8f, 0xf4, 0xa8, 0x82, - 0x65, 0x06, 0xf8, 0x98, 0xdd, 0x92, 0x10, 0xe3, 0xdf, 0x25, 0xcc, 0xc8, 0x3a, 0x2d, 0xea, 0x32, - 0x4f, 0xea, 0x73, 0x75, 0xf0, 0xea, 0xd6, 0xb9, 0x15, 0xe2, 0xa3, 0xd7, 0xbb, 0x3d, 0x94, 0x09, - 0xea, 0xad, 0x4c, 0x87, 0x98, 0x7b, 0x7e, 0xd5, 0x4e, 0x98, 0xb9, 0xdf, 0xcb, 0x99, 0x9d, 0xe0, - 0xdd, 0x24, 0xcf, 0xa1, 0x5a, 0xb5, 0xb2, 0x83, 0xa4, 0xc8, 0xce, 0xa0, 0xe6, 0x68, 0x27, 0x58, - 0x51, 0x63, 0x8c, 0x11, 0x3b, 0xc1, 0x01, 0xdc, 0x64, 0xf3, 0xc8, 0xf3, 0x5e, 0x31, 0x85, 0xb7, - 0x28, 0x9b, 0xc7, 0x76, 0x04, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x76, 0x44, 0x9f, 0xe7, 0x2c, 0xbd, - 0x50, 0x53, 0x80, 0xdb, 0xc0, 0x42, 0x82, 0xe7, 0x80, 0x5b, 0x21, 0xc4, 0x4c, 0x02, 0x42, 0x70, - 0x0c, 0x65, 0x9e, 0xa4, 0xf8, 0xae, 0x85, 0xd4, 0x51, 0x32, 0x62, 0x12, 0xc0, 0x0c, 0x2a, 0xae, - 0xba, 0xc3, 0xe1, 0x2b, 0x2e, 0xba, 0xc2, 0x71, 0x2b, 0x84, 0x98, 0x69, 0x50, 0x08, 0x26, 0x65, - 0x9e, 0x71, 0x34, 0x0c, 0xa4, 0x86, 0x90, 0x10, 0xc3, 0xc0, 0x25, 0x90, 0xc9, 0x03, 0xa8, 0x66, - 0xe0, 0x35, 0x29, 0x24, 0x41, 0x93, 0x2d, 0x61, 0xae, 0xe4, 0xc9, 0xba, 0xb3, 0x72, 0x85, 0xae, - 0xe4, 0xa9, 0x6a, 0xb1, 0x72, 0x45, 0x5c, 0xc9, 0x73, 0x00, 0x54, 0xc4, 0xa3, 0xa4, 0xe6, 0xfe, - 0x22, 0x0a, 0x49, 0xb0, 0x88, 0x2d, 0x61, 0xe6, 0x68, 0x59, 0xc4, 0x05, 0x47, 0x73, 0xb4, 0x2a, - 0x80, 0x75, 0x32, 0x7b, 0x9d, 0x94, 0x9b, 0x48, 0x22, 0x5b, 0x05, 0xf8, 0x4e, 0x06, 0xf9, 0xb4, - 0x46, 0x91, 0x44, 0x3d, 0xf7, 0x56, 0x4a, 0x44, 0x92, 0x2e, 0x85, 0xba, 0x92, 0xda, 0x37, 0xf6, - 0xd5, 0x0e, 0x6d, 0x19, 0xdf, 0x0a, 0x21, 0x26, 0x3e, 0xb5, 0x85, 0xde, 0x4a, 0xaa, 0x2a, 0x6b, - 0x26, 0xff, 0x7b, 0xfe, 0x02, 0xb5, 0x72, 0x22, 0x3e, 0xf9, 0x38, 0x34, 0xbc, 0xda, 0xc0, 0xed, - 0x2b, 0x18, 0x0e, 0xdd, 0xb7, 0x83, 0x8c, 0xc9, 0x38, 0x85, 0xc4, 0x3a, 0x5a, 0xf4, 0x3d, 0x4d, - 0xcf, 0xc9, 0xe2, 0xbd, 0x3e, 0xcc, 0xba, 0x32, 0xaf, 0x5d, 0x1c, 0xb0, 0x25, 0x9c, 0xb0, 0x17, - 0x6f, 0xb3, 0x9a, 0x67, 0xc5, 0x4c, 0xcd, 0xdc, 0xcf, 0x08, 0x4b, 0x3e, 0x98, 0xb8, 0x32, 0xdf, - 0xab, 0x64, 0x12, 0x08, 0x54, 0x96, 0x43, 0xb8, 0xf4, 0x26, 0x10, 0xd8, 0xa2, 0xe6, 0x88, 0x04, - 0x22, 0xc4, 0x9b, 0x7d, 0x14, 0xed, 0x5c, 0xbd, 0x57, 0x78, 0xc2, 0xda, 0x5c, 0x8e, 0xb2, 0x86, - 0x41, 0x62, 0x29, 0x1b, 0x54, 0x30, 0xeb, 0x4b, 0xed, 0xdf, 0x0c, 0xb1, 0x07, 0x84, 0x9d, 0xee, - 0x30, 0x7b, 0x38, 0x80, 0xf4, 0xb8, 0x32, 0xe7, 0xe3, 0x94, 0xab, 0xee, 0xf1, 0xf8, 0xc3, 0x01, - 0xa4, 0xb5, 0x27, 0x63, 0x57, 0xeb, 0x79, 0x92, 0x5e, 0xcc, 0x2a, 0xb6, 0x28, 0xa6, 0x5b, 0x2c, - 0x67, 0x15, 0xda, 0x93, 0x71, 0x4a, 0x8d, 0x50, 0x62, 0x4f, 0xa6, 0x47, 0xc5, 0x64, 0x70, 0x76, - 0x29, 0x36, 0xf3, 0x6c, 0x86, 0x57, 0xd4, 0x8e, 0x21, 0x01, 0x10, 0x19, 0x9c, 0x17, 0xf4, 0x74, - 0x22, 0xb9, 0xe2, 0xe6, 0x59, 0x9a, 0xe4, 0xd2, 0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x7b, 0x3b, 0x91, - 0x47, 0xc1, 0x53, 0xcf, 0x93, 0x45, 0x55, 0xec, 0x15, 0x9c, 0x91, 0xf5, 0x6c, 0x81, 0xde, 0x7a, - 0x5a, 0x20, 0x0a, 0xab, 0x27, 0xf0, 0xb6, 0x29, 0x4d, 0xf3, 0x8f, 0x2f, 0xac, 0x36, 0xbf, 0x8f, - 0x95, 0x3c, 0x14, 0x56, 0x11, 0x87, 0x2a, 0xa3, 0x9c, 0xc8, 0x0e, 0x13, 0xd0, 0x76, 0xbb, 0xc9, - 0x83, 0x7e, 0xd0, 0xef, 0x67, 0xc2, 0x57, 0x39, 0x84, 0xfc, 0x08, 0x60, 0x88, 0x9f, 0x16, 0x34, - 0xdb, 0x2d, 0x4e, 0x7d, 0xce, 0x21, 0xbd, 0xe8, 0x5c, 0xf7, 0x71, 0x0b, 0x2a, 0x11, 0x62, 0xbb, - 0x85, 0x40, 0xfd, 0x4d, 0xb4, 0x97, 0xb2, 0x22, 0xd4, 0x44, 0x8d, 0x7c, 0x48, 0x13, 0x29, 0xce, - 0x2c, 0x7e, 0xb5, 0x54, 0xf5, 0x4c, 0xd9, 0x4c, 0x6b, 0x84, 0x05, 0x1b, 0x22, 0x16, 0xbf, 0x24, - 0x6c, 0x72, 0x72, 0xec, 0xf3, 0xa0, 0x7b, 0xbf, 0xb7, 0x63, 0xe5, 0x80, 0xbe, 0xdf, 0x4b, 0xb1, - 0x74, 0x25, 0x65, 0x1f, 0xe9, 0xb1, 0xe2, 0xf6, 0x93, 0xc7, 0xc3, 0x60, 0xb3, 0xe4, 0x71, 0x7c, - 0x6e, 0xe5, 0x90, 0x54, 0xd2, 0xeb, 0x7a, 0xc0, 0x90, 0xc1, 0x88, 0x25, 0x4f, 0x00, 0x47, 0x21, - 0xcc, 0xf1, 0xbc, 0xc5, 0x0a, 0x0e, 0x05, 0xf7, 0x85, 0x30, 0xd7, 0x98, 0x02, 0x43, 0x21, 0x8c, - 0x52, 0x40, 0xfd, 0x56, 0xec, 0x07, 0x01, 0x3f, 0x4c, 0xe6, 0xde, 0x8c, 0x4d, 0xee, 0xf5, 0x48, - 0x79, 0xa8, 0xdf, 0x22, 0xce, 0x3a, 0x70, 0xb3, 0xbd, 0x9c, 0x24, 0xd5, 0x4c, 0xef, 0x6e, 0x4c, - 0xe3, 0x27, 0xb4, 0x1d, 0x97, 0x24, 0x0e, 0xdc, 0xc2, 0x1a, 0x28, 0xec, 0xec, 0xcd, 0x93, 0x99, - 0xae, 0xa9, 0xa7, 0x06, 0x42, 0xde, 0xa9, 0xea, 0x83, 0x7e, 0x10, 0xf9, 0x79, 0x95, 0x4d, 0x81, - 0x05, 0xfc, 0x08, 0xf9, 0x10, 0x3f, 0x18, 0x44, 0xd9, 0x5b, 0x53, 0x6f, 0xb9, 0xa2, 0xdb, 0x2c, - 0xa6, 0x6a, 0x1d, 0x3b, 0x26, 0x1e, 0x0f, 0xe2, 0x42, 0xd9, 0x1b, 0xc1, 0xa3, 0x31, 0xda, 0x6e, - 0xd0, 0x86, 0xc6, 0xa8, 0xde, 0x7f, 0x1d, 0x32, 0x46, 0x7d, 0xb0, 0xf2, 0xf9, 0x53, 0x35, 0x46, - 0xb7, 0x13, 0x9e, 0x34, 0x79, 0xfb, 0xab, 0x0c, 0x2e, 0xd5, 0x42, 0xd8, 0x53, 0xdf, 0x96, 0x1a, - 0x8b, 0x17, 0xbb, 0xd0, 0xaa, 0x78, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0x56, 0x08, 0xbd, 0xbe, 0xd1, - 0x52, 0x61, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0xde, 0x18, 0xed, 0xf5, 0x8d, 0x5e, 0x1b, 0xdd, 0x18, - 0xcc, 0x2b, 0xdf, 0x7f, 0xd5, 0x0e, 0x5c, 0xdb, 0x79, 0x93, 0x87, 0xa5, 0x3c, 0x5b, 0x82, 0x2f, - 0x9d, 0x74, 0xed, 0x69, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xd6, 0x67, 0x46, 0x7c, 0xa5, 0x38, 0x62, - 0x75, 0x26, 0x0e, 0xcc, 0x9f, 0x0d, 0x30, 0xda, 0xc2, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0x1c, 0x37, - 0x3a, 0xa8, 0xb9, 0xdd, 0xfb, 0x38, 0x60, 0xaf, 0x7b, 0xc9, 0x77, 0x7d, 0x20, 0x6d, 0x0e, 0xfe, - 0x1c, 0xc6, 0x3e, 0x71, 0x0c, 0xb5, 0xaa, 0xf7, 0xd0, 0xf1, 0xc9, 0x70, 0x05, 0xe5, 0xfe, 0x6f, - 0xda, 0x75, 0x05, 0xf6, 0xaf, 0x06, 0xc1, 0xd3, 0x21, 0x16, 0xd1, 0x40, 0x78, 0x76, 0x25, 0x1d, - 0x55, 0x90, 0xff, 0x18, 0x45, 0xb7, 0xbc, 0x05, 0x71, 0xcf, 0x9e, 0x7f, 0x77, 0x88, 0x6d, 0xff, - 0x19, 0xf4, 0x17, 0xdf, 0x46, 0x55, 0x95, 0xee, 0x1f, 0xda, 0xe5, 0x7d, 0xab, 0x21, 0xde, 0xc0, - 0x78, 0x59, 0x4d, 0xa1, 0x52, 0x23, 0x36, 0xd4, 0xe9, 0x0c, 0x8c, 0xc7, 0xed, 0xa7, 0x57, 0xd4, - 0xb2, 0x3e, 0x89, 0xe3, 0xc0, 0xea, 0xed, 0x37, 0xab, 0x3c, 0x21, 0xcb, 0x16, 0x8d, 0x0b, 0xf4, - 0xd9, 0x55, 0xd5, 0xa8, 0x91, 0x6c, 0xc1, 0xe2, 0x0d, 0xfb, 0x67, 0x03, 0x0d, 0x3b, 0xef, 0xdc, - 0x7f, 0x72, 0x35, 0x25, 0x55, 0x96, 0xff, 0x1a, 0x45, 0x77, 0x1d, 0xd6, 0x9c, 0x76, 0xa0, 0x3d, - 0x99, 0x1f, 0x05, 0xec, 0x53, 0x4a, 0xba, 0x70, 0xbf, 0xf7, 0xed, 0x94, 0xcd, 0xf7, 0x63, 0x1c, - 0x95, 0x9d, 0x2c, 0xe7, 0x50, 0x75, 0xbf, 0x1f, 0xe3, 0xda, 0x95, 0xd4, 0x98, 0xfe, 0x7e, 0x4c, - 0x00, 0xb7, 0xbe, 0x1f, 0xe3, 0xf1, 0xec, 0xfd, 0x7e, 0x8c, 0xd7, 0x5a, 0xf0, 0xfb, 0x31, 0x61, - 0x0d, 0x6a, 0xf2, 0x69, 0x8b, 0x20, 0x77, 0xd5, 0x07, 0x59, 0x74, 0x37, 0xd9, 0x9f, 0x5e, 0x45, - 0x85, 0x98, 0x7e, 0x25, 0x27, 0x6e, 0xc4, 0x0d, 0x78, 0xa6, 0xce, 0xad, 0xb8, 0x8d, 0xc1, 0xbc, - 0xf2, 0xfd, 0x13, 0xb5, 0xf6, 0xd2, 0x93, 0x0d, 0xab, 0xc4, 0xb7, 0x83, 0xd6, 0x42, 0x93, 0x47, - 0x63, 0xc1, 0x6e, 0xf9, 0xc7, 0xc3, 0x60, 0xa2, 0xba, 0x0d, 0xa1, 0x1a, 0x7d, 0xdc, 0x67, 0x08, - 0x35, 0xf9, 0xc6, 0x60, 0x9e, 0x98, 0xe4, 0xa4, 0x6f, 0xd9, 0xda, 0x03, 0x8c, 0xb9, 0x6d, 0xfd, - 0x64, 0xb8, 0x82, 0x72, 0xbf, 0x54, 0x49, 0xad, 0xed, 0x5e, 0xb4, 0xf3, 0x7a, 0x9f, 0xa9, 0x89, - 0xd3, 0xcc, 0xe3, 0xa1, 0x78, 0x28, 0xbd, 0xb1, 0x27, 0xf8, 0xbe, 0xf4, 0xc6, 0x3b, 0xc9, 0x7f, - 0x72, 0x35, 0x25, 0x55, 0x96, 0x7f, 0x1e, 0x45, 0xd7, 0xc9, 0xb2, 0xa8, 0x7e, 0xf0, 0xd9, 0x50, - 0xcb, 0xa8, 0x3f, 0x7c, 0x7e, 0x65, 0x3d, 0x55, 0xa8, 0x7f, 0x1b, 0x45, 0x37, 0x02, 0x85, 0x92, - 0x1d, 0xe4, 0x0a, 0xd6, 0xdd, 0x8e, 0xf2, 0xc3, 0xab, 0x2b, 0x52, 0xd3, 0xbd, 0x8d, 0x4f, 0xba, - 0x1f, 0x56, 0x09, 0xd8, 0x9e, 0xd0, 0x1f, 0x56, 0xe9, 0xd7, 0xc2, 0x5b, 0x50, 0x4d, 0x52, 0xa2, - 0x56, 0x46, 0xbe, 0x2d, 0x28, 0x91, 0xb3, 0xa0, 0x15, 0xd1, 0xfd, 0x5e, 0xce, 0xe7, 0xe4, 0xc5, - 0xdb, 0x32, 0x29, 0xa6, 0xb4, 0x13, 0x29, 0xef, 0x77, 0xa2, 0x39, 0xbc, 0x75, 0xd7, 0x48, 0x8f, - 0x59, 0xbb, 0xcc, 0x7b, 0x48, 0xe9, 0x6b, 0x24, 0xb8, 0x75, 0xd7, 0x41, 0x09, 0x6f, 0x2a, 0xa7, - 0x0d, 0x79, 0x43, 0xa9, 0xec, 0xa3, 0x21, 0x28, 0x5a, 0x40, 0x68, 0x6f, 0xfa, 0x44, 0xe0, 0x71, - 0xc8, 0x4a, 0xe7, 0x54, 0x60, 0x7d, 0x20, 0x4d, 0xb8, 0x9d, 0x00, 0xff, 0x12, 0x92, 0x29, 0x54, - 0x41, 0xb7, 0x9a, 0x1a, 0xe4, 0xd6, 0xa6, 0x7d, 0x6e, 0xb7, 0x58, 0xbe, 0x98, 0x17, 0xaa, 0x31, - 0x49, 0xb7, 0x36, 0xd5, 0xef, 0x16, 0xd1, 0x78, 0xd3, 0xd2, 0xb8, 0x15, 0xe9, 0xe5, 0xa3, 0xb0, - 0x19, 0x27, 0xab, 0x5c, 0x1b, 0xc4, 0xd2, 0xf5, 0x54, 0xdd, 0xa8, 0xa7, 0x9e, 0xa8, 0x27, 0xad, - 0x0f, 0xa4, 0xf1, 0xee, 0xa1, 0xe5, 0x56, 0xf7, 0xa7, 0x8d, 0x1e, 0x5b, 0x9d, 0x2e, 0xf5, 0x64, - 0xb8, 0x02, 0xde, 0xab, 0x55, 0xbd, 0xaa, 0x59, 0x17, 0xed, 0x64, 0x79, 0x1e, 0xaf, 0x05, 0xba, - 0x49, 0x0b, 0x05, 0xf7, 0x6a, 0x3d, 0x30, 0xd1, 0x93, 0xdb, 0xbd, 0xcd, 0x22, 0xee, 0xb3, 0x23, - 0xa8, 0x41, 0x3d, 0xd9, 0xa6, 0xd1, 0x7e, 0x9b, 0xf5, 0xa8, 0x75, 0x6d, 0xc7, 0xe1, 0x07, 0xd7, - 0xa9, 0xf0, 0xc6, 0x60, 0x1e, 0x5d, 0x06, 0x10, 0x94, 0x98, 0x59, 0xee, 0x50, 0x26, 0x9c, 0x99, - 0xe4, 0x6e, 0x0f, 0x85, 0xf6, 0x2c, 0xe5, 0x30, 0x7a, 0x9d, 0x4d, 0x67, 0xc0, 0xbd, 0xe7, 0x58, - 0x36, 0x10, 0x3c, 0xc7, 0x42, 0x20, 0x6a, 0x3a, 0xf9, 0xbb, 0xde, 0xac, 0xdd, 0x9b, 0xfa, 0x9a, - 0x4e, 0x29, 0x5b, 0x54, 0xa8, 0xe9, 0xbc, 0x34, 0x8a, 0x06, 0xda, 0xad, 0x7a, 0x89, 0xfe, 0x51, - 0xc8, 0x0c, 0x7a, 0x93, 0x7e, 0x6d, 0x10, 0x8b, 0x66, 0x14, 0xe3, 0x30, 0x9b, 0x67, 0xdc, 0x37, - 0xa3, 0x58, 0x36, 0x1a, 0x24, 0x34, 0xa3, 0x74, 0x51, 0xaa, 0x7a, 0x4d, 0x8e, 0xb0, 0x37, 0x0d, - 0x57, 0x4f, 0x32, 0xc3, 0xaa, 0xa7, 0xd9, 0xce, 0xb1, 0x6b, 0xa1, 0xbb, 0x0c, 0x3f, 0x57, 0x8b, - 0x65, 0x4f, 0xdf, 0x16, 0x2f, 0x57, 0x62, 0x30, 0x14, 0x75, 0x28, 0x05, 0x7c, 0x9c, 0xd0, 0x70, - 0xed, 0xc9, 0x70, 0x59, 0x42, 0x52, 0x25, 0x45, 0xea, 0x5d, 0x9c, 0x0a, 0x83, 0x1d, 0x32, 0xb4, - 0x38, 0x25, 0x35, 0xd0, 0xa1, 0xbe, 0xfb, 0x5a, 0xa4, 0x67, 0x28, 0xe8, 0xf7, 0x0f, 0xdd, 0xb7, - 0x22, 0x1f, 0x0e, 0x20, 0xf1, 0xa1, 0x7e, 0x0b, 0xe8, 0x6d, 0x79, 0xe9, 0xf4, 0xe3, 0x80, 0x29, - 0x17, 0x0d, 0x2d, 0x84, 0x69, 0x15, 0xd4, 0xa9, 0x75, 0x82, 0x0b, 0xfc, 0xc7, 0xb0, 0xf2, 0x75, - 0x6a, 0x93, 0x9f, 0x0a, 0x24, 0xd4, 0xa9, 0xbb, 0x28, 0xca, 0x33, 0xed, 0x75, 0xd0, 0xbd, 0x80, - 0xbe, 0xbd, 0xf4, 0xb9, 0xdf, 0xcb, 0xa1, 0x91, 0xb3, 0x9d, 0x2d, 0x9d, 0x53, 0x0c, 0x4f, 0x41, - 0xb7, 0xb3, 0xa5, 0xff, 0x10, 0x63, 0x6d, 0x10, 0x8b, 0x2f, 0x0c, 0x24, 0x1c, 0xde, 0xb6, 0x27, - 0xf9, 0x9e, 0xe2, 0x0a, 0x79, 0xe7, 0x28, 0xff, 0x41, 0x3f, 0x68, 0xae, 0xe7, 0x1e, 0x55, 0x2c, - 0x85, 0xba, 0x56, 0x5f, 0x9b, 0x73, 0xef, 0x3f, 0x29, 0xd9, 0x18, 0x7d, 0x6b, 0xee, 0x4e, 0x18, - 0x52, 0xb6, 0xbf, 0x8c, 0xde, 0xdd, 0x67, 0xb3, 0x09, 0x14, 0xd3, 0xf8, 0x07, 0xee, 0x85, 0x58, - 0x36, 0x1b, 0x37, 0x3f, 0x6b, 0x7b, 0xd7, 0x28, 0xb1, 0xb9, 0xd2, 0xb7, 0x0d, 0x6f, 0x16, 0xb3, - 0x09, 0x4f, 0x38, 0xba, 0xd2, 0x27, 0x7e, 0x1f, 0x37, 0x02, 0xe2, 0x4a, 0x9f, 0x03, 0x20, 0x7b, - 0x27, 0x15, 0x80, 0xd7, 0x5e, 0x23, 0x08, 0xda, 0x53, 0x80, 0x99, 0x75, 0xb5, 0xbd, 0x26, 0xb1, - 0xc5, 0x57, 0xf0, 0x8c, 0x8e, 0x90, 0x12, 0xb3, 0x6e, 0x97, 0x32, 0x9d, 0x41, 0x56, 0x5f, 0x7c, - 0x5b, 0x63, 0x31, 0x9f, 0x27, 0xd5, 0x0a, 0x75, 0x06, 0x55, 0x4b, 0x0b, 0x20, 0x3a, 0x83, 0x17, - 0x34, 0xbd, 0xbc, 0x7d, 0xcc, 0xe9, 0xc5, 0x2e, 0xab, 0xd8, 0x82, 0x67, 0x05, 0xe0, 0xef, 0x2b, - 0xe8, 0x07, 0x6a, 0x33, 0x44, 0x2f, 0xa7, 0x58, 0x93, 0x15, 0x0a, 0x42, 0xde, 0x0e, 0x14, 0xdf, - 0x6c, 0xad, 0x39, 0xab, 0xf0, 0xe9, 0xa0, 0xb4, 0x82, 0x21, 0x22, 0x2b, 0x24, 0x61, 0xd4, 0xf6, - 0x47, 0x59, 0x31, 0xf3, 0xb6, 0xfd, 0x91, 0xfd, 0xc5, 0xc3, 0x1b, 0x34, 0x60, 0xe2, 0xbb, 0x7c, - 0x68, 0xf2, 0x1b, 0x46, 0xea, 0x2d, 0x49, 0xef, 0x43, 0xb7, 0x09, 0x22, 0xbe, 0xfb, 0x49, 0xe4, - 0xea, 0x65, 0x09, 0x05, 0x4c, 0xdb, 0x3b, 0x70, 0x3e, 0x57, 0x0e, 0x11, 0x74, 0x85, 0x49, 0x13, - 0x55, 0x85, 0xfc, 0x78, 0x51, 0x1c, 0x55, 0xec, 0x2c, 0xcb, 0xa1, 0x42, 0x51, 0x55, 0xaa, 0x5b, - 0x72, 0x22, 0xaa, 0xfa, 0x38, 0x73, 0x99, 0x42, 0x48, 0x9d, 0x0f, 0x0f, 0x9f, 0x54, 0x49, 0x8a, - 0x2f, 0x53, 0x48, 0x1b, 0x5d, 0x8c, 0xd8, 0x49, 0x0b, 0xe0, 0xa6, 0xa7, 0x1f, 0x00, 0xaf, 0xb2, - 0xb4, 0x9e, 0x00, 0x3f, 0x4a, 0xaa, 0x64, 0x0e, 0x1c, 0x2a, 0xdc, 0xd3, 0x15, 0x32, 0x76, 0x18, - 0xa2, 0xa7, 0x53, 0xac, 0x72, 0xf8, 0xfb, 0xd1, 0xfb, 0x4d, 0xa0, 0x87, 0x42, 0x7d, 0x23, 0xff, - 0x85, 0xf8, 0xe3, 0x1a, 0xf1, 0x07, 0xda, 0xc6, 0x84, 0x57, 0x90, 0xcc, 0x5b, 0xdb, 0xef, 0xe9, - 0xdf, 0x05, 0xf8, 0x64, 0xd4, 0x34, 0xc8, 0x21, 0xe3, 0xd9, 0x59, 0xb3, 0xae, 0x52, 0xa7, 0x58, - 0xa8, 0x41, 0x6c, 0xf1, 0x38, 0xf0, 0xc9, 0x00, 0x1f, 0x67, 0x02, 0x8d, 0x2d, 0x3d, 0x86, 0x32, - 0xc7, 0x81, 0xc6, 0xd1, 0x16, 0x00, 0x11, 0x68, 0xbc, 0xa0, 0xe9, 0x5d, 0xb6, 0xf8, 0x04, 0xc2, - 0x95, 0x39, 0x81, 0x61, 0x95, 0x39, 0x71, 0xde, 0x11, 0xc8, 0xa3, 0xf7, 0x0f, 0x60, 0xfe, 0x06, - 0xaa, 0xfa, 0x3c, 0x2b, 0x77, 0x9b, 0x19, 0x36, 0xe1, 0x0b, 0xfc, 0x16, 0x9d, 0x21, 0xc6, 0x1a, - 0x21, 0xd2, 0x10, 0x02, 0x35, 0xa1, 0xcc, 0x00, 0x7b, 0xf5, 0x61, 0x32, 0x07, 0xf1, 0x01, 0x84, - 0x78, 0x8d, 0x32, 0x62, 0x41, 0x44, 0x28, 0x23, 0x61, 0xeb, 0x75, 0x23, 0xc3, 0x1c, 0xc3, 0xac, - 0xe9, 0x61, 0xd5, 0x51, 0xb2, 0x9a, 0x43, 0xc1, 0x95, 0x49, 0xb4, 0x09, 0x6b, 0x99, 0xf4, 0xf3, - 0xc4, 0x26, 0xec, 0x10, 0x3d, 0x2b, 0xe9, 0x76, 0x1e, 0xfc, 0x11, 0xab, 0xb8, 0xfc, 0x0b, 0x18, - 0xa7, 0x55, 0x8e, 0x92, 0x6e, 0xf7, 0xa1, 0x3a, 0x24, 0x91, 0x74, 0x87, 0x35, 0xac, 0x4f, 0x47, - 0x3b, 0x65, 0x78, 0x05, 0x95, 0xee, 0x27, 0x2f, 0xe6, 0x49, 0x96, 0xab, 0xde, 0xf0, 0x45, 0xc0, - 0x36, 0xa1, 0x43, 0x7c, 0x3a, 0x7a, 0xa8, 0xae, 0xf5, 0xb1, 0xed, 0x70, 0x09, 0xd1, 0x9e, 0x70, - 0x8f, 0x7d, 0x62, 0x4f, 0xb8, 0x5f, 0xcb, 0x2c, 0xd5, 0x0c, 0x2b, 0xb8, 0x95, 0x20, 0xb6, 0xd8, - 0x14, 0x6f, 0x10, 0x59, 0x36, 0x11, 0x48, 0x2c, 0xd5, 0x82, 0x0a, 0x66, 0x6e, 0x33, 0xd8, 0x4e, - 0x56, 0x24, 0x79, 0xf6, 0x53, 0x7c, 0xf7, 0xd9, 0xb2, 0xd3, 0x12, 0xc4, 0xdc, 0xe6, 0x27, 0x7d, - 0xae, 0x76, 0x81, 0x9f, 0x64, 0x4d, 0xe8, 0x7f, 0x10, 0x78, 0x6e, 0x82, 0xe8, 0x77, 0x65, 0x91, - 0xca, 0xd5, 0xcf, 0x46, 0xd1, 0x75, 0xfc, 0x58, 0x37, 0xcb, 0x72, 0xd2, 0xa4, 0x24, 0xc7, 0x90, - 0x42, 0x56, 0xf2, 0xf8, 0xd3, 0xf0, 0xb3, 0x42, 0x38, 0x71, 0xb2, 0x3e, 0x40, 0xcd, 0x3a, 0xaf, - 0x6d, 0x62, 0xc9, 0x44, 0xfe, 0x69, 0xa8, 0xd3, 0x1a, 0x2a, 0x35, 0x53, 0xee, 0x02, 0x47, 0xa3, - 0xd3, 0xe2, 0xc6, 0x16, 0xd8, 0x54, 0x94, 0x18, 0x9d, 0x61, 0x0d, 0xb3, 0xbb, 0x63, 0x71, 0xc7, - 0x50, 0xb3, 0x7c, 0x09, 0xe2, 0xfa, 0xdb, 0x63, 0xd2, 0x98, 0x45, 0x11, 0xbb, 0x3b, 0x34, 0x6d, - 0xd2, 0x8d, 0xae, 0xdb, 0xcd, 0x62, 0xb5, 0x87, 0xcf, 0xc8, 0x3d, 0x96, 0x04, 0x46, 0xa4, 0x1b, - 0x01, 0xdc, 0xda, 0xfd, 0xac, 0x58, 0x32, 0x4d, 0x93, 0x9a, 0x1f, 0x25, 0xab, 0x9c, 0x25, 0x53, - 0x31, 0xaf, 0xe3, 0xdd, 0xcf, 0x96, 0x19, 0xdb, 0x10, 0xb5, 0xfb, 0x49, 0xc1, 0x66, 0x65, 0xa7, - 0xfe, 0xe2, 0x95, 0xba, 0x5a, 0x78, 0x1b, 0xe5, 0x48, 0xa2, 0xbc, 0xf8, 0x5a, 0xe1, 0x9d, 0x30, - 0x64, 0x5e, 0x89, 0x92, 0x22, 0x91, 0x86, 0xdc, 0xf0, 0xe9, 0x38, 0x09, 0xc8, 0xcd, 0x00, 0x61, - 0x3e, 0x93, 0x20, 0x7f, 0x6f, 0xff, 0x68, 0x03, 0x57, 0x1f, 0xd1, 0x7d, 0xec, 0xd3, 0xb5, 0xa1, - 0xb1, 0xfd, 0x1d, 0xb2, 0xf5, 0x81, 0xb4, 0xf4, 0xfa, 0xfc, 0xe6, 0x7f, 0x7f, 0x7d, 0x6d, 0xf4, - 0xf3, 0xaf, 0xaf, 0x8d, 0xfe, 0xff, 0xeb, 0x6b, 0xa3, 0x9f, 0x7d, 0x73, 0xed, 0x9d, 0x9f, 0x7f, - 0x73, 0xed, 0x9d, 0xff, 0xfd, 0xe6, 0xda, 0x3b, 0x5f, 0xbd, 0xab, 0xfe, 0x74, 0xda, 0x9b, 0x5f, - 0x12, 0x7f, 0x00, 0xed, 0xd9, 0x2f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xe4, 0x86, 0x5e, - 0x6d, 0x00, 0x00, + 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xcf, 0xc0, + 0xe3, 0x3d, 0x22, 0x9e, 0xd0, 0xee, 0x3f, 0x72, 0xaa, 0xcc, 0xac, 0xfc, 0x88, 0xca, 0xc8, 0x2a, + 0xef, 0xd3, 0x8c, 0x3a, 0x7e, 0x11, 0x91, 0x59, 0x99, 0x19, 0x19, 0xf9, 0x51, 0xe5, 0xe8, 0x7a, + 0xf9, 0x66, 0xa3, 0xac, 0x18, 0x67, 0xf5, 0x46, 0x0d, 0xd5, 0x32, 0x4b, 0xa1, 0xfd, 0x77, 0x2c, + 0x7e, 0x8e, 0xdf, 0x4d, 0x8a, 0x15, 0x5f, 0x95, 0xf0, 0xd1, 0x87, 0x86, 0x4c, 0xd9, 0x7c, 0x9e, + 0x14, 0xd3, 0x5a, 0x22, 0x1f, 0x7d, 0x60, 0x24, 0xb0, 0x84, 0x82, 0xab, 0xdf, 0x9f, 0xfe, 0xf7, + 0xff, 0x8d, 0xa2, 0xf7, 0xb6, 0xf2, 0x0c, 0x0a, 0xbe, 0xa5, 0x34, 0xe2, 0xaf, 0xa2, 0xef, 0x6e, + 0x96, 0xe5, 0x2e, 0xf0, 0x57, 0x50, 0xd5, 0x19, 0x2b, 0xe2, 0xdb, 0x63, 0xe5, 0x60, 0x7c, 0x5c, + 0xa6, 0xe3, 0xcd, 0xb2, 0x1c, 0x1b, 0xe1, 0xf8, 0x18, 0x7e, 0xb2, 0x80, 0x9a, 0x7f, 0x74, 0x27, + 0x0c, 0xd5, 0x25, 0x2b, 0x6a, 0x88, 0xcf, 0xa2, 0xdf, 0xd8, 0x2c, 0xcb, 0x09, 0xf0, 0x6d, 0x68, + 0x2a, 0x30, 0xe1, 0x09, 0x87, 0xf8, 0x7e, 0x47, 0xd5, 0x05, 0xb4, 0x8f, 0x07, 0xfd, 0xa0, 0xf2, + 0x73, 0x12, 0x7d, 0xa7, 0xf1, 0x73, 0xbe, 0xe0, 0x53, 0x76, 0x59, 0xc4, 0x37, 0xbb, 0x8a, 0x4a, + 0xa4, 0x6d, 0xdf, 0x0a, 0x21, 0xca, 0xea, 0xeb, 0xe8, 0x57, 0x5f, 0x27, 0x79, 0x0e, 0x7c, 0xab, + 0x82, 0xa6, 0xe0, 0xae, 0x8e, 0x14, 0x8d, 0xa5, 0x4c, 0xdb, 0xbd, 0x1d, 0x64, 0x94, 0xe1, 0xaf, + 0xa2, 0xef, 0x4a, 0xc9, 0x31, 0xa4, 0x6c, 0x09, 0x55, 0xec, 0xd5, 0x52, 0x42, 0xe2, 0x91, 0x77, + 0x20, 0x6c, 0x7b, 0x8b, 0x15, 0x4b, 0xa8, 0xb8, 0xdf, 0xb6, 0x12, 0x86, 0x6d, 0x1b, 0x48, 0xd9, + 0xfe, 0xbb, 0x51, 0xf4, 0xfd, 0xcd, 0x34, 0x65, 0x8b, 0x82, 0xef, 0xb3, 0x34, 0xc9, 0xf7, 0xb3, + 0xe2, 0xe2, 0x10, 0x2e, 0xb7, 0xce, 0x1b, 0xbe, 0x98, 0x41, 0xfc, 0xcc, 0x7d, 0xaa, 0x12, 0x1d, + 0x6b, 0x76, 0x6c, 0xc3, 0xda, 0xf7, 0x27, 0x57, 0x53, 0x52, 0x65, 0xf9, 0xa7, 0x51, 0x74, 0x0d, + 0x97, 0x65, 0xc2, 0xf2, 0x25, 0x98, 0xd2, 0x7c, 0xda, 0x63, 0xd8, 0xc5, 0x75, 0x79, 0x3e, 0xbb, + 0xaa, 0x9a, 0x2a, 0x51, 0x1e, 0xbd, 0x6f, 0x77, 0x97, 0x09, 0xd4, 0x62, 0x38, 0x3d, 0xa4, 0x7b, + 0x84, 0x42, 0xb4, 0xe7, 0x47, 0x43, 0x50, 0xe5, 0x2d, 0x8b, 0x62, 0xe5, 0x2d, 0x67, 0xb5, 0x76, + 0xf6, 0xc0, 0x6b, 0xc1, 0x22, 0xb4, 0xaf, 0x87, 0x03, 0x48, 0xe5, 0xea, 0x8f, 0xa3, 0x5f, 0x7b, + 0xcd, 0xaa, 0x8b, 0xba, 0x4c, 0x52, 0x50, 0x43, 0xe1, 0xae, 0xab, 0xdd, 0x4a, 0xf1, 0x68, 0xb8, + 0xd7, 0x87, 0x59, 0x9d, 0xb6, 0x15, 0xbe, 0x2c, 0x01, 0xc7, 0x20, 0xa3, 0xd8, 0x08, 0xa9, 0x4e, + 0x8b, 0x21, 0x65, 0xfb, 0x22, 0x8a, 0x8d, 0xed, 0x37, 0x7f, 0x02, 0x29, 0xdf, 0x9c, 0x4e, 0x71, + 0xab, 0x18, 0x5d, 0x41, 0x8c, 0x37, 0xa7, 0x53, 0xaa, 0x55, 0xfc, 0xa8, 0x72, 0x76, 0x19, 0x7d, + 0x80, 0x9c, 0xed, 0x67, 0xb5, 0x70, 0xb8, 0x1e, 0xb6, 0xa2, 0x30, 0xed, 0x74, 0x3c, 0x14, 0x57, + 0x8e, 0xff, 0x62, 0x14, 0x7d, 0xcf, 0xe3, 0xf9, 0x18, 0xe6, 0x6c, 0x09, 0xf1, 0x93, 0x7e, 0x6b, + 0x92, 0xd4, 0xfe, 0x3f, 0xbe, 0x82, 0x86, 0xa7, 0x9b, 0x4c, 0x20, 0x87, 0x94, 0x93, 0xdd, 0x44, + 0x8a, 0x7b, 0xbb, 0x89, 0xc6, 0xac, 0x11, 0xd6, 0x0a, 0x77, 0x81, 0x6f, 0x2d, 0xaa, 0x0a, 0x0a, + 0x4e, 0xb6, 0xa5, 0x41, 0x7a, 0xdb, 0xd2, 0x41, 0x3d, 0xf5, 0xd9, 0x05, 0xbe, 0x99, 0xe7, 0x64, + 0x7d, 0xa4, 0xb8, 0xb7, 0x3e, 0x1a, 0x53, 0x1e, 0xd2, 0xe8, 0xd7, 0xad, 0x27, 0xc6, 0xf7, 0x8a, + 0x33, 0x16, 0xd3, 0xcf, 0x42, 0xc8, 0xb5, 0x8f, 0xfb, 0xbd, 0x9c, 0xa7, 0x1a, 0x2f, 0xde, 0x96, + 0xac, 0xa2, 0x9b, 0x45, 0x8a, 0x7b, 0xab, 0xa1, 0x31, 0xe5, 0xe1, 0x8f, 0xa2, 0xf7, 0x54, 0x94, + 0x6c, 0xe7, 0xb3, 0x3b, 0xde, 0x10, 0x8a, 0x27, 0xb4, 0xbb, 0x3d, 0x94, 0x09, 0x0e, 0x4a, 0xa6, + 0x82, 0xcf, 0x6d, 0xaf, 0x1e, 0x0a, 0x3d, 0x77, 0xc2, 0x50, 0xc7, 0xf6, 0x36, 0xe4, 0x40, 0xda, + 0x96, 0xc2, 0x1e, 0xdb, 0x1a, 0x52, 0xb6, 0xab, 0xe8, 0xb7, 0xf4, 0x63, 0x69, 0xe6, 0x51, 0x21, + 0x6f, 0x82, 0xf4, 0x1a, 0x51, 0x6f, 0x1b, 0xd2, 0xbe, 0x1e, 0x0f, 0x83, 0x3b, 0xf5, 0x51, 0x23, + 0xd0, 0x5f, 0x1f, 0x34, 0xfe, 0xee, 0x84, 0x21, 0x65, 0xfb, 0xef, 0x47, 0xd1, 0x0f, 0x94, 0xec, + 0x45, 0x91, 0xbc, 0xc9, 0x41, 0x4c, 0x89, 0x87, 0xc0, 0x2f, 0x59, 0x75, 0x31, 0x59, 0x15, 0x29, + 0x31, 0xfd, 0xfb, 0xe1, 0x9e, 0xe9, 0x9f, 0x54, 0xb2, 0x32, 0x3e, 0x55, 0x51, 0xce, 0x4a, 0x9c, + 0xf1, 0xb5, 0x35, 0xe0, 0xac, 0xa4, 0x32, 0x3e, 0x17, 0xe9, 0x58, 0x3d, 0x68, 0xc2, 0xa6, 0xdf, + 0xea, 0x81, 0x1d, 0x27, 0x6f, 0x85, 0x10, 0x13, 0xb6, 0xda, 0x0e, 0xcc, 0x8a, 0xb3, 0x6c, 0x76, + 0x5a, 0x4e, 0x9b, 0x6e, 0xfc, 0xd0, 0xdf, 0x43, 0x2d, 0x84, 0x08, 0x5b, 0x04, 0xaa, 0xbc, 0xfd, + 0xa3, 0x49, 0x8c, 0xd4, 0x50, 0xda, 0xa9, 0xd8, 0x7c, 0x1f, 0x66, 0x49, 0xba, 0x52, 0xe3, 0xff, + 0x93, 0xd0, 0xc0, 0xc3, 0xb4, 0x2e, 0xc4, 0xa7, 0x57, 0xd4, 0x52, 0xe5, 0xf9, 0xcf, 0x51, 0x74, + 0xa7, 0xad, 0xfe, 0x79, 0x52, 0xcc, 0x40, 0xb5, 0xa7, 0x2c, 0xfd, 0x66, 0x31, 0x3d, 0x86, 0x9a, + 0x27, 0x15, 0x8f, 0xbf, 0xf0, 0x57, 0x32, 0xa4, 0xa3, 0xcb, 0xf6, 0xa3, 0x6f, 0xa5, 0x6b, 0x5a, + 0x7d, 0xd2, 0x04, 0x36, 0x15, 0x02, 0xdc, 0x56, 0x17, 0x12, 0x1c, 0x00, 0x6e, 0x85, 0x10, 0xd3, + 0xea, 0x42, 0xb0, 0x57, 0x2c, 0x33, 0x0e, 0xbb, 0x50, 0x40, 0xd5, 0x6d, 0x75, 0xa9, 0xea, 0x22, + 0x44, 0xab, 0x13, 0xa8, 0x09, 0x36, 0x8e, 0x37, 0x3d, 0x39, 0xae, 0x05, 0x8c, 0x74, 0xa6, 0xc7, + 0xc7, 0xc3, 0x60, 0xb3, 0xba, 0xb3, 0x7c, 0x1e, 0xc3, 0x92, 0x5d, 0xe0, 0xd5, 0x9d, 0x6d, 0x42, + 0x02, 0xc4, 0xea, 0xce, 0x0b, 0x9a, 0x19, 0xcc, 0xf2, 0xf3, 0x2a, 0x83, 0x4b, 0x34, 0x83, 0xd9, + 0xca, 0x8d, 0x98, 0x98, 0xc1, 0x3c, 0x98, 0xf2, 0x70, 0x18, 0xfd, 0x8a, 0x10, 0xfe, 0x01, 0xcb, + 0x8a, 0xf8, 0xba, 0x47, 0xa9, 0x11, 0x68, 0xab, 0x37, 0x68, 0x00, 0x95, 0xb8, 0xf9, 0x75, 0x2b, + 0x29, 0x52, 0xc8, 0xbd, 0x25, 0x36, 0xe2, 0x60, 0x89, 0x1d, 0xcc, 0xa4, 0x0e, 0x42, 0xd8, 0xc4, + 0xaf, 0xc9, 0x79, 0x52, 0x65, 0xc5, 0x2c, 0xf6, 0xe9, 0x5a, 0x72, 0x22, 0x75, 0xf0, 0x71, 0xa8, + 0x0b, 0x2b, 0xc5, 0xcd, 0xb2, 0xac, 0x9a, 0xb0, 0xe8, 0xeb, 0xc2, 0x2e, 0x12, 0xec, 0xc2, 0x1d, + 0xd4, 0xef, 0x6d, 0x1b, 0xd2, 0x3c, 0x2b, 0x82, 0xde, 0x14, 0x32, 0xc4, 0x9b, 0x41, 0x51, 0xe7, + 0xdd, 0x87, 0x64, 0x09, 0x6d, 0xcd, 0x7c, 0x4f, 0xc6, 0x06, 0x82, 0x9d, 0x17, 0x81, 0x66, 0x9d, + 0x26, 0xc4, 0x07, 0xc9, 0x05, 0x34, 0x0f, 0x18, 0x9a, 0x79, 0x2d, 0xf6, 0xe9, 0x3b, 0x04, 0xb1, + 0x4e, 0xf3, 0x93, 0xca, 0xd5, 0x22, 0xfa, 0x40, 0xc8, 0x8f, 0x92, 0x8a, 0x67, 0x69, 0x56, 0x26, + 0x45, 0x9b, 0xff, 0xfb, 0xc6, 0x75, 0x87, 0xd2, 0x2e, 0xd7, 0x07, 0xd2, 0xca, 0xed, 0xbf, 0x8f, + 0xa2, 0x9b, 0xd8, 0xef, 0x11, 0x54, 0xf3, 0x4c, 0x2c, 0x23, 0x6b, 0x19, 0x84, 0xe3, 0xcf, 0xc3, + 0x46, 0x3b, 0x0a, 0xba, 0x34, 0x3f, 0xbc, 0xba, 0xa2, 0x2a, 0xd8, 0x1f, 0x46, 0x91, 0x5c, 0xae, + 0x88, 0x25, 0xa5, 0x3b, 0x6a, 0xd5, 0x3a, 0xc6, 0x59, 0x4f, 0xde, 0x0c, 0x10, 0x66, 0xaa, 0x90, + 0xbf, 0x8b, 0x95, 0x72, 0xec, 0xd5, 0x10, 0x22, 0x62, 0xaa, 0x40, 0x08, 0x2e, 0xe8, 0xe4, 0x9c, + 0x5d, 0xfa, 0x0b, 0xda, 0x48, 0xc2, 0x05, 0x55, 0x84, 0xd9, 0xbb, 0x52, 0x05, 0xf5, 0xed, 0x5d, + 0xb5, 0xc5, 0x08, 0xed, 0x5d, 0x61, 0x46, 0x19, 0x66, 0xd1, 0x6f, 0xda, 0x86, 0x9f, 0x33, 0x76, + 0x31, 0x4f, 0xaa, 0x8b, 0xf8, 0x11, 0xad, 0xdc, 0x32, 0xda, 0xd1, 0xda, 0x20, 0xd6, 0x84, 0x05, + 0xdb, 0x61, 0x93, 0x68, 0x9c, 0x56, 0x39, 0x0a, 0x0b, 0x8e, 0x0d, 0x85, 0x10, 0x61, 0x81, 0x40, + 0x4d, 0xe4, 0xb6, 0xbd, 0x4d, 0x00, 0xaf, 0x96, 0x1c, 0xf5, 0x09, 0x50, 0xab, 0x25, 0x0f, 0x86, + 0xbb, 0xd0, 0x6e, 0x95, 0x94, 0xe7, 0xfe, 0x2e, 0x24, 0x44, 0xe1, 0x2e, 0xd4, 0x22, 0xb8, 0xbd, + 0x27, 0x90, 0x54, 0xe9, 0xb9, 0xbf, 0xbd, 0xa5, 0x2c, 0xdc, 0xde, 0x9a, 0xc1, 0xed, 0x2d, 0x05, + 0xaf, 0x33, 0x7e, 0x7e, 0x00, 0x3c, 0xf1, 0xb7, 0xb7, 0xcb, 0x84, 0xdb, 0xbb, 0xc3, 0x9a, 0x4c, + 0xc6, 0x76, 0x38, 0x59, 0xbc, 0xa9, 0xd3, 0x2a, 0x7b, 0x03, 0x71, 0xc0, 0x8a, 0x86, 0x88, 0x4c, + 0x86, 0x84, 0x4d, 0x90, 0x56, 0x3e, 0x5b, 0xd9, 0xde, 0xb4, 0x46, 0x41, 0xba, 0xb5, 0x61, 0x11, + 0x44, 0x90, 0xf6, 0x93, 0xb8, 0x7a, 0xbb, 0x15, 0x5b, 0x94, 0x75, 0x4f, 0xf5, 0x10, 0x14, 0xae, + 0x5e, 0x17, 0x56, 0x3e, 0xdf, 0x46, 0xbf, 0x6d, 0x3f, 0xd2, 0xd3, 0xa2, 0xd6, 0x5e, 0xd7, 0xe9, + 0xe7, 0x64, 0x61, 0xc4, 0xb6, 0x54, 0x00, 0x37, 0x69, 0x4a, 0xeb, 0x99, 0x6f, 0x03, 0x4f, 0xb2, + 0xbc, 0x8e, 0xef, 0xf9, 0x6d, 0xb4, 0x72, 0x22, 0x4d, 0xf1, 0x71, 0x78, 0xcc, 0x6e, 0x2f, 0xca, + 0x3c, 0x4b, 0xbb, 0xfb, 0x93, 0x4a, 0x57, 0x8b, 0xc3, 0x63, 0xd6, 0xc6, 0x70, 0x0c, 0x9a, 0x00, + 0x97, 0xff, 0x39, 0x59, 0x95, 0xe0, 0x8f, 0x41, 0x0e, 0x12, 0x8e, 0x41, 0x18, 0xc5, 0xf5, 0x99, + 0x00, 0xdf, 0x4f, 0x56, 0x6c, 0x41, 0xc4, 0x20, 0x2d, 0x0e, 0xd7, 0xc7, 0xc6, 0x4c, 0xa6, 0xa0, + 0x3d, 0xec, 0x15, 0x1c, 0xaa, 0x22, 0xc9, 0x77, 0xf2, 0x64, 0x56, 0xc7, 0xc4, 0xb8, 0x71, 0x29, + 0x22, 0x53, 0xa0, 0x69, 0xcf, 0x63, 0xdc, 0xab, 0x77, 0x92, 0x25, 0xab, 0x32, 0x4e, 0x3f, 0x46, + 0x83, 0xf4, 0x3e, 0x46, 0x07, 0xf5, 0x7a, 0xdb, 0xac, 0xd2, 0xf3, 0x6c, 0x09, 0xd3, 0x80, 0xb7, + 0x16, 0x19, 0xe0, 0xcd, 0x42, 0x3d, 0x8d, 0x36, 0x61, 0x8b, 0x2a, 0x05, 0xb2, 0xd1, 0xa4, 0xb8, + 0xb7, 0xd1, 0x34, 0xa6, 0x3c, 0xfc, 0xf5, 0x28, 0xfa, 0x1d, 0x29, 0xb5, 0x37, 0x0d, 0xb7, 0x93, + 0xfa, 0xfc, 0x0d, 0x4b, 0xaa, 0x69, 0xfc, 0xb1, 0xcf, 0x8e, 0x17, 0xd5, 0xae, 0x9f, 0x5e, 0x45, + 0x05, 0x3f, 0xd6, 0xfd, 0xac, 0xb6, 0x46, 0x9c, 0xf7, 0xb1, 0x3a, 0x48, 0xf8, 0xb1, 0x62, 0x14, + 0x07, 0x10, 0x21, 0x97, 0x0b, 0xf4, 0x7b, 0xa4, 0xbe, 0xbb, 0x4a, 0xbf, 0xdf, 0xcb, 0xe1, 0xf8, + 0xd8, 0x08, 0xdd, 0xde, 0xb2, 0x4e, 0xd9, 0xf0, 0xf7, 0x98, 0xf1, 0x50, 0x9c, 0xf4, 0xac, 0x47, + 0x45, 0xd8, 0x73, 0x67, 0x64, 0x8c, 0x87, 0xe2, 0x84, 0x67, 0x2b, 0xac, 0x85, 0x3c, 0x7b, 0x42, + 0xdb, 0x78, 0x28, 0x8e, 0x33, 0x0a, 0xc5, 0xb4, 0xf3, 0xc2, 0xa3, 0x80, 0x1d, 0x3c, 0x37, 0xac, + 0x0d, 0x62, 0x95, 0xc3, 0xbf, 0x1d, 0x45, 0xdf, 0x37, 0x1e, 0x0f, 0xd8, 0x34, 0x3b, 0x5b, 0x49, + 0xe8, 0x55, 0x92, 0x2f, 0xa0, 0x8e, 0x9f, 0x52, 0xd6, 0xba, 0xac, 0x2e, 0xc1, 0xb3, 0x2b, 0xe9, + 0xe0, 0xb1, 0xb3, 0x59, 0x96, 0xf9, 0xea, 0x04, 0xe6, 0x65, 0x4e, 0x8e, 0x1d, 0x07, 0x09, 0x8f, + 0x1d, 0x8c, 0xe2, 0x4c, 0xf3, 0x84, 0x35, 0x79, 0xac, 0x37, 0xd3, 0x14, 0xa2, 0x70, 0xa6, 0xd9, + 0x22, 0x38, 0x57, 0x3a, 0x61, 0x5b, 0x2c, 0xcf, 0x21, 0xe5, 0xdd, 0x83, 0x47, 0xad, 0x69, 0x88, + 0x70, 0xae, 0x84, 0x48, 0xb3, 0x46, 0x6f, 0xd7, 0x45, 0x49, 0x05, 0xcf, 0x57, 0xfb, 0x59, 0x71, + 0x11, 0xfb, 0xd3, 0x02, 0x03, 0x10, 0x6b, 0x74, 0x2f, 0x88, 0xd7, 0x5f, 0xa7, 0xc5, 0x94, 0xf9, + 0xd7, 0x5f, 0x8d, 0x24, 0xbc, 0xfe, 0x52, 0x04, 0x36, 0x79, 0x0c, 0x94, 0xc9, 0x46, 0x12, 0x36, + 0xa9, 0x08, 0x5f, 0x28, 0x54, 0x3b, 0xb9, 0x64, 0x28, 0x44, 0x7b, 0xb7, 0xf7, 0x7b, 0x39, 0xdc, + 0x43, 0xdb, 0x85, 0xd8, 0x0e, 0xf0, 0xf4, 0xdc, 0xdf, 0x43, 0x1d, 0x24, 0xdc, 0x43, 0x31, 0x8a, + 0xab, 0x74, 0xc2, 0xf4, 0x42, 0xf2, 0x9e, 0xbf, 0x7f, 0x74, 0x16, 0x91, 0xf7, 0x7b, 0x39, 0xbc, + 0x34, 0xda, 0x9b, 0x8b, 0x67, 0xe6, 0xed, 0xe4, 0x52, 0x16, 0x5e, 0x1a, 0x69, 0x06, 0x97, 0x5e, + 0x0a, 0x9a, 0xc7, 0xe9, 0x2f, 0xbd, 0x91, 0x87, 0x4b, 0xef, 0x70, 0xca, 0xc9, 0xbf, 0x8e, 0xa2, + 0xeb, 0xb6, 0x97, 0x43, 0xd6, 0x8c, 0x91, 0x57, 0x49, 0x9e, 0x4d, 0x13, 0x0e, 0x27, 0xec, 0x02, + 0x0a, 0xb4, 0xb7, 0xe2, 0x96, 0x56, 0xf2, 0x63, 0x47, 0x81, 0xd8, 0x5b, 0x19, 0xa4, 0x88, 0xfb, + 0x89, 0xa4, 0x4f, 0x6b, 0xd8, 0x4a, 0x6a, 0x22, 0x92, 0x39, 0x48, 0xb8, 0x9f, 0x60, 0x14, 0xe7, + 0xab, 0x52, 0xfe, 0xe2, 0x6d, 0x09, 0x55, 0x06, 0x45, 0x0a, 0xfe, 0x7c, 0x15, 0x53, 0xe1, 0x7c, + 0xd5, 0x43, 0x77, 0xb6, 0x1e, 0x74, 0x70, 0xea, 0xde, 0x1d, 0xc0, 0x44, 0xe0, 0xee, 0x00, 0x81, + 0xe2, 0x4a, 0x1a, 0xc0, 0xbb, 0x7d, 0xd7, 0xb1, 0x12, 0xdc, 0xbe, 0xa3, 0xe9, 0xce, 0x86, 0x8e, + 0x66, 0x26, 0xcd, 0x30, 0xe9, 0x29, 0xfa, 0xc4, 0x1e, 0x2e, 0x6b, 0x83, 0x58, 0xff, 0x0e, 0xd2, + 0x31, 0xe4, 0x89, 0x98, 0x42, 0x02, 0xdb, 0x34, 0x2d, 0x33, 0x64, 0x07, 0xc9, 0x62, 0x95, 0xc3, + 0xbf, 0x1c, 0x45, 0x1f, 0xf9, 0x3c, 0xbe, 0x2c, 0x85, 0xdf, 0x27, 0xfd, 0xb6, 0x24, 0x49, 0x5c, + 0x8e, 0x08, 0x6b, 0xa8, 0x32, 0xfc, 0x69, 0xf4, 0x61, 0x2b, 0x32, 0x77, 0x27, 0x54, 0x01, 0xdc, + 0x04, 0x4a, 0x97, 0x1f, 0x73, 0xda, 0xfd, 0xc6, 0x60, 0xde, 0xac, 0x4d, 0xdc, 0x72, 0xd5, 0x68, + 0x6d, 0xa2, 0x6d, 0x28, 0x31, 0xb1, 0x36, 0xf1, 0x60, 0x66, 0x57, 0xc3, 0xae, 0xde, 0xeb, 0x8c, + 0x9f, 0x8b, 0xdc, 0x07, 0xed, 0x6a, 0x38, 0x65, 0xd5, 0x10, 0xb1, 0xab, 0x41, 0xc2, 0x38, 0x3b, + 0x68, 0xc1, 0x66, 0x6c, 0xfa, 0xe2, 0xaa, 0x36, 0x64, 0x8f, 0xcc, 0x07, 0xfd, 0x20, 0xee, 0xaf, + 0xad, 0x58, 0x2d, 0x43, 0x1e, 0x85, 0x2c, 0xa0, 0xa5, 0xc8, 0xda, 0x20, 0x56, 0x39, 0xfc, 0xf3, + 0xe8, 0x7b, 0x9d, 0x8a, 0xed, 0x40, 0xc2, 0x17, 0x15, 0x4c, 0xe3, 0x8d, 0x9e, 0x72, 0xb7, 0xa0, + 0x76, 0xfd, 0x64, 0xb8, 0x42, 0x27, 0x5f, 0x6e, 0x39, 0xd9, 0xad, 0x74, 0x19, 0x9e, 0x86, 0x4c, + 0xba, 0x6c, 0x30, 0x5f, 0xa6, 0x75, 0x3a, 0x4b, 0x5e, 0xbb, 0x77, 0x6d, 0x2e, 0x93, 0x2c, 0x17, + 0xc7, 0x28, 0x1f, 0x87, 0x8c, 0x3a, 0x68, 0x70, 0xc9, 0x4b, 0xaa, 0x74, 0x22, 0xb3, 0x18, 0xe3, + 0xd6, 0x52, 0xe9, 0x31, 0x1d, 0x09, 0x3c, 0x2b, 0xa5, 0xf5, 0x81, 0xb4, 0x72, 0xcb, 0xdb, 0xad, + 0xc2, 0xe6, 0x67, 0xbb, 0x93, 0xfb, 0xbc, 0x2a, 0x55, 0x4f, 0x4f, 0x5f, 0x1f, 0x48, 0x2b, 0xaf, + 0x7f, 0x16, 0x7d, 0xd8, 0xf5, 0xaa, 0x26, 0xa2, 0x8d, 0x5e, 0x53, 0x68, 0x2e, 0x7a, 0x32, 0x5c, + 0xc1, 0x2c, 0x2f, 0xbe, 0xcc, 0x6a, 0xce, 0xaa, 0xd5, 0xe4, 0x9c, 0x5d, 0xb6, 0x77, 0x92, 0xdd, + 0xd1, 0xaa, 0x80, 0xb1, 0x45, 0x10, 0xcb, 0x0b, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x2e, 0xd7, 0x84, + 0x2b, 0x8b, 0xe8, 0x71, 0xe5, 0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x17, 0xad, 0xef, 0xfb, 0x8b, + 0xda, 0xbd, 0x6c, 0xfd, 0xa0, 0x1f, 0x34, 0x19, 0x8b, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, + 0xfe, 0x92, 0xda, 0x08, 0x91, 0xb1, 0x10, 0xa8, 0x49, 0x80, 0x77, 0xb2, 0x1c, 0xc4, 0x99, 0xdc, + 0xcb, 0xb3, 0xb3, 0x9c, 0x25, 0x53, 0x94, 0x00, 0x37, 0xe2, 0xb1, 0x2d, 0x27, 0x12, 0x60, 0x1f, + 0x67, 0xae, 0x34, 0x35, 0xd2, 0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0xa2, 0x25, 0x34, 0xb5, + 0x90, 0xb8, 0xd2, 0xd4, 0x81, 0xcc, 0xc4, 0xd8, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, + 0xd1, 0x12, 0x13, 0x13, 0xa3, 0x07, 0x33, 0xeb, 0xc0, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, + 0x5a, 0x52, 0x42, 0xac, 0x03, 0x5d, 0xc2, 0xac, 0x67, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, + 0xde, 0xea, 0xaa, 0xb4, 0x32, 0x62, 0x3d, 0x83, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, + 0x15, 0x2b, 0xe3, 0x6b, 0x1e, 0x85, 0xca, 0xba, 0x4d, 0x75, 0x9d, 0x94, 0x9b, 0x4b, 0x81, 0xba, + 0x6f, 0x9c, 0xd6, 0xc9, 0x0c, 0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x29, 0xb0, 0x4b, 0xb9, + 0xbd, 0xe2, 0x90, 0x4d, 0x95, 0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x24, 0x33, + 0x87, 0xc9, 0x32, 0x9b, 0xe9, 0x09, 0x47, 0xc6, 0xad, 0x1a, 0x25, 0x33, 0x86, 0x19, 0x5b, 0x10, + 0x91, 0xcc, 0x90, 0xb0, 0xf2, 0xf9, 0x2f, 0xa3, 0xe8, 0x86, 0x61, 0x76, 0xdb, 0x9d, 0xb3, 0xbd, + 0xe2, 0x8c, 0x35, 0xa9, 0xcf, 0x7e, 0x56, 0x5c, 0xd4, 0xf1, 0x67, 0x94, 0x49, 0x3f, 0xaf, 0x8b, + 0xf2, 0xf9, 0x95, 0xf5, 0x4c, 0xd6, 0xda, 0x6e, 0x2b, 0x99, 0xf3, 0x52, 0xa9, 0x81, 0xb2, 0x56, + 0xbd, 0xfb, 0x84, 0x39, 0x22, 0x6b, 0x0d, 0xf1, 0xa6, 0x89, 0xb5, 0xf3, 0x9c, 0x15, 0xb8, 0x89, + 0x8d, 0x85, 0x46, 0x48, 0x34, 0x71, 0x07, 0x32, 0xf1, 0xb8, 0x15, 0xc9, 0x1d, 0x90, 0xcd, 0x3c, + 0x47, 0xf1, 0x58, 0xab, 0x6a, 0x80, 0x88, 0xc7, 0x5e, 0x50, 0xf9, 0x39, 0x8e, 0xbe, 0xd3, 0x3c, + 0xd2, 0xa3, 0x0a, 0x96, 0x19, 0xe0, 0xa3, 0x7d, 0x4b, 0x42, 0x8c, 0x7f, 0x97, 0x30, 0x23, 0xeb, + 0xb4, 0xa8, 0xcb, 0x3c, 0xa9, 0xcf, 0xd5, 0x61, 0xaf, 0x5b, 0xe7, 0x56, 0x88, 0x8f, 0x7b, 0xef, + 0xf6, 0x50, 0x26, 0xa8, 0xb7, 0x32, 0x1d, 0x62, 0xee, 0xf9, 0x55, 0x3b, 0x61, 0xe6, 0x7e, 0x2f, + 0x67, 0x76, 0x9f, 0x77, 0x93, 0x3c, 0x87, 0x6a, 0xd5, 0xca, 0x0e, 0x92, 0x22, 0x3b, 0x83, 0x9a, + 0xa3, 0xdd, 0x67, 0x45, 0x8d, 0x31, 0x46, 0xec, 0x3e, 0x07, 0x70, 0x93, 0xcd, 0x23, 0xcf, 0x7b, + 0xc5, 0x14, 0xde, 0xa2, 0x6c, 0x1e, 0xdb, 0x11, 0x0c, 0x91, 0xcd, 0x53, 0xac, 0xd9, 0x85, 0x7d, + 0x9e, 0xb3, 0xf4, 0x42, 0x4d, 0x01, 0x6e, 0x03, 0x0b, 0x09, 0x9e, 0x03, 0x6e, 0x85, 0x10, 0x33, + 0x09, 0x08, 0xc1, 0x31, 0x94, 0x79, 0x92, 0xe2, 0xfb, 0x1d, 0x52, 0x47, 0xc9, 0x88, 0x49, 0x00, + 0x33, 0xa8, 0xb8, 0xea, 0xde, 0x88, 0xaf, 0xb8, 0xe8, 0xda, 0xc8, 0xad, 0x10, 0x62, 0xa6, 0x41, + 0x21, 0x98, 0x94, 0x79, 0xc6, 0xd1, 0x30, 0x90, 0x1a, 0x42, 0x42, 0x0c, 0x03, 0x97, 0x40, 0x26, + 0x0f, 0xa0, 0x9a, 0x81, 0xd7, 0xa4, 0x90, 0x04, 0x4d, 0xb6, 0x84, 0xb9, 0x06, 0x28, 0xeb, 0xce, + 0xca, 0x15, 0xba, 0x06, 0xa8, 0xaa, 0xc5, 0xca, 0x15, 0x71, 0x0d, 0xd0, 0x01, 0x50, 0x11, 0x8f, + 0x92, 0x9a, 0xfb, 0x8b, 0x28, 0x24, 0xc1, 0x22, 0xb6, 0x84, 0x99, 0xa3, 0x65, 0x11, 0x17, 0x1c, + 0xcd, 0xd1, 0xaa, 0x00, 0xd6, 0x69, 0xf0, 0x75, 0x52, 0x6e, 0x22, 0x89, 0x6c, 0x15, 0xe0, 0x3b, + 0x19, 0xe4, 0xd3, 0x1a, 0x45, 0x12, 0xf5, 0xdc, 0x5b, 0x29, 0x11, 0x49, 0xba, 0x14, 0xea, 0x4a, + 0x6a, 0xaf, 0xda, 0x57, 0x3b, 0xb4, 0x4d, 0x7d, 0x2b, 0x84, 0x98, 0xf8, 0xd4, 0x16, 0x7a, 0x2b, + 0xa9, 0xaa, 0xac, 0x99, 0xfc, 0xef, 0xf9, 0x0b, 0xd4, 0xca, 0x89, 0xf8, 0xe4, 0xe3, 0xd0, 0xf0, + 0x6a, 0x03, 0xb7, 0xaf, 0x60, 0x38, 0x74, 0xdf, 0x0e, 0x32, 0x26, 0xe3, 0x14, 0x12, 0xeb, 0x38, + 0xd3, 0xf7, 0x34, 0x3d, 0xa7, 0x99, 0xf7, 0xfa, 0x30, 0xeb, 0x9a, 0xbe, 0x76, 0x71, 0xc0, 0x96, + 0x70, 0xc2, 0x5e, 0xbc, 0xcd, 0x6a, 0x9e, 0x15, 0x33, 0x35, 0x73, 0x3f, 0x23, 0x2c, 0xf9, 0x60, + 0xe2, 0x9a, 0x7e, 0xaf, 0x92, 0x49, 0x20, 0x50, 0x59, 0x0e, 0xe1, 0xd2, 0x9b, 0x40, 0x60, 0x8b, + 0x9a, 0x23, 0x12, 0x88, 0x10, 0x6f, 0xf6, 0x51, 0xb4, 0x73, 0xf5, 0x2e, 0xe3, 0x09, 0x6b, 0x73, + 0x39, 0xca, 0x1a, 0x06, 0x89, 0xa5, 0x6c, 0x50, 0xc1, 0xac, 0x2f, 0xb5, 0x7f, 0x33, 0xc4, 0x1e, + 0x10, 0x76, 0xba, 0xc3, 0xec, 0xe1, 0x00, 0xd2, 0xe3, 0xca, 0x9c, 0xc9, 0x53, 0xae, 0xba, 0x47, + 0xf2, 0x0f, 0x07, 0x90, 0xd6, 0x9e, 0x8c, 0x5d, 0xad, 0xe7, 0x49, 0x7a, 0x31, 0xab, 0xd8, 0xa2, + 0x98, 0x6e, 0xb1, 0x9c, 0x55, 0x68, 0x4f, 0xc6, 0x29, 0x35, 0x42, 0x89, 0x3d, 0x99, 0x1e, 0x15, + 0x93, 0xc1, 0xd9, 0xa5, 0xd8, 0xcc, 0xb3, 0x19, 0x5e, 0x51, 0x3b, 0x86, 0x04, 0x40, 0x64, 0x70, + 0x5e, 0xd0, 0xd3, 0x89, 0xe4, 0x8a, 0x9b, 0x67, 0x69, 0x92, 0x4b, 0x7f, 0x1b, 0xb4, 0x19, 0x07, + 0xec, 0xed, 0x44, 0x1e, 0x05, 0x4f, 0x3d, 0x4f, 0x16, 0x55, 0xb1, 0x57, 0x70, 0x46, 0xd6, 0xb3, + 0x05, 0x7a, 0xeb, 0x69, 0x81, 0x28, 0xac, 0x9e, 0xc0, 0xdb, 0xa6, 0x34, 0xcd, 0x3f, 0xbe, 0xb0, + 0xda, 0xfc, 0x3e, 0x56, 0xf2, 0x50, 0x58, 0x45, 0x1c, 0xaa, 0x8c, 0x72, 0x22, 0x3b, 0x4c, 0x40, + 0xdb, 0xed, 0x26, 0x0f, 0xfa, 0x41, 0xbf, 0x9f, 0x09, 0x5f, 0xe5, 0x10, 0xf2, 0x23, 0x80, 0x21, + 0x7e, 0x5a, 0xd0, 0x6c, 0xb7, 0x38, 0xf5, 0x39, 0x87, 0xf4, 0xa2, 0x73, 0xc5, 0xc8, 0x2d, 0xa8, + 0x44, 0x88, 0xed, 0x16, 0x02, 0xf5, 0x37, 0xd1, 0x5e, 0xca, 0x8a, 0x50, 0x13, 0x35, 0xf2, 0x21, + 0x4d, 0xa4, 0x38, 0xb3, 0xf8, 0xd5, 0x52, 0xd5, 0x33, 0x65, 0x33, 0xad, 0x11, 0x16, 0x6c, 0x88, + 0x58, 0xfc, 0x92, 0xb0, 0xc9, 0xc9, 0xb1, 0xcf, 0x83, 0xee, 0x9d, 0xe2, 0x8e, 0x95, 0x03, 0xfa, + 0x4e, 0x31, 0xc5, 0xd2, 0x95, 0x94, 0x7d, 0xa4, 0xc7, 0x8a, 0xdb, 0x4f, 0x1e, 0x0f, 0x83, 0xcd, + 0x92, 0xc7, 0xf1, 0xb9, 0x95, 0x43, 0x52, 0x49, 0xaf, 0xeb, 0x01, 0x43, 0x06, 0x23, 0x96, 0x3c, + 0x01, 0x1c, 0x85, 0x30, 0xc7, 0xf3, 0x16, 0x2b, 0x38, 0x14, 0xdc, 0x17, 0xc2, 0x5c, 0x63, 0x0a, + 0x0c, 0x85, 0x30, 0x4a, 0x01, 0xf5, 0x5b, 0xb1, 0x1f, 0x04, 0xfc, 0x30, 0x99, 0x7b, 0x33, 0x36, + 0xb9, 0xd7, 0x23, 0xe5, 0xa1, 0x7e, 0x8b, 0x38, 0xeb, 0x90, 0xcf, 0xf6, 0x72, 0x92, 0x54, 0x33, + 0xbd, 0xbb, 0x31, 0x8d, 0x9f, 0xd0, 0x76, 0x5c, 0x92, 0x38, 0xe4, 0x0b, 0x6b, 0xa0, 0xb0, 0xb3, + 0x37, 0x4f, 0x66, 0xba, 0xa6, 0x9e, 0x1a, 0x08, 0x79, 0xa7, 0xaa, 0x0f, 0xfa, 0x41, 0xe4, 0xe7, + 0x55, 0x36, 0x05, 0x16, 0xf0, 0x23, 0xe4, 0x43, 0xfc, 0x60, 0x10, 0x65, 0x6f, 0x4d, 0xbd, 0xe5, + 0x8a, 0x6e, 0xb3, 0x98, 0xaa, 0x75, 0xec, 0x98, 0x78, 0x3c, 0x88, 0x0b, 0x65, 0x6f, 0x04, 0x8f, + 0xc6, 0x68, 0xbb, 0x41, 0x1b, 0x1a, 0xa3, 0x7a, 0xff, 0x75, 0xc8, 0x18, 0xf5, 0xc1, 0xca, 0xe7, + 0x4f, 0xd5, 0x18, 0xdd, 0x4e, 0x78, 0xd2, 0xe4, 0xed, 0xaf, 0x32, 0xb8, 0x54, 0x0b, 0x61, 0x4f, + 0x7d, 0x5b, 0x6a, 0x2c, 0x5e, 0x26, 0x43, 0xab, 0xe2, 0x8d, 0xc1, 0x7c, 0xc0, 0xb7, 0x5a, 0x21, + 0xf4, 0xfa, 0x46, 0x4b, 0x85, 0x8d, 0xc1, 0x7c, 0xc0, 0xb7, 0x7a, 0x4b, 0xb5, 0xd7, 0x37, 0x7a, + 0x55, 0x75, 0x63, 0x30, 0xaf, 0x7c, 0xff, 0x55, 0x3b, 0x70, 0x6d, 0xe7, 0x4d, 0x1e, 0x96, 0xf2, + 0x6c, 0x09, 0xbe, 0x74, 0xd2, 0xb5, 0xa7, 0xd1, 0x50, 0x3a, 0x49, 0xab, 0x58, 0x9f, 0x36, 0xf1, + 0x95, 0xe2, 0x88, 0xd5, 0x99, 0x38, 0xa4, 0x7f, 0x36, 0xc0, 0x68, 0x0b, 0x87, 0x16, 0x4d, 0x21, + 0x25, 0x73, 0xdc, 0xe8, 0xa0, 0xe6, 0x46, 0xf1, 0xe3, 0x80, 0xbd, 0xee, 0xc5, 0xe2, 0xf5, 0x81, + 0xb4, 0x39, 0xf8, 0x73, 0x18, 0xfb, 0xc4, 0x31, 0xd4, 0xaa, 0xde, 0x43, 0xc7, 0x27, 0xc3, 0x15, + 0x94, 0xfb, 0xbf, 0x69, 0xd7, 0x15, 0xd8, 0xbf, 0x1a, 0x04, 0x4f, 0x87, 0x58, 0x44, 0x03, 0xe1, + 0xd9, 0x95, 0x74, 0x54, 0x41, 0xfe, 0x63, 0x14, 0xdd, 0xf2, 0x16, 0xc4, 0x3d, 0x7b, 0xfe, 0xdd, + 0x21, 0xb6, 0xfd, 0x67, 0xd0, 0x5f, 0x7c, 0x1b, 0x55, 0x55, 0xba, 0x7f, 0x68, 0x97, 0xf7, 0xad, + 0x86, 0x78, 0xeb, 0xe3, 0x65, 0x35, 0x85, 0x4a, 0x8d, 0xd8, 0x50, 0xa7, 0x33, 0x30, 0x1e, 0xb7, + 0x9f, 0x5e, 0x51, 0xcb, 0xfa, 0x0c, 0x8f, 0x03, 0xab, 0x37, 0xee, 0xac, 0xf2, 0x84, 0x2c, 0x5b, + 0x34, 0x2e, 0xd0, 0x67, 0x57, 0x55, 0xa3, 0x46, 0xb2, 0x05, 0x8b, 0xb7, 0xfa, 0x9f, 0x0d, 0x34, + 0xec, 0xbc, 0xe7, 0xff, 0xc9, 0xd5, 0x94, 0x54, 0x59, 0xfe, 0x6b, 0x14, 0xdd, 0x75, 0x58, 0x73, + 0xda, 0x81, 0xf6, 0x64, 0x7e, 0x14, 0xb0, 0x4f, 0x29, 0xe9, 0xc2, 0xfd, 0xde, 0xb7, 0x53, 0x36, + 0xdf, 0xac, 0x71, 0x54, 0x76, 0xb2, 0x9c, 0x43, 0xd5, 0xfd, 0x66, 0x8d, 0x6b, 0x57, 0x52, 0x63, + 0xfa, 0x9b, 0x35, 0x01, 0xdc, 0xfa, 0x66, 0x8d, 0xc7, 0xb3, 0xf7, 0x9b, 0x35, 0x5e, 0x6b, 0xc1, + 0x6f, 0xd6, 0x84, 0x35, 0xa8, 0xc9, 0xa7, 0x2d, 0x82, 0xdc, 0x55, 0x1f, 0x64, 0xd1, 0xdd, 0x64, + 0x7f, 0x7a, 0x15, 0x15, 0x62, 0xfa, 0x95, 0x9c, 0xb8, 0x85, 0x37, 0xe0, 0x99, 0x3a, 0x37, 0xf1, + 0x36, 0x06, 0xf3, 0xca, 0xf7, 0x4f, 0xd4, 0xda, 0x4b, 0x4f, 0x36, 0xac, 0x12, 0xdf, 0x2b, 0x5a, + 0x0b, 0x4d, 0x1e, 0x8d, 0x05, 0xbb, 0xe5, 0x1f, 0x0f, 0x83, 0x89, 0xea, 0x36, 0x84, 0x6a, 0xf4, + 0x71, 0x9f, 0x21, 0xd4, 0xe4, 0x1b, 0x83, 0x79, 0x62, 0x92, 0x93, 0xbe, 0x65, 0x6b, 0x0f, 0x30, + 0xe6, 0xb6, 0xf5, 0x93, 0xe1, 0x0a, 0xca, 0xfd, 0x52, 0x25, 0xb5, 0xb6, 0x7b, 0xd1, 0xce, 0xeb, + 0x7d, 0xa6, 0x26, 0x4e, 0x33, 0x8f, 0x87, 0xe2, 0xa1, 0xf4, 0xc6, 0x9e, 0xe0, 0xfb, 0xd2, 0x1b, + 0xef, 0x24, 0xff, 0xc9, 0xd5, 0x94, 0x54, 0x59, 0xfe, 0x79, 0x14, 0x5d, 0x27, 0xcb, 0xa2, 0xfa, + 0xc1, 0x67, 0x43, 0x2d, 0xa3, 0xfe, 0xf0, 0xf9, 0x95, 0xf5, 0x54, 0xa1, 0xfe, 0x6d, 0x14, 0xdd, + 0x08, 0x14, 0x4a, 0x76, 0x90, 0x2b, 0x58, 0x77, 0x3b, 0xca, 0x0f, 0xaf, 0xae, 0x48, 0x4d, 0xf7, + 0x36, 0x3e, 0xe9, 0x7e, 0xcc, 0x25, 0x60, 0x7b, 0x42, 0x7f, 0xcc, 0xa5, 0x5f, 0x0b, 0x6f, 0x41, + 0x35, 0x49, 0x89, 0x5a, 0x19, 0xf9, 0xb6, 0xa0, 0x44, 0xce, 0x82, 0x56, 0x44, 0xf7, 0x7b, 0x39, + 0x9f, 0x93, 0x17, 0x6f, 0xcb, 0xa4, 0x98, 0xd2, 0x4e, 0xa4, 0xbc, 0xdf, 0x89, 0xe6, 0xf0, 0xd6, + 0x5d, 0x23, 0x3d, 0x66, 0xed, 0x32, 0xef, 0x21, 0xa5, 0xaf, 0x91, 0xe0, 0xd6, 0x5d, 0x07, 0x25, + 0xbc, 0xa9, 0x9c, 0x36, 0xe4, 0x0d, 0xa5, 0xb2, 0x8f, 0x86, 0xa0, 0x68, 0x01, 0xa1, 0xbd, 0xe9, + 0x13, 0x81, 0xc7, 0x21, 0x2b, 0x9d, 0x53, 0x81, 0xf5, 0x81, 0x34, 0xe1, 0x76, 0x02, 0xfc, 0x4b, + 0x48, 0xa6, 0x50, 0x05, 0xdd, 0x6a, 0x6a, 0x90, 0x5b, 0x9b, 0xf6, 0xb9, 0xdd, 0x62, 0xf9, 0x62, + 0x5e, 0xa8, 0xc6, 0x24, 0xdd, 0xda, 0x54, 0xbf, 0x5b, 0x44, 0xe3, 0x4d, 0x4b, 0xe3, 0x56, 0xa4, + 0x97, 0x8f, 0xc2, 0x66, 0x9c, 0xac, 0x72, 0x6d, 0x10, 0x4b, 0xd7, 0x53, 0x75, 0xa3, 0x9e, 0x7a, + 0xa2, 0x9e, 0xb4, 0x3e, 0x90, 0xc6, 0xbb, 0x87, 0x96, 0x5b, 0xdd, 0x9f, 0x36, 0x7a, 0x6c, 0x75, + 0xba, 0xd4, 0x93, 0xe1, 0x0a, 0x78, 0xaf, 0x56, 0xf5, 0xaa, 0x66, 0x5d, 0xb4, 0x93, 0xe5, 0x79, + 0xbc, 0x16, 0xe8, 0x26, 0x2d, 0x14, 0xdc, 0xab, 0xf5, 0xc0, 0x44, 0x4f, 0x6e, 0xf7, 0x36, 0x8b, + 0xb8, 0xcf, 0x8e, 0xa0, 0x06, 0xf5, 0x64, 0x9b, 0x46, 0xfb, 0x6d, 0xd6, 0xa3, 0xd6, 0xb5, 0x1d, + 0x87, 0x1f, 0x5c, 0xa7, 0xc2, 0x1b, 0x83, 0x79, 0x74, 0x19, 0x40, 0x50, 0x62, 0x66, 0xb9, 0x43, + 0x99, 0x70, 0x66, 0x92, 0xbb, 0x3d, 0x14, 0xda, 0xb3, 0x94, 0xc3, 0xe8, 0x75, 0x36, 0x9d, 0x01, + 0xf7, 0x9e, 0x63, 0xd9, 0x40, 0xf0, 0x1c, 0x0b, 0x81, 0xa8, 0xe9, 0xe4, 0xef, 0x7a, 0xb3, 0x76, + 0x6f, 0xea, 0x6b, 0x3a, 0xa5, 0x6c, 0x51, 0xa1, 0xa6, 0xf3, 0xd2, 0x28, 0x1a, 0x68, 0xb7, 0xea, + 0xc5, 0xfd, 0x47, 0x21, 0x33, 0xe8, 0xed, 0xfd, 0xb5, 0x41, 0x2c, 0x9a, 0x51, 0x8c, 0xc3, 0x6c, + 0x9e, 0x71, 0xdf, 0x8c, 0x62, 0xd9, 0x68, 0x90, 0xd0, 0x8c, 0xd2, 0x45, 0xa9, 0xea, 0x35, 0x39, + 0xc2, 0xde, 0x34, 0x5c, 0x3d, 0xc9, 0x0c, 0xab, 0x9e, 0x66, 0x3b, 0xc7, 0xae, 0x85, 0xee, 0x32, + 0xfc, 0x5c, 0x2d, 0x96, 0x3d, 0x7d, 0x5b, 0xbc, 0xd0, 0x89, 0xc1, 0x50, 0xd4, 0xa1, 0x14, 0xf0, + 0x71, 0x42, 0xc3, 0xb5, 0x27, 0xc3, 0x65, 0x09, 0x49, 0x95, 0x14, 0xa9, 0x77, 0x71, 0x2a, 0x0c, + 0x76, 0xc8, 0xd0, 0xe2, 0x94, 0xd4, 0x40, 0x87, 0xfa, 0xee, 0xab, 0x98, 0x9e, 0xa1, 0xa0, 0xdf, + 0x79, 0x74, 0xdf, 0xc4, 0x7c, 0x38, 0x80, 0xc4, 0x87, 0xfa, 0x2d, 0xa0, 0xb7, 0xe5, 0xa5, 0xd3, + 0x8f, 0x03, 0xa6, 0x5c, 0x34, 0xb4, 0x10, 0xa6, 0x55, 0x50, 0xa7, 0xd6, 0x09, 0x2e, 0xf0, 0x1f, + 0xc3, 0xca, 0xd7, 0xa9, 0x4d, 0x7e, 0x2a, 0x90, 0x50, 0xa7, 0xee, 0xa2, 0x28, 0xcf, 0xb4, 0xd7, + 0x41, 0xf7, 0x02, 0xfa, 0xf6, 0xd2, 0xe7, 0x7e, 0x2f, 0x87, 0x46, 0xce, 0x76, 0xb6, 0x74, 0x4e, + 0x31, 0x3c, 0x05, 0xdd, 0xce, 0x96, 0xfe, 0x43, 0x8c, 0xb5, 0x41, 0x2c, 0xbe, 0x30, 0x90, 0x70, + 0x78, 0xdb, 0x9e, 0xe4, 0x7b, 0x8a, 0x2b, 0xe4, 0x9d, 0xa3, 0xfc, 0x07, 0xfd, 0xa0, 0xb9, 0x9e, + 0x7b, 0x54, 0xb1, 0x14, 0xea, 0x5a, 0x7d, 0xe1, 0xce, 0xbd, 0xff, 0xa4, 0x64, 0x63, 0xf4, 0x7d, + 0xbb, 0x3b, 0x61, 0x48, 0xd9, 0xfe, 0x32, 0x7a, 0x77, 0x9f, 0xcd, 0x26, 0x50, 0x4c, 0xe3, 0x1f, + 0xb8, 0x17, 0x62, 0xd9, 0x6c, 0xdc, 0xfc, 0xac, 0xed, 0x5d, 0xa3, 0xc4, 0xe6, 0x4a, 0xdf, 0x36, + 0xbc, 0x59, 0xcc, 0x26, 0x3c, 0xe1, 0xe8, 0x4a, 0x9f, 0xf8, 0x7d, 0xdc, 0x08, 0x88, 0x2b, 0x7d, + 0x0e, 0x80, 0xec, 0x9d, 0x54, 0x00, 0x5e, 0x7b, 0x8d, 0x20, 0x68, 0x4f, 0x01, 0x66, 0xd6, 0xd5, + 0xf6, 0x9a, 0xc4, 0x16, 0x5f, 0xc1, 0x33, 0x3a, 0x42, 0x4a, 0xcc, 0xba, 0x5d, 0xca, 0x74, 0x06, + 0x59, 0x7d, 0xf1, 0x3d, 0x8f, 0xc5, 0x7c, 0x9e, 0x54, 0x2b, 0xd4, 0x19, 0x54, 0x2d, 0x2d, 0x80, + 0xe8, 0x0c, 0x5e, 0xd0, 0xf4, 0xf2, 0xf6, 0x31, 0xa7, 0x17, 0xbb, 0xac, 0x62, 0x0b, 0x9e, 0x15, + 0x80, 0xbf, 0xe9, 0xa0, 0x1f, 0xa8, 0xcd, 0x10, 0xbd, 0x9c, 0x62, 0x4d, 0x56, 0x28, 0x08, 0x79, + 0x3b, 0x50, 0x7c, 0x27, 0xb6, 0xe6, 0xac, 0xc2, 0xa7, 0x83, 0xd2, 0x0a, 0x86, 0x88, 0xac, 0x90, + 0x84, 0x51, 0xdb, 0x1f, 0x65, 0xc5, 0xcc, 0xdb, 0xf6, 0x47, 0xf6, 0x57, 0x16, 0x6f, 0xd0, 0x80, + 0x89, 0xef, 0xf2, 0xa1, 0xc9, 0xef, 0x26, 0xa9, 0x37, 0x33, 0xbd, 0x0f, 0xdd, 0x26, 0x88, 0xf8, + 0xee, 0x27, 0x91, 0xab, 0x97, 0x25, 0x14, 0x30, 0x6d, 0xef, 0xc0, 0xf9, 0x5c, 0x39, 0x44, 0xd0, + 0x15, 0x26, 0x4d, 0x54, 0x15, 0xf2, 0xe3, 0x45, 0x71, 0x54, 0xb1, 0xb3, 0x2c, 0x87, 0x0a, 0x45, + 0x55, 0xa9, 0x6e, 0xc9, 0x89, 0xa8, 0xea, 0xe3, 0xcc, 0x65, 0x0a, 0x21, 0x75, 0x3e, 0x76, 0x7c, + 0x52, 0x25, 0x29, 0xbe, 0x4c, 0x21, 0x6d, 0x74, 0x31, 0x62, 0x27, 0x2d, 0x80, 0x9b, 0x9e, 0x7e, + 0x00, 0xbc, 0xca, 0xd2, 0x7a, 0x02, 0xfc, 0x28, 0xa9, 0x92, 0x39, 0x70, 0xa8, 0x70, 0x4f, 0x57, + 0xc8, 0xd8, 0x61, 0x88, 0x9e, 0x4e, 0xb1, 0xca, 0xe1, 0xef, 0x47, 0xef, 0x37, 0x81, 0x1e, 0x0a, + 0xf5, 0x5d, 0xfe, 0x17, 0xe2, 0x0f, 0x7a, 0xc4, 0x1f, 0x68, 0x1b, 0x13, 0x5e, 0x41, 0x32, 0x6f, + 0x6d, 0xbf, 0xa7, 0x7f, 0x17, 0xe0, 0x93, 0x51, 0xd3, 0x20, 0x87, 0x8c, 0x67, 0x67, 0xcd, 0xba, + 0x4a, 0x9d, 0x62, 0xa1, 0x06, 0xb1, 0xc5, 0xe3, 0xc0, 0x67, 0x0a, 0x7c, 0x9c, 0x09, 0x34, 0xb6, + 0xf4, 0x18, 0xca, 0x1c, 0x07, 0x1a, 0x47, 0x5b, 0x00, 0x44, 0xa0, 0xf1, 0x82, 0xa6, 0x77, 0xd9, + 0xe2, 0x13, 0x08, 0x57, 0xe6, 0x04, 0x86, 0x55, 0xe6, 0xc4, 0x79, 0x47, 0x20, 0x8f, 0xde, 0x3f, + 0x80, 0xf9, 0x1b, 0xa8, 0xea, 0xf3, 0xac, 0xdc, 0x6d, 0x66, 0xd8, 0x84, 0x2f, 0xf0, 0x5b, 0x74, + 0x86, 0x18, 0x6b, 0x84, 0x48, 0x43, 0x08, 0xd4, 0x84, 0x32, 0x03, 0xec, 0xd5, 0x87, 0xc9, 0x1c, + 0xc4, 0x47, 0x17, 0xe2, 0x35, 0xca, 0x88, 0x05, 0x11, 0xa1, 0x8c, 0x84, 0xad, 0xd7, 0x8d, 0x0c, + 0x73, 0x0c, 0xb3, 0xa6, 0x87, 0x55, 0x47, 0xc9, 0x6a, 0x0e, 0x05, 0x57, 0x26, 0xd1, 0x26, 0xac, + 0x65, 0xd2, 0xcf, 0x13, 0x9b, 0xb0, 0x43, 0xf4, 0xac, 0xa4, 0xdb, 0x79, 0xf0, 0x47, 0xac, 0xe2, + 0xf2, 0xaf, 0x6e, 0x9c, 0x56, 0x39, 0x4a, 0xba, 0xdd, 0x87, 0xea, 0x90, 0x44, 0xd2, 0x1d, 0xd6, + 0xb0, 0x3e, 0x57, 0xed, 0x94, 0xe1, 0x15, 0x54, 0xba, 0x9f, 0xbc, 0x98, 0x27, 0x59, 0xae, 0x7a, + 0xc3, 0x17, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0xb9, 0xea, 0xa1, 0xba, 0xd6, 0x07, 0xbe, 0xc3, 0x25, + 0x44, 0x7b, 0xc2, 0x3d, 0xf6, 0x89, 0x3d, 0xe1, 0x7e, 0x2d, 0xb3, 0x54, 0x33, 0xac, 0xe0, 0x56, + 0x82, 0xd8, 0x62, 0x53, 0xbc, 0x41, 0x64, 0xd9, 0x44, 0x20, 0xb1, 0x54, 0x0b, 0x2a, 0x98, 0xb9, + 0xcd, 0x60, 0x3b, 0x59, 0x91, 0xe4, 0xd9, 0x4f, 0xf1, 0xdd, 0x67, 0xcb, 0x4e, 0x4b, 0x10, 0x73, + 0x9b, 0x9f, 0xf4, 0xb9, 0xda, 0x05, 0x7e, 0x92, 0x35, 0xa1, 0xff, 0x41, 0xe0, 0xb9, 0x09, 0xa2, + 0xdf, 0x95, 0x45, 0x2a, 0x57, 0x3f, 0x1b, 0x45, 0xd7, 0xf1, 0x63, 0xdd, 0x2c, 0xcb, 0x49, 0x93, + 0x92, 0x1c, 0x43, 0x0a, 0x59, 0xc9, 0xe3, 0x4f, 0xc3, 0xcf, 0x0a, 0xe1, 0xc4, 0xc9, 0xfa, 0x00, + 0x35, 0xeb, 0xbc, 0xb6, 0x89, 0x25, 0x13, 0xf9, 0xe7, 0xa8, 0x4e, 0x6b, 0xa8, 0xd4, 0x4c, 0xb9, + 0x0b, 0x1c, 0x8d, 0x4e, 0x8b, 0x1b, 0x5b, 0x60, 0x53, 0x51, 0x62, 0x74, 0x86, 0x35, 0xcc, 0xee, + 0x8e, 0xc5, 0x1d, 0x43, 0xcd, 0xf2, 0x25, 0x88, 0xeb, 0x6f, 0x8f, 0x49, 0x63, 0x16, 0x45, 0xec, + 0xee, 0xd0, 0xb4, 0x49, 0x37, 0xba, 0x6e, 0x37, 0x8b, 0xd5, 0x1e, 0x3e, 0x23, 0xf7, 0x58, 0x12, + 0x18, 0x91, 0x6e, 0x04, 0x70, 0x6b, 0xf7, 0xb3, 0x62, 0xc9, 0x34, 0x4d, 0x6a, 0x7e, 0x94, 0xac, + 0x72, 0x96, 0x4c, 0xc5, 0xbc, 0x8e, 0x77, 0x3f, 0x5b, 0x66, 0x6c, 0x43, 0xd4, 0xee, 0x27, 0x05, + 0x9b, 0x95, 0x9d, 0xfa, 0x2b, 0x5b, 0xea, 0x6a, 0xe1, 0x6d, 0x94, 0x23, 0x89, 0xf2, 0xe2, 0x6b, + 0x85, 0x77, 0xc2, 0x90, 0x79, 0x25, 0x4a, 0x8a, 0x44, 0x1a, 0x72, 0xc3, 0xa7, 0xe3, 0x24, 0x20, + 0x37, 0x03, 0x84, 0xf9, 0x4c, 0x82, 0xfc, 0xbd, 0xfd, 0x43, 0x11, 0x5c, 0x7d, 0xb8, 0xf7, 0xb1, + 0x4f, 0xd7, 0x86, 0xc6, 0xf6, 0xb7, 0xcf, 0xd6, 0x07, 0xd2, 0xd2, 0xeb, 0xf3, 0x9b, 0xff, 0xf3, + 0xf5, 0xb5, 0xd1, 0xcf, 0xbf, 0xbe, 0x36, 0xfa, 0xff, 0xaf, 0xaf, 0x8d, 0x7e, 0xf6, 0xcd, 0xb5, + 0x77, 0x7e, 0xfe, 0xcd, 0xb5, 0x77, 0xfe, 0xf7, 0x9b, 0x6b, 0xef, 0x7c, 0xf5, 0xae, 0xfa, 0x73, + 0x6d, 0x6f, 0x7e, 0x49, 0xfc, 0xd1, 0xb5, 0x67, 0xbf, 0x08, 0x00, 0x00, 0xff, 0xff, 0x95, 0x20, + 0x7a, 0x41, 0xd2, 0x6d, 0x00, 0x00, } // This is a compile-time assertion to ensure that this generated file @@ -458,6 +459,7 @@ type ClientCommandsHandler interface { ObjectCreateRelationOption(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse RelationListRemoveOption(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse RelationOptions(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse + RelationListWithValue(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse // Object Relations // *** ObjectRelationAdd(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse @@ -2581,6 +2583,26 @@ func RelationOptions(b []byte) (resp []byte) { return resp } +func RelationListWithValue(b []byte) (resp []byte) { + defer func() { + if PanicHandler != nil { + if r := recover(); r != nil { + resp, _ = (&pb.RpcRelationListWithValueResponse{Error: &pb.RpcRelationListWithValueResponseError{Code: pb.RpcRelationListWithValueResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal() + PanicHandler(r) + } + } + }() + + in := new(pb.RpcRelationListWithValueRequest) + if err := in.Unmarshal(b); err != nil { + resp, _ = (&pb.RpcRelationListWithValueResponse{Error: &pb.RpcRelationListWithValueResponseError{Code: pb.RpcRelationListWithValueResponseError_BAD_INPUT, Description: err.Error()}}).Marshal() + return resp + } + + resp, _ = clientCommandsHandler.RelationListWithValue(context.Background(), in).Marshal() + return resp +} + func ObjectRelationAdd(b []byte) (resp []byte) { defer func() { if PanicHandler != nil { @@ -5859,6 +5881,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) { cd = RelationListRemoveOption(data) case "RelationOptions": cd = RelationOptions(data) + case "RelationListWithValue": + cd = RelationListWithValue(data) case "ObjectRelationAdd": cd = ObjectRelationAdd(data) case "ObjectRelationDelete": @@ -7533,6 +7557,20 @@ func (h *ClientCommandsHandlerProxy) RelationOptions(ctx context.Context, req *p call, _ := actualCall(ctx, req) return call.(*pb.RpcRelationOptionsResponse) } +func (h *ClientCommandsHandlerProxy) RelationListWithValue(ctx context.Context, req *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse { + actualCall := func(ctx context.Context, req any) (any, error) { + return h.client.RelationListWithValue(ctx, req.(*pb.RpcRelationListWithValueRequest)), nil + } + for _, interceptor := range h.interceptors { + toCall := actualCall + currentInterceptor := interceptor + actualCall = func(ctx context.Context, req any) (any, error) { + return currentInterceptor(ctx, req, "RelationListWithValue", toCall) + } + } + call, _ := actualCall(ctx, req) + return call.(*pb.RpcRelationListWithValueResponse) +} func (h *ClientCommandsHandlerProxy) ObjectRelationAdd(ctx context.Context, req *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse { actualCall := func(ctx context.Context, req any) (any, error) { return h.client.ObjectRelationAdd(ctx, req.(*pb.RpcObjectRelationAddRequest)), nil diff --git a/core/block/relation.go b/core/block/relation.go index c541e039b5..2b935ca971 100644 --- a/core/block/relation.go +++ b/core/block/relation.go @@ -4,17 +4,28 @@ import ( "context" "fmt" "strings" + "time" + "github.com/gogo/protobuf/types" + "golang.org/x/exp/maps" "golang.org/x/exp/slices" "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/core/relationutils" "github.com/anyproto/anytype-heart/pkg/lib/bundle" + coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" + "github.com/anyproto/anytype-heart/pkg/lib/database" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/space/spacecore/typeprovider" "github.com/anyproto/anytype-heart/util/pbtypes" "github.com/anyproto/anytype-heart/util/slice" ) +type filtersGetter func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) + var ErrBundledTypeIsReadonly = fmt.Errorf("can't modify bundled object type") func (s *Service) ObjectTypeRelationAdd(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { @@ -56,3 +67,174 @@ func (s *Service) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId st return b.Apply(st) }) } + +func (s *Service) ListRelationsWithValue(spaceId string, value *types.Value) (keys []string, counters []int64, err error) { + var ( + allRelations relationutils.Relations + getFilters func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) + countersByKeys = make(map[string]int64) + ) + + allRelations, err = s.objectStore.ListAllRelations(spaceId) + if err != nil { + return nil, nil, fmt.Errorf("failed to list all relations: %w", err) + } + + getFilters, err = generateFiltersGetter(value) + if err != nil { + return nil, nil, err + } + + for _, rel := range allRelations { + filters, err := getFilters(spaceId, rel.Relation) + if err != nil { + continue + } + records, err := s.objectStore.Query(database.Query{ + Filters: filters, + }) + if err != nil { + log.Errorf("failed to query objects: %v", err) + continue + } + if len(records) != 0 { + countersByKeys[rel.Key] = int64(len(records)) + } + } + + keys = maps.Keys(countersByKeys) + slices.Sort(keys) + + for _, key := range keys { + counters = append(counters, countersByKeys[key]) + } + + return keys, counters, nil +} + +func generateFiltersGetter(value *types.Value) (filtersGetter, error) { + stringFormats := []model.RelationFormat{ + model.RelationFormat_longtext, + model.RelationFormat_shorttext, + model.RelationFormat_status, + model.RelationFormat_tag, + model.RelationFormat_object, + } + + switch t := value.Kind.(type) { + case *types.Value_StringValue: + sbt, _ := typeprovider.SmartblockTypeFromID(t.StringValue) + if sbt != coresb.SmartBlockTypeDate { + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + if !slices.Contains(stringFormats, rel.Format) { + return nil, fmt.Errorf("unsupported format %q", rel.Format) + } + return simpleFilters(spaceId, rel.Key, value), nil + }, nil + } + + start, err := addr.DateIDToDayStart(t.StringValue) + if err != nil { + return nil, fmt.Errorf("failed to convert date id to day start: %w", err) + } + end := start.Add(24 * time.Hour) + + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + switch rel.Format { + case model.RelationFormat_date: + return dateRangeFilters(spaceId, rel.Key, start, end), nil + case model.RelationFormat_longtext, + model.RelationFormat_shorttext, + model.RelationFormat_object: + return simpleFilters(spaceId, rel.Key, value), nil + } + return nil, fmt.Errorf("unsupported format %q", rel.Format) + }, nil + case *types.Value_NumberValue: + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + if rel.Format != model.RelationFormat_number { + return nil, fmt.Errorf("unsupported format %q", rel.Format) + } + return simpleFilters(spaceId, rel.Key, value), nil + }, nil + case *types.Value_BoolValue: + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + if rel.Format != model.RelationFormat_checkbox { + return nil, fmt.Errorf("unsupported format %q", rel.Format) + } + return simpleFilters(spaceId, rel.Key, value), nil + }, nil + case *types.Value_ListValue: + if pbtypes.GetStringListValue(value) != nil { + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + if !slices.Contains(stringFormats, rel.Format) { + return nil, fmt.Errorf("unsupported format %q", rel.Format) + } + return listFilters(spaceId, rel.Key, value), nil + }, nil + } + + if pbtypes.GetIntListValue(value) != nil { + return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { + if rel.Format != model.RelationFormat_number { + return nil, fmt.Errorf("unsupported format %q", rel.Format) + } + return listFilters(spaceId, rel.Key, value), nil + }, nil + } + + return nil, fmt.Errorf("unsupported list value type: %T", t.ListValue.Values[0]) + default: + return nil, fmt.Errorf("unsupported value type: %T", value) + } +} + +func simpleFilters(spaceId, key string, value *types.Value) []*model.BlockContentDataviewFilter { + return []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }, + { + RelationKey: key, + Condition: model.BlockContentDataviewFilter_Equal, + Value: value, + }, + } +} + +func listFilters(spaceId, key string, value *types.Value) []*model.BlockContentDataviewFilter { + return []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }, + { + RelationKey: key, + Condition: model.BlockContentDataviewFilter_AllIn, + Value: value, + }, + } +} + +func dateRangeFilters(spaceId, key string, start, end time.Time) []*model.BlockContentDataviewFilter { + return []*model.BlockContentDataviewFilter{ + { + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }, + { + RelationKey: key, + Condition: model.BlockContentDataviewFilter_GreaterOrEqual, + Value: pbtypes.Int64(start.Unix()), + }, + { + RelationKey: key, + Condition: model.BlockContentDataviewFilter_Less, + Value: pbtypes.Int64(end.Unix()), + }, + } +} diff --git a/core/block/relation_test.go b/core/block/relation_test.go new file mode 100644 index 0000000000..dabead23bd --- /dev/null +++ b/core/block/relation_test.go @@ -0,0 +1,119 @@ +package block + +import ( + "testing" + "time" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/assert" + + "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const spaceId = "spaceId" + +func relationObject(key domain.RelationKey, format model.RelationFormat) objectstore.TestObject { + return objectstore.TestObject{ + bundle.RelationKeyId: pbtypes.String(key.URL()), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyLayout: pbtypes.Float64(float64(model.ObjectType_relation)), + bundle.RelationKeyRelationKey: pbtypes.String(key.String()), + bundle.RelationKeyRelationFormat: pbtypes.Int64(int64(format)), + } +} + +func TestService_ListRelationsWithValue(t *testing.T) { + store := objectstore.NewStoreFixture(t) + store.AddObjects(t, []objectstore.TestObject{ + // relations + relationObject(bundle.RelationKeyLastModifiedDate, model.RelationFormat_date), + relationObject(bundle.RelationKeyAddedDate, model.RelationFormat_date), + relationObject(bundle.RelationKeyCreatedDate, model.RelationFormat_date), + relationObject(bundle.RelationKeyLinks, model.RelationFormat_object), + relationObject(bundle.RelationKeyName, model.RelationFormat_longtext), + relationObject(bundle.RelationKeyIsHidden, model.RelationFormat_checkbox), + relationObject(bundle.RelationKeyIsFavorite, model.RelationFormat_checkbox), + relationObject("daysTillSummer", model.RelationFormat_number), + relationObject(bundle.RelationKeyCoverX, model.RelationFormat_number), + { + bundle.RelationKeyId: pbtypes.String("obj1"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyCreatedDate: pbtypes.Int64(time.Now().Add(-5 * time.Minute).Unix()), + bundle.RelationKeyAddedDate: pbtypes.Int64(time.Now().Add(-3 * time.Minute).Unix()), + bundle.RelationKeyLastModifiedDate: pbtypes.Int64(time.Now().Add(-1 * time.Minute).Unix()), + bundle.RelationKeyIsFavorite: pbtypes.Bool(true), + "daysTillSummer": pbtypes.Int64(300), + bundle.RelationKeyLinks: pbtypes.StringList([]string{"obj2", "obj3"}), + }, + { + bundle.RelationKeyId: pbtypes.String("obj2"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyName: pbtypes.String(addr.TimeToID(time.Now())), + bundle.RelationKeyCreatedDate: pbtypes.Int64(time.Now().Add(-24*time.Hour - 5*time.Minute).Unix()), + bundle.RelationKeyAddedDate: pbtypes.Int64(time.Now().Add(-24*time.Hour - 3*time.Minute).Unix()), + bundle.RelationKeyLastModifiedDate: pbtypes.Int64(time.Now().Add(-1 * time.Minute).Unix()), + bundle.RelationKeyCoverX: pbtypes.Int64(300), + }, + { + bundle.RelationKeyId: pbtypes.String("obj3"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyIsHidden: pbtypes.Bool(true), + bundle.RelationKeyCreatedDate: pbtypes.Int64(time.Now().Add(-3 * time.Minute).Unix()), + bundle.RelationKeyLastModifiedDate: pbtypes.Int64(time.Now().Unix()), + bundle.RelationKeyIsFavorite: pbtypes.Bool(true), + bundle.RelationKeyCoverX: pbtypes.Int64(300), + }, + }) + + bs := Service{objectStore: store} + + for _, tc := range []struct { + name string + value *types.Value + expectedKeys []string + expectedCounters []int64 + }{ + { + "date object - today", + pbtypes.String(addr.TimeToID(time.Now())), + []string{bundle.RelationKeyAddedDate.String(), bundle.RelationKeyCreatedDate.String(), bundle.RelationKeyLastModifiedDate.String(), bundle.RelationKeyName.String()}, + []int64{1, 2, 3, 1}, + }, + { + "date object - yesterday", + pbtypes.String(addr.TimeToID(time.Now().Add(-24 * time.Hour))), + []string{bundle.RelationKeyAddedDate.String(), bundle.RelationKeyCreatedDate.String()}, + []int64{1, 1}, + }, + { + "number", + pbtypes.Int64(300), + []string{bundle.RelationKeyCoverX.String(), "daysTillSummer"}, + []int64{2, 1}, + }, + { + "bool", + pbtypes.Bool(true), + []string{bundle.RelationKeyIsFavorite.String(), bundle.RelationKeyIsHidden.String()}, + []int64{2, 1}, + }, + { + "string list", + pbtypes.StringList([]string{"obj2", "obj3"}), + []string{bundle.RelationKeyLinks.String()}, + []int64{1}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + keys, counters, err := bs.ListRelationsWithValue(spaceId, tc.value) + assert.NoError(t, err) + assert.Equal(t, tc.expectedKeys, keys) + assert.Equal(t, tc.expectedCounters, counters) + }) + } +} diff --git a/core/relations.go b/core/relations.go index 5acb31d6a9..7200b91056 100644 --- a/core/relations.go +++ b/core/relations.go @@ -80,7 +80,31 @@ func (mw *Middleware) RelationListRemoveOption(cctx context.Context, request *pb return response(pb.RpcRelationListRemoveOptionResponseError_NULL, nil) } -func (mw *Middleware) RelationOptions(cctx context.Context, request *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse { +func (mw *Middleware) RelationOptions(_ context.Context, _ *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse { // TODO implement me panic("implement me") } + +func (mw *Middleware) RelationListWithValue(_ context.Context, req *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse { + response := func(keys []string, counters []int64, err error) *pb.RpcRelationListWithValueResponse { + m := &pb.RpcRelationListWithValueResponse{Error: &pb.RpcRelationListWithValueResponseError{Code: pb.RpcRelationListWithValueResponseError_NULL}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } else { + m.RelationKeys = keys + m.Counters = counters + } + return m + } + + var ( + keys []string + counters []int64 + ) + + err := mw.doBlockService(func(bs *block.Service) (err error) { + keys, counters, err = bs.ListRelationsWithValue(req.SpaceId, req.Value) + return + }) + return response(keys, counters, err) +} diff --git a/docs/proto.md b/docs/proto.md index 7f9d8103e6..361f9a484c 100644 --- a/docs/proto.md +++ b/docs/proto.md @@ -1015,6 +1015,10 @@ - [Rpc.Relation.ListRemoveOption.Request](#anytype-Rpc-Relation-ListRemoveOption-Request) - [Rpc.Relation.ListRemoveOption.Response](#anytype-Rpc-Relation-ListRemoveOption-Response) - [Rpc.Relation.ListRemoveOption.Response.Error](#anytype-Rpc-Relation-ListRemoveOption-Response-Error) + - [Rpc.Relation.ListWithValue](#anytype-Rpc-Relation-ListWithValue) + - [Rpc.Relation.ListWithValue.Request](#anytype-Rpc-Relation-ListWithValue-Request) + - [Rpc.Relation.ListWithValue.Response](#anytype-Rpc-Relation-ListWithValue-Response) + - [Rpc.Relation.ListWithValue.Response.Error](#anytype-Rpc-Relation-ListWithValue-Response-Error) - [Rpc.Relation.Options](#anytype-Rpc-Relation-Options) - [Rpc.Relation.Options.Request](#anytype-Rpc-Relation-Options-Request) - [Rpc.Relation.Options.Response](#anytype-Rpc-Relation-Options-Response) @@ -1402,6 +1406,7 @@ - [Rpc.ObjectType.Relation.Remove.Response.Error.Code](#anytype-Rpc-ObjectType-Relation-Remove-Response-Error-Code) - [Rpc.Process.Cancel.Response.Error.Code](#anytype-Rpc-Process-Cancel-Response-Error-Code) - [Rpc.Relation.ListRemoveOption.Response.Error.Code](#anytype-Rpc-Relation-ListRemoveOption-Response-Error-Code) + - [Rpc.Relation.ListWithValue.Response.Error.Code](#anytype-Rpc-Relation-ListWithValue-Response-Error-Code) - [Rpc.Relation.Options.Response.Error.Code](#anytype-Rpc-Relation-Options-Response-Error-Code) - [Rpc.Space.Delete.Response.Error.Code](#anytype-Rpc-Space-Delete-Response-Error-Code) - [Rpc.Space.InviteGenerate.Response.Error.Code](#anytype-Rpc-Space-InviteGenerate-Response-Error-Code) @@ -1933,6 +1938,7 @@ | ObjectCreateRelationOption | [Rpc.Object.CreateRelationOption.Request](#anytype-Rpc-Object-CreateRelationOption-Request) | [Rpc.Object.CreateRelationOption.Response](#anytype-Rpc-Object-CreateRelationOption-Response) | | | RelationListRemoveOption | [Rpc.Relation.ListRemoveOption.Request](#anytype-Rpc-Relation-ListRemoveOption-Request) | [Rpc.Relation.ListRemoveOption.Response](#anytype-Rpc-Relation-ListRemoveOption-Response) | | | RelationOptions | [Rpc.Relation.Options.Request](#anytype-Rpc-Relation-Options-Request) | [Rpc.Relation.Options.Response](#anytype-Rpc-Relation-Options-Response) | | +| RelationListWithValue | [Rpc.Relation.ListWithValue.Request](#anytype-Rpc-Relation-ListWithValue-Request) | [Rpc.Relation.ListWithValue.Response](#anytype-Rpc-Relation-ListWithValue-Response) | | | ObjectRelationAdd | [Rpc.ObjectRelation.Add.Request](#anytype-Rpc-ObjectRelation-Add-Request) | [Rpc.ObjectRelation.Add.Response](#anytype-Rpc-ObjectRelation-Add-Response) | Object Relations *** | | ObjectRelationDelete | [Rpc.ObjectRelation.Delete.Request](#anytype-Rpc-ObjectRelation-Delete-Request) | [Rpc.ObjectRelation.Delete.Response](#anytype-Rpc-ObjectRelation-Delete-Response) | | | ObjectRelationAddFeatured | [Rpc.ObjectRelation.AddFeatured.Request](#anytype-Rpc-ObjectRelation-AddFeatured-Request) | [Rpc.ObjectRelation.AddFeatured.Response](#anytype-Rpc-ObjectRelation-AddFeatured-Response) | | @@ -16800,6 +16806,65 @@ Available undo/redo operations + + +### Rpc.Relation.ListWithValue + + + + + + + + + +### Rpc.Relation.ListWithValue.Request + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| spaceId | [string](#string) | | | +| value | [google.protobuf.Value](#google-protobuf-Value) | | | + + + + + + + + +### Rpc.Relation.ListWithValue.Response + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| error | [Rpc.Relation.ListWithValue.Response.Error](#anytype-Rpc-Relation-ListWithValue-Response-Error) | | | +| relationKeys | [string](#string) | repeated | | +| counters | [int64](#int64) | repeated | | + + + + + + + + +### Rpc.Relation.ListWithValue.Response.Error + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| code | [Rpc.Relation.ListWithValue.Response.Error.Code](#anytype-Rpc-Relation-ListWithValue-Response-Error-Code) | | | +| description | [string](#string) | | | + + + + + + ### Rpc.Relation.Options @@ -22182,6 +22247,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er + + +### Rpc.Relation.ListWithValue.Response.Error.Code + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| UNKNOWN_ERROR | 1 | | +| BAD_INPUT | 2 | | + + + ### Rpc.Relation.Options.Response.Error.Code diff --git a/pb/commands.pb.go b/pb/commands.pb.go index 94328d2b0f..70a11b9d45 100644 --- a/pb/commands.pb.go +++ b/pb/commands.pb.go @@ -3776,6 +3776,34 @@ func (RpcRelationOptionsResponseErrorCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 1, 1, 0, 0} } +type RpcRelationListWithValueResponseErrorCode int32 + +const ( + RpcRelationListWithValueResponseError_NULL RpcRelationListWithValueResponseErrorCode = 0 + RpcRelationListWithValueResponseError_UNKNOWN_ERROR RpcRelationListWithValueResponseErrorCode = 1 + RpcRelationListWithValueResponseError_BAD_INPUT RpcRelationListWithValueResponseErrorCode = 2 +) + +var RpcRelationListWithValueResponseErrorCode_name = map[int32]string{ + 0: "NULL", + 1: "UNKNOWN_ERROR", + 2: "BAD_INPUT", +} + +var RpcRelationListWithValueResponseErrorCode_value = map[string]int32{ + "NULL": 0, + "UNKNOWN_ERROR": 1, + "BAD_INPUT": 2, +} + +func (x RpcRelationListWithValueResponseErrorCode) String() string { + return proto.EnumName(RpcRelationListWithValueResponseErrorCode_name, int32(x)) +} + +func (RpcRelationListWithValueResponseErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 2, 1, 0, 0} +} + type RpcHistoryGetVersionsResponseErrorCode int32 const ( @@ -30991,6 +31019,206 @@ func (m *RpcRelationOptionsResponseError) GetDescription() string { return "" } +type RpcRelationListWithValue struct { +} + +func (m *RpcRelationListWithValue) Reset() { *m = RpcRelationListWithValue{} } +func (m *RpcRelationListWithValue) String() string { return proto.CompactTextString(m) } +func (*RpcRelationListWithValue) ProtoMessage() {} +func (*RpcRelationListWithValue) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 2} +} +func (m *RpcRelationListWithValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcRelationListWithValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcRelationListWithValue.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 *RpcRelationListWithValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcRelationListWithValue.Merge(m, src) +} +func (m *RpcRelationListWithValue) XXX_Size() int { + return m.Size() +} +func (m *RpcRelationListWithValue) XXX_DiscardUnknown() { + xxx_messageInfo_RpcRelationListWithValue.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcRelationListWithValue proto.InternalMessageInfo + +type RpcRelationListWithValueRequest struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Value *types.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (m *RpcRelationListWithValueRequest) Reset() { *m = RpcRelationListWithValueRequest{} } +func (m *RpcRelationListWithValueRequest) String() string { return proto.CompactTextString(m) } +func (*RpcRelationListWithValueRequest) ProtoMessage() {} +func (*RpcRelationListWithValueRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 2, 0} +} +func (m *RpcRelationListWithValueRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcRelationListWithValueRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcRelationListWithValueRequest.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 *RpcRelationListWithValueRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcRelationListWithValueRequest.Merge(m, src) +} +func (m *RpcRelationListWithValueRequest) XXX_Size() int { + return m.Size() +} +func (m *RpcRelationListWithValueRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RpcRelationListWithValueRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcRelationListWithValueRequest proto.InternalMessageInfo + +func (m *RpcRelationListWithValueRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *RpcRelationListWithValueRequest) GetValue() *types.Value { + if m != nil { + return m.Value + } + return nil +} + +type RpcRelationListWithValueResponse struct { + Error *RpcRelationListWithValueResponseError `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + RelationKeys []string `protobuf:"bytes,2,rep,name=relationKeys,proto3" json:"relationKeys,omitempty"` + Counters []int64 `protobuf:"varint,3,rep,packed,name=counters,proto3" json:"counters,omitempty"` +} + +func (m *RpcRelationListWithValueResponse) Reset() { *m = RpcRelationListWithValueResponse{} } +func (m *RpcRelationListWithValueResponse) String() string { return proto.CompactTextString(m) } +func (*RpcRelationListWithValueResponse) ProtoMessage() {} +func (*RpcRelationListWithValueResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 2, 1} +} +func (m *RpcRelationListWithValueResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcRelationListWithValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcRelationListWithValueResponse.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 *RpcRelationListWithValueResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcRelationListWithValueResponse.Merge(m, src) +} +func (m *RpcRelationListWithValueResponse) XXX_Size() int { + return m.Size() +} +func (m *RpcRelationListWithValueResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RpcRelationListWithValueResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcRelationListWithValueResponse proto.InternalMessageInfo + +func (m *RpcRelationListWithValueResponse) GetError() *RpcRelationListWithValueResponseError { + if m != nil { + return m.Error + } + return nil +} + +func (m *RpcRelationListWithValueResponse) GetRelationKeys() []string { + if m != nil { + return m.RelationKeys + } + return nil +} + +func (m *RpcRelationListWithValueResponse) GetCounters() []int64 { + if m != nil { + return m.Counters + } + return nil +} + +type RpcRelationListWithValueResponseError struct { + Code RpcRelationListWithValueResponseErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.RpcRelationListWithValueResponseErrorCode" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (m *RpcRelationListWithValueResponseError) Reset() { *m = RpcRelationListWithValueResponseError{} } +func (m *RpcRelationListWithValueResponseError) String() string { return proto.CompactTextString(m) } +func (*RpcRelationListWithValueResponseError) ProtoMessage() {} +func (*RpcRelationListWithValueResponseError) Descriptor() ([]byte, []int) { + return fileDescriptor_8261c968b2e6f45c, []int{0, 9, 2, 1, 0} +} +func (m *RpcRelationListWithValueResponseError) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RpcRelationListWithValueResponseError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RpcRelationListWithValueResponseError.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 *RpcRelationListWithValueResponseError) XXX_Merge(src proto.Message) { + xxx_messageInfo_RpcRelationListWithValueResponseError.Merge(m, src) +} +func (m *RpcRelationListWithValueResponseError) XXX_Size() int { + return m.Size() +} +func (m *RpcRelationListWithValueResponseError) XXX_DiscardUnknown() { + xxx_messageInfo_RpcRelationListWithValueResponseError.DiscardUnknown(m) +} + +var xxx_messageInfo_RpcRelationListWithValueResponseError proto.InternalMessageInfo + +func (m *RpcRelationListWithValueResponseError) GetCode() RpcRelationListWithValueResponseErrorCode { + if m != nil { + return m.Code + } + return RpcRelationListWithValueResponseError_NULL +} + +func (m *RpcRelationListWithValueResponseError) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type RpcHistory struct { } @@ -64856,6 +65084,7 @@ func init() { proto.RegisterEnum("anytype.RpcObjectTypeRelationRemoveResponseErrorCode", RpcObjectTypeRelationRemoveResponseErrorCode_name, RpcObjectTypeRelationRemoveResponseErrorCode_value) proto.RegisterEnum("anytype.RpcRelationListRemoveOptionResponseErrorCode", RpcRelationListRemoveOptionResponseErrorCode_name, RpcRelationListRemoveOptionResponseErrorCode_value) proto.RegisterEnum("anytype.RpcRelationOptionsResponseErrorCode", RpcRelationOptionsResponseErrorCode_name, RpcRelationOptionsResponseErrorCode_value) + proto.RegisterEnum("anytype.RpcRelationListWithValueResponseErrorCode", RpcRelationListWithValueResponseErrorCode_name, RpcRelationListWithValueResponseErrorCode_value) proto.RegisterEnum("anytype.RpcHistoryGetVersionsResponseErrorCode", RpcHistoryGetVersionsResponseErrorCode_name, RpcHistoryGetVersionsResponseErrorCode_value) proto.RegisterEnum("anytype.RpcHistoryShowVersionResponseErrorCode", RpcHistoryShowVersionResponseErrorCode_name, RpcHistoryShowVersionResponseErrorCode_value) proto.RegisterEnum("anytype.RpcHistorySetVersionResponseErrorCode", RpcHistorySetVersionResponseErrorCode_name, RpcHistorySetVersionResponseErrorCode_value) @@ -65469,6 +65698,10 @@ func init() { proto.RegisterType((*RpcRelationOptionsRequest)(nil), "anytype.Rpc.Relation.Options.Request") proto.RegisterType((*RpcRelationOptionsResponse)(nil), "anytype.Rpc.Relation.Options.Response") proto.RegisterType((*RpcRelationOptionsResponseError)(nil), "anytype.Rpc.Relation.Options.Response.Error") + proto.RegisterType((*RpcRelationListWithValue)(nil), "anytype.Rpc.Relation.ListWithValue") + proto.RegisterType((*RpcRelationListWithValueRequest)(nil), "anytype.Rpc.Relation.ListWithValue.Request") + proto.RegisterType((*RpcRelationListWithValueResponse)(nil), "anytype.Rpc.Relation.ListWithValue.Response") + proto.RegisterType((*RpcRelationListWithValueResponseError)(nil), "anytype.Rpc.Relation.ListWithValue.Response.Error") proto.RegisterType((*RpcHistory)(nil), "anytype.Rpc.History") proto.RegisterType((*RpcHistoryVersion)(nil), "anytype.Rpc.History.Version") proto.RegisterType((*RpcHistoryGetVersions)(nil), "anytype.Rpc.History.GetVersions") @@ -66145,1134 +66378,1138 @@ func init() { func init() { proto.RegisterFile("pb/protos/commands.proto", fileDescriptor_8261c968b2e6f45c) } var fileDescriptor_8261c968b2e6f45c = []byte{ - // 18026 bytes of a gzipped FileDescriptorProto + // 18088 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x9c, 0x24, 0x49, - 0x59, 0x2f, 0x8a, 0x4f, 0x55, 0x56, 0x55, 0x77, 0x47, 0xbf, 0x4c, 0x4d, 0xee, 0xcc, 0x6c, 0x6f, - 0xec, 0x32, 0xbb, 0xcc, 0x2e, 0xcb, 0xba, 0x2c, 0x3d, 0xb0, 0x0b, 0xc2, 0x2e, 0xbb, 0xec, 0x56, - 0x57, 0x67, 0x77, 0x17, 0xdb, 0x5d, 0xd5, 0x66, 0x65, 0xcf, 0xb0, 0xfa, 0xf3, 0x57, 0x27, 0xa7, - 0x2a, 0xba, 0x3b, 0x77, 0xaa, 0x33, 0xcb, 0xac, 0xec, 0x9e, 0x19, 0xee, 0xe7, 0xdc, 0x23, 0x22, - 0xb2, 0xbe, 0x70, 0x10, 0x91, 0xa3, 0x80, 0x80, 0x80, 0xe0, 0x01, 0x05, 0xe4, 0x5d, 0x10, 0x51, - 0xde, 0x04, 0x11, 0x11, 0x41, 0x14, 0x50, 0x3e, 0x82, 0x20, 0x07, 0xcf, 0x3d, 0x1c, 0xaf, 0x7e, - 0x8e, 0x70, 0x50, 0xb8, 0xde, 0x4f, 0xbc, 0x64, 0x66, 0x44, 0x75, 0x65, 0x56, 0x64, 0x75, 0x65, - 0xf5, 0xa2, 0xf7, 0xbf, 0xcc, 0xc8, 0xc8, 0x88, 0x27, 0x9e, 0xef, 0xf3, 0x44, 0x3c, 0x11, 0xf1, - 0xc4, 0x13, 0x60, 0xbe, 0x73, 0xf1, 0x5c, 0xc7, 0x75, 0x3c, 0xa7, 0x7b, 0xae, 0xe9, 0xec, 0xee, - 0x9a, 0x76, 0xab, 0xbb, 0x40, 0xde, 0xd5, 0x09, 0xd3, 0xbe, 0xea, 0x5d, 0xed, 0x20, 0x78, 0x4b, - 0xe7, 0xd2, 0xf6, 0xb9, 0xb6, 0x75, 0xf1, 0x5c, 0xe7, 0xe2, 0xb9, 0x5d, 0xa7, 0x85, 0xda, 0xfe, - 0x0f, 0xe4, 0x85, 0x65, 0x87, 0xb7, 0x45, 0xe5, 0x6a, 0x3b, 0x4d, 0xb3, 0xdd, 0xf5, 0x1c, 0x17, - 0xb1, 0x9c, 0xa7, 0xc3, 0x2a, 0xd1, 0x3e, 0xb2, 0x3d, 0xbf, 0x84, 0x1b, 0xb6, 0x1d, 0x67, 0xbb, - 0x8d, 0xe8, 0xb7, 0x8b, 0x7b, 0x5b, 0xe7, 0xba, 0x9e, 0xbb, 0xd7, 0xf4, 0xd8, 0xd7, 0x9b, 0x7a, - 0xbf, 0xb6, 0x50, 0xb7, 0xe9, 0x5a, 0x1d, 0xcf, 0x71, 0x69, 0x8e, 0xb3, 0x5f, 0xfb, 0xed, 0x09, - 0xa0, 0xe8, 0x9d, 0x26, 0xfc, 0xd6, 0x04, 0x50, 0x4a, 0x9d, 0x0e, 0xfc, 0x68, 0x16, 0x80, 0x15, - 0xe4, 0x9d, 0x47, 0x6e, 0xd7, 0x72, 0x6c, 0x78, 0x1c, 0x4c, 0xe8, 0xe8, 0xc7, 0xf6, 0x50, 0xd7, - 0xbb, 0x27, 0xf7, 0xc8, 0xd7, 0x95, 0x0c, 0x7c, 0x7d, 0x16, 0x4c, 0xea, 0xa8, 0xdb, 0x71, 0xec, - 0x2e, 0x52, 0x1f, 0x00, 0x79, 0xe4, 0xba, 0x8e, 0x3b, 0x9f, 0xb9, 0x29, 0x73, 0xdb, 0xf4, 0x9d, - 0xb7, 0x2f, 0xb0, 0xe6, 0x2f, 0xe8, 0x9d, 0xe6, 0x42, 0xa9, 0xd3, 0x59, 0x08, 0x4b, 0x5a, 0xf0, - 0x7f, 0x5a, 0xd0, 0xf0, 0x1f, 0x3a, 0xfd, 0x51, 0x9d, 0x07, 0x13, 0xfb, 0x34, 0xc3, 0x7c, 0xf6, - 0xa6, 0xcc, 0x6d, 0x53, 0xba, 0xff, 0x8a, 0xbf, 0xb4, 0x90, 0x67, 0x5a, 0xed, 0xee, 0xbc, 0x42, - 0xbf, 0xb0, 0x57, 0xf8, 0xda, 0x0c, 0xc8, 0x93, 0x42, 0xd4, 0x32, 0xc8, 0x35, 0x9d, 0x16, 0x22, - 0xd5, 0xcf, 0xdd, 0x79, 0x4e, 0xbe, 0xfa, 0x85, 0xb2, 0xd3, 0x42, 0x3a, 0xf9, 0x59, 0xbd, 0x09, - 0x4c, 0xfb, 0x6c, 0x09, 0xc9, 0xe0, 0x93, 0xce, 0xde, 0x09, 0x72, 0x38, 0xbf, 0x3a, 0x09, 0x72, - 0xd5, 0xcd, 0xb5, 0xb5, 0xe2, 0x31, 0xf5, 0x04, 0x98, 0xdd, 0xac, 0x3e, 0x58, 0xad, 0x5d, 0xa8, - 0x36, 0x34, 0x5d, 0xaf, 0xe9, 0xc5, 0x8c, 0x3a, 0x0b, 0xa6, 0x16, 0x4b, 0x4b, 0x8d, 0x4a, 0x75, - 0x63, 0xd3, 0x28, 0x66, 0xe1, 0xab, 0x14, 0x30, 0x57, 0x47, 0xde, 0x12, 0xda, 0xb7, 0x9a, 0xa8, - 0xee, 0x99, 0x1e, 0x82, 0x2f, 0xca, 0x04, 0xcc, 0x54, 0x37, 0x71, 0xa5, 0xc1, 0x27, 0xd6, 0x80, - 0xbb, 0x0e, 0x34, 0x40, 0x2c, 0x61, 0x81, 0xfd, 0xbd, 0xc0, 0xa5, 0xe9, 0x7c, 0x39, 0x67, 0x9f, - 0x08, 0xa6, 0xb9, 0x6f, 0xea, 0x1c, 0x00, 0x8b, 0xa5, 0xf2, 0x83, 0x2b, 0x7a, 0x6d, 0xb3, 0xba, - 0x54, 0x3c, 0x86, 0xdf, 0x97, 0x6b, 0xba, 0xc6, 0xde, 0x33, 0xf0, 0x3b, 0x19, 0x0e, 0xcc, 0x25, - 0x11, 0xcc, 0x85, 0xc1, 0xc4, 0xf4, 0x01, 0x14, 0xbe, 0x21, 0x00, 0x67, 0x45, 0x00, 0xe7, 0xae, - 0x64, 0xc5, 0xa5, 0x0f, 0xd0, 0xf3, 0xb3, 0x60, 0xb2, 0xbe, 0xb3, 0xe7, 0xb5, 0x9c, 0xcb, 0x36, - 0x9c, 0x0a, 0x90, 0x81, 0xdf, 0xe4, 0x79, 0xf2, 0x4c, 0x91, 0x27, 0xb7, 0x1d, 0x6c, 0x04, 0x2b, - 0x21, 0x82, 0x1b, 0xbf, 0x1a, 0x70, 0xa3, 0x24, 0x70, 0xe3, 0x89, 0xb2, 0x05, 0xa5, 0xcf, 0x87, - 0x9f, 0xbf, 0x0b, 0xe4, 0xeb, 0x1d, 0xb3, 0x89, 0xe0, 0x27, 0x15, 0x30, 0xb3, 0x86, 0xcc, 0x7d, - 0x54, 0xea, 0x74, 0x5c, 0x67, 0x1f, 0xc1, 0x72, 0x28, 0xaf, 0xf3, 0x60, 0xa2, 0x8b, 0x33, 0x55, - 0x5a, 0xa4, 0x05, 0x53, 0xba, 0xff, 0xaa, 0x9e, 0x01, 0xc0, 0x6a, 0x21, 0xdb, 0xb3, 0x3c, 0x0b, - 0x75, 0xe7, 0xb3, 0x37, 0x29, 0xb7, 0x4d, 0xe9, 0x5c, 0x0a, 0xfc, 0x56, 0x56, 0x56, 0xc6, 0x08, - 0x15, 0x0b, 0x3c, 0x05, 0x11, 0x5c, 0x7d, 0x5d, 0x56, 0x46, 0xc6, 0x06, 0x16, 0x97, 0x8c, 0xb7, - 0x6f, 0xc9, 0x24, 0x67, 0x2e, 0xce, 0x51, 0xad, 0x35, 0xea, 0x9b, 0xe5, 0xd5, 0x46, 0x7d, 0xa3, - 0x54, 0xd6, 0x8a, 0x48, 0x3d, 0x09, 0x8a, 0xe4, 0xb1, 0x51, 0xa9, 0x37, 0x96, 0xb4, 0x35, 0xcd, - 0xd0, 0x96, 0x8a, 0x5b, 0xaa, 0x0a, 0xe6, 0x74, 0xed, 0x87, 0x36, 0xb5, 0xba, 0xd1, 0x58, 0x2e, - 0x55, 0xd6, 0xb4, 0xa5, 0xe2, 0x36, 0xfe, 0x79, 0xad, 0xb2, 0x5e, 0x31, 0x1a, 0xba, 0x56, 0x2a, - 0xaf, 0x6a, 0x4b, 0xc5, 0x1d, 0xf5, 0x5a, 0x70, 0x4d, 0xb5, 0xd6, 0x28, 0x6d, 0x6c, 0xe8, 0xb5, - 0xf3, 0x5a, 0x83, 0xfd, 0x51, 0x2f, 0x5a, 0xb4, 0x22, 0xa3, 0x51, 0x5f, 0x2d, 0xe9, 0x5a, 0x69, - 0x71, 0x4d, 0x2b, 0x3e, 0x0c, 0x9f, 0xa7, 0x80, 0xd9, 0x75, 0xf3, 0x12, 0xaa, 0xef, 0x98, 0x2e, - 0x32, 0x2f, 0xb6, 0x11, 0xbc, 0x59, 0x02, 0x4f, 0xf8, 0x49, 0x1e, 0x2f, 0x4d, 0xc4, 0xeb, 0x5c, - 0x1f, 0x06, 0x0b, 0x55, 0x44, 0x00, 0xf6, 0xbf, 0x03, 0x35, 0x58, 0x15, 0x00, 0x7b, 0x4a, 0xc2, - 0xf2, 0x92, 0x21, 0xf6, 0x13, 0x8f, 0x02, 0xc4, 0xe0, 0x97, 0x14, 0x30, 0x57, 0xb1, 0xf7, 0x2d, - 0x0f, 0xad, 0x20, 0x1b, 0xb9, 0x78, 0x1c, 0x90, 0x82, 0xe1, 0xf5, 0x0a, 0x07, 0xc3, 0xb2, 0x08, - 0xc3, 0x93, 0xfa, 0xb0, 0x4d, 0xac, 0x23, 0x62, 0xb4, 0xbd, 0x01, 0x4c, 0x59, 0x24, 0x5f, 0xd9, - 0x6a, 0x31, 0x8e, 0x85, 0x09, 0xea, 0x2d, 0x60, 0x96, 0xbe, 0x2c, 0x5b, 0x6d, 0xf4, 0x20, 0xba, - 0xca, 0xc6, 0x5d, 0x31, 0x11, 0xfe, 0x5c, 0xa0, 0x7c, 0x15, 0x01, 0xcb, 0xa7, 0x26, 0x25, 0x2a, - 0x19, 0x98, 0x2f, 0x7d, 0x34, 0xa8, 0xdf, 0x01, 0x2d, 0xb3, 0xe0, 0xf7, 0xb2, 0x60, 0xba, 0xee, - 0x39, 0x1d, 0x2c, 0xb2, 0x96, 0xbd, 0x2d, 0x07, 0xee, 0xc7, 0x79, 0x1d, 0x2b, 0x8b, 0xe0, 0x3e, - 0xb1, 0x0f, 0x1f, 0xb9, 0x0a, 0x22, 0x34, 0xec, 0x5b, 0x81, 0x86, 0x2d, 0x0b, 0xa8, 0xdc, 0x99, - 0xa8, 0xb4, 0xef, 0x43, 0xfd, 0x7a, 0xa9, 0x02, 0x8a, 0xbe, 0x98, 0x79, 0xe5, 0x3d, 0xd7, 0x45, - 0xb6, 0x27, 0x07, 0xc2, 0x5f, 0xf2, 0x20, 0xac, 0x8a, 0x20, 0xdc, 0x19, 0x23, 0xcc, 0x7e, 0x2d, - 0x29, 0xea, 0xd8, 0xef, 0x07, 0x68, 0x3e, 0x28, 0xa0, 0xf9, 0xb4, 0xe4, 0x64, 0x25, 0x83, 0x74, - 0x75, 0x08, 0x44, 0x4f, 0x82, 0x22, 0x1e, 0x93, 0xca, 0x46, 0xe5, 0xbc, 0xd6, 0xa8, 0x54, 0xcf, - 0x57, 0x0c, 0xad, 0x88, 0xe0, 0x4b, 0x14, 0x30, 0x43, 0x49, 0xd3, 0xd1, 0xbe, 0x73, 0x49, 0xb2, - 0xd7, 0xfb, 0x52, 0x42, 0x63, 0x81, 0xaf, 0x21, 0x42, 0x33, 0x7e, 0x26, 0x81, 0xb1, 0x10, 0x53, - 0xdc, 0xa3, 0xa9, 0xb7, 0x3a, 0xa0, 0x06, 0xdb, 0x7d, 0xb4, 0xa5, 0x6f, 0x6f, 0xf5, 0xd2, 0x1c, - 0x00, 0xb4, 0x91, 0xe7, 0x2d, 0x74, 0x19, 0xae, 0x87, 0x98, 0x08, 0x62, 0x9b, 0x19, 0x28, 0xb6, - 0xd9, 0x7e, 0x62, 0xfb, 0x1e, 0x7e, 0xcc, 0x5a, 0x14, 0xd1, 0xbb, 0x23, 0x92, 0xdd, 0x98, 0x92, - 0xe8, 0xd9, 0xa1, 0x2f, 0x28, 0x59, 0xd1, 0xea, 0xbc, 0x01, 0x4c, 0x91, 0xc7, 0xaa, 0xb9, 0x8b, - 0x98, 0x0e, 0x85, 0x09, 0xea, 0x59, 0x30, 0x43, 0x33, 0x36, 0x1d, 0x1b, 0xb7, 0x27, 0x47, 0x32, - 0x08, 0x69, 0x18, 0xc4, 0xa6, 0x8b, 0x4c, 0xcf, 0x71, 0x49, 0x19, 0x79, 0x0a, 0x22, 0x97, 0x04, - 0xbf, 0x11, 0x68, 0xa1, 0x26, 0x48, 0xce, 0x93, 0x93, 0x34, 0x25, 0x99, 0xdc, 0xec, 0x0f, 0xa7, - 0x7f, 0x54, 0xeb, 0x1a, 0x18, 0xed, 0x65, 0x32, 0xb5, 0x43, 0xea, 0x69, 0xa0, 0xb2, 0x54, 0x9c, - 0xb7, 0x5c, 0xab, 0x1a, 0x5a, 0xd5, 0x28, 0x6e, 0xf5, 0x95, 0xa8, 0x6d, 0xf8, 0xba, 0x1c, 0xc8, - 0x3d, 0xcb, 0xb1, 0x6c, 0xf8, 0xfc, 0x8c, 0x20, 0x12, 0x36, 0xf2, 0x2e, 0x3b, 0xee, 0xa5, 0x40, - 0x51, 0xc3, 0x84, 0x78, 0x6c, 0x42, 0x51, 0x52, 0x06, 0x8a, 0x52, 0xae, 0x9f, 0x28, 0xfd, 0x02, - 0x2f, 0x4a, 0xf7, 0x8a, 0xa2, 0x74, 0x6b, 0x1f, 0xfe, 0x63, 0xe2, 0x23, 0x3a, 0x80, 0x8f, 0x05, - 0x1d, 0xc0, 0xfd, 0x02, 0x8c, 0x4f, 0x90, 0x2b, 0x26, 0x19, 0x80, 0x5f, 0x4c, 0x55, 0xf1, 0xfb, - 0x41, 0xbd, 0x1d, 0x01, 0xf5, 0x4e, 0x9f, 0x3e, 0xc1, 0x3a, 0xd8, 0x75, 0x3c, 0x7c, 0xb0, 0x9b, - 0xb8, 0xa4, 0x9e, 0x02, 0x27, 0x96, 0x2a, 0xcb, 0xcb, 0x9a, 0xae, 0x55, 0x8d, 0x46, 0x55, 0x33, - 0x2e, 0xd4, 0xf4, 0x07, 0x8b, 0x6d, 0xf8, 0x5a, 0x05, 0x00, 0xcc, 0xa1, 0xb2, 0x69, 0x37, 0x51, - 0x5b, 0xae, 0x47, 0xff, 0x9f, 0xd9, 0x64, 0x7d, 0x42, 0x58, 0x7e, 0x04, 0x9c, 0xaf, 0xcc, 0xca, - 0x6b, 0x65, 0x64, 0x61, 0xc9, 0x40, 0x7d, 0xd3, 0xa3, 0xc1, 0xf6, 0xbc, 0x06, 0x1c, 0xf7, 0xcb, - 0x63, 0xd9, 0xfb, 0x4f, 0xfb, 0xde, 0x9a, 0x03, 0x73, 0x0c, 0x16, 0x7f, 0x1e, 0xff, 0x48, 0x46, - 0x66, 0x22, 0x0f, 0xc1, 0x24, 0x9b, 0xb6, 0xfb, 0xdd, 0x7b, 0xf0, 0xae, 0xae, 0x80, 0xe9, 0x0e, - 0x72, 0x77, 0xad, 0x6e, 0xd7, 0x72, 0x6c, 0xba, 0x20, 0x37, 0x77, 0xe7, 0xe3, 0x02, 0x8e, 0x93, - 0xb5, 0xcb, 0x85, 0x0d, 0xd3, 0xf5, 0xac, 0xa6, 0xd5, 0x31, 0x6d, 0x6f, 0x23, 0xcc, 0xac, 0xf3, - 0x7f, 0xc2, 0x17, 0x27, 0x9c, 0xd6, 0x88, 0x2d, 0x89, 0x10, 0x89, 0xf7, 0x27, 0x98, 0x92, 0xc4, - 0x16, 0x98, 0x4c, 0x2c, 0x3e, 0x9a, 0xaa, 0x58, 0xf4, 0xc1, 0x7b, 0x5b, 0xbd, 0x0e, 0x9c, 0xaa, - 0x54, 0xcb, 0x35, 0x5d, 0xd7, 0xca, 0x46, 0x63, 0x43, 0xd3, 0xd7, 0x2b, 0xf5, 0x7a, 0xa5, 0x56, - 0xad, 0x1f, 0x46, 0xdb, 0xe1, 0x27, 0x94, 0x40, 0x62, 0x96, 0x50, 0xb3, 0x6d, 0xd9, 0x08, 0xde, - 0x7f, 0x48, 0x81, 0x11, 0x57, 0x7d, 0xe4, 0x71, 0x66, 0xf5, 0x47, 0xe0, 0xfc, 0x9a, 0xe4, 0x38, - 0xf7, 0x2f, 0xf0, 0xdf, 0xb0, 0xfa, 0x7f, 0x49, 0x01, 0x27, 0x38, 0x45, 0xd4, 0xd1, 0xee, 0xc8, - 0x56, 0xf2, 0x7e, 0x82, 0xd7, 0xdd, 0x8a, 0x88, 0x69, 0x3f, 0x6b, 0xfa, 0x00, 0x19, 0x11, 0xb0, - 0xbe, 0x29, 0x80, 0x75, 0x4d, 0x80, 0xf5, 0xe9, 0x43, 0x94, 0x99, 0x0c, 0xd9, 0xdf, 0x4a, 0x15, - 0xd9, 0xeb, 0xc0, 0xa9, 0x8d, 0x92, 0x6e, 0x54, 0xca, 0x95, 0x8d, 0x12, 0x1e, 0x47, 0xb9, 0x21, - 0x3b, 0xc2, 0x5c, 0x17, 0x41, 0xef, 0x8b, 0xef, 0xef, 0xe5, 0xc0, 0x0d, 0xfd, 0x3b, 0xda, 0xf2, - 0x8e, 0x69, 0x6f, 0x23, 0x68, 0xc9, 0x40, 0xbd, 0x04, 0x26, 0x9a, 0x24, 0x3b, 0xc5, 0x99, 0xdf, - 0xba, 0x89, 0xe9, 0xcb, 0x69, 0x0d, 0xba, 0xff, 0x2b, 0x7c, 0x07, 0x2f, 0x10, 0x86, 0x28, 0x10, - 0xcf, 0x8c, 0x07, 0xef, 0x00, 0xdd, 0x11, 0xb2, 0xf1, 0xe9, 0x40, 0x36, 0x2e, 0x08, 0xb2, 0x51, - 0x3e, 0x5c, 0xf1, 0xc9, 0xc4, 0xe4, 0x8f, 0x1e, 0x0d, 0x1d, 0x40, 0xa4, 0x34, 0x59, 0xd1, 0xa3, - 0x42, 0xdf, 0xee, 0xfe, 0xd5, 0x0a, 0x28, 0x2c, 0xa1, 0x36, 0x92, 0x5d, 0x89, 0xfc, 0xfb, 0xac, - 0xec, 0x86, 0x08, 0x85, 0x81, 0x96, 0x1d, 0xbd, 0x3a, 0xe2, 0x59, 0xbb, 0xa8, 0xeb, 0x99, 0xbb, - 0x1d, 0xc2, 0x6a, 0x45, 0x0f, 0x13, 0xe0, 0x4f, 0x66, 0x65, 0xb6, 0x4b, 0x62, 0xaa, 0xf9, 0xb7, - 0xb1, 0xa6, 0xf8, 0xd5, 0x39, 0x50, 0xb8, 0x60, 0xb6, 0xdb, 0xc8, 0x83, 0x5f, 0xcb, 0x82, 0x42, - 0x19, 0xcf, 0x49, 0x11, 0x7c, 0x42, 0x08, 0x16, 0x04, 0x93, 0xae, 0xe3, 0x78, 0x1b, 0xa6, 0xb7, - 0xc3, 0xd0, 0x0a, 0xde, 0xd9, 0x36, 0xed, 0x6f, 0xf2, 0xa0, 0xdd, 0x2f, 0x82, 0xf6, 0x03, 0x02, - 0x37, 0x69, 0x45, 0x0b, 0xb4, 0x92, 0x08, 0xd4, 0x20, 0x98, 0xdc, 0xb5, 0xd1, 0xae, 0x63, 0x5b, - 0x4d, 0x7f, 0xa4, 0xf7, 0xdf, 0xe1, 0x87, 0x82, 0x59, 0xf2, 0xa2, 0x80, 0xd9, 0x82, 0x74, 0x2d, - 0xc9, 0x40, 0xab, 0x0f, 0x81, 0xd9, 0x8d, 0xe0, 0x7a, 0x0a, 0x41, 0xc3, 0xa8, 0x35, 0xca, 0xba, - 0x56, 0x32, 0xb4, 0xc6, 0x5a, 0xad, 0x5c, 0x5a, 0x6b, 0xe8, 0xda, 0x46, 0xad, 0x88, 0xe0, 0x7f, - 0xcb, 0x62, 0xe6, 0x36, 0x9d, 0x7d, 0xe4, 0xc2, 0x15, 0x29, 0x3e, 0xc7, 0xf1, 0x84, 0x61, 0xf0, - 0x0b, 0xd2, 0x5b, 0xe5, 0x8c, 0x3b, 0x8c, 0x82, 0x88, 0xae, 0xf0, 0xc3, 0x52, 0xdb, 0xde, 0xb1, - 0x45, 0x3d, 0x0a, 0x38, 0xfd, 0xbf, 0xb2, 0x60, 0xa2, 0xec, 0xd8, 0xfb, 0xc8, 0xf5, 0x78, 0x2b, - 0x93, 0xe7, 0x66, 0x46, 0xe4, 0x26, 0xee, 0x9a, 0x90, 0xed, 0xb9, 0x4e, 0xc7, 0x37, 0x33, 0xfd, - 0x57, 0xf8, 0xeb, 0x49, 0x39, 0xcc, 0x6a, 0x8e, 0x5e, 0x6e, 0xea, 0x5f, 0x91, 0x40, 0x9e, 0xd2, - 0xa3, 0x00, 0xaf, 0x4d, 0x82, 0x4b, 0x7f, 0x02, 0xd2, 0xdf, 0xe5, 0xfd, 0xb2, 0x02, 0x66, 0xa9, - 0xf2, 0xd5, 0x11, 0x19, 0x17, 0x61, 0x8d, 0x5f, 0xe8, 0xe9, 0x61, 0xfe, 0xea, 0x31, 0x81, 0xfd, - 0x05, 0xb3, 0xd3, 0x09, 0x16, 0xfd, 0x56, 0x8f, 0xe9, 0xec, 0x9d, 0x8a, 0xf9, 0x62, 0x01, 0xe4, - 0xcc, 0x3d, 0x6f, 0x07, 0x7e, 0x4f, 0xda, 0xe4, 0x17, 0x3a, 0x03, 0x46, 0x4f, 0x04, 0x24, 0x27, - 0x41, 0xde, 0x73, 0x2e, 0x21, 0x9f, 0x0f, 0xf4, 0x05, 0xc3, 0x61, 0x76, 0x3a, 0x06, 0xf9, 0xc0, - 0xe0, 0xf0, 0xdf, 0xf1, 0x08, 0x63, 0x36, 0x9b, 0xce, 0x9e, 0xed, 0x55, 0xfc, 0x85, 0xbf, 0x30, - 0x01, 0x7e, 0x3e, 0x23, 0x33, 0x85, 0x90, 0x20, 0x30, 0x19, 0x64, 0x17, 0x87, 0x50, 0xa5, 0x05, - 0x70, 0x7b, 0x69, 0x63, 0xa3, 0x61, 0xd4, 0x1e, 0xd4, 0xaa, 0xe1, 0x70, 0xdf, 0xa8, 0x54, 0x1b, - 0xc6, 0xaa, 0xd6, 0x28, 0x6f, 0xea, 0x64, 0x75, 0xa6, 0x54, 0x2e, 0xd7, 0x36, 0xab, 0x46, 0x11, - 0xc1, 0x37, 0x67, 0xc1, 0x4c, 0xb9, 0xed, 0x74, 0x03, 0x84, 0x6f, 0x0c, 0x11, 0x0e, 0xd8, 0x98, - 0xe1, 0xd8, 0x08, 0xff, 0x25, 0x23, 0xbb, 0xd5, 0xeb, 0x33, 0x84, 0x2b, 0x3e, 0xa2, 0x97, 0xfa, - 0x75, 0xa9, 0xad, 0xde, 0xc1, 0xe5, 0xa5, 0xaf, 0x12, 0x9f, 0xbd, 0x07, 0x4c, 0x94, 0xa8, 0x60, - 0xc0, 0xbf, 0xce, 0x80, 0x42, 0xd9, 0xb1, 0xb7, 0xac, 0x6d, 0xf5, 0x56, 0x30, 0x87, 0x6c, 0xf3, - 0x62, 0x1b, 0x2d, 0x99, 0x9e, 0xb9, 0x6f, 0xa1, 0xcb, 0xa4, 0x01, 0x93, 0x7a, 0x4f, 0x2a, 0x26, - 0x8a, 0xa5, 0xa0, 0x8b, 0x7b, 0xdb, 0x84, 0xa8, 0x49, 0x9d, 0x4f, 0x52, 0x9f, 0x0e, 0xae, 0xa5, - 0xaf, 0x1b, 0x2e, 0x72, 0x51, 0x1b, 0x99, 0x5d, 0x84, 0x8d, 0x51, 0x1b, 0xb5, 0x89, 0xd0, 0x4e, - 0xea, 0x51, 0x9f, 0xd5, 0xb3, 0x60, 0x86, 0x7e, 0x22, 0xa6, 0x4e, 0x97, 0x88, 0xf1, 0xa4, 0x2e, - 0xa4, 0xa9, 0x4f, 0x04, 0x79, 0x74, 0xc5, 0x73, 0xcd, 0xf9, 0x16, 0xc1, 0xeb, 0xda, 0x05, 0xea, - 0xeb, 0xb5, 0xe0, 0xfb, 0x7a, 0x2d, 0xd4, 0x89, 0x27, 0x98, 0x4e, 0x73, 0xc1, 0x5f, 0x99, 0x0c, - 0x0c, 0x89, 0x7f, 0xcd, 0x86, 0x82, 0xa1, 0x82, 0x9c, 0x6d, 0xee, 0x22, 0x26, 0x17, 0xe4, 0x59, - 0xbd, 0x1d, 0x1c, 0x37, 0xf7, 0x4d, 0xcf, 0x74, 0xd7, 0x9c, 0xa6, 0xd9, 0x26, 0x83, 0x9f, 0xaf, - 0xf9, 0xbd, 0x1f, 0xc8, 0x3a, 0xbc, 0xe7, 0xb8, 0x88, 0xe4, 0xf2, 0xd7, 0xe1, 0xfd, 0x04, 0x5c, - 0xba, 0xd5, 0x74, 0x6c, 0x42, 0xbf, 0xa2, 0x93, 0x67, 0xcc, 0x95, 0x96, 0xd5, 0xc5, 0x0d, 0x21, - 0xa5, 0x54, 0xe9, 0x82, 0x72, 0xfd, 0xaa, 0xdd, 0x24, 0x6b, 0xf0, 0x93, 0x7a, 0xd4, 0x67, 0x75, - 0x11, 0x4c, 0xb3, 0xe5, 0xe7, 0x75, 0x2c, 0x57, 0x05, 0x22, 0x57, 0x37, 0x89, 0x9e, 0x34, 0x14, - 0xcf, 0x85, 0x6a, 0x98, 0x4f, 0xe7, 0x7f, 0x52, 0x1f, 0x00, 0xd7, 0xb3, 0xd7, 0xf2, 0x5e, 0xd7, - 0x73, 0x76, 0x29, 0xe8, 0xcb, 0x56, 0x9b, 0xb6, 0x60, 0x82, 0xb4, 0x20, 0x2e, 0x8b, 0x7a, 0x27, - 0x38, 0xd9, 0x71, 0xd1, 0x16, 0x72, 0x1f, 0x32, 0x77, 0xf7, 0xae, 0x18, 0xae, 0x69, 0x77, 0x3b, - 0x8e, 0xeb, 0xcd, 0x4f, 0x12, 0xe2, 0xfb, 0x7e, 0x63, 0x1d, 0xe5, 0x24, 0x28, 0x50, 0xf6, 0xc1, - 0x17, 0xe5, 0xa5, 0x9d, 0xe8, 0x58, 0x83, 0x62, 0xcd, 0xb3, 0x27, 0x81, 0x09, 0xd6, 0xc3, 0x11, - 0xa0, 0xa6, 0xef, 0x3c, 0xdd, 0x33, 0x9b, 0x63, 0xa5, 0xe8, 0x7e, 0x36, 0xf5, 0x2e, 0x50, 0x68, - 0x92, 0x66, 0x11, 0xcc, 0xa6, 0xef, 0xbc, 0xbe, 0x7f, 0xa5, 0x24, 0x8b, 0xce, 0xb2, 0xc2, 0x2f, - 0x28, 0x52, 0x7e, 0x77, 0x71, 0x14, 0x27, 0xd3, 0xea, 0x6f, 0x64, 0x87, 0xe8, 0x36, 0xef, 0x00, - 0xb7, 0xb1, 0x3e, 0x91, 0xd9, 0x1f, 0x4b, 0x8d, 0xc5, 0x4d, 0xdf, 0x04, 0xc7, 0x56, 0x49, 0xdd, - 0x28, 0xe9, 0x78, 0xfe, 0xb4, 0x84, 0x4d, 0xf7, 0xdb, 0xc1, 0xad, 0x03, 0x72, 0x6b, 0x46, 0xa3, - 0x5a, 0x5a, 0xd7, 0x8a, 0x5b, 0xa2, 0x6d, 0x53, 0x37, 0x6a, 0x1b, 0x0d, 0x7d, 0xb3, 0x5a, 0xad, - 0x54, 0x57, 0x68, 0x61, 0xd8, 0x24, 0x3c, 0x1d, 0x66, 0xb8, 0xa0, 0x57, 0x0c, 0xad, 0x51, 0xae, - 0x55, 0x97, 0x2b, 0x2b, 0x45, 0x6b, 0x90, 0x61, 0xf4, 0xb0, 0x7a, 0x13, 0xb8, 0x41, 0xa0, 0xa4, - 0x52, 0xab, 0xe2, 0xf9, 0x44, 0xb9, 0x54, 0x2d, 0x6b, 0x78, 0xf2, 0x70, 0x49, 0x85, 0xe0, 0x14, - 0x2d, 0xae, 0xb1, 0x5c, 0x59, 0xe3, 0xb7, 0x00, 0x3e, 0x9e, 0x51, 0xe7, 0xc1, 0x35, 0xfc, 0xb7, - 0x4a, 0xf5, 0x7c, 0x69, 0xad, 0xb2, 0x54, 0xfc, 0xc3, 0x8c, 0x7a, 0x0b, 0xb8, 0x51, 0xf8, 0x8b, - 0xae, 0xe6, 0x37, 0x2a, 0x4b, 0x8d, 0xf5, 0x4a, 0x7d, 0xbd, 0x64, 0x94, 0x57, 0x8b, 0x9f, 0x20, - 0xf3, 0x85, 0xc0, 0x00, 0xe6, 0x9c, 0xe1, 0x5e, 0xca, 0x8f, 0xe9, 0x25, 0x51, 0x50, 0x9f, 0xd0, - 0x17, 0xf6, 0x78, 0x1b, 0xf6, 0xa3, 0xc1, 0xe8, 0xb0, 0x24, 0x88, 0xd0, 0x93, 0x12, 0x94, 0x95, - 0x4c, 0x86, 0x8c, 0x21, 0x44, 0xe8, 0x26, 0x70, 0x43, 0x55, 0xa3, 0x48, 0xe9, 0x5a, 0xb9, 0x76, - 0x5e, 0xd3, 0x1b, 0x17, 0x4a, 0x6b, 0x6b, 0x9a, 0xd1, 0x58, 0xae, 0xe8, 0x75, 0xa3, 0xb8, 0x05, - 0xff, 0x29, 0x1b, 0xcc, 0xa1, 0x39, 0x6e, 0xfd, 0x75, 0x36, 0xa9, 0x5a, 0xc7, 0xce, 0x95, 0x9f, - 0x0a, 0x0a, 0x5d, 0xcf, 0xf4, 0xf6, 0xba, 0x4c, 0xab, 0x1f, 0xd3, 0x5f, 0xab, 0x17, 0xea, 0x24, - 0x93, 0xce, 0x32, 0xc3, 0x2f, 0x64, 0x92, 0xa8, 0xe9, 0x08, 0xa6, 0xd1, 0xd6, 0x10, 0x2c, 0x3e, - 0x03, 0xa0, 0x2f, 0xed, 0x95, 0x7a, 0xa3, 0xb4, 0xa6, 0x6b, 0xa5, 0xa5, 0x87, 0x82, 0xc9, 0x33, - 0x52, 0x4f, 0x81, 0x13, 0x9b, 0x55, 0x3c, 0x1d, 0x26, 0xea, 0x52, 0xab, 0x56, 0xb5, 0x32, 0xe6, - 0xfb, 0x4f, 0x92, 0xa5, 0x6a, 0x6c, 0x41, 0x13, 0xba, 0xb1, 0x95, 0xc3, 0xf1, 0xff, 0xeb, 0xd2, - 0x1e, 0x1d, 0xa1, 0x84, 0xf1, 0x65, 0x8d, 0x16, 0x87, 0xcf, 0x4b, 0x39, 0x71, 0x48, 0x51, 0x92, - 0x0c, 0x8f, 0xff, 0x30, 0x04, 0x1e, 0xa7, 0xc0, 0x09, 0x1e, 0x0f, 0xe2, 0xcc, 0x11, 0x0d, 0xc3, - 0x57, 0x26, 0x41, 0xa1, 0x8e, 0xda, 0xa8, 0xe9, 0xc1, 0xb7, 0x72, 0xc6, 0xc4, 0x1c, 0xc8, 0x06, - 0xce, 0x03, 0x59, 0xab, 0x25, 0x4c, 0x9f, 0xb3, 0x3d, 0xd3, 0xe7, 0x18, 0x33, 0x40, 0x49, 0x64, - 0x06, 0xe4, 0x52, 0x30, 0x03, 0xf2, 0xc3, 0x9b, 0x01, 0x85, 0x41, 0x66, 0x00, 0xfc, 0xb5, 0x42, - 0xd2, 0x5e, 0x82, 0xb2, 0xfa, 0x68, 0x07, 0xff, 0xff, 0x99, 0x4b, 0xd2, 0xab, 0xf4, 0xa5, 0x38, - 0x99, 0x14, 0x7f, 0x4f, 0x49, 0x61, 0xf9, 0x41, 0xbd, 0x19, 0xdc, 0x18, 0xbe, 0x37, 0xb4, 0x67, - 0x57, 0xea, 0x46, 0x9d, 0x8c, 0xf8, 0xe5, 0x9a, 0xae, 0x6f, 0x6e, 0xd0, 0x95, 0xbb, 0xd3, 0x40, - 0x0d, 0x4b, 0xd1, 0x37, 0xab, 0x74, 0x7c, 0xdf, 0x16, 0x4b, 0x5f, 0xae, 0x54, 0x97, 0x1a, 0x81, - 0xce, 0x54, 0x97, 0x6b, 0xc5, 0x1d, 0x3c, 0x65, 0xe3, 0x4a, 0xc7, 0x03, 0x34, 0xab, 0xa1, 0x54, - 0x5d, 0x6a, 0xac, 0x57, 0xb5, 0xf5, 0x5a, 0xb5, 0x52, 0x26, 0xe9, 0x75, 0xcd, 0x28, 0x5a, 0x78, - 0xa0, 0xe9, 0xb1, 0x28, 0xea, 0x5a, 0x49, 0x2f, 0xaf, 0x6a, 0x3a, 0xad, 0xf2, 0x61, 0xf5, 0x56, - 0x70, 0xb6, 0x54, 0xad, 0x19, 0x38, 0xa5, 0x54, 0x7d, 0xc8, 0x78, 0x68, 0x43, 0x6b, 0x6c, 0xe8, - 0xb5, 0xb2, 0x56, 0xaf, 0x63, 0x3d, 0x65, 0xf6, 0x47, 0xb1, 0xad, 0x3e, 0x13, 0xdc, 0xc3, 0x91, - 0xa6, 0x19, 0x64, 0x9b, 0x68, 0xbd, 0x46, 0x3c, 0x05, 0x96, 0xb4, 0xc6, 0x6a, 0xa9, 0xde, 0xa8, - 0x54, 0xcb, 0xb5, 0xf5, 0x8d, 0x92, 0x51, 0xc1, 0xea, 0xbc, 0xa1, 0xd7, 0x8c, 0x5a, 0xe3, 0xbc, - 0xa6, 0xd7, 0x2b, 0xb5, 0x6a, 0xd1, 0xc6, 0x4d, 0xe6, 0xf4, 0xdf, 0xef, 0x87, 0x1d, 0xf5, 0x06, - 0x30, 0xef, 0xa7, 0xaf, 0xd5, 0x30, 0xa3, 0x39, 0x8b, 0xa4, 0x93, 0xaa, 0x45, 0xf2, 0xcf, 0x59, - 0x90, 0xab, 0x7b, 0x4e, 0x07, 0xfe, 0x40, 0xd8, 0xc1, 0x9c, 0x01, 0xc0, 0x25, 0xbb, 0x3e, 0x78, - 0x16, 0xc6, 0xe6, 0x65, 0x5c, 0x0a, 0xfc, 0x03, 0xe9, 0xa5, 0xea, 0xb0, 0xcf, 0x76, 0x3a, 0x11, - 0xb6, 0xca, 0x77, 0xe4, 0x7c, 0xf7, 0xa3, 0x0b, 0x4a, 0x26, 0xef, 0x3f, 0x33, 0xcc, 0x62, 0x34, - 0x04, 0xa7, 0x39, 0xd8, 0x30, 0xff, 0x7d, 0x91, 0x40, 0xea, 0xb5, 0xe0, 0x9a, 0x1e, 0xe1, 0x22, - 0x32, 0xb5, 0xa5, 0x3e, 0x16, 0x3c, 0x86, 0x13, 0x6f, 0x6d, 0xbd, 0x76, 0x5e, 0x0b, 0x04, 0x79, - 0xa9, 0x64, 0x94, 0x8a, 0xdb, 0xf0, 0xb3, 0x0a, 0xc8, 0xad, 0x3b, 0xfb, 0xbd, 0x3b, 0x04, 0x36, - 0xba, 0xcc, 0xad, 0x85, 0xfa, 0xaf, 0xa2, 0xaf, 0xb2, 0x14, 0xdb, 0xd7, 0xa3, 0x77, 0x03, 0x3f, - 0x9f, 0x4d, 0xc2, 0xf6, 0xf5, 0xc3, 0x6e, 0x01, 0xfe, 0xdd, 0x30, 0x6c, 0x8f, 0x60, 0x2d, 0x52, - 0xcf, 0x82, 0x33, 0xe1, 0x87, 0xca, 0x92, 0x56, 0x35, 0x2a, 0xcb, 0x0f, 0x85, 0xcc, 0xad, 0xe8, - 0x52, 0xec, 0x1f, 0xd4, 0x8d, 0xc5, 0xcf, 0x34, 0xe6, 0xc1, 0xc9, 0xf0, 0xdb, 0x8a, 0x66, 0xf8, - 0x5f, 0x1e, 0x86, 0xcf, 0xcf, 0x83, 0x19, 0xda, 0xad, 0x6f, 0x76, 0x5a, 0xa6, 0x87, 0xe0, 0x5d, - 0x21, 0xba, 0xb7, 0x81, 0xe3, 0x95, 0x8d, 0xe5, 0x7a, 0xdd, 0x73, 0x5c, 0x73, 0x1b, 0x95, 0x5a, - 0x2d, 0x97, 0x71, 0xab, 0x37, 0x19, 0xbe, 0x4b, 0x7a, 0x9d, 0x4f, 0x1c, 0x4a, 0x68, 0x9d, 0x11, - 0xa8, 0x7f, 0x59, 0x6a, 0x5d, 0x4e, 0xa2, 0xc0, 0x64, 0xe8, 0x3f, 0x3c, 0x62, 0x9d, 0x8b, 0xc6, - 0x65, 0xeb, 0xec, 0x0b, 0xb2, 0x60, 0xca, 0xb0, 0x76, 0xd1, 0x73, 0x1c, 0x1b, 0x75, 0xd5, 0x09, - 0xa0, 0xac, 0xac, 0x1b, 0xc5, 0x63, 0xf8, 0x01, 0x1b, 0x55, 0x19, 0xf2, 0xa0, 0xe1, 0x0a, 0xf0, - 0x43, 0xc9, 0x28, 0x2a, 0xf8, 0x61, 0x5d, 0x33, 0x8a, 0x39, 0xfc, 0x50, 0xd5, 0x8c, 0x62, 0x1e, - 0x3f, 0x6c, 0xac, 0x19, 0xc5, 0x02, 0x7e, 0xa8, 0xd4, 0x8d, 0xe2, 0x04, 0x7e, 0x58, 0xac, 0x1b, - 0xc5, 0x49, 0xfc, 0x70, 0xbe, 0x6e, 0x14, 0xa7, 0xf0, 0x43, 0xd9, 0x30, 0x8a, 0x00, 0x3f, 0x3c, - 0xab, 0x6e, 0x14, 0xa7, 0xf1, 0x43, 0xa9, 0x6c, 0x14, 0x67, 0xc8, 0x83, 0x66, 0x14, 0x67, 0xf1, - 0x43, 0xbd, 0x6e, 0x14, 0xe7, 0x48, 0xc9, 0x75, 0xa3, 0x78, 0x9c, 0xd4, 0x55, 0x31, 0x8a, 0x45, - 0xfc, 0xb0, 0x5a, 0x37, 0x8a, 0x27, 0x48, 0xe6, 0xba, 0x51, 0x54, 0x49, 0xa5, 0x75, 0xa3, 0x78, - 0x0d, 0xc9, 0x53, 0x37, 0x8a, 0x27, 0x49, 0x15, 0x75, 0xa3, 0x78, 0x8a, 0x90, 0xa1, 0x19, 0xc5, - 0xd3, 0x24, 0x8f, 0x6e, 0x14, 0xaf, 0x25, 0x9f, 0xaa, 0x46, 0x71, 0x9e, 0x10, 0xa6, 0x19, 0xc5, - 0xeb, 0xc8, 0x83, 0x6e, 0x14, 0x21, 0xf9, 0x54, 0x32, 0x8a, 0xd7, 0xc3, 0xc7, 0x80, 0xa9, 0x15, - 0xe4, 0x51, 0x10, 0x61, 0x11, 0x28, 0x2b, 0xc8, 0xe3, 0xcd, 0xf8, 0xaf, 0x2a, 0xe0, 0x5a, 0x36, - 0xf5, 0x5b, 0x76, 0x9d, 0xdd, 0x35, 0xb4, 0x6d, 0x36, 0xaf, 0x6a, 0x57, 0xb0, 0x09, 0x05, 0xeb, - 0xc2, 0xd2, 0x55, 0x27, 0xec, 0x8c, 0xc8, 0x73, 0xac, 0xc5, 0xe9, 0x2f, 0x46, 0x29, 0xe1, 0x62, - 0x14, 0xb3, 0xc8, 0xfe, 0x91, 0x97, 0x68, 0x61, 0xfd, 0x38, 0xd3, 0xb3, 0x7e, 0x8c, 0xd5, 0xa4, - 0x83, 0xdc, 0xae, 0x63, 0x9b, 0xed, 0x3a, 0xdb, 0x2e, 0xa5, 0xab, 0x5e, 0xbd, 0xc9, 0xea, 0x0f, - 0xf9, 0x9a, 0x41, 0xad, 0xb2, 0x67, 0xc4, 0xcd, 0x70, 0x7b, 0x9b, 0x19, 0xa1, 0x24, 0x9f, 0x08, - 0x94, 0xc4, 0x10, 0x94, 0xe4, 0x81, 0x43, 0x94, 0x9d, 0x4c, 0x5f, 0x2a, 0xc3, 0x4d, 0x2d, 0x42, - 0x67, 0x42, 0x7f, 0xb9, 0x5a, 0x81, 0x9f, 0xcd, 0x82, 0xd3, 0x9a, 0xdd, 0xcf, 0xc2, 0xe7, 0x65, - 0xe1, 0xcd, 0x3c, 0x34, 0x1b, 0x22, 0x4b, 0xef, 0xe9, 0xdb, 0xec, 0xfe, 0x65, 0x46, 0x70, 0xf4, - 0x53, 0x01, 0x47, 0xeb, 0x02, 0x47, 0xef, 0x1f, 0xbe, 0xe8, 0x64, 0x0c, 0xad, 0x8e, 0xb4, 0x03, - 0xca, 0xc1, 0x6f, 0xe4, 0xc0, 0x63, 0xa8, 0xc7, 0x03, 0xa3, 0x90, 0x6a, 0x59, 0xc9, 0x6e, 0xe9, - 0xa8, 0xeb, 0x99, 0xae, 0x27, 0x9c, 0x42, 0xed, 0x99, 0x4a, 0x65, 0x52, 0x98, 0x4a, 0x65, 0x07, - 0x4e, 0xa5, 0xe0, 0x3b, 0x79, 0xf3, 0xe1, 0x82, 0x88, 0x71, 0xa9, 0x7f, 0xff, 0x1f, 0xd7, 0xc2, - 0x28, 0xa8, 0x03, 0xbb, 0xe2, 0x87, 0x05, 0xa8, 0x97, 0x0f, 0x5d, 0x43, 0x32, 0xc4, 0xff, 0x60, - 0xb4, 0x76, 0x5e, 0x8e, 0xff, 0x26, 0x1a, 0x25, 0xc5, 0x56, 0xaa, 0x06, 0xfa, 0xa7, 0x27, 0xc0, - 0x14, 0xd1, 0x85, 0x35, 0xcb, 0xbe, 0x04, 0x5f, 0xab, 0x80, 0x99, 0x2a, 0xba, 0x5c, 0xde, 0x31, - 0xdb, 0x6d, 0x64, 0x6f, 0x23, 0xde, 0x6c, 0x9f, 0x07, 0x13, 0x66, 0xa7, 0x53, 0x0d, 0xf7, 0x19, - 0xfc, 0x57, 0xd6, 0xff, 0x7e, 0xbd, 0xaf, 0x92, 0x67, 0x62, 0x94, 0x3c, 0xa8, 0x77, 0x81, 0xaf, - 0x33, 0x62, 0x86, 0x7c, 0x13, 0x98, 0x6e, 0xfa, 0x59, 0x02, 0x6f, 0x75, 0x3e, 0x09, 0xfe, 0x6d, - 0xa2, 0x6e, 0x40, 0xaa, 0xf2, 0x64, 0x42, 0x81, 0x46, 0x6c, 0x87, 0x9c, 0x02, 0x27, 0x8c, 0x5a, - 0xad, 0xb1, 0x5e, 0xaa, 0x3e, 0x14, 0x9e, 0x12, 0xdd, 0x82, 0xaf, 0xcc, 0x81, 0xb9, 0xba, 0xd3, - 0xde, 0x47, 0x21, 0x4c, 0x95, 0x10, 0xa6, 0x1e, 0x3e, 0x65, 0x0e, 0xf0, 0x49, 0x3d, 0x0d, 0x0a, - 0xa6, 0xdd, 0xbd, 0x8c, 0x7c, 0xdb, 0x90, 0xbd, 0x31, 0x18, 0x7f, 0x8f, 0xd7, 0x63, 0x5d, 0x84, - 0xf1, 0xde, 0x01, 0x9c, 0x14, 0xa9, 0x8a, 0x00, 0xf2, 0x2c, 0x98, 0xe9, 0xd2, 0xcd, 0x42, 0x83, - 0xdb, 0x13, 0x16, 0xd2, 0x08, 0x89, 0x74, 0xb7, 0x5a, 0x61, 0x24, 0x92, 0x37, 0xf8, 0xda, 0x40, - 0xfd, 0x37, 0x05, 0x88, 0x4b, 0x87, 0x21, 0x2c, 0x19, 0xc8, 0xaf, 0x1e, 0xf5, 0x0c, 0x6f, 0x1e, - 0x9c, 0x64, 0x5a, 0xdb, 0x28, 0xaf, 0x96, 0xd6, 0xd6, 0xb4, 0xea, 0x8a, 0xd6, 0xa8, 0x2c, 0xd1, - 0xad, 0x8a, 0x30, 0xa5, 0x64, 0x18, 0xda, 0xfa, 0x86, 0x51, 0x6f, 0x68, 0xcf, 0x2e, 0x6b, 0xda, - 0x12, 0x71, 0x44, 0x22, 0x27, 0x09, 0x7c, 0x97, 0xb1, 0x52, 0xb5, 0x7e, 0x41, 0xd3, 0x8b, 0x3b, - 0x67, 0x4b, 0x60, 0x9a, 0xeb, 0xe7, 0x31, 0x75, 0x4b, 0x68, 0xcb, 0xdc, 0x6b, 0x33, 0x5b, 0xad, - 0x78, 0x0c, 0x53, 0x47, 0x78, 0x53, 0xb3, 0xdb, 0x57, 0x8b, 0x19, 0xb5, 0x08, 0x66, 0xf8, 0x2e, - 0xbd, 0x98, 0x85, 0xdf, 0xb9, 0x1e, 0x4c, 0x5d, 0x70, 0xdc, 0x4b, 0xc4, 0x7b, 0x0c, 0xbe, 0x97, - 0x46, 0x93, 0xf0, 0xcf, 0xe5, 0x71, 0x03, 0xfb, 0xab, 0xe5, 0xbd, 0x05, 0xfc, 0xd2, 0x16, 0x06, - 0x9e, 0xbd, 0xbb, 0x09, 0x4c, 0x5f, 0xf6, 0x73, 0x87, 0x9a, 0xce, 0x25, 0xc1, 0xff, 0x2a, 0xb7, - 0xff, 0x3f, 0xb8, 0xca, 0xf4, 0xf7, 0xa7, 0xdf, 0x9a, 0x05, 0x85, 0x15, 0xe4, 0x95, 0xda, 0x6d, - 0x9e, 0x6f, 0x2f, 0x93, 0x3e, 0x4f, 0x21, 0x34, 0xa2, 0xd4, 0x6e, 0x47, 0x2b, 0x15, 0xc7, 0x20, - 0xdf, 0xef, 0x57, 0x48, 0x83, 0xbf, 0x26, 0x75, 0x12, 0x6a, 0x40, 0x85, 0xe9, 0x73, 0xec, 0x0d, - 0x4a, 0xb0, 0xc7, 0xfd, 0xd3, 0x9c, 0x95, 0xf3, 0xe4, 0x30, 0x92, 0x48, 0x26, 0x7e, 0xaf, 0xdc, - 0xcf, 0xa7, 0x3e, 0x08, 0x26, 0xf6, 0xba, 0xa8, 0x6c, 0x76, 0x11, 0xa1, 0xad, 0xb7, 0xa5, 0xb5, - 0x8b, 0x0f, 0xa3, 0xa6, 0xb7, 0x50, 0xd9, 0xc5, 0x06, 0xf5, 0x26, 0xcd, 0x18, 0x04, 0xe7, 0x60, - 0xef, 0xba, 0x5f, 0x02, 0x7c, 0xd1, 0x10, 0x90, 0xc5, 0xee, 0xf7, 0x46, 0x1e, 0xbd, 0x4a, 0x0c, - 0xd4, 0x08, 0x36, 0x69, 0x87, 0x01, 0xea, 0xd3, 0x59, 0x90, 0xab, 0x75, 0x90, 0x2d, 0xe7, 0x80, - 0xfa, 0x5a, 0x79, 0x2f, 0xaf, 0xa0, 0x61, 0xb8, 0xf4, 0x08, 0xee, 0x9d, 0x03, 0x39, 0xcb, 0xde, - 0x72, 0x98, 0x81, 0x79, 0x7d, 0xc4, 0x66, 0x4e, 0xc5, 0xde, 0x72, 0x74, 0x92, 0x51, 0xd6, 0xc1, - 0x2b, 0xae, 0xee, 0xf4, 0x59, 0xfa, 0xcd, 0x49, 0x50, 0xa0, 0x62, 0x09, 0x5f, 0xaa, 0x00, 0xa5, - 0xd4, 0x6a, 0x45, 0x1c, 0xe2, 0xc8, 0x1e, 0x38, 0xc4, 0xe1, 0x90, 0xdf, 0x02, 0xbe, 0x07, 0xef, - 0x62, 0x28, 0x08, 0xc9, 0x3e, 0x9a, 0xa9, 0x46, 0xa9, 0xd5, 0x8a, 0xf6, 0x25, 0x0d, 0x2a, 0xcc, - 0x8a, 0x15, 0xf2, 0x9a, 0xaa, 0xc8, 0x69, 0x6a, 0xe2, 0x0e, 0x3d, 0x92, 0xbe, 0xf4, 0x21, 0xfa, - 0xc7, 0x2c, 0x98, 0x58, 0xb3, 0xba, 0x1e, 0xc6, 0xa6, 0x24, 0x83, 0xcd, 0x0d, 0x60, 0xca, 0x67, - 0x0d, 0xee, 0xba, 0x70, 0xbf, 0x1c, 0x26, 0xc0, 0xd7, 0xf1, 0xe8, 0x3c, 0x4b, 0x44, 0xe7, 0x29, - 0xf1, 0xad, 0x67, 0x54, 0x44, 0xfb, 0x68, 0x87, 0xd5, 0x66, 0x7b, 0xab, 0xfd, 0xcd, 0x80, 0xe1, - 0xeb, 0x02, 0xc3, 0xef, 0x1e, 0xa6, 0xca, 0xf4, 0x99, 0xfe, 0xb9, 0x2c, 0x00, 0xb8, 0x6e, 0x76, - 0x10, 0xe6, 0xf1, 0xc2, 0xf1, 0xd6, 0x18, 0xee, 0xbe, 0x92, 0xe7, 0xee, 0xba, 0xc8, 0xdd, 0xa7, - 0x0d, 0x6e, 0x6a, 0xdc, 0x81, 0x17, 0xb5, 0x08, 0x14, 0x2b, 0x60, 0x2d, 0x7e, 0x84, 0x6f, 0x0d, - 0x98, 0xba, 0x21, 0x30, 0xf5, 0xde, 0x21, 0x6b, 0x4a, 0x9f, 0xaf, 0x7f, 0x99, 0x05, 0x13, 0x75, - 0xe4, 0xe1, 0x6e, 0x12, 0x9e, 0x97, 0x39, 0x72, 0xc2, 0xe9, 0x76, 0x56, 0x52, 0xb7, 0xbf, 0x9d, - 0x91, 0x0d, 0x93, 0x11, 0x72, 0x86, 0xd1, 0x14, 0xb1, 0x08, 0xf0, 0x7a, 0xa9, 0x30, 0x19, 0x83, - 0x4a, 0x4b, 0x9f, 0xbb, 0x6f, 0xce, 0x06, 0x1b, 0xec, 0x4f, 0x10, 0x26, 0x68, 0xbc, 0x79, 0x9b, - 0x39, 0x68, 0xde, 0xfe, 0x53, 0x26, 0xb9, 0xa9, 0x11, 0xb7, 0xbb, 0x9c, 0xd8, 0xa0, 0x18, 0xc1, - 0xc6, 0xef, 0x30, 0xfc, 0x7a, 0x9e, 0x02, 0x0a, 0x6c, 0x85, 0xf8, 0xfe, 0xf8, 0x15, 0xe2, 0xc1, - 0x53, 0x84, 0xf7, 0x0c, 0x61, 0xae, 0xc5, 0x2d, 0xdb, 0x06, 0x64, 0x64, 0x39, 0x32, 0xee, 0x00, - 0x79, 0x12, 0xc7, 0x8f, 0x8d, 0x73, 0xe1, 0x9e, 0xbd, 0x5f, 0x84, 0x86, 0xbf, 0xea, 0x34, 0x53, - 0x62, 0x14, 0x46, 0xb0, 0xd2, 0x3b, 0x0c, 0x0a, 0x2f, 0xf9, 0x48, 0x26, 0x30, 0x42, 0xde, 0x93, - 0x63, 0x26, 0xde, 0xc7, 0xc4, 0x88, 0x02, 0x4d, 0xc7, 0xf6, 0xd0, 0x15, 0x6e, 0x6d, 0x3d, 0x48, - 0x88, 0xb5, 0x0c, 0xe6, 0xc1, 0x84, 0xe7, 0xf2, 0xeb, 0xed, 0xfe, 0x2b, 0xdf, 0xe3, 0xe4, 0xc5, - 0x1e, 0xa7, 0x0a, 0xce, 0x5a, 0x76, 0xb3, 0xbd, 0xd7, 0x42, 0x3a, 0x6a, 0x9b, 0xb8, 0x55, 0xdd, - 0x52, 0x77, 0x09, 0x75, 0x90, 0xdd, 0x42, 0xb6, 0x47, 0xe9, 0xf4, 0x7d, 0x6b, 0x25, 0x72, 0xc2, - 0xaf, 0xf1, 0x82, 0x71, 0x9f, 0x28, 0x18, 0x8f, 0xef, 0x37, 0x3f, 0x88, 0x31, 0x42, 0xef, 0x06, - 0x80, 0xb6, 0xed, 0xbc, 0x85, 0x2e, 0xb3, 0x0e, 0xf1, 0xba, 0x1e, 0x53, 0xb4, 0x16, 0x64, 0xd0, - 0xb9, 0xcc, 0xf0, 0x4b, 0x81, 0x30, 0x3c, 0x20, 0x08, 0xc3, 0x1d, 0x92, 0x24, 0x24, 0x93, 0x83, - 0xce, 0x10, 0x6b, 0x16, 0xb3, 0x60, 0x2a, 0x5c, 0x69, 0x54, 0xd4, 0xeb, 0xc0, 0x29, 0xdf, 0x77, - 0xa1, 0xaa, 0x69, 0x4b, 0xf5, 0xc6, 0xe6, 0xc6, 0x8a, 0x5e, 0x5a, 0xd2, 0x8a, 0x40, 0x55, 0xc1, - 0x5c, 0x6d, 0xf1, 0x59, 0x5a, 0xd9, 0x08, 0x5c, 0x0e, 0x72, 0xf0, 0xcf, 0xb3, 0x20, 0x4f, 0x1c, - 0xc3, 0xe1, 0x8f, 0x8e, 0x48, 0x72, 0xba, 0xc2, 0x4e, 0x4d, 0x30, 0xaf, 0x90, 0x8f, 0xf4, 0xc7, - 0x98, 0x49, 0xa8, 0x3a, 0x54, 0xa4, 0xbf, 0x98, 0x82, 0xd2, 0x57, 0x4f, 0xac, 0x92, 0xf5, 0x1d, - 0xe7, 0xf2, 0xbf, 0x67, 0x95, 0xc4, 0xed, 0x3f, 0x62, 0x95, 0xec, 0x43, 0xc2, 0xd8, 0x55, 0xb2, - 0x8f, 0xde, 0xc5, 0xa8, 0x29, 0xfc, 0xdb, 0x5c, 0xb0, 0xb0, 0xf2, 0x7f, 0x1d, 0x6e, 0x61, 0xa5, - 0x04, 0x66, 0x2d, 0xdb, 0x43, 0xae, 0x6d, 0xb6, 0x97, 0xdb, 0xe6, 0xb6, 0x7f, 0xfc, 0xb8, 0x77, - 0x16, 0x5e, 0xe1, 0xf2, 0xe8, 0xe2, 0x1f, 0xea, 0x19, 0x00, 0x3c, 0xb4, 0xdb, 0x69, 0x9b, 0x5e, - 0x28, 0x7a, 0x5c, 0x0a, 0x2f, 0x7d, 0x39, 0x51, 0xfa, 0x9e, 0x04, 0xae, 0xa1, 0xa0, 0x19, 0x57, - 0x3b, 0x68, 0xd3, 0xb6, 0x7e, 0x6c, 0x8f, 0x04, 0xa0, 0xa1, 0x32, 0xda, 0xef, 0x13, 0xfc, 0x1f, - 0xd2, 0xc7, 0x28, 0x7d, 0xcd, 0x1e, 0x70, 0x8c, 0x32, 0xd0, 0x26, 0xa5, 0x47, 0x9b, 0x02, 0x83, - 0x20, 0x27, 0x61, 0x10, 0xf0, 0x9c, 0xcf, 0x4b, 0x1a, 0xd3, 0xaf, 0x91, 0x3a, 0xa7, 0x19, 0xd7, - 0x8c, 0xf4, 0x7b, 0xa8, 0xf7, 0x2a, 0x60, 0x8e, 0x56, 0xbd, 0xe8, 0x38, 0x97, 0x76, 0x4d, 0xf7, - 0x12, 0x3f, 0xb7, 0x18, 0x42, 0xdc, 0xa2, 0x57, 0xca, 0x3e, 0xc5, 0x23, 0xbb, 0x22, 0x22, 0xfb, - 0xe4, 0x68, 0x96, 0xf8, 0x74, 0x8d, 0x67, 0x71, 0xe3, 0x8d, 0x01, 0x66, 0xcf, 0x12, 0x30, 0xfb, - 0xc1, 0xc4, 0x04, 0xa6, 0x8f, 0xdd, 0x1f, 0x05, 0xd8, 0xf9, 0x1d, 0x76, 0x6a, 0xd8, 0x7d, 0x79, - 0x38, 0xec, 0x7c, 0xba, 0x86, 0xc0, 0xae, 0x08, 0x94, 0x4b, 0xc1, 0x96, 0x12, 0x7e, 0xe4, 0x1b, - 0x94, 0x4b, 0x0f, 0xcd, 0x08, 0x92, 0xc7, 0x82, 0xe6, 0x49, 0x91, 0x84, 0x5a, 0x27, 0x55, 0x4c, - 0xbf, 0x28, 0xbd, 0xde, 0xd2, 0x97, 0x41, 0x94, 0xba, 0xf1, 0x68, 0xa5, 0xdc, 0x62, 0x8d, 0x3c, - 0x99, 0xe9, 0xa3, 0xf9, 0x0f, 0x39, 0x30, 0xe5, 0x1f, 0x66, 0xf5, 0xe0, 0x9f, 0x72, 0x43, 0xf8, - 0x69, 0x50, 0xe8, 0x3a, 0x7b, 0x6e, 0x13, 0xb1, 0x15, 0x30, 0xf6, 0x36, 0xc4, 0x6a, 0xcd, 0xc0, - 0x71, 0xf9, 0xc0, 0xd0, 0x9f, 0x4b, 0x3c, 0xf4, 0x47, 0x1a, 0x96, 0xf0, 0x45, 0xd2, 0xa1, 0x07, - 0x05, 0x5c, 0xea, 0xc8, 0x7b, 0x34, 0x8e, 0xd5, 0x1f, 0x94, 0x9a, 0xef, 0x0f, 0x68, 0x49, 0x32, - 0xb1, 0xaa, 0x0d, 0x61, 0x54, 0x5e, 0x0f, 0xae, 0xf5, 0x73, 0x30, 0x6b, 0x92, 0x58, 0x8f, 0x9b, - 0xfa, 0x5a, 0x51, 0x81, 0xcf, 0xcb, 0x81, 0x22, 0x25, 0xad, 0x16, 0x18, 0x56, 0xf0, 0x65, 0x47, - 0x6e, 0x3d, 0x46, 0x4f, 0x07, 0x3f, 0x93, 0x95, 0x0d, 0x6f, 0x24, 0x30, 0x3e, 0x6c, 0x5d, 0x84, - 0x24, 0x0d, 0xa1, 0x4a, 0x31, 0xc2, 0x07, 0x7f, 0x23, 0x23, 0x13, 0x2d, 0x49, 0x8e, 0xc4, 0xf4, - 0x7b, 0x9e, 0xd7, 0xe5, 0xfc, 0xb8, 0x03, 0xcb, 0xae, 0xb3, 0xbb, 0xe9, 0xb6, 0xe1, 0x87, 0xa4, - 0x82, 0xd1, 0x45, 0x98, 0xea, 0xd9, 0x48, 0x53, 0x1d, 0x0f, 0xd1, 0x7b, 0x6e, 0xdb, 0x1f, 0xa2, - 0xf7, 0xdc, 0xf6, 0x10, 0x43, 0xb4, 0x7a, 0x2b, 0x98, 0x33, 0x5b, 0xad, 0x0d, 0x73, 0x1b, 0x95, - 0xf1, 0x1c, 0xd8, 0xf6, 0xd8, 0x99, 0xe4, 0x9e, 0xd4, 0x04, 0x3b, 0x63, 0x02, 0x10, 0x8c, 0x07, - 0x8f, 0xa6, 0x9d, 0x31, 0x09, 0xfa, 0xd2, 0x97, 0x92, 0x4f, 0x64, 0xc1, 0xac, 0x6f, 0xb8, 0x2e, - 0x23, 0xaf, 0xb9, 0x03, 0xef, 0x96, 0x5d, 0xa1, 0x60, 0xb0, 0x67, 0x03, 0xd8, 0xe1, 0xf7, 0x32, - 0x09, 0xb1, 0x11, 0x6a, 0x8e, 0x58, 0xde, 0x49, 0xc4, 0xcc, 0xb8, 0x02, 0xd3, 0x67, 0xe6, 0x97, - 0xb2, 0x00, 0x18, 0x4e, 0x30, 0x81, 0x3a, 0x04, 0x27, 0x5f, 0x22, 0x1d, 0xa6, 0x9c, 0x35, 0x3c, - 0xac, 0x36, 0xb9, 0x88, 0x4b, 0xee, 0xcd, 0x0c, 0xaa, 0x29, 0x7d, 0xfe, 0xbe, 0x3f, 0x0b, 0xa6, - 0x96, 0xf6, 0x3a, 0x6d, 0xab, 0x69, 0x7a, 0xbd, 0x1b, 0x8a, 0xd1, 0xec, 0x25, 0xf7, 0x8d, 0x24, - 0xb2, 0x50, 0x82, 0x3a, 0x22, 0x78, 0x49, 0x4f, 0x5b, 0x66, 0xfd, 0xd3, 0x96, 0x92, 0x9b, 0x04, - 0x03, 0x0a, 0x1f, 0x83, 0x78, 0x2a, 0xe0, 0x78, 0xad, 0x83, 0xec, 0x45, 0x17, 0x99, 0xad, 0xa6, - 0xbb, 0xb7, 0x7b, 0xb1, 0xcb, 0xef, 0x86, 0xc7, 0xcb, 0x28, 0xb7, 0xe6, 0x98, 0x15, 0xd6, 0x1c, - 0xe1, 0x4f, 0x29, 0xb2, 0x67, 0x7f, 0xb9, 0x95, 0x71, 0x8e, 0x86, 0x21, 0xfa, 0xe4, 0x44, 0x7b, - 0x38, 0x3d, 0xcb, 0x8b, 0xb9, 0x24, 0xcb, 0x8b, 0x6f, 0x92, 0x3a, 0x49, 0x2c, 0xd5, 0xae, 0xb1, - 0x6c, 0xc5, 0xcd, 0xd5, 0x91, 0x17, 0x01, 0xef, 0x2d, 0x60, 0xf6, 0x62, 0xf8, 0x25, 0x80, 0x58, - 0x4c, 0xec, 0xb3, 0x41, 0xfe, 0xe6, 0xa4, 0x53, 0x7e, 0x91, 0x84, 0x08, 0x74, 0x03, 0x04, 0xb3, - 0x32, 0xbb, 0x70, 0x89, 0xe6, 0xef, 0xb1, 0xf5, 0xa7, 0x8f, 0xc2, 0x47, 0xb2, 0x60, 0x9a, 0xdc, - 0xa2, 0xb2, 0x78, 0x95, 0xb8, 0x67, 0x3f, 0x4e, 0x08, 0xb5, 0x15, 0xe9, 0xf1, 0xf3, 0x42, 0x9e, - 0xcd, 0x2a, 0xc8, 0xb5, 0x2d, 0xfb, 0x92, 0xbf, 0x7d, 0x8a, 0x9f, 0xc3, 0x98, 0xfc, 0xd9, 0x3e, - 0x31, 0xf9, 0x83, 0x05, 0xee, 0xa0, 0xde, 0x43, 0x5d, 0x12, 0x35, 0xb0, 0xb8, 0xf4, 0xd9, 0xf8, - 0xc7, 0x39, 0x50, 0xa8, 0x23, 0xd3, 0x6d, 0xee, 0xc0, 0x57, 0x72, 0x07, 0xdd, 0x97, 0xc1, 0xc4, - 0x96, 0xd5, 0xf6, 0x90, 0x4b, 0x1d, 0x47, 0xf8, 0x0e, 0x9c, 0x2a, 0xf2, 0x62, 0xdb, 0x69, 0x5e, - 0x5a, 0x60, 0xd6, 0xe2, 0x82, 0x1f, 0x33, 0x68, 0x61, 0x99, 0xfc, 0xa4, 0xfb, 0x3f, 0xab, 0x0f, - 0x80, 0x7c, 0xd7, 0x71, 0xbd, 0xa8, 0x20, 0x9c, 0x11, 0xa5, 0xd4, 0x1d, 0xd7, 0xd3, 0xe9, 0x8f, - 0x18, 0xcc, 0xad, 0xbd, 0x76, 0xdb, 0x40, 0x57, 0x3c, 0x7f, 0xa6, 0xe0, 0xbf, 0xe3, 0xb9, 0xbd, - 0xb3, 0xb5, 0xd5, 0x45, 0x74, 0x9e, 0x9a, 0xd7, 0xd9, 0x9b, 0x7a, 0x12, 0xe4, 0xdb, 0xd6, 0xae, - 0x45, 0x6d, 0xdb, 0xbc, 0x4e, 0x5f, 0xd4, 0xdb, 0x41, 0x31, 0x34, 0xab, 0x29, 0xa1, 0xf3, 0x05, - 0xa2, 0x80, 0x07, 0xd2, 0xb1, 0x64, 0x5c, 0x42, 0x57, 0xbb, 0xf3, 0x13, 0xe4, 0x3b, 0x79, 0x16, - 0xbd, 0xf4, 0x64, 0x96, 0xca, 0x29, 0x5f, 0xa3, 0x27, 0x4d, 0x2e, 0x6a, 0x3a, 0x6e, 0xcb, 0xe7, - 0x4d, 0xb4, 0xbd, 0xcb, 0xf2, 0x25, 0x5b, 0xe0, 0xee, 0x5b, 0x79, 0xfa, 0xf2, 0xf4, 0xf2, 0x02, - 0xee, 0x1c, 0x71, 0xd5, 0x17, 0x2c, 0x6f, 0x67, 0x1d, 0x79, 0x26, 0xfc, 0x63, 0xe5, 0xff, 0x93, - 0xab, 0x18, 0xb9, 0xa2, 0x67, 0xbe, 0xbd, 0x3d, 0xd7, 0xc6, 0xdc, 0x62, 0x51, 0x96, 0xb8, 0x14, - 0xf5, 0x5e, 0x70, 0x5d, 0xf8, 0xe6, 0xaf, 0xb3, 0x2d, 0xb1, 0xb9, 0xd2, 0x14, 0xc9, 0x1e, 0x9d, - 0x41, 0xdd, 0x00, 0x37, 0xd3, 0x8f, 0xab, 0xc6, 0xfa, 0xda, 0xaa, 0xb5, 0xbd, 0xd3, 0xb6, 0xb6, - 0x77, 0xbc, 0x6e, 0xc5, 0xee, 0x7a, 0xc8, 0x6c, 0xd5, 0xb6, 0x74, 0x1a, 0x24, 0x17, 0x90, 0x72, - 0x64, 0xb2, 0x8a, 0xee, 0x23, 0x72, 0x23, 0x15, 0x2f, 0x0f, 0x11, 0xfa, 0xf0, 0x83, 0x58, 0x1f, - 0xba, 0x7b, 0xed, 0x00, 0xd3, 0x1b, 0x7a, 0x30, 0x0d, 0x05, 0x7a, 0xaf, 0x4d, 0x94, 0x82, 0x64, - 0x4e, 0x3a, 0x66, 0xc5, 0x50, 0x92, 0xbe, 0x72, 0xfc, 0x3f, 0x05, 0x90, 0x5f, 0x71, 0xcd, 0xce, - 0x0e, 0x7c, 0x5e, 0x0a, 0x7d, 0x6d, 0x20, 0x9d, 0xd9, 0x41, 0xd2, 0xa9, 0x0c, 0x90, 0xce, 0x1c, - 0x27, 0x9d, 0xd1, 0x5b, 0xdd, 0x67, 0xc1, 0x4c, 0xd3, 0x69, 0xb7, 0x51, 0x13, 0xf3, 0xa3, 0xd2, - 0x22, 0x81, 0x41, 0xa6, 0x74, 0x21, 0x8d, 0x44, 0x4f, 0x43, 0x5e, 0x9d, 0x2e, 0xc0, 0x52, 0xa1, - 0x0f, 0x13, 0xe0, 0xcb, 0xb2, 0x20, 0xa7, 0xb5, 0xb6, 0x91, 0xb0, 0x48, 0x9b, 0xe1, 0x16, 0x69, - 0x4f, 0x83, 0x82, 0x67, 0xba, 0xdb, 0xc8, 0xf3, 0x8f, 0xe3, 0xd0, 0xb7, 0x20, 0xa8, 0x9b, 0xc2, - 0x05, 0x75, 0x7b, 0x1a, 0xc8, 0x61, 0x9e, 0xb1, 0x70, 0x29, 0x37, 0xf7, 0x83, 0x9f, 0xf0, 0x7e, - 0x01, 0xd7, 0xb8, 0x80, 0x5b, 0xad, 0x93, 0x1f, 0x7a, 0xb1, 0xce, 0x1f, 0xc0, 0x9a, 0xdc, 0xf7, - 0xd1, 0x74, 0xec, 0xca, 0xae, 0xb9, 0x8d, 0x58, 0x33, 0xc3, 0x04, 0xff, 0xab, 0xb6, 0xeb, 0x3c, - 0x6c, 0xb1, 0xf8, 0x6a, 0x61, 0x02, 0x6e, 0xc2, 0x8e, 0xd5, 0x6a, 0x21, 0x9b, 0x69, 0x36, 0x7b, - 0x3b, 0x7b, 0x06, 0xe4, 0x30, 0x0d, 0x58, 0x7e, 0xf0, 0xc0, 0x5f, 0x3c, 0xa6, 0xce, 0x60, 0xb5, - 0xa2, 0xca, 0x5b, 0xcc, 0x88, 0x8b, 0x75, 0x32, 0xbe, 0x1b, 0xb4, 0x71, 0xfd, 0x95, 0xeb, 0x89, - 0x20, 0x6f, 0x3b, 0x2d, 0x34, 0x70, 0xa8, 0xa1, 0xb9, 0xd4, 0xa7, 0x80, 0x3c, 0x6a, 0xe1, 0x5e, - 0x41, 0x21, 0xd9, 0xcf, 0xc4, 0xf3, 0x52, 0xa7, 0x99, 0x93, 0x39, 0x88, 0xf4, 0xa3, 0x36, 0x7d, - 0x05, 0xfc, 0x95, 0x09, 0x70, 0x9c, 0xf6, 0x01, 0xf5, 0xbd, 0x8b, 0xb8, 0xa8, 0x8b, 0x08, 0xbe, - 0x4b, 0x11, 0xa2, 0x48, 0x76, 0xf7, 0x2e, 0x06, 0x66, 0x23, 0x7d, 0xe1, 0x15, 0x34, 0x3b, 0x92, - 0x41, 0x4b, 0x19, 0x76, 0xd0, 0x12, 0x06, 0x20, 0xc5, 0x57, 0xf1, 0x70, 0xb8, 0x2a, 0x90, 0x64, - 0x7f, 0xb8, 0xea, 0x37, 0xd8, 0xcc, 0x83, 0x09, 0x73, 0xcb, 0x43, 0x6e, 0xa5, 0x45, 0xe4, 0x71, - 0x4a, 0xf7, 0x5f, 0xf1, 0x80, 0x78, 0x11, 0x6d, 0x39, 0x2e, 0xd6, 0xf4, 0x29, 0x3a, 0x20, 0xfa, - 0xef, 0x9c, 0x7e, 0x02, 0x61, 0x13, 0xe5, 0x36, 0x70, 0xdc, 0xda, 0xb6, 0x1d, 0x17, 0x05, 0x9e, - 0x79, 0xf3, 0x33, 0xf4, 0xb0, 0x78, 0x4f, 0xb2, 0x7a, 0x07, 0x38, 0x61, 0x3b, 0x4b, 0xa8, 0xc3, - 0xf8, 0x4e, 0x51, 0x9d, 0x25, 0x1a, 0x71, 0xf0, 0xc3, 0x81, 0xae, 0x65, 0xee, 0x60, 0xd7, 0x02, - 0x3f, 0x9d, 0x74, 0x3e, 0xdc, 0x03, 0xfc, 0xc8, 0xec, 0x32, 0xf5, 0x19, 0x60, 0xa6, 0xc5, 0xfc, - 0x76, 0x9a, 0x56, 0xa0, 0x35, 0x91, 0xff, 0x09, 0x99, 0x43, 0x91, 0xcb, 0xf1, 0x22, 0xb7, 0x02, - 0x26, 0xc9, 0x29, 0x0d, 0x2c, 0x73, 0xf9, 0x9e, 0x60, 0x74, 0x64, 0xca, 0x16, 0x34, 0x8a, 0x63, - 0xdb, 0x42, 0x99, 0xfd, 0xa2, 0x07, 0x3f, 0x27, 0x9b, 0x59, 0xc7, 0x73, 0x28, 0x7d, 0xf5, 0xfc, - 0x4c, 0x0e, 0x1c, 0x5f, 0x71, 0x9d, 0xbd, 0x4e, 0x37, 0x54, 0xcf, 0xbf, 0xee, 0xbf, 0x9a, 0x5e, - 0x10, 0xc7, 0xa2, 0xfe, 0x8a, 0x7b, 0x13, 0x98, 0x76, 0x59, 0x8f, 0x1a, 0xae, 0xad, 0xf3, 0x49, - 0xbc, 0x6a, 0x2b, 0x87, 0x51, 0xed, 0x50, 0x41, 0x72, 0x82, 0x82, 0xf4, 0x0a, 0x72, 0xbe, 0x8f, - 0x20, 0xff, 0x55, 0x36, 0xa1, 0x20, 0xf7, 0xb0, 0x28, 0x42, 0x90, 0xcb, 0xa0, 0xb0, 0x4d, 0x32, - 0x32, 0x39, 0x7e, 0x82, 0x5c, 0xcb, 0x48, 0xe1, 0x3a, 0xfb, 0x35, 0xe4, 0xab, 0xc2, 0xf1, 0x35, - 0x99, 0x50, 0xc5, 0x53, 0x9b, 0xbe, 0x50, 0xbd, 0x3d, 0x07, 0x66, 0x82, 0xda, 0xc9, 0xc1, 0x87, - 0xcc, 0xa0, 0x0e, 0xff, 0xc0, 0xea, 0x4c, 0xd0, 0x95, 0x2a, 0x5c, 0x57, 0xda, 0xa7, 0xf3, 0x9b, - 0x4e, 0xd0, 0xf9, 0xcd, 0x44, 0x74, 0x7e, 0xf0, 0xb9, 0x8a, 0x6c, 0xd0, 0x62, 0xb1, 0x0f, 0x20, - 0xad, 0x7b, 0x34, 0xf7, 0x6a, 0x92, 0xa1, 0x93, 0x07, 0xb7, 0x2a, 0x7d, 0xa1, 0xf9, 0x40, 0x16, - 0x9c, 0xa0, 0xbd, 0xe1, 0xa6, 0xdd, 0x0d, 0xfa, 0xa2, 0xc7, 0x8a, 0x6e, 0x05, 0xb8, 0x4d, 0xdd, - 0xc0, 0xad, 0x80, 0xbc, 0x89, 0x8b, 0xe0, 0xb1, 0x67, 0x96, 0x84, 0x3e, 0x97, 0xab, 0x25, 0x62, - 0x45, 0x49, 0xee, 0x54, 0x92, 0x64, 0xa1, 0xe9, 0x33, 0xf0, 0x17, 0x15, 0x30, 0x55, 0x47, 0xde, - 0x9a, 0x79, 0xd5, 0xd9, 0xf3, 0xa0, 0x29, 0xbb, 0xfc, 0xfd, 0x74, 0x50, 0x68, 0x93, 0x5f, 0xd8, - 0x0d, 0x5c, 0x37, 0xf5, 0x5d, 0x3f, 0x26, 0x1b, 0xbd, 0xb4, 0x68, 0x9d, 0xe5, 0x17, 0x0f, 0x8b, - 0xc9, 0xec, 0x3e, 0x04, 0xd4, 0x8d, 0x64, 0xe9, 0x34, 0xd1, 0xde, 0x44, 0x54, 0xd5, 0xe9, 0xc3, - 0xf2, 0x53, 0x0a, 0x98, 0xad, 0x23, 0xaf, 0xd2, 0x5d, 0x36, 0xf7, 0x1d, 0xd7, 0xf2, 0x10, 0x7f, - 0x19, 0x44, 0x3c, 0x34, 0x67, 0x00, 0xb0, 0x82, 0xdf, 0x58, 0x34, 0x70, 0x2e, 0x05, 0xfe, 0x46, - 0xd2, 0x1d, 0x63, 0x81, 0x8e, 0x91, 0x80, 0x90, 0x68, 0x0f, 0x33, 0xae, 0xfa, 0xf4, 0x81, 0xf8, - 0x7c, 0x96, 0x01, 0x51, 0x72, 0x9b, 0x3b, 0xd6, 0x3e, 0x6a, 0x25, 0x04, 0xc2, 0xff, 0x2d, 0x04, - 0x22, 0x28, 0x28, 0xf1, 0xf6, 0xb0, 0x40, 0xc7, 0x28, 0xb6, 0x87, 0xe3, 0x0a, 0x1c, 0xcb, 0x29, - 0x54, 0xdc, 0xf5, 0xb0, 0x35, 0x86, 0xfb, 0x65, 0xd9, 0x1a, 0x9a, 0x70, 0x59, 0xde, 0x84, 0x1b, - 0xaa, 0x63, 0xa1, 0x75, 0x0f, 0x92, 0xe9, 0x5c, 0x1a, 0x1d, 0x4b, 0xdf, 0xaa, 0xd3, 0x67, 0xfa, - 0xbb, 0x15, 0x70, 0x2a, 0x30, 0x78, 0xea, 0xc8, 0x5b, 0x32, 0xbb, 0x3b, 0x17, 0x1d, 0xd3, 0x6d, - 0xf1, 0x37, 0xb3, 0x0d, 0x7d, 0x14, 0x03, 0xfe, 0x05, 0x0f, 0x42, 0x55, 0x04, 0xa1, 0xaf, 0x5f, - 0x50, 0x5f, 0x5a, 0x46, 0xd1, 0xc9, 0xc4, 0xba, 0x2e, 0xfd, 0x56, 0x00, 0xd6, 0x0f, 0x09, 0x60, - 0xdd, 0x37, 0x2c, 0x89, 0xe9, 0x03, 0xf7, 0xcb, 0x74, 0x44, 0xe0, 0x5c, 0xd8, 0x1e, 0x92, 0x05, - 0x2c, 0xc2, 0x85, 0x49, 0x89, 0x3e, 0x6d, 0x30, 0xcc, 0x18, 0x31, 0xd0, 0xfd, 0x2c, 0xdd, 0x31, - 0xe2, 0x08, 0x5d, 0xcb, 0xde, 0xae, 0x80, 0x22, 0x39, 0x9f, 0xcb, 0xb9, 0xf7, 0xc1, 0x87, 0x65, - 0xd1, 0x39, 0xe0, 0x4a, 0x38, 0x91, 0xd4, 0x95, 0x10, 0xbe, 0x2d, 0xa9, 0xc3, 0x60, 0x2f, 0xb5, - 0x23, 0x41, 0x2c, 0x91, 0x3f, 0xe0, 0x00, 0x0a, 0xd2, 0x07, 0xed, 0x3f, 0x2b, 0x00, 0x60, 0x85, - 0x66, 0x3e, 0x6a, 0xcf, 0x96, 0x85, 0xeb, 0x1c, 0xef, 0x44, 0x89, 0x81, 0x3a, 0xd5, 0x03, 0x14, - 0x2d, 0x31, 0xf4, 0x7e, 0x7b, 0x7d, 0x52, 0xdf, 0xa5, 0x90, 0xaa, 0x91, 0xc0, 0x92, 0xc8, 0x9b, - 0x29, 0xb2, 0xee, 0xf4, 0x01, 0xf9, 0xed, 0x2c, 0xc8, 0x1b, 0x4e, 0x1d, 0x79, 0x87, 0x37, 0x05, - 0x12, 0x9f, 0xa7, 0x24, 0xf5, 0x8e, 0xe2, 0x3c, 0x65, 0xbf, 0x82, 0xd2, 0x67, 0xdd, 0xbb, 0xb2, - 0x60, 0xc6, 0x70, 0xca, 0xc1, 0x62, 0x95, 0xbc, 0x2f, 0x98, 0xfc, 0xc5, 0x4b, 0x41, 0x03, 0xc3, - 0x6a, 0x0e, 0x75, 0xf1, 0xd2, 0xe0, 0xf2, 0xd2, 0xe7, 0xdb, 0xdd, 0xe0, 0xf8, 0xa6, 0xdd, 0x72, - 0x74, 0xd4, 0x72, 0xd8, 0x92, 0xac, 0xaa, 0x82, 0xdc, 0x9e, 0xdd, 0x72, 0x08, 0xc9, 0x79, 0x9d, - 0x3c, 0xe3, 0x34, 0x17, 0xb5, 0x1c, 0xb6, 0x5f, 0x47, 0x9e, 0xe1, 0xd7, 0x14, 0x90, 0xc3, 0xff, - 0xca, 0xb3, 0xfa, 0xed, 0x4a, 0xc2, 0x13, 0xa2, 0xb8, 0xf8, 0x91, 0x58, 0x42, 0xf7, 0x73, 0x8b, - 0xd4, 0xd4, 0x43, 0xec, 0xe6, 0xa8, 0xfa, 0x38, 0x56, 0x84, 0x8b, 0xd3, 0xea, 0x3c, 0x98, 0xb8, - 0xd8, 0x76, 0x9a, 0x97, 0xc2, 0x83, 0x8c, 0xec, 0x55, 0xbd, 0x1d, 0xe4, 0x5d, 0xd3, 0xde, 0x46, - 0x6c, 0xf1, 0xfb, 0x64, 0x4f, 0x5f, 0x48, 0x76, 0xa2, 0x75, 0x9a, 0x05, 0xbe, 0x2d, 0xc9, 0xd9, - 0xd4, 0x3e, 0x8d, 0x4f, 0x26, 0x0f, 0x4b, 0x43, 0x1c, 0x23, 0x28, 0x82, 0x99, 0x72, 0x89, 0x5e, - 0x71, 0xb6, 0x5e, 0x3b, 0xaf, 0x15, 0x15, 0x02, 0x33, 0xe6, 0x49, 0x8a, 0x30, 0xe3, 0xe2, 0xff, - 0xdd, 0xc2, 0xdc, 0xa7, 0xf1, 0x47, 0x01, 0xf3, 0x27, 0xb2, 0x60, 0x76, 0xcd, 0xea, 0x7a, 0x51, - 0xde, 0xb4, 0x31, 0xe1, 0x79, 0x5e, 0x94, 0xd4, 0x54, 0x16, 0xea, 0x91, 0x8e, 0xcb, 0x93, 0xc8, - 0x1c, 0x8e, 0xab, 0x62, 0x3c, 0x6e, 0xdf, 0x84, 0x02, 0x7a, 0x2d, 0x91, 0x34, 0x27, 0x13, 0x1b, - 0x4a, 0x61, 0x25, 0xe3, 0x37, 0x94, 0x22, 0xeb, 0x4e, 0x9f, 0xbf, 0x5f, 0xcb, 0x82, 0x13, 0xb8, - 0xfa, 0xb8, 0x65, 0xa9, 0x68, 0x36, 0x0f, 0x5c, 0x96, 0x4a, 0xbc, 0x32, 0x7e, 0x80, 0x96, 0x51, - 0xac, 0x8c, 0x0f, 0x2a, 0x74, 0xcc, 0x6c, 0x8e, 0x58, 0x86, 0x1d, 0xc4, 0xe6, 0x98, 0x65, 0xd8, - 0xe1, 0xd9, 0x1c, 0xbf, 0x14, 0x3b, 0x24, 0x9b, 0x8f, 0x6c, 0x81, 0xf5, 0xd7, 0x94, 0x80, 0xcd, - 0x91, 0x6b, 0x1b, 0x31, 0x6c, 0x4e, 0x7c, 0x3c, 0x0b, 0xbe, 0x63, 0x48, 0xc6, 0x8f, 0x78, 0x7d, - 0x63, 0x18, 0x98, 0x8e, 0x70, 0x8d, 0xe3, 0xe5, 0x0a, 0x98, 0x63, 0x54, 0xf4, 0x9f, 0x32, 0xc7, - 0x60, 0x94, 0x78, 0xca, 0x9c, 0xd8, 0xc7, 0x5e, 0xa4, 0x6c, 0xfc, 0x3e, 0xf6, 0xb1, 0xf5, 0xa7, - 0x0f, 0xce, 0xd7, 0x73, 0xe0, 0x34, 0x26, 0x61, 0xdd, 0x69, 0x59, 0x5b, 0x57, 0x29, 0x15, 0xe7, - 0xcd, 0xf6, 0x1e, 0xea, 0xc2, 0xf7, 0x66, 0x65, 0x51, 0xfa, 0xff, 0x01, 0xe0, 0x74, 0x90, 0x4b, - 0x23, 0xdc, 0x30, 0xa0, 0xee, 0x8d, 0x6a, 0xec, 0xc1, 0x9a, 0x82, 0xa8, 0xb3, 0x35, 0xbf, 0x10, - 0x9d, 0x2b, 0x0f, 0x5b, 0x85, 0x53, 0xc1, 0x97, 0x5e, 0x87, 0x8f, 0xcc, 0x41, 0x87, 0x8f, 0xdb, - 0x80, 0x62, 0xb6, 0x5a, 0x01, 0x54, 0xbd, 0x9b, 0xd9, 0xa4, 0x4e, 0x1d, 0x67, 0xc1, 0x39, 0xbb, - 0x28, 0x3c, 0xfa, 0x12, 0x91, 0xb3, 0x8b, 0x3c, 0x75, 0x01, 0x14, 0xe8, 0x15, 0x4d, 0xc1, 0x8a, - 0x7e, 0xff, 0xcc, 0x2c, 0x97, 0x68, 0xda, 0xd5, 0x44, 0x31, 0xbc, 0x3b, 0x11, 0x67, 0xfa, 0xf5, - 0xd3, 0xa1, 0x9d, 0xac, 0x0b, 0x02, 0xf6, 0xcc, 0xa1, 0x4b, 0x1e, 0xcf, 0x6e, 0x58, 0xa9, 0xd3, - 0x69, 0x5f, 0x35, 0xd8, 0x69, 0xfa, 0x44, 0xbb, 0x61, 0xdc, 0xa1, 0xfc, 0x6c, 0xef, 0xa1, 0xfc, - 0xe4, 0xbb, 0x61, 0x02, 0x1d, 0xa3, 0xd8, 0x0d, 0x8b, 0x2b, 0x70, 0x0c, 0xeb, 0x91, 0x79, 0x6a, - 0x35, 0xb3, 0xe0, 0x81, 0x6f, 0xcc, 0xf6, 0x75, 0xa7, 0x02, 0xa2, 0x3b, 0x55, 0xbf, 0xb8, 0x82, - 0xb1, 0x41, 0x53, 0xd5, 0xa7, 0x80, 0xc2, 0x96, 0xe3, 0xee, 0x9a, 0xfe, 0xc6, 0x7d, 0xaf, 0xf7, - 0x36, 0x0b, 0xd8, 0xb7, 0x4c, 0xf2, 0xe8, 0x2c, 0x2f, 0x9e, 0x8f, 0x3c, 0xc7, 0xea, 0xb0, 0x70, - 0x58, 0xf8, 0x51, 0xbd, 0x05, 0xcc, 0xb2, 0xa8, 0x58, 0x55, 0xd4, 0xf5, 0x50, 0x8b, 0x1d, 0x4f, - 0x16, 0x13, 0xd5, 0xb3, 0x60, 0x86, 0x25, 0x2c, 0x5b, 0x6d, 0xd4, 0x65, 0x77, 0x12, 0x0a, 0x69, - 0xea, 0x69, 0x50, 0xb0, 0xba, 0xcf, 0xea, 0x3a, 0x36, 0xf1, 0xc9, 0x9d, 0xd4, 0xd9, 0x1b, 0x71, - 0xdb, 0xa1, 0xf9, 0x02, 0x63, 0x95, 0x3a, 0xd1, 0xf7, 0x26, 0xc3, 0xcf, 0x0e, 0x33, 0x71, 0x48, - 0x1c, 0x28, 0x11, 0xa3, 0xb0, 0xd7, 0x6c, 0x22, 0xd4, 0x62, 0xa7, 0x0d, 0xfc, 0xd7, 0x84, 0x21, - 0x14, 0x13, 0x4f, 0x33, 0x8e, 0x28, 0x86, 0xe2, 0x87, 0x4e, 0x81, 0x02, 0x8d, 0x2b, 0x0e, 0x5f, - 0x3a, 0xd7, 0x57, 0x18, 0xe7, 0x44, 0x61, 0xdc, 0x04, 0x33, 0xb6, 0x83, 0xab, 0xdb, 0x30, 0x5d, - 0x73, 0xb7, 0x1b, 0xb7, 0x8a, 0x48, 0xcb, 0x0d, 0x86, 0x8c, 0x2a, 0xf7, 0xdb, 0xea, 0x31, 0x5d, - 0x28, 0x46, 0xfd, 0xff, 0x83, 0xe3, 0x17, 0xd9, 0x09, 0xdb, 0x2e, 0x2b, 0x39, 0x1b, 0xed, 0x73, - 0xd7, 0x53, 0xf2, 0xa2, 0xf8, 0xe7, 0xea, 0x31, 0xbd, 0xb7, 0x30, 0xf5, 0x47, 0xc0, 0x1c, 0x7e, - 0x6d, 0x39, 0x97, 0x7d, 0xc2, 0x95, 0x68, 0x43, 0xa3, 0xa7, 0xf8, 0x75, 0xe1, 0xc7, 0xd5, 0x63, - 0x7a, 0x4f, 0x51, 0x6a, 0x0d, 0x80, 0x1d, 0x6f, 0xb7, 0xcd, 0x0a, 0xce, 0x45, 0x8b, 0x64, 0x4f, - 0xc1, 0xab, 0xc1, 0x4f, 0xab, 0xc7, 0x74, 0xae, 0x08, 0x75, 0x0d, 0x4c, 0x79, 0x57, 0x3c, 0x56, - 0x5e, 0x3e, 0x7a, 0x73, 0xbb, 0xa7, 0x3c, 0xc3, 0xff, 0x67, 0xf5, 0x98, 0x1e, 0x16, 0xa0, 0x56, - 0xc0, 0x64, 0xe7, 0x22, 0x2b, 0xac, 0xd0, 0xe7, 0x2e, 0xe5, 0xfe, 0x85, 0x6d, 0x5c, 0x0c, 0xca, - 0x0a, 0x7e, 0xc7, 0x84, 0x35, 0xbb, 0xfb, 0xac, 0xac, 0x09, 0x69, 0xc2, 0xca, 0xfe, 0x3f, 0x98, - 0xb0, 0xa0, 0x00, 0xb5, 0x02, 0xa6, 0xba, 0xb6, 0xd9, 0xe9, 0xee, 0x38, 0x5e, 0x77, 0x7e, 0xb2, - 0xc7, 0x2f, 0x32, 0xba, 0xb4, 0x3a, 0xfb, 0x47, 0x0f, 0xff, 0x56, 0x9f, 0x02, 0x4e, 0xed, 0x91, - 0xfb, 0xd9, 0xb4, 0x2b, 0x56, 0xd7, 0xb3, 0xec, 0x6d, 0x3f, 0xb8, 0x1f, 0xed, 0x4d, 0xfa, 0x7f, - 0x54, 0x17, 0xd8, 0x29, 0x05, 0x40, 0x74, 0x13, 0xf6, 0x6e, 0xc6, 0xd1, 0x6a, 0xb9, 0xc3, 0x09, - 0xcf, 0x00, 0x39, 0xfc, 0x89, 0x78, 0x16, 0xce, 0xf5, 0x5f, 0xe8, 0xeb, 0x95, 0x1d, 0xa2, 0xc0, - 0xf8, 0x27, 0x3c, 0x36, 0xda, 0xce, 0x86, 0xeb, 0x6c, 0xbb, 0xa8, 0xdb, 0x65, 0x0e, 0x87, 0x5c, - 0x0a, 0x56, 0x70, 0xab, 0xbb, 0x6e, 0x6d, 0x53, 0xeb, 0x89, 0xb9, 0x63, 0xf3, 0x49, 0x74, 0xb6, - 0x59, 0x45, 0x97, 0xc9, 0x9d, 0x5f, 0xf3, 0xc7, 0xfd, 0xd9, 0xa6, 0x9f, 0x02, 0x6f, 0x05, 0x33, - 0xbc, 0x92, 0xd1, 0xcb, 0x49, 0xac, 0xd0, 0xf6, 0x62, 0x6f, 0xf0, 0x16, 0x30, 0x27, 0xca, 0x34, - 0x37, 0xc4, 0x28, 0x7e, 0x57, 0x08, 0x6f, 0x06, 0xc7, 0x7b, 0x14, 0xcb, 0x3f, 0xb3, 0x9f, 0x09, - 0xcf, 0xec, 0xdf, 0x04, 0x40, 0x28, 0xc5, 0x7d, 0x8b, 0xb9, 0x11, 0x4c, 0x05, 0x72, 0xd9, 0x37, - 0xc3, 0x57, 0x32, 0x60, 0xd2, 0x17, 0xb6, 0x7e, 0x19, 0xf0, 0xf8, 0x62, 0x73, 0x1b, 0x08, 0x6c, - 0x9a, 0x2d, 0xa4, 0xe1, 0x71, 0x24, 0x74, 0xe3, 0x35, 0x2c, 0xaf, 0xed, 0x1f, 0x47, 0xe9, 0x4d, - 0x56, 0x37, 0x00, 0xb0, 0x08, 0x46, 0x46, 0x78, 0x3e, 0xe5, 0x49, 0x09, 0xf4, 0x81, 0xca, 0x03, - 0x57, 0xc6, 0xd9, 0xc7, 0xb2, 0xc3, 0x23, 0x53, 0x20, 0x5f, 0xdf, 0x28, 0x95, 0xb5, 0xe2, 0x31, - 0x75, 0x0e, 0x00, 0xed, 0xd9, 0x1b, 0x9a, 0x5e, 0xd1, 0xaa, 0x65, 0xad, 0x98, 0x81, 0xaf, 0xc8, - 0x82, 0xa9, 0x40, 0x09, 0xfa, 0x36, 0x52, 0x63, 0xa2, 0x35, 0xf0, 0xfe, 0x87, 0x83, 0x4a, 0xc5, - 0x0b, 0xd9, 0xd3, 0xc1, 0xb5, 0x7b, 0x5d, 0xb4, 0x6c, 0xb9, 0x5d, 0x4f, 0x77, 0x2e, 0x2f, 0x3b, - 0x6e, 0x10, 0xce, 0xd2, 0xbf, 0xe7, 0x38, 0xe2, 0x33, 0xb6, 0x28, 0x5a, 0x88, 0x1c, 0x61, 0x40, - 0x2e, 0x5b, 0x19, 0x0e, 0x13, 0x70, 0xb9, 0x1e, 0xbd, 0x58, 0xb8, 0x8b, 0x74, 0xe7, 0x72, 0xb7, - 0x64, 0xb7, 0xca, 0x4e, 0x7b, 0x6f, 0xd7, 0xee, 0x32, 0x9b, 0x20, 0xea, 0x33, 0xe6, 0x0e, 0xb9, - 0xdd, 0x65, 0x0e, 0x80, 0x72, 0x6d, 0x6d, 0x4d, 0x2b, 0x1b, 0x95, 0x5a, 0xb5, 0x78, 0x0c, 0x73, - 0xcb, 0x28, 0x2d, 0xae, 0x61, 0xee, 0xfc, 0x28, 0x98, 0xf4, 0x75, 0xfa, 0xc0, 0xa5, 0xce, 0x25, - 0x30, 0xe9, 0x6b, 0x39, 0x1b, 0x11, 0x1e, 0xd7, 0x7b, 0x14, 0x6d, 0xd7, 0x74, 0x3d, 0xe2, 0x3f, - 0xed, 0x17, 0xb2, 0x68, 0x76, 0x91, 0x1e, 0xfc, 0x76, 0xf6, 0x89, 0x8c, 0x02, 0x15, 0xcc, 0x95, - 0xd6, 0xd6, 0x1a, 0x35, 0xbd, 0x51, 0xad, 0x19, 0xab, 0x95, 0xea, 0x0a, 0x1d, 0x21, 0x2b, 0x2b, - 0xd5, 0x9a, 0xae, 0xd1, 0x01, 0xb2, 0x5e, 0xcc, 0xd0, 0xdb, 0x85, 0x16, 0x27, 0x41, 0xa1, 0x43, - 0xb8, 0x0b, 0xbf, 0xa8, 0x24, 0x3c, 0x69, 0x1a, 0xe0, 0x14, 0x71, 0xff, 0x89, 0xe0, 0x83, 0x9e, - 0xed, 0x73, 0x4e, 0xeb, 0x2c, 0x98, 0xa1, 0xb6, 0x5c, 0x97, 0x2c, 0xdf, 0xb3, 0x2b, 0x04, 0x85, - 0x34, 0xf8, 0x91, 0x6c, 0x82, 0xe3, 0xa7, 0x7d, 0x29, 0x4a, 0x66, 0x5c, 0xfc, 0xd9, 0x30, 0xb7, - 0x09, 0xa9, 0x60, 0xae, 0x52, 0x35, 0x34, 0xbd, 0x5a, 0x5a, 0x63, 0x59, 0x14, 0x75, 0x1e, 0x9c, - 0xac, 0xd6, 0x58, 0x00, 0xa7, 0x3a, 0xb9, 0xb7, 0x74, 0x7d, 0xa3, 0xa6, 0x1b, 0xc5, 0xbc, 0x7a, - 0x1a, 0xa8, 0xf4, 0x59, 0xb8, 0xf6, 0xb7, 0xa0, 0x3e, 0x1e, 0xdc, 0xbc, 0x56, 0x59, 0xaf, 0x18, - 0x8d, 0xda, 0x72, 0x43, 0xaf, 0x5d, 0xa8, 0x63, 0x04, 0x75, 0x6d, 0xad, 0x84, 0x05, 0x89, 0xbb, - 0x65, 0x68, 0x42, 0xbd, 0x06, 0x1c, 0x27, 0x37, 0x88, 0x91, 0xab, 0x83, 0x69, 0x7d, 0x93, 0xea, - 0x0d, 0x60, 0xbe, 0x52, 0xad, 0x6f, 0x2e, 0x2f, 0x57, 0xca, 0x15, 0xad, 0x6a, 0x34, 0x36, 0x34, - 0x7d, 0xbd, 0x52, 0xaf, 0xe3, 0x7f, 0x8b, 0x53, 0xf0, 0x43, 0x0a, 0x28, 0xd0, 0x3e, 0x13, 0xbe, - 0x47, 0x01, 0xb3, 0xe7, 0xcd, 0xb6, 0x85, 0x07, 0x0a, 0x72, 0xb9, 0x13, 0xbc, 0x51, 0x70, 0x4d, - 0xf7, 0xc8, 0x25, 0x50, 0xcc, 0x35, 0x9d, 0xbc, 0xc0, 0x9f, 0xe4, 0x45, 0xc3, 0x10, 0x45, 0xe3, - 0x99, 0x31, 0x40, 0xd0, 0x1a, 0x17, 0x84, 0xda, 0x22, 0x26, 0x37, 0xaf, 0x09, 0x70, 0xbe, 0x20, - 0xe0, 0x5c, 0x3e, 0x5c, 0xf1, 0xc9, 0xc0, 0xff, 0x95, 0x51, 0x81, 0x5f, 0x04, 0x33, 0x9b, 0xd5, - 0xd2, 0xa6, 0xb1, 0x5a, 0xd3, 0x2b, 0x3f, 0x4c, 0xc2, 0xc0, 0xce, 0x82, 0xa9, 0xe5, 0x9a, 0xbe, - 0x58, 0x59, 0x5a, 0xd2, 0xaa, 0xc5, 0xbc, 0x7a, 0x2d, 0xb8, 0xa6, 0xae, 0xe9, 0xe7, 0x2b, 0x65, - 0xad, 0xb1, 0x59, 0x2d, 0x9d, 0x2f, 0x55, 0xd6, 0x48, 0x1f, 0x51, 0x88, 0xb9, 0x98, 0x6a, 0x02, - 0xfe, 0x78, 0x0e, 0x00, 0xda, 0x74, 0x6c, 0x49, 0xf3, 0xd7, 0x17, 0xfd, 0x79, 0xd2, 0x49, 0x43, - 0x58, 0x4c, 0x84, 0xfe, 0x56, 0xc0, 0xa4, 0xcb, 0x3e, 0xb0, 0xe5, 0x93, 0x41, 0xe5, 0xd0, 0x47, - 0xbf, 0x34, 0x3d, 0xf8, 0x1d, 0xbe, 0x37, 0xc9, 0x1c, 0x21, 0x92, 0xb0, 0x64, 0x48, 0x2e, 0x8f, - 0x06, 0x48, 0xf8, 0xc2, 0x0c, 0x98, 0x13, 0x1b, 0x86, 0x1b, 0x41, 0x8c, 0x29, 0xb9, 0x46, 0x88, - 0x3f, 0x73, 0x46, 0xd6, 0xd9, 0xbb, 0xd8, 0x70, 0x0a, 0x7c, 0xcd, 0xa4, 0xa7, 0x31, 0x7d, 0x8b, - 0xa5, 0x98, 0xc1, 0xc4, 0x63, 0xa3, 0x83, 0xde, 0x5d, 0x6b, 0x5c, 0xf1, 0x8a, 0x0a, 0x7c, 0x57, - 0x0e, 0xcc, 0x0a, 0xf7, 0x23, 0xc1, 0x7f, 0xca, 0xc8, 0xdc, 0x79, 0xc2, 0xdd, 0xbc, 0x94, 0x39, - 0xec, 0xcd, 0x4b, 0x67, 0x7f, 0x22, 0x03, 0x26, 0x58, 0x22, 0x61, 0x70, 0xad, 0x8a, 0x6d, 0x81, - 0xe3, 0x60, 0x7a, 0x45, 0x33, 0x1a, 0x75, 0xa3, 0xa4, 0x1b, 0xda, 0x52, 0x31, 0xa3, 0x9e, 0x02, - 0x27, 0x36, 0x34, 0xbd, 0x5e, 0xc3, 0xfc, 0xdc, 0xd0, 0x6b, 0xa4, 0x23, 0xa4, 0x6c, 0xc6, 0x30, - 0xac, 0x69, 0x4b, 0x2b, 0x5a, 0x63, 0xb1, 0x54, 0xd7, 0x8a, 0x0a, 0xfe, 0xb7, 0x5a, 0x33, 0xb4, - 0x7a, 0x63, 0xa9, 0x52, 0xd2, 0x1f, 0x2a, 0xe6, 0xf0, 0xbf, 0x75, 0x43, 0x2f, 0x19, 0xda, 0x4a, - 0xa5, 0x4c, 0x6e, 0xfc, 0xc5, 0x1a, 0x90, 0xc7, 0x83, 0xa9, 0xb6, 0xbe, 0x61, 0x3c, 0x54, 0x2c, - 0x24, 0xf7, 0xea, 0xeb, 0x6d, 0xdc, 0x98, 0xbd, 0xfa, 0xe2, 0xaa, 0x1f, 0xc3, 0xd5, 0x50, 0x0a, - 0x28, 0x52, 0x0a, 0xb4, 0x2b, 0x1d, 0xe4, 0x5a, 0xc8, 0x6e, 0x22, 0x78, 0x49, 0x26, 0x64, 0xdc, - 0x81, 0xf8, 0x55, 0x64, 0x8c, 0xe0, 0x2c, 0x4f, 0xfa, 0xd2, 0x63, 0xb4, 0xe7, 0x0e, 0x18, 0xed, - 0x9f, 0x4a, 0xea, 0xd6, 0xd7, 0x4b, 0xee, 0x48, 0x20, 0xfb, 0x78, 0x12, 0xb7, 0xbe, 0x01, 0x14, - 0x8c, 0x25, 0x12, 0x64, 0xc4, 0x98, 0x5e, 0x54, 0xe0, 0x5b, 0xa7, 0x40, 0x91, 0x12, 0xca, 0xf9, - 0x4a, 0xfd, 0x22, 0xbb, 0xa4, 0xaa, 0x91, 0x20, 0xf4, 0x93, 0x7f, 0x34, 0x37, 0x2b, 0x1e, 0xcd, - 0x15, 0x96, 0xde, 0x94, 0xde, 0xfd, 0xed, 0xa4, 0xea, 0xc7, 0x39, 0x46, 0x45, 0x5f, 0x91, 0x94, - 0x9e, 0xfa, 0xc5, 0x56, 0x3f, 0x9e, 0x8b, 0x54, 0xd8, 0x55, 0x49, 0x9a, 0x2c, 0x32, 0xf1, 0xf7, - 0x45, 0x25, 0xf5, 0x92, 0x15, 0x1c, 0xd3, 0x62, 0x2e, 0x51, 0x4a, 0xcf, 0x4b, 0x76, 0x10, 0x05, - 0xe9, 0xa3, 0xf0, 0xbd, 0x2c, 0xc8, 0xd5, 0x1d, 0xd7, 0x1b, 0x15, 0x06, 0x49, 0x77, 0xf6, 0x38, - 0x0e, 0xd4, 0xa3, 0x67, 0x4e, 0xe9, 0xed, 0xec, 0xc5, 0xd7, 0x3f, 0x86, 0xe8, 0x59, 0xc7, 0xc1, - 0x1c, 0xa5, 0x24, 0x88, 0x65, 0xfe, 0xdd, 0x2c, 0xed, 0xaf, 0x1e, 0x94, 0x45, 0xe4, 0x2c, 0x98, - 0xe1, 0x76, 0xd6, 0x82, 0x7b, 0x35, 0xf9, 0x34, 0xf8, 0xeb, 0x3c, 0x2e, 0x4b, 0x22, 0x2e, 0xfd, - 0xe6, 0x8d, 0x41, 0x38, 0xf0, 0x51, 0xf5, 0x4c, 0x49, 0x02, 0x71, 0xc5, 0x54, 0x9e, 0x3e, 0x22, - 0xcf, 0x57, 0x40, 0x81, 0x79, 0x36, 0x8d, 0x14, 0x81, 0xa4, 0x9a, 0x11, 0x30, 0x41, 0xce, 0x03, - 0x4a, 0x19, 0xb5, 0x66, 0xc4, 0xd7, 0x9f, 0x3e, 0x0e, 0xff, 0xca, 0x5c, 0xf6, 0x4a, 0xfb, 0xa6, - 0xd5, 0x36, 0x2f, 0xb6, 0x13, 0x04, 0xc0, 0xfc, 0x48, 0xc2, 0x43, 0x4a, 0x41, 0x53, 0x85, 0xfa, - 0x22, 0x38, 0xfe, 0x54, 0x30, 0xe5, 0x06, 0x0b, 0x6b, 0xfe, 0x19, 0xee, 0x1e, 0x77, 0x49, 0xf6, - 0x5d, 0x0f, 0x73, 0x26, 0x3a, 0x91, 0x24, 0x45, 0xcf, 0x58, 0x4e, 0x50, 0x4c, 0x97, 0x5a, 0xad, - 0x65, 0x64, 0x7a, 0x7b, 0x2e, 0x6a, 0x25, 0x1a, 0x22, 0x44, 0x16, 0x4d, 0xf1, 0x9c, 0x10, 0xc2, - 0x56, 0xad, 0x89, 0xe8, 0xfc, 0xe0, 0x80, 0xde, 0xc0, 0xa7, 0x65, 0x24, 0x5d, 0xd2, 0x5b, 0x02, - 0x48, 0x6a, 0x02, 0x24, 0xcf, 0x18, 0x8e, 0x88, 0xf4, 0x01, 0xf9, 0x25, 0x05, 0xcc, 0x51, 0x3b, - 0x61, 0xd4, 0x98, 0xfc, 0x6e, 0x42, 0x4f, 0x08, 0xee, 0xb6, 0x08, 0x9e, 0x9c, 0x91, 0xc0, 0x92, - 0xc4, 0x6f, 0x42, 0x8e, 0x8e, 0xf4, 0x91, 0xf9, 0x6c, 0x01, 0x00, 0xce, 0xbb, 0xed, 0x23, 0x85, - 0x30, 0x84, 0x14, 0x7c, 0x1b, 0x9b, 0x7f, 0xd4, 0x85, 0xd8, 0xa4, 0x9c, 0xe7, 0x5a, 0xb0, 0xad, - 0x22, 0x26, 0x4a, 0x8d, 0x2a, 0x7f, 0x96, 0xd0, 0xe6, 0x65, 0xbe, 0x65, 0x03, 0x07, 0xf7, 0x21, - 0x7b, 0xb9, 0x8f, 0x26, 0x30, 0x7e, 0x07, 0x91, 0x92, 0x0c, 0xb5, 0xb5, 0x21, 0xe6, 0x92, 0xf3, - 0xe0, 0xa4, 0xae, 0x95, 0x96, 0x6a, 0xd5, 0xb5, 0x87, 0xf8, 0x6b, 0x05, 0x8a, 0x0a, 0x3f, 0x39, - 0x49, 0x05, 0xb6, 0xd7, 0x25, 0xec, 0x03, 0x45, 0x5e, 0xc5, 0xcd, 0x56, 0xb8, 0xe9, 0xfc, 0xe0, - 0x5e, 0x4d, 0xa2, 0xd8, 0xa3, 0x44, 0xe1, 0xb9, 0xbc, 0x1a, 0xfd, 0xb4, 0x02, 0x8a, 0xe1, 0x2d, - 0xb4, 0xec, 0x8e, 0x98, 0x9a, 0xe8, 0xfc, 0xd6, 0xa1, 0xbb, 0x28, 0xa1, 0xf3, 0x9b, 0x9f, 0xa0, - 0xde, 0x0a, 0xe6, 0x9a, 0x3b, 0xa8, 0x79, 0xa9, 0x62, 0xfb, 0xbb, 0xc3, 0x74, 0x2b, 0xb1, 0x27, - 0x55, 0x04, 0xe6, 0x41, 0x11, 0x18, 0x71, 0x12, 0x2d, 0x0c, 0xd2, 0x3c, 0x51, 0x11, 0xb8, 0xfc, - 0x61, 0x80, 0x4b, 0x55, 0xc0, 0xe5, 0x9e, 0xa1, 0x4a, 0x4d, 0x06, 0x4b, 0x75, 0x08, 0x58, 0x20, - 0x38, 0x5d, 0xdb, 0x30, 0x2a, 0xb5, 0x6a, 0x63, 0xb3, 0xae, 0x2d, 0x35, 0x16, 0x7d, 0x70, 0xea, - 0x45, 0x05, 0x7e, 0x23, 0x0b, 0x26, 0x28, 0x59, 0xdd, 0x9e, 0x5b, 0x63, 0xe3, 0xbd, 0xfe, 0xe0, - 0x5b, 0xa5, 0xcf, 0xf0, 0x07, 0x8c, 0x60, 0xf5, 0x44, 0xf4, 0x53, 0x4f, 0x07, 0x13, 0x14, 0x64, - 0xdf, 0x69, 0xe4, 0x4c, 0x44, 0x2f, 0xc5, 0x8a, 0xd1, 0xfd, 0xec, 0x92, 0xe7, 0xf9, 0x07, 0x90, - 0x31, 0x96, 0x09, 0xe2, 0xc4, 0xaa, 0xd5, 0xf5, 0x1c, 0xf7, 0x2a, 0x7c, 0x7d, 0x06, 0x4c, 0x9c, - 0x47, 0x6e, 0xd7, 0x72, 0xec, 0x03, 0x9b, 0xa5, 0x37, 0x81, 0xe9, 0x8e, 0x8b, 0xf6, 0x2d, 0x67, - 0xaf, 0x1b, 0x4e, 0xcc, 0xf9, 0x24, 0x15, 0x82, 0x49, 0x73, 0xcf, 0xdb, 0x71, 0xdc, 0xf0, 0xbc, - 0xbc, 0xff, 0xae, 0x9e, 0x01, 0x80, 0x3e, 0x57, 0xcd, 0x5d, 0xc4, 0xb6, 0x80, 0xb9, 0x14, 0x55, - 0x05, 0x39, 0xcf, 0xda, 0x45, 0x2c, 0xdc, 0x1d, 0x79, 0x56, 0xe7, 0xc1, 0x04, 0x09, 0x4e, 0xc5, - 0x82, 0x80, 0x29, 0xba, 0xff, 0x0a, 0xff, 0xab, 0x02, 0xa6, 0x57, 0x90, 0xc7, 0x48, 0xed, 0xf2, - 0x51, 0x67, 0x62, 0x42, 0x42, 0xe3, 0xee, 0xb5, 0x6d, 0x76, 0xfd, 0xdf, 0x82, 0xd5, 0x37, 0x31, - 0x31, 0x0c, 0xbd, 0xa7, 0x70, 0xd1, 0x35, 0xe1, 0xbb, 0xb2, 0xb2, 0xe7, 0x1c, 0x19, 0x33, 0x17, - 0x38, 0x02, 0x23, 0x65, 0x6b, 0x72, 0x9f, 0xe5, 0x38, 0x10, 0x0a, 0x95, 0x2f, 0x89, 0x15, 0xa3, - 0x07, 0xb9, 0x25, 0x4f, 0x48, 0x0e, 0xa6, 0x24, 0x7d, 0xf1, 0xfa, 0xb6, 0x02, 0xa6, 0xeb, 0x3b, - 0xce, 0x65, 0x46, 0x00, 0x7f, 0x11, 0x6a, 0x1c, 0x54, 0x37, 0x80, 0xa9, 0xfd, 0x1e, 0x98, 0xc2, - 0x84, 0xe8, 0xfb, 0x3a, 0xe1, 0x23, 0x4a, 0x52, 0x98, 0x38, 0xe2, 0x46, 0x7e, 0x9b, 0xa6, 0xfa, - 0x83, 0x60, 0x82, 0x51, 0xcd, 0xe6, 0xcf, 0xf1, 0x00, 0xfb, 0x99, 0xf9, 0x06, 0xe6, 0xc4, 0x06, - 0x26, 0x43, 0x3e, 0xba, 0x71, 0x63, 0x08, 0x38, 0x9e, 0x25, 0xe7, 0xe3, 0x7d, 0xe0, 0xcb, 0x23, - 0x00, 0x1e, 0x7e, 0x27, 0x23, 0xbb, 0xca, 0x14, 0x70, 0x20, 0xa0, 0xe0, 0x50, 0x01, 0xdc, 0x07, - 0x16, 0x97, 0x3e, 0x3f, 0x5f, 0x91, 0x03, 0x33, 0x4b, 0xd6, 0xd6, 0x56, 0xd0, 0xeb, 0xbd, 0x38, - 0x23, 0xc7, 0xd2, 0xe8, 0x1d, 0x4a, 0x6c, 0xb4, 0xec, 0xb9, 0x2e, 0xb2, 0xfd, 0x46, 0x31, 0x75, - 0xea, 0x49, 0x55, 0x6f, 0x03, 0xc7, 0xfd, 0x8e, 0xde, 0xcf, 0x48, 0xc5, 0xb2, 0x37, 0x19, 0x7e, - 0x4b, 0x7a, 0x8b, 0xc2, 0xe7, 0x28, 0xdf, 0xa4, 0x08, 0x05, 0xbc, 0x17, 0xcc, 0xee, 0xd0, 0xdc, - 0x64, 0x1e, 0xe7, 0x77, 0x96, 0xa7, 0x7b, 0x02, 0x65, 0xae, 0xa3, 0x6e, 0xd7, 0xdc, 0x46, 0xba, - 0x98, 0xb9, 0x47, 0x7d, 0x95, 0x24, 0xb7, 0x55, 0xc8, 0xed, 0x76, 0x48, 0xb4, 0x24, 0x7d, 0xe9, - 0xf8, 0xea, 0x63, 0x41, 0x6e, 0xd9, 0x6a, 0x23, 0xf8, 0x33, 0x59, 0x30, 0xa5, 0xa3, 0xa6, 0x63, - 0x37, 0xf1, 0x1b, 0xe7, 0xaf, 0xf0, 0x0f, 0xbc, 0xee, 0x3c, 0x20, 0x42, 0x73, 0xbb, 0xd0, 0x20, - 0x5c, 0xce, 0x42, 0x50, 0x46, 0x84, 0xde, 0xbc, 0x36, 0xe0, 0x4d, 0x59, 0xe0, 0xcd, 0x39, 0xf9, - 0xa2, 0xc6, 0x10, 0x87, 0x1b, 0xdb, 0x91, 0x5b, 0x5b, 0x6d, 0xc7, 0x14, 0x56, 0x32, 0x7a, 0x6d, - 0x9b, 0xdb, 0x41, 0xd1, 0x77, 0x3b, 0x77, 0xbc, 0x0d, 0xcb, 0xb6, 0x83, 0x73, 0x8d, 0x07, 0xd2, - 0xc5, 0x4d, 0xb8, 0xd8, 0xd0, 0x10, 0xa4, 0xed, 0xac, 0xf6, 0x08, 0xc9, 0xbe, 0x15, 0xcc, 0x5d, - 0xbc, 0xea, 0xa1, 0x2e, 0xcb, 0xc5, 0xaa, 0xcd, 0xe9, 0x3d, 0xa9, 0xf0, 0xdd, 0x52, 0x21, 0x24, - 0x62, 0x2a, 0x4c, 0xc6, 0xea, 0xd5, 0x21, 0xcc, 0xf9, 0x93, 0xa0, 0x58, 0xad, 0x2d, 0x69, 0xc4, - 0x7d, 0xc6, 0xf7, 0x47, 0xd8, 0x86, 0x2f, 0x51, 0xc0, 0x0c, 0xd9, 0x8b, 0xf6, 0x51, 0xb8, 0x59, - 0x62, 0xff, 0x1b, 0x7e, 0x49, 0xda, 0xb5, 0x86, 0x34, 0x99, 0xaf, 0x20, 0x9a, 0xd1, 0x5b, 0x56, - 0xbb, 0x97, 0xd1, 0x79, 0xbd, 0x27, 0xb5, 0x0f, 0x20, 0x4a, 0x5f, 0x40, 0x7e, 0x47, 0xca, 0xbf, - 0x66, 0x10, 0x75, 0x47, 0x85, 0xca, 0xfb, 0x15, 0x30, 0x8d, 0xe7, 0x7f, 0x3e, 0x28, 0x35, 0x01, - 0x14, 0xc7, 0x6e, 0x5f, 0x0d, 0xe7, 0xb8, 0xfe, 0x6b, 0x22, 0x25, 0xf9, 0x4b, 0xe9, 0x69, 0x18, - 0x61, 0x11, 0x47, 0xcb, 0x98, 0xf0, 0x7b, 0x9f, 0xd4, 0xe4, 0x6c, 0x00, 0x71, 0x47, 0x05, 0xdf, - 0x6f, 0xe6, 0x41, 0x61, 0xb3, 0x43, 0x90, 0xfb, 0x5a, 0x56, 0x26, 0x68, 0xf2, 0x01, 0xdf, 0x6a, - 0x6c, 0x66, 0xb5, 0x9d, 0xa6, 0xd9, 0xde, 0x08, 0x0f, 0xa9, 0x84, 0x09, 0xea, 0x3d, 0xcc, 0xdd, - 0x8a, 0x9e, 0xf0, 0xb9, 0x35, 0x36, 0x9e, 0x30, 0xe1, 0x11, 0xe7, 0xc7, 0x7e, 0x07, 0x38, 0xd1, - 0xb2, 0xba, 0xe6, 0xc5, 0x36, 0xd2, 0xec, 0xa6, 0x7b, 0x95, 0xb2, 0x83, 0xba, 0xa6, 0x1c, 0xfc, - 0xa0, 0xde, 0x07, 0xf2, 0x5d, 0xef, 0x6a, 0x9b, 0x4e, 0xfc, 0x78, 0xb7, 0xf7, 0xc8, 0xaa, 0xea, - 0x38, 0xbb, 0x4e, 0xff, 0xe2, 0xef, 0x12, 0x9c, 0x90, 0xbc, 0x17, 0xf1, 0x2e, 0x50, 0x70, 0x5c, - 0x6b, 0xdb, 0xa2, 0x61, 0xfa, 0xe7, 0x0e, 0x84, 0xc9, 0xa2, 0xa6, 0x40, 0x8d, 0x64, 0xd1, 0x59, - 0x56, 0xf8, 0x3e, 0xe9, 0xcb, 0xf9, 0x09, 0x8d, 0x14, 0x9c, 0xf1, 0xdc, 0x8d, 0xf8, 0x6a, 0xa9, - 0x68, 0x19, 0xd1, 0x64, 0xa5, 0x3f, 0x08, 0x7f, 0x2e, 0x0b, 0x26, 0x97, 0x9c, 0xcb, 0x36, 0x11, - 0xd8, 0xbb, 0xe5, 0x6c, 0xd6, 0x3e, 0xe7, 0xa7, 0xc4, 0x1b, 0x9d, 0x62, 0x9d, 0xa5, 0x49, 0x6b, - 0xfd, 0x2a, 0x23, 0x60, 0x88, 0xd5, 0x00, 0xc9, 0x1b, 0x78, 0xe2, 0xea, 0x49, 0x9f, 0xaf, 0x7f, - 0xa2, 0x80, 0xdc, 0x92, 0xeb, 0x74, 0xe0, 0x5b, 0x32, 0x09, 0xf6, 0x91, 0x5b, 0xae, 0xd3, 0x31, - 0xc8, 0xe5, 0x1a, 0xa1, 0x87, 0x38, 0x9f, 0xa6, 0xde, 0x0d, 0x26, 0x3b, 0x4e, 0xd7, 0xf2, 0xfc, - 0xe9, 0xc0, 0xdc, 0x9d, 0x8f, 0xe9, 0xab, 0x95, 0x1b, 0x2c, 0x93, 0x1e, 0x64, 0xc7, 0xbd, 0x2f, - 0x61, 0x21, 0xe6, 0x0b, 0x66, 0xa3, 0x7f, 0xc1, 0x48, 0x4f, 0x2a, 0x7c, 0x29, 0x8f, 0xe4, 0x33, - 0x44, 0x24, 0x1f, 0xd7, 0x87, 0xc3, 0xae, 0xd3, 0x19, 0xc9, 0xce, 0xcf, 0x2b, 0x03, 0x54, 0x9f, - 0x29, 0xa0, 0x7a, 0xbb, 0x54, 0x9d, 0xe9, 0x23, 0xfa, 0xbe, 0x1c, 0x00, 0xc4, 0x5c, 0xd8, 0xc4, - 0x13, 0x19, 0x39, 0x5b, 0xe9, 0xa7, 0x72, 0x1c, 0x2f, 0x4b, 0x22, 0x2f, 0x9f, 0x10, 0x61, 0x8d, - 0x90, 0xe2, 0x23, 0x38, 0x5a, 0x02, 0xf9, 0x3d, 0xfc, 0x99, 0x71, 0x54, 0xb2, 0x08, 0xf2, 0xaa, - 0xd3, 0x3f, 0xe1, 0x1f, 0x67, 0x40, 0x9e, 0x24, 0xa8, 0x67, 0x00, 0x20, 0x03, 0x34, 0x3d, 0x6b, - 0x90, 0x21, 0x43, 0x31, 0x97, 0x42, 0xa4, 0xd5, 0x6a, 0xb1, 0xcf, 0xd4, 0xf4, 0x0d, 0x13, 0xf0, - 0xdf, 0x64, 0xd8, 0x26, 0x65, 0xb1, 0x81, 0x9c, 0x4b, 0xc1, 0x7f, 0x93, 0xb7, 0x35, 0xb4, 0x45, - 0x63, 0xac, 0xe6, 0xf4, 0x30, 0x21, 0xf8, 0x7b, 0x2d, 0xb8, 0x47, 0xc3, 0xff, 0x9b, 0xa4, 0xe0, - 0x49, 0x2d, 0x11, 0xcb, 0xc5, 0xb0, 0x8a, 0x02, 0xc9, 0xd4, 0x9b, 0x0c, 0x5f, 0x17, 0x88, 0xcd, - 0x92, 0x20, 0x36, 0x4f, 0x4a, 0xc0, 0xde, 0xf4, 0x85, 0xe7, 0x2b, 0x79, 0x30, 0x55, 0x75, 0x5a, - 0x4c, 0x76, 0xb8, 0x89, 0xdf, 0xc7, 0xf3, 0x89, 0x26, 0x7e, 0x41, 0x19, 0x11, 0x02, 0xf2, 0x80, - 0x28, 0x20, 0x72, 0x25, 0xf0, 0xf2, 0xa1, 0x2e, 0x82, 0x02, 0x91, 0xde, 0x83, 0xf7, 0xa3, 0xc4, - 0x15, 0x41, 0x58, 0xab, 0xb3, 0x3f, 0xff, 0xcd, 0xc9, 0xd8, 0x7f, 0x02, 0x79, 0xd2, 0xc0, 0x18, - 0xaf, 0x60, 0xb1, 0xa1, 0xd9, 0xf8, 0x86, 0x2a, 0xf1, 0x0d, 0xcd, 0xf5, 0x36, 0x34, 0xc9, 0x7c, - 0x3e, 0x4a, 0x42, 0xd2, 0x97, 0xf1, 0xff, 0x31, 0x01, 0x40, 0xd5, 0xdc, 0xb7, 0xb6, 0xe9, 0x96, - 0xdd, 0x5f, 0xf8, 0xf3, 0x18, 0xb6, 0xb9, 0xf6, 0x9f, 0xb9, 0x81, 0xf0, 0x6e, 0x30, 0xc1, 0xc6, - 0x3d, 0xd6, 0x90, 0x1b, 0x85, 0x86, 0x84, 0xa5, 0x50, 0xf3, 0xf2, 0x8a, 0xa7, 0xfb, 0xf9, 0x85, - 0x1b, 0xe3, 0xb2, 0x3d, 0x37, 0xc6, 0xf5, 0xdd, 0x1d, 0x88, 0xba, 0x47, 0x0e, 0xbe, 0x5b, 0xfa, - 0xc6, 0x0f, 0x8e, 0x1e, 0xae, 0x45, 0x11, 0x2a, 0x78, 0x17, 0x98, 0x70, 0x82, 0x5d, 0x46, 0x25, - 0x72, 0x3d, 0xab, 0x62, 0x6f, 0x39, 0xba, 0x9f, 0x53, 0xf2, 0x2e, 0x0f, 0x29, 0x3a, 0xc6, 0xe2, - 0x3b, 0x7f, 0x7a, 0xc5, 0x8f, 0x57, 0x83, 0xdb, 0x71, 0xc1, 0xf2, 0x76, 0xd6, 0x2c, 0xfb, 0x52, - 0x17, 0xfe, 0x07, 0x39, 0x0b, 0x92, 0xc3, 0x3f, 0x9b, 0x0c, 0x7f, 0x31, 0x1c, 0x40, 0x5d, 0x44, - 0xed, 0xbe, 0xa8, 0x52, 0xfa, 0x53, 0x1b, 0x01, 0xe0, 0x3d, 0xa0, 0x40, 0x09, 0x65, 0x9d, 0xe8, - 0xd9, 0x48, 0xfc, 0x82, 0x92, 0x74, 0xf6, 0x07, 0x7c, 0x57, 0x80, 0xe3, 0x79, 0x01, 0xc7, 0xc5, - 0x43, 0x51, 0x96, 0x3a, 0xa4, 0x67, 0x9f, 0x0c, 0x26, 0x18, 0xa7, 0xd5, 0x39, 0x5e, 0x8b, 0x8b, - 0xc7, 0x54, 0x00, 0x0a, 0xeb, 0xce, 0x3e, 0x32, 0x9c, 0x62, 0x06, 0x3f, 0x63, 0xfa, 0x0c, 0xa7, - 0x98, 0x85, 0xaf, 0x9a, 0x04, 0x93, 0x41, 0xa0, 0x90, 0xcf, 0x65, 0x41, 0x31, 0xbc, 0xdb, 0x9d, - 0xb6, 0x48, 0xde, 0x65, 0xef, 0x97, 0xa4, 0xf7, 0xdd, 0x83, 0x00, 0x1e, 0xbd, 0x95, 0x49, 0x5e, - 0x5e, 0xfd, 0x66, 0xa9, 0x7d, 0x78, 0xd9, 0x5a, 0xd2, 0x57, 0xb5, 0x4f, 0x65, 0x41, 0xbe, 0xdc, - 0x76, 0x6c, 0x94, 0xe8, 0xee, 0xea, 0xfe, 0x3b, 0x0a, 0xf0, 0xb9, 0x59, 0x59, 0x5b, 0x23, 0x64, - 0x00, 0xae, 0x5b, 0x92, 0xb7, 0x72, 0x83, 0x54, 0x6c, 0xd1, 0xe9, 0x33, 0xf4, 0x1b, 0x59, 0x30, - 0x45, 0x43, 0x6e, 0x94, 0xda, 0x6d, 0xf8, 0x98, 0x90, 0xa9, 0x7d, 0x82, 0xad, 0xc0, 0xdf, 0x91, - 0xf6, 0x9b, 0x0e, 0x5a, 0x15, 0x94, 0x9d, 0x20, 0xf6, 0x48, 0x32, 0x37, 0x5e, 0xb9, 0x3d, 0xb1, - 0x81, 0x04, 0xa5, 0xcf, 0xea, 0x3f, 0xcf, 0x62, 0x03, 0xc0, 0xbe, 0xb4, 0xe1, 0xa2, 0x7d, 0x0b, - 0x5d, 0x86, 0xd7, 0x87, 0xcc, 0x3e, 0x18, 0x4f, 0xe0, 0x8d, 0xd2, 0x8b, 0x38, 0x5c, 0x91, 0x91, - 0x5b, 0x52, 0xd3, 0xed, 0x30, 0x13, 0xeb, 0xc5, 0x7b, 0x83, 0x3c, 0x70, 0xc5, 0xe8, 0x7c, 0x76, - 0xc9, 0x35, 0x9b, 0x68, 0x2a, 0xd2, 0x67, 0xec, 0x23, 0x13, 0x60, 0x72, 0xd3, 0xee, 0x76, 0xda, - 0x66, 0x77, 0x07, 0x7e, 0x57, 0x09, 0xae, 0x8e, 0x7e, 0xaa, 0x70, 0x6c, 0xf9, 0xc7, 0xf6, 0x90, - 0xeb, 0xbb, 0xe1, 0xd0, 0x97, 0xfe, 0x77, 0x93, 0xc2, 0xf7, 0x29, 0xb2, 0x93, 0x54, 0xbf, 0xd2, - 0xf8, 0x3b, 0x95, 0x2b, 0x60, 0xb2, 0x63, 0x35, 0xbd, 0x3d, 0x37, 0xb8, 0xe9, 0xf2, 0x89, 0x72, - 0xa5, 0x6c, 0xd0, 0xbf, 0xf4, 0xe0, 0x77, 0x68, 0x82, 0x09, 0x96, 0x78, 0x60, 0x5b, 0xe8, 0xe0, - 0x31, 0xbc, 0xd3, 0xa0, 0x60, 0xba, 0x9e, 0xd5, 0xf5, 0x6f, 0x12, 0x66, 0x6f, 0xb8, 0xbb, 0xa4, - 0x4f, 0x9b, 0x6e, 0xdb, 0x0f, 0x70, 0x10, 0x24, 0xc0, 0xf7, 0x4b, 0xcd, 0x1f, 0xe3, 0x5b, 0x9e, - 0x0c, 0xf2, 0x07, 0x87, 0x58, 0x6b, 0xbe, 0x16, 0x5c, 0xa3, 0x97, 0x0c, 0xad, 0x41, 0xcf, 0xc3, - 0x07, 0x47, 0xdf, 0x5b, 0xf0, 0xbb, 0xfc, 0xfa, 0x9d, 0x38, 0x46, 0x30, 0x2e, 0x86, 0x63, 0x44, - 0x90, 0x10, 0x33, 0x46, 0xfc, 0xa6, 0xf4, 0xee, 0x4e, 0xc0, 0x92, 0x01, 0x6b, 0x79, 0x71, 0x17, - 0x8a, 0x7c, 0x40, 0x6a, 0xa7, 0x66, 0x50, 0x4d, 0x47, 0xc8, 0xfe, 0x5f, 0x9f, 0x00, 0x13, 0x2b, - 0x66, 0xbb, 0x8d, 0xdc, 0xab, 0x78, 0x68, 0x29, 0xfa, 0x14, 0xae, 0x9b, 0xb6, 0xb5, 0x85, 0xe7, - 0xf7, 0xb1, 0x9d, 0xde, 0xbb, 0xa5, 0x83, 0x55, 0xb2, 0x3a, 0x16, 0x7a, 0xcb, 0x8f, 0xe0, 0xf9, - 0x39, 0x90, 0xb3, 0xec, 0x2d, 0x87, 0x75, 0x7d, 0xbd, 0xab, 0xe8, 0xfe, 0xcf, 0x64, 0x0a, 0x42, - 0x32, 0x4a, 0xc6, 0xab, 0x94, 0xa4, 0x22, 0xfd, 0x1e, 0xf0, 0xb7, 0x72, 0x60, 0xd6, 0x27, 0xa2, - 0x62, 0xb7, 0xd0, 0x15, 0x7e, 0x49, 0xe5, 0x25, 0x39, 0xd9, 0xb3, 0x36, 0xbd, 0xed, 0x21, 0x45, - 0x45, 0xb0, 0xd4, 0x00, 0xa0, 0x69, 0x7a, 0x68, 0xdb, 0x71, 0xad, 0xa0, 0x5f, 0x7b, 0x4a, 0x92, - 0xd2, 0xca, 0xf4, 0xef, 0xab, 0x3a, 0x57, 0x8e, 0x7a, 0x1f, 0x98, 0x46, 0xc1, 0x71, 0x5a, 0x7f, - 0xc9, 0x25, 0x16, 0x2f, 0x3e, 0x3f, 0xfc, 0x73, 0xa9, 0x23, 0x3d, 0x32, 0xcd, 0x4c, 0x86, 0x59, - 0x63, 0x38, 0x1d, 0xda, 0xac, 0xae, 0x97, 0xf4, 0xfa, 0x6a, 0x69, 0x6d, 0xad, 0x52, 0x5d, 0x09, - 0x62, 0x43, 0xa8, 0x60, 0x6e, 0xa9, 0x76, 0xa1, 0xca, 0x05, 0xef, 0xc8, 0xc1, 0x0d, 0x30, 0xe9, - 0xf3, 0xab, 0x9f, 0xb3, 0x23, 0xcf, 0x33, 0xe6, 0xec, 0xc8, 0x25, 0x61, 0x23, 0xcb, 0x6a, 0x06, - 0x0e, 0x33, 0xe4, 0x19, 0xfe, 0x91, 0x09, 0xf2, 0x64, 0x6d, 0x1c, 0xbe, 0x9d, 0x5c, 0x35, 0xdc, - 0x69, 0x9b, 0x4d, 0x04, 0x77, 0x13, 0x58, 0xd5, 0x7e, 0xf4, 0xf4, 0xec, 0x81, 0xe8, 0xe9, 0xe4, - 0x91, 0x59, 0x6f, 0x27, 0xfb, 0xad, 0xc7, 0xeb, 0x34, 0x8b, 0x78, 0xfa, 0x25, 0x76, 0x97, 0x84, - 0x2e, 0xe3, 0x33, 0x32, 0x23, 0x44, 0x32, 0x9a, 0xa6, 0x64, 0x16, 0xa5, 0xdc, 0x7e, 0x4a, 0x1c, - 0x45, 0xe9, 0x6b, 0xfc, 0x17, 0x73, 0x20, 0x5f, 0xef, 0xb4, 0x2d, 0x0f, 0xbe, 0x3c, 0x3b, 0x12, - 0xcc, 0x68, 0xc4, 0x7b, 0x65, 0x60, 0xc4, 0xfb, 0x70, 0x17, 0x34, 0x27, 0xb1, 0x0b, 0x6a, 0xa0, - 0x2b, 0x9e, 0xb8, 0x0b, 0x7a, 0x37, 0x8b, 0xef, 0x44, 0xf7, 0x50, 0x1f, 0xd7, 0x87, 0xa5, 0xa4, - 0x59, 0x7d, 0x02, 0x87, 0x9d, 0x7d, 0x32, 0x8b, 0x5f, 0x04, 0x40, 0x61, 0xb1, 0x66, 0x18, 0xb5, - 0xf5, 0xe2, 0x31, 0x12, 0xf8, 0xa2, 0xb6, 0x51, 0xcc, 0xa8, 0x53, 0x20, 0x5f, 0xa9, 0x56, 0x35, - 0xbd, 0x98, 0x25, 0x11, 0x95, 0x2a, 0xc6, 0x9a, 0x56, 0x54, 0xc4, 0xf0, 0xc7, 0xb1, 0x66, 0xb4, - 0x58, 0x77, 0x9a, 0xe2, 0x25, 0x67, 0x50, 0x47, 0xd3, 0x93, 0xbe, 0x70, 0xfd, 0x17, 0x05, 0xe4, - 0xd7, 0x91, 0xbb, 0x8d, 0xe0, 0x8f, 0x25, 0xd8, 0xac, 0xdb, 0xb2, 0xdc, 0x2e, 0x8d, 0x3f, 0x15, - 0x6e, 0xd6, 0xf1, 0x69, 0xea, 0x2d, 0x60, 0xb6, 0x8b, 0x9a, 0x8e, 0xdd, 0xf2, 0x33, 0xd1, 0xfe, - 0x48, 0x4c, 0x84, 0x2f, 0x4b, 0x08, 0x19, 0x21, 0x74, 0x24, 0x3b, 0x6e, 0x49, 0x80, 0xe9, 0x57, - 0x6b, 0xfa, 0xc0, 0x7c, 0x4b, 0xc1, 0x3f, 0x75, 0xae, 0xc2, 0x97, 0x49, 0xef, 0xa2, 0xde, 0x01, - 0x0a, 0x44, 0x4c, 0xfd, 0x31, 0xba, 0x7f, 0x7f, 0xcc, 0xf2, 0xa8, 0x8b, 0xe0, 0x44, 0x17, 0xb5, - 0x51, 0xd3, 0x43, 0x2d, 0xac, 0xba, 0xfa, 0xc0, 0x4e, 0xe1, 0x60, 0x76, 0xf8, 0xa7, 0x3c, 0x80, - 0xf7, 0x8a, 0x00, 0xde, 0xda, 0x87, 0x95, 0xb8, 0x41, 0xd1, 0xb6, 0x32, 0x6e, 0x46, 0xbd, 0xed, - 0x04, 0x8b, 0xdb, 0xfe, 0x3b, 0xfe, 0xb6, 0xe3, 0xed, 0xb6, 0xc9, 0x37, 0xe6, 0xc1, 0xef, 0xbf, - 0xab, 0x0b, 0x60, 0xc2, 0xb4, 0xaf, 0x92, 0x4f, 0xb9, 0x98, 0x56, 0xfb, 0x99, 0xe0, 0xab, 0x02, - 0xe4, 0xef, 0x17, 0x90, 0x7f, 0x82, 0x1c, 0xb9, 0xe9, 0x03, 0xff, 0x93, 0x13, 0x20, 0xbf, 0x61, - 0x76, 0x3d, 0x04, 0xff, 0x6f, 0x45, 0x16, 0xf9, 0x5b, 0xc1, 0xdc, 0x96, 0xd3, 0xdc, 0xeb, 0xa2, - 0x96, 0xa8, 0x94, 0x3d, 0xa9, 0xa3, 0xc0, 0x5c, 0xbd, 0x1d, 0x14, 0xfd, 0x44, 0x56, 0xac, 0xbf, - 0x9d, 0x7e, 0x20, 0x9d, 0x04, 0xd3, 0xed, 0x6e, 0x98, 0xae, 0x57, 0xdb, 0x22, 0x69, 0x41, 0x30, - 0x5d, 0x3e, 0x51, 0x80, 0xbe, 0x10, 0x03, 0xfd, 0x44, 0x34, 0xf4, 0x93, 0x12, 0xd0, 0xab, 0x25, - 0x30, 0xb9, 0x65, 0xb5, 0x11, 0xf9, 0x61, 0x8a, 0xfc, 0xd0, 0x6f, 0x4c, 0x22, 0xbc, 0x0f, 0xc6, - 0xa4, 0x65, 0xab, 0x8d, 0xf4, 0xe0, 0x37, 0x7f, 0x22, 0x03, 0xc2, 0x89, 0xcc, 0x1a, 0xf5, 0x6f, - 0xc5, 0x86, 0x97, 0x6d, 0xee, 0x22, 0x7f, 0x11, 0xcd, 0x66, 0xa7, 0x47, 0x5a, 0xa6, 0x67, 0x12, - 0x30, 0x66, 0x74, 0xf2, 0x2c, 0xfa, 0x77, 0x28, 0xbd, 0xfe, 0x1d, 0x2f, 0x50, 0x92, 0xf5, 0x88, - 0x3e, 0xb1, 0x11, 0x1a, 0x75, 0xd1, 0x07, 0x88, 0x5a, 0x8a, 0xc1, 0x3b, 0x06, 0xa6, 0x69, 0xba, - 0xc8, 0xdb, 0xe0, 0x3d, 0x2a, 0xf2, 0xba, 0x98, 0x48, 0x5c, 0xeb, 0xba, 0x75, 0x73, 0x17, 0x91, - 0xca, 0xca, 0xf8, 0x1b, 0x73, 0x99, 0x3a, 0x90, 0x1e, 0xf6, 0xbf, 0xf9, 0x51, 0xf7, 0xbf, 0xfd, - 0xda, 0x98, 0xbe, 0x1a, 0xbe, 0x26, 0x07, 0x94, 0xf2, 0x9e, 0xf7, 0xa8, 0xee, 0x7e, 0xbf, 0x27, - 0xed, 0xaf, 0xc2, 0xfa, 0xb3, 0xc8, 0xbb, 0xa6, 0xc7, 0xd4, 0xfb, 0x26, 0x94, 0x12, 0x39, 0xbf, - 0x98, 0xa8, 0xb6, 0xa5, 0x2f, 0x23, 0x6f, 0x51, 0x02, 0x87, 0xc7, 0xe7, 0x67, 0x0e, 0x6f, 0x9a, - 0x43, 0xda, 0x3f, 0x71, 0x3d, 0x43, 0xf0, 0xee, 0x77, 0x3c, 0x39, 0x21, 0xf4, 0x16, 0xd9, 0x26, - 0x27, 0xac, 0x9c, 0xd1, 0xe9, 0x0b, 0x7c, 0x85, 0xb4, 0x1b, 0x38, 0x65, 0x5b, 0xac, 0x4b, 0x60, - 0x32, 0x9b, 0x4a, 0xee, 0x3e, 0xc1, 0x98, 0x6a, 0xd3, 0x07, 0xec, 0xef, 0xa3, 0x97, 0x0c, 0x87, - 0x41, 0x0c, 0xbe, 0x5a, 0x7a, 0x5b, 0x89, 0x36, 0x7b, 0xc0, 0x7a, 0x61, 0x32, 0x7e, 0xcb, 0x6d, - 0x3a, 0xc5, 0x56, 0x9c, 0x3e, 0xc7, 0xbf, 0xa9, 0x80, 0x02, 0xdd, 0x4a, 0x84, 0x6f, 0xca, 0x24, - 0xb8, 0x88, 0xd9, 0x13, 0x5d, 0x01, 0x83, 0xf7, 0x24, 0x6b, 0x0e, 0x82, 0xcb, 0x60, 0x2e, 0x91, - 0xcb, 0xa0, 0x78, 0xae, 0x52, 0x42, 0x8f, 0x68, 0x1b, 0x53, 0x9e, 0x4e, 0x26, 0xd1, 0xb0, 0xbe, - 0x04, 0xa5, 0x8f, 0xf7, 0x4f, 0xe7, 0xc1, 0x0c, 0xad, 0xfa, 0x82, 0xd5, 0xda, 0x46, 0x1e, 0x7c, - 0x67, 0xf6, 0xfb, 0x07, 0x75, 0xb5, 0x0a, 0x66, 0x2e, 0x13, 0xb2, 0xd7, 0xcc, 0xab, 0xce, 0x9e, - 0xc7, 0x56, 0x2e, 0x6e, 0x8f, 0x5d, 0xf7, 0xa0, 0xed, 0x5c, 0xa0, 0x7f, 0xe8, 0xc2, 0xff, 0x98, - 0xc7, 0x74, 0xc1, 0x9f, 0x3a, 0x62, 0x15, 0x88, 0x91, 0xc5, 0x27, 0xa9, 0xa7, 0x41, 0x61, 0xdf, - 0x42, 0x97, 0x2b, 0x2d, 0x66, 0xdd, 0xb2, 0x37, 0xf8, 0x41, 0xe9, 0xfd, 0x57, 0x1e, 0x6e, 0x46, - 0x4b, 0xba, 0x52, 0x28, 0xb7, 0x0b, 0x3b, 0x90, 0xac, 0x31, 0x9c, 0xf1, 0x15, 0xef, 0xeb, 0x4b, - 0x72, 0x0f, 0x7c, 0x94, 0xe1, 0x9c, 0xe0, 0x32, 0x7e, 0xca, 0x80, 0x11, 0x5f, 0xe5, 0x27, 0x77, - 0x78, 0x7f, 0x40, 0xd5, 0xe9, 0x73, 0xfe, 0x75, 0x0a, 0x98, 0xaa, 0x23, 0x6f, 0xd9, 0x42, 0xed, - 0x56, 0x17, 0xba, 0x87, 0x37, 0x8d, 0xce, 0x81, 0xc2, 0x16, 0x29, 0x6c, 0xd0, 0xf9, 0x03, 0x96, - 0x0d, 0xbe, 0x26, 0x2b, 0xbb, 0xb3, 0xcb, 0x56, 0xdf, 0x7c, 0x6a, 0x47, 0x02, 0x93, 0x9c, 0x67, - 0x6e, 0x7c, 0xcd, 0xe9, 0xa3, 0xf4, 0x56, 0x05, 0xcc, 0xb0, 0x0b, 0xbe, 0x4a, 0x6d, 0x6b, 0xdb, - 0x86, 0x7b, 0x23, 0xd0, 0x10, 0xf5, 0x49, 0x20, 0x6f, 0xe2, 0xd2, 0x98, 0x93, 0x3e, 0xec, 0xdb, - 0x79, 0x92, 0xfa, 0x74, 0x9a, 0x31, 0x41, 0x8c, 0xbe, 0x50, 0xb0, 0x7d, 0x9a, 0xc7, 0x18, 0xa3, - 0x6f, 0x60, 0xe5, 0xe9, 0x23, 0xf6, 0x65, 0x05, 0x9c, 0x64, 0x04, 0x9c, 0x47, 0xae, 0x67, 0x35, - 0xcd, 0x36, 0x45, 0xee, 0x85, 0x99, 0x51, 0x40, 0xb7, 0x0a, 0x66, 0xf7, 0xf9, 0x62, 0x19, 0x84, - 0x67, 0xfb, 0x42, 0x28, 0x10, 0xa0, 0x8b, 0x3f, 0x26, 0x88, 0x75, 0x26, 0x70, 0x55, 0x28, 0x73, - 0x8c, 0xb1, 0xce, 0xa4, 0x89, 0x48, 0x1f, 0xe2, 0x97, 0xe6, 0x68, 0xf8, 0xbf, 0xb0, 0xfb, 0xfc, - 0x0b, 0x69, 0x6c, 0x37, 0xc1, 0x34, 0xc1, 0x92, 0xfe, 0xc8, 0x96, 0x21, 0x62, 0x84, 0x38, 0xe8, - 0x77, 0xd8, 0x9d, 0x42, 0xc1, 0xbf, 0x3a, 0x5f, 0x0e, 0xbc, 0x00, 0x40, 0xf8, 0x89, 0xef, 0xa4, - 0x33, 0x51, 0x9d, 0x74, 0x56, 0xae, 0x93, 0x7e, 0xa3, 0x74, 0xf0, 0x92, 0xfe, 0x64, 0x1f, 0x5e, - 0x3c, 0xe4, 0xc2, 0x56, 0x0c, 0xae, 0x3d, 0x7d, 0xb9, 0x78, 0x55, 0xae, 0xf7, 0x26, 0xe7, 0x8f, - 0x8c, 0x64, 0x3e, 0xc5, 0xf7, 0x07, 0x4a, 0x4f, 0x7f, 0x70, 0x08, 0x4b, 0xfa, 0x36, 0x70, 0x9c, - 0x56, 0x51, 0x0e, 0xc8, 0xca, 0xd3, 0xd0, 0x0c, 0x3d, 0xc9, 0xf0, 0xa3, 0x43, 0x08, 0xc1, 0xa0, - 0x6b, 0xa6, 0xe3, 0x3a, 0xb9, 0x64, 0xc6, 0x6e, 0x52, 0x01, 0x39, 0xba, 0xdb, 0xa9, 0xbf, 0x91, - 0xa3, 0xd6, 0xee, 0x26, 0xb9, 0xf6, 0x09, 0x7e, 0x21, 0x37, 0x8a, 0x11, 0xe1, 0x01, 0x90, 0x23, - 0xae, 0xea, 0x4a, 0xe4, 0x92, 0x46, 0x58, 0x65, 0x78, 0x27, 0x17, 0xba, 0xe2, 0xad, 0x1e, 0xd3, - 0xc9, 0x9f, 0xea, 0xed, 0xe0, 0xf8, 0x45, 0xb3, 0x79, 0x69, 0xdb, 0x75, 0xf6, 0xc8, 0x05, 0x39, - 0x0e, 0xbb, 0x69, 0x87, 0xdc, 0x58, 0x26, 0x7e, 0x50, 0xef, 0xf4, 0x4d, 0x87, 0xfc, 0x20, 0xd3, - 0x61, 0xf5, 0x18, 0x33, 0x1e, 0xd4, 0x27, 0x07, 0x9d, 0x4e, 0x21, 0xb6, 0xd3, 0x59, 0x3d, 0xe6, - 0x77, 0x3b, 0xea, 0x12, 0x98, 0x6c, 0x59, 0xfb, 0x64, 0xab, 0x9a, 0xcc, 0xba, 0x06, 0x1d, 0x25, - 0x5e, 0xb2, 0xf6, 0xe9, 0xc6, 0xf6, 0xea, 0x31, 0x3d, 0xf8, 0x53, 0x5d, 0x01, 0x53, 0x64, 0x5b, - 0x80, 0x14, 0x33, 0x99, 0xe8, 0x98, 0xf0, 0xea, 0x31, 0x3d, 0xfc, 0x17, 0x5b, 0x1f, 0x39, 0x72, - 0x86, 0xe3, 0x7e, 0x7f, 0xbb, 0x3d, 0x93, 0x68, 0xbb, 0x1d, 0xf3, 0x82, 0x6e, 0xb8, 0x9f, 0x06, - 0xf9, 0x26, 0xe1, 0x70, 0x96, 0x71, 0x98, 0xbe, 0xaa, 0xf7, 0x82, 0xdc, 0xae, 0xe9, 0xfa, 0x93, - 0xe7, 0x5b, 0x07, 0x97, 0xbb, 0x6e, 0xba, 0x97, 0x30, 0x82, 0xf8, 0xaf, 0xc5, 0x09, 0x90, 0x27, - 0x8c, 0x0b, 0x1e, 0xe0, 0x5b, 0x72, 0xd4, 0x0c, 0x29, 0x3b, 0x36, 0x1e, 0xf6, 0x0d, 0xc7, 0x3f, - 0xe8, 0xf2, 0xc1, 0xcc, 0x68, 0x2c, 0xc8, 0xbe, 0x57, 0x1f, 0x2b, 0x91, 0x57, 0x1f, 0xf7, 0xdc, - 0xc1, 0x99, 0xeb, 0xbd, 0x83, 0x33, 0x5c, 0x3e, 0xc8, 0x0f, 0x76, 0x54, 0xf9, 0xd3, 0x21, 0x4c, - 0x97, 0x5e, 0x46, 0x44, 0xcf, 0xc0, 0xdb, 0x96, 0xcd, 0xb5, 0xd9, 0x7f, 0x4d, 0xd8, 0x29, 0x25, - 0x35, 0x6a, 0x06, 0x90, 0x97, 0x7e, 0xdf, 0xf4, 0x1b, 0x39, 0x30, 0x4f, 0x6f, 0x7a, 0xdd, 0x47, - 0x86, 0x23, 0x5e, 0x49, 0x07, 0x3f, 0x39, 0x12, 0xa1, 0xe9, 0x33, 0xe0, 0x28, 0x7d, 0x07, 0x9c, - 0x03, 0x87, 0x8d, 0x73, 0x03, 0x0e, 0x1b, 0xe7, 0x93, 0xad, 0x1c, 0xfe, 0x1e, 0x2f, 0x3f, 0x1b, - 0xa2, 0xfc, 0xdc, 0x13, 0x01, 0x50, 0x3f, 0xbe, 0x8c, 0xc4, 0xbe, 0x79, 0x7b, 0x20, 0x29, 0x75, - 0x41, 0x52, 0xee, 0x1f, 0x9e, 0x90, 0xf4, 0xa5, 0xe5, 0x77, 0x73, 0xe0, 0x9a, 0x90, 0x98, 0x2a, - 0xba, 0xcc, 0x04, 0xe5, 0x73, 0x23, 0x11, 0x94, 0xe4, 0xb1, 0x0c, 0xd2, 0x96, 0x98, 0x3f, 0x96, - 0x3e, 0x03, 0xd4, 0x0b, 0x54, 0xc0, 0x9b, 0x08, 0x61, 0x39, 0x0d, 0x0a, 0xb4, 0x87, 0x61, 0xd0, - 0xb0, 0xb7, 0x84, 0xdd, 0x8d, 0xdc, 0xc9, 0x21, 0x59, 0xda, 0xc6, 0x20, 0x3f, 0x6c, 0x5d, 0xc3, - 0xd8, 0x73, 0xed, 0x8a, 0xed, 0x39, 0xf0, 0x27, 0x46, 0x22, 0x38, 0x81, 0x37, 0x9c, 0x32, 0x8c, - 0x37, 0xdc, 0x50, 0xab, 0x1c, 0x7e, 0x0b, 0x8e, 0x64, 0x95, 0x23, 0xa2, 0xf2, 0xf4, 0xf1, 0x7b, - 0x9b, 0x42, 0x6f, 0x7d, 0xaf, 0x23, 0x6f, 0x51, 0xb4, 0x10, 0xe1, 0x43, 0xa3, 0x00, 0xf2, 0xa4, - 0x6f, 0x26, 0xb1, 0x4b, 0x8b, 0xc8, 0x8b, 0x78, 0xe2, 0x29, 0x36, 0x78, 0xbe, 0x30, 0x1d, 0xec, - 0xa1, 0x70, 0x24, 0x48, 0xc9, 0xc5, 0xcc, 0x4f, 0x40, 0x46, 0xfa, 0x98, 0xbd, 0x58, 0x01, 0x05, - 0x76, 0xc3, 0xf7, 0x66, 0x2a, 0x0e, 0x13, 0x62, 0x08, 0x5d, 0x89, 0x1d, 0xb9, 0xc4, 0xf7, 0x60, - 0xa7, 0xb7, 0x17, 0x77, 0x44, 0x17, 0x5d, 0x7f, 0x2b, 0x0b, 0xa6, 0xeb, 0xc8, 0x2b, 0x9b, 0xae, - 0x6b, 0x99, 0xdb, 0xa3, 0xf2, 0xf8, 0x96, 0xf5, 0x1e, 0x86, 0xdf, 0xce, 0xc8, 0x9e, 0xa7, 0x09, - 0x16, 0xc2, 0x7d, 0x52, 0x23, 0x62, 0xfb, 0xc9, 0xdd, 0x30, 0x3e, 0xa8, 0xb4, 0x31, 0x78, 0x6c, - 0x67, 0xc1, 0x84, 0x7f, 0xa6, 0xee, 0x9c, 0x70, 0xce, 0x72, 0xc7, 0xdb, 0xf5, 0x8f, 0xc1, 0x90, - 0xe7, 0x83, 0x67, 0xb9, 0xe0, 0x2b, 0x13, 0x3a, 0xca, 0xc7, 0x1f, 0x08, 0x4c, 0xa6, 0x63, 0x49, - 0xdc, 0xe1, 0x8f, 0xea, 0x08, 0xe0, 0xef, 0x4c, 0xb0, 0xe5, 0xc8, 0x35, 0xd3, 0x43, 0x57, 0xe0, - 0x5f, 0x28, 0x60, 0xa2, 0x8e, 0x3c, 0x3c, 0xde, 0x62, 0xf2, 0x0f, 0x2d, 0xe1, 0x2a, 0xb7, 0xe2, - 0x31, 0xc5, 0xd6, 0x30, 0x9e, 0x05, 0xa6, 0x3a, 0xae, 0xd3, 0x44, 0xdd, 0x2e, 0x5b, 0xbd, 0xe0, - 0x1d, 0xd5, 0xfa, 0x8d, 0xfe, 0x84, 0xb4, 0x85, 0x0d, 0xff, 0x1f, 0x3d, 0xfc, 0x3d, 0xa9, 0x19, - 0x40, 0x4b, 0x62, 0x0d, 0x1c, 0xb7, 0x19, 0x10, 0x57, 0x79, 0xfa, 0x40, 0x7f, 0x46, 0x01, 0x33, - 0x75, 0xe4, 0x05, 0x5c, 0x4c, 0xb0, 0xc9, 0x11, 0x0d, 0xaf, 0x00, 0xa5, 0x72, 0x38, 0x28, 0xe5, - 0xef, 0x5d, 0x13, 0xb9, 0x19, 0x14, 0x36, 0xc6, 0x7b, 0xd7, 0xe4, 0x28, 0x18, 0xc3, 0xf1, 0xb5, - 0xc7, 0x81, 0x29, 0x42, 0x0b, 0x51, 0xd8, 0x9f, 0xcb, 0x85, 0xca, 0xfb, 0xf9, 0x94, 0x94, 0xf7, - 0x3e, 0x90, 0x27, 0xf7, 0xb9, 0x13, 0xc5, 0x9d, 0x96, 0x31, 0xdb, 0xd7, 0x71, 0x76, 0x9d, 0xfe, - 0xd5, 0xdf, 0x4f, 0x33, 0x9f, 0xcc, 0x4f, 0xf3, 0xf5, 0xd9, 0x44, 0x23, 0x21, 0x9d, 0x3b, 0x8c, - 0x50, 0xe5, 0x13, 0x8c, 0x9b, 0x31, 0x75, 0xa7, 0x2f, 0x1c, 0x2f, 0x54, 0xc0, 0x24, 0x1e, 0xb7, - 0x89, 0x3d, 0x7e, 0xe1, 0xf0, 0xe2, 0xd0, 0xdf, 0xd0, 0x4f, 0xd8, 0x03, 0xfb, 0x1c, 0x19, 0x9d, - 0x79, 0x9f, 0xa0, 0x07, 0x8e, 0xab, 0x3c, 0x7d, 0x3c, 0xde, 0x41, 0xf1, 0x20, 0xfa, 0x00, 0xdf, - 0xa0, 0x00, 0x65, 0x05, 0x79, 0xe3, 0xb6, 0x22, 0xdf, 0x2a, 0x1d, 0xaa, 0x48, 0x60, 0x18, 0xa1, - 0x79, 0x61, 0x05, 0x8d, 0x46, 0x81, 0xe4, 0x62, 0x14, 0x49, 0x11, 0x90, 0x3e, 0x6a, 0xef, 0xa1, - 0xa8, 0xd1, 0xcd, 0x85, 0x1f, 0x1f, 0x41, 0xaf, 0x3a, 0xde, 0x85, 0x0f, 0x9f, 0x81, 0xa4, 0x8c, - 0xa3, 0xd2, 0xb7, 0x7e, 0x95, 0x8f, 0xe5, 0x9e, 0x33, 0x80, 0x95, 0x7d, 0x07, 0x35, 0x2f, 0xa1, - 0x16, 0xfc, 0x91, 0xc3, 0x43, 0x37, 0x0f, 0x26, 0x9a, 0xb4, 0x34, 0x02, 0xde, 0xa4, 0xee, 0xbf, - 0x26, 0xb8, 0xb4, 0x57, 0xec, 0x88, 0xe8, 0xef, 0x63, 0xbc, 0xb4, 0x57, 0xa2, 0xfa, 0x31, 0x98, - 0x2d, 0x74, 0x96, 0x51, 0x69, 0x3a, 0x36, 0xfc, 0x8f, 0x87, 0x87, 0xe5, 0x06, 0x30, 0x65, 0x35, - 0x1d, 0xbb, 0xb2, 0xeb, 0x07, 0xf7, 0x9b, 0xd2, 0xc3, 0x04, 0xff, 0xab, 0xb6, 0xeb, 0x3c, 0x6c, - 0xb1, 0x5d, 0xf3, 0x30, 0x61, 0x58, 0x63, 0x02, 0x93, 0x7e, 0x54, 0xc6, 0x44, 0x9f, 0xba, 0xd3, - 0x87, 0xec, 0xa3, 0xa1, 0x77, 0x1b, 0xed, 0x0a, 0x1f, 0x15, 0xab, 0xc0, 0xc3, 0x0c, 0x67, 0x7c, - 0x2b, 0x8e, 0x64, 0x38, 0x8b, 0x21, 0x60, 0x0c, 0xf7, 0x8b, 0x84, 0x38, 0xa6, 0xbe, 0x06, 0x7c, - 0x08, 0x74, 0x46, 0x67, 0x1e, 0x0e, 0x89, 0xce, 0xd1, 0x98, 0x88, 0x1f, 0x60, 0xa1, 0x2e, 0x99, - 0xc5, 0x03, 0xff, 0xd3, 0x28, 0xc0, 0xb9, 0x67, 0x18, 0x7f, 0x05, 0xea, 0xad, 0x90, 0xe0, 0xba, - 0xe1, 0x03, 0x1c, 0xc4, 0xa5, 0x8c, 0xf1, 0x22, 0x6e, 0x99, 0xfa, 0xd3, 0x07, 0xf0, 0x67, 0x15, - 0x30, 0x47, 0x7c, 0x04, 0xda, 0xc8, 0x74, 0x69, 0x47, 0x39, 0x12, 0x47, 0xf9, 0x77, 0x48, 0x07, - 0xf8, 0x11, 0xf9, 0x10, 0xd2, 0x31, 0x12, 0x28, 0xe4, 0xa2, 0xfb, 0x48, 0x92, 0x30, 0x96, 0x6d, - 0x94, 0x62, 0x40, 0x02, 0x13, 0xf1, 0xd1, 0xe0, 0x91, 0xd0, 0x23, 0x57, 0x64, 0x86, 0xaf, 0x6c, - 0x63, 0xf6, 0xc8, 0x95, 0x21, 0x22, 0x7d, 0x4c, 0xde, 0xf0, 0x24, 0xb6, 0xe0, 0x6c, 0x90, 0xdb, - 0xb8, 0x5f, 0x9d, 0x0b, 0x4e, 0xb4, 0x7d, 0x66, 0x24, 0x1e, 0x98, 0x87, 0x08, 0x6c, 0xaf, 0x82, - 0x9c, 0xeb, 0x5c, 0xa6, 0x4b, 0x5b, 0xb3, 0x3a, 0x79, 0x26, 0x26, 0xbf, 0xd3, 0xde, 0xdb, 0xb5, - 0xe9, 0xc9, 0xd0, 0x59, 0xdd, 0x7f, 0x55, 0x6f, 0x01, 0xb3, 0x97, 0x2d, 0x6f, 0x67, 0x15, 0x99, - 0x2d, 0xe4, 0xea, 0xce, 0x65, 0xe2, 0x31, 0x37, 0xa9, 0x8b, 0x89, 0xa2, 0xff, 0x8a, 0x84, 0x7d, - 0x49, 0xae, 0xe8, 0x1e, 0xcb, 0xf1, 0xb7, 0x24, 0x96, 0x67, 0x34, 0x55, 0xe9, 0x0b, 0xcc, 0x7b, - 0x15, 0x30, 0xa5, 0x3b, 0x97, 0x99, 0x90, 0xfc, 0x9f, 0x47, 0x2b, 0x23, 0x89, 0x27, 0x7a, 0xf4, - 0xca, 0x75, 0x9f, 0xfc, 0xb1, 0x4f, 0xf4, 0x62, 0xab, 0x1f, 0xcb, 0xc9, 0xa5, 0x19, 0xdd, 0xb9, - 0x5c, 0x47, 0x1e, 0xd5, 0x08, 0xd8, 0x18, 0x91, 0x93, 0xb5, 0xd5, 0xa5, 0x05, 0xb2, 0x79, 0x78, - 0xf0, 0x9e, 0x74, 0x17, 0x21, 0x60, 0x50, 0x40, 0xe2, 0xb8, 0x77, 0x11, 0x06, 0x52, 0x30, 0x86, - 0x18, 0x29, 0x0a, 0x98, 0xd6, 0x9d, 0xcb, 0x78, 0x68, 0x58, 0xb6, 0xda, 0xed, 0xd1, 0x8c, 0x90, - 0x49, 0x8d, 0x7f, 0x9f, 0x0d, 0x3e, 0x15, 0x63, 0x37, 0xfe, 0x07, 0x10, 0x90, 0x3e, 0x0c, 0x2f, - 0xa0, 0xca, 0xe2, 0x8f, 0xd0, 0xf6, 0x68, 0x70, 0x18, 0x56, 0x21, 0x02, 0x32, 0x8e, 0x4c, 0x21, - 0xa2, 0x28, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x99, 0x0c, 0xf3, 0xa3, 0xd5, 0x89, 0x77, 0x25, 0x73, - 0x4d, 0x64, 0xc3, 0xae, 0x40, 0xc8, 0x48, 0xd0, 0x48, 0xe0, 0x82, 0x28, 0x41, 0x43, 0xfa, 0x78, - 0x7c, 0x48, 0x01, 0x33, 0x94, 0x84, 0x47, 0x89, 0x15, 0x30, 0x94, 0x52, 0xf1, 0x2d, 0x38, 0x1a, - 0xa5, 0x8a, 0xa1, 0x60, 0x2c, 0xb7, 0x74, 0x62, 0x3b, 0x6e, 0x88, 0xe3, 0xe3, 0x51, 0x08, 0x0e, - 0x6d, 0x8c, 0x8d, 0xf0, 0x08, 0xf9, 0x30, 0xc6, 0xd8, 0x11, 0x1d, 0x23, 0x7f, 0x41, 0xa0, 0x45, - 0xa3, 0xc4, 0xe0, 0x10, 0xaa, 0x30, 0x42, 0x18, 0x86, 0x54, 0x85, 0x23, 0x42, 0xe2, 0x2b, 0x0a, - 0x00, 0x94, 0x80, 0x75, 0x67, 0x9f, 0x5c, 0xca, 0x33, 0x82, 0xee, 0xac, 0xd7, 0xad, 0x5e, 0x19, - 0xe0, 0x56, 0x9f, 0x30, 0x84, 0x4b, 0xd2, 0x95, 0x40, 0x8e, 0xcb, 0xb8, 0x91, 0x63, 0x5f, 0x09, - 0x8c, 0xaf, 0x3f, 0x7d, 0x8c, 0xbf, 0x44, 0xad, 0xb9, 0xf0, 0x80, 0xe9, 0x2f, 0x8f, 0x04, 0x65, - 0x6e, 0xf6, 0xaf, 0x88, 0xb3, 0xff, 0x43, 0x60, 0x3b, 0xac, 0x8d, 0x38, 0xe8, 0xe0, 0x68, 0xfa, - 0x36, 0xe2, 0xd1, 0x1d, 0x10, 0xfd, 0xf1, 0x1c, 0x38, 0xce, 0x3a, 0x91, 0xef, 0x07, 0x88, 0x13, - 0x9e, 0xc3, 0x13, 0x3a, 0xc9, 0x01, 0x28, 0x8f, 0x6a, 0x41, 0x2a, 0xc9, 0x52, 0xa6, 0x04, 0x79, - 0x63, 0x59, 0xdd, 0x28, 0x68, 0x57, 0x3a, 0xa6, 0xdd, 0x92, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0x7f, - 0xad, 0x51, 0x11, 0xd7, 0x1a, 0xfb, 0xac, 0x4c, 0x26, 0xde, 0xb9, 0x26, 0x2c, 0xa3, 0xe4, 0x8e, - 0x7d, 0xe7, 0x3a, 0xba, 0xee, 0xf4, 0x51, 0x7a, 0x97, 0x02, 0x72, 0x75, 0xc7, 0xf5, 0xe0, 0x23, - 0x49, 0xb4, 0x93, 0x72, 0x3e, 0x04, 0xc9, 0x7f, 0x57, 0xcb, 0xc2, 0xad, 0xc9, 0xe7, 0xe2, 0x8f, - 0x3a, 0x9b, 0x9e, 0x49, 0xbc, 0xba, 0x71, 0xfd, 0xdc, 0xf5, 0xc9, 0x49, 0xe3, 0xe9, 0x50, 0xfe, - 0xd5, 0xa3, 0x0f, 0x60, 0xa4, 0x16, 0x4f, 0x27, 0xb2, 0xe6, 0xf4, 0x71, 0xfb, 0xef, 0x73, 0xcc, - 0xb7, 0x75, 0xd9, 0x6a, 0x23, 0xf8, 0x08, 0x75, 0x19, 0xa9, 0x9a, 0xbb, 0x48, 0xfe, 0x48, 0x4c, - 0xac, 0x6b, 0x2b, 0x89, 0x2f, 0xab, 0x84, 0xf1, 0x65, 0x93, 0x2a, 0x14, 0x3d, 0x80, 0x4e, 0x49, - 0x1a, 0xb7, 0x42, 0xc5, 0xd4, 0x3d, 0x96, 0x38, 0x9d, 0x27, 0xea, 0xc8, 0xa3, 0x46, 0x65, 0xcd, - 0xbf, 0x81, 0xe5, 0x47, 0x47, 0x12, 0xb1, 0x33, 0xb8, 0xe0, 0x45, 0xe9, 0xb9, 0xe0, 0xe5, 0xbd, - 0x3c, 0x38, 0xeb, 0x22, 0x38, 0x4f, 0x8b, 0x66, 0x90, 0x48, 0xe4, 0x48, 0x60, 0x7a, 0x6b, 0x00, - 0xd3, 0x86, 0x00, 0xd3, 0xbd, 0x43, 0x52, 0x91, 0x3e, 0x60, 0x9f, 0xc7, 0xa6, 0x0a, 0x99, 0xf4, - 0x97, 0xec, 0x16, 0x8b, 0xb0, 0xfa, 0x8f, 0x47, 0xbd, 0xd9, 0x76, 0x30, 0x04, 0xab, 0x10, 0xcb, - 0x39, 0xdf, 0x7b, 0x5b, 0xfd, 0x22, 0x0d, 0xe7, 0x8a, 0x3b, 0x51, 0xb2, 0xd3, 0x26, 0x7f, 0x63, - 0x7d, 0xf0, 0x1f, 0xfc, 0x93, 0x64, 0xeb, 0x6f, 0xa4, 0x88, 0x1e, 0xc6, 0xa5, 0x6c, 0x03, 0x25, - 0x58, 0x99, 0x93, 0xa0, 0xee, 0xdf, 0x87, 0x5b, 0x58, 0x18, 0x09, 0x64, 0x48, 0xb7, 0x30, 0x52, - 0xc0, 0x51, 0xba, 0x85, 0x0d, 0x22, 0x60, 0x0c, 0xb7, 0xcc, 0xe7, 0xd9, 0xae, 0x3c, 0xf1, 0x99, - 0x84, 0x7f, 0x95, 0x4d, 0x7d, 0xb4, 0xfd, 0x4e, 0x26, 0x91, 0x1f, 0x33, 0xa1, 0x2b, 0x7e, 0xb8, - 0x4d, 0xe2, 0x99, 0x1c, 0x57, 0xdc, 0x18, 0xd6, 0x7f, 0xb2, 0xc4, 0xa7, 0xfc, 0x82, 0xd5, 0xf2, - 0x76, 0x46, 0x74, 0x32, 0xe3, 0x32, 0x2e, 0xcb, 0xbf, 0xae, 0x98, 0xbc, 0xc0, 0x7f, 0xc9, 0x24, - 0x0a, 0x05, 0x15, 0xb0, 0x84, 0x90, 0x15, 0xc1, 0xe2, 0x04, 0x01, 0x9c, 0x62, 0xcb, 0x1b, 0xa3, - 0x44, 0x9f, 0xb7, 0x5a, 0xc8, 0x79, 0x14, 0x4a, 0x34, 0xa1, 0x6b, 0x74, 0x12, 0x1d, 0x57, 0xdc, - 0xbf, 0x53, 0x89, 0x0e, 0x58, 0x32, 0x22, 0x89, 0x8e, 0x2d, 0x2f, 0x7d, 0x1e, 0xbf, 0x72, 0x86, - 0x4d, 0x88, 0xd6, 0x2c, 0xfb, 0x12, 0xfc, 0xa7, 0x82, 0x7f, 0x51, 0xf2, 0x05, 0xcb, 0xdb, 0x61, - 0x31, 0x5d, 0x7e, 0x57, 0xfa, 0x8e, 0x93, 0x21, 0xe2, 0xb6, 0x88, 0x61, 0xa1, 0xf2, 0x07, 0xc2, - 0x42, 0x95, 0xc0, 0xac, 0x65, 0x7b, 0xc8, 0xb5, 0xcd, 0xf6, 0x72, 0xdb, 0xdc, 0xee, 0xce, 0x4f, - 0xf4, 0xbd, 0x84, 0xae, 0xc2, 0xe5, 0xd1, 0xc5, 0x3f, 0xf8, 0xeb, 0x24, 0x27, 0xc5, 0x6b, 0xf1, - 0x23, 0xa2, 0x58, 0x4d, 0x45, 0x47, 0xb1, 0x0a, 0xa2, 0x54, 0x81, 0xc1, 0x41, 0xae, 0x65, 0x6d, - 0xdc, 0x84, 0x61, 0xfb, 0xce, 0x49, 0x46, 0x53, 0x0b, 0x42, 0x38, 0xfe, 0xaa, 0x92, 0x68, 0x95, - 0x0e, 0x0b, 0xc2, 0x42, 0xaf, 0x10, 0x24, 0xb6, 0x50, 0xf9, 0xc6, 0x2b, 0x3d, 0x8d, 0x0f, 0x4c, - 0x9e, 0x9c, 0x84, 0xc9, 0xc3, 0x0b, 0x55, 0x5e, 0x4e, 0xa8, 0x92, 0x2c, 0xfa, 0xc9, 0xb4, 0x76, - 0x0c, 0xa7, 0x8a, 0xf2, 0xe0, 0x84, 0x1f, 0xb5, 0xb6, 0xd3, 0x41, 0xa6, 0x6b, 0xda, 0x4d, 0x04, - 0x3f, 0x9a, 0x1d, 0x85, 0xd9, 0xbb, 0x0c, 0x26, 0xad, 0xa6, 0x63, 0xd7, 0xad, 0xe7, 0xf8, 0x97, - 0xc4, 0xc5, 0x07, 0x4b, 0x27, 0x1c, 0xa9, 0xb0, 0x3f, 0xf4, 0xe0, 0x5f, 0xb5, 0x02, 0xa6, 0x9a, - 0xa6, 0xdb, 0xa2, 0xc1, 0xf4, 0xf2, 0x3d, 0x17, 0x32, 0x45, 0x16, 0x54, 0xf6, 0x7f, 0xd1, 0xc3, - 0xbf, 0xd5, 0x9a, 0xc8, 0xc4, 0x42, 0x4f, 0x54, 0x8e, 0xc8, 0xc2, 0x96, 0xc2, 0x9f, 0x04, 0x9e, - 0x63, 0xee, 0xb8, 0xa8, 0x4d, 0xee, 0x84, 0xa7, 0x3d, 0xc4, 0x94, 0x1e, 0x26, 0x24, 0x9d, 0xe6, - 0x93, 0xaa, 0x0e, 0xa0, 0x31, 0xee, 0x69, 0xbe, 0x14, 0x15, 0xe9, 0x4b, 0xe6, 0xdb, 0x0b, 0x60, - 0x96, 0xf6, 0x6a, 0x8c, 0x9d, 0xf0, 0x67, 0xc9, 0x95, 0xce, 0xde, 0x83, 0xe8, 0x2a, 0xac, 0x1f, - 0x7e, 0x4c, 0x2e, 0x02, 0xe5, 0x52, 0x10, 0x38, 0x10, 0x3f, 0x26, 0xdd, 0x7f, 0xf7, 0xe9, 0x5a, - 0xa0, 0x34, 0x8d, 0x7b, 0xff, 0x3d, 0xbe, 0xfa, 0xf4, 0xf1, 0xf9, 0x05, 0x05, 0x28, 0xa5, 0x56, - 0x0b, 0x36, 0x0f, 0x0f, 0xc5, 0x4d, 0x60, 0xda, 0xd7, 0x99, 0x30, 0x96, 0x23, 0x9f, 0x94, 0x74, - 0x31, 0x33, 0xe0, 0x4d, 0xa9, 0x35, 0xf6, 0xdd, 0x81, 0x98, 0xba, 0xd3, 0x07, 0xe5, 0x97, 0x27, - 0x98, 0xd2, 0x2c, 0x3a, 0xce, 0x25, 0x72, 0xe4, 0xe5, 0x11, 0x05, 0xe4, 0x97, 0x91, 0xd7, 0xdc, - 0x19, 0x91, 0xce, 0xec, 0xb9, 0x6d, 0x5f, 0x67, 0x0e, 0xdc, 0x4f, 0x3f, 0xd8, 0x86, 0xf5, 0xc9, - 0x5a, 0x20, 0x24, 0x8d, 0x3b, 0x4a, 0x73, 0x6c, 0xed, 0xe9, 0x83, 0xf3, 0x2f, 0x0a, 0x98, 0x0b, - 0x56, 0xb8, 0x28, 0x26, 0x3f, 0xff, 0xa8, 0x5b, 0xb7, 0x84, 0x9f, 0x4b, 0x16, 0xea, 0x2c, 0xe0, - 0xa9, 0xd8, 0xb2, 0x94, 0x17, 0x16, 0x13, 0x04, 0x41, 0x93, 0x23, 0x70, 0x0c, 0x33, 0x78, 0x05, - 0x4c, 0x12, 0x82, 0x96, 0xac, 0x7d, 0xe2, 0x02, 0x28, 0x2c, 0x34, 0x3e, 0x77, 0x24, 0x0b, 0x8d, - 0xf7, 0x8a, 0x0b, 0x8d, 0x92, 0x91, 0x8b, 0xfd, 0x75, 0xc6, 0x84, 0x3e, 0x31, 0xf8, 0xff, 0x91, - 0x2f, 0x33, 0x26, 0xf0, 0x89, 0x19, 0x50, 0x7f, 0xfa, 0x88, 0x7e, 0xb2, 0xc1, 0x3a, 0x5b, 0x7f, - 0x63, 0x14, 0xfe, 0xf7, 0x13, 0x20, 0x77, 0x1e, 0x3f, 0xfc, 0xaf, 0xf0, 0x66, 0xab, 0x97, 0x8d, - 0x20, 0xc8, 0xc2, 0x33, 0x41, 0x0e, 0x97, 0xcf, 0xa6, 0x2d, 0xb7, 0xcb, 0xed, 0xd2, 0x62, 0x42, - 0x74, 0xf2, 0x9f, 0x7a, 0x1a, 0x14, 0xba, 0xce, 0x9e, 0xdb, 0xc4, 0xe6, 0x33, 0x96, 0x18, 0xf6, - 0x96, 0x34, 0xb8, 0xa8, 0x50, 0xf4, 0xc2, 0xe8, 0x5c, 0x3f, 0xb9, 0x8b, 0x8e, 0x14, 0xe1, 0xa2, - 0xa3, 0x04, 0xfb, 0x07, 0x12, 0xb4, 0xa5, 0x2f, 0x11, 0x7f, 0x45, 0xee, 0xfc, 0x6b, 0x8d, 0x0a, - 0xf6, 0x08, 0xb6, 0x1c, 0x56, 0x1c, 0x92, 0x3a, 0x6e, 0x8b, 0xac, 0x0d, 0xe2, 0xb9, 0x8f, 0xd5, - 0x71, 0x5b, 0x82, 0x86, 0xb1, 0x9c, 0x36, 0x2f, 0x30, 0x67, 0xd3, 0x87, 0x46, 0x89, 0x6e, 0x4e, - 0x10, 0xfa, 0x43, 0xa1, 0x33, 0x42, 0x27, 0xd4, 0xa1, 0xd1, 0x39, 0x22, 0x37, 0xd4, 0x3f, 0x50, - 0x48, 0x44, 0x4b, 0xdf, 0xc8, 0x91, 0xbf, 0xb0, 0x28, 0x31, 0x44, 0x78, 0x0c, 0x16, 0xe2, 0x39, - 0xcf, 0x0e, 0x1f, 0xe2, 0x5b, 0x64, 0x1d, 0x47, 0xff, 0xb8, 0x43, 0x7c, 0xcb, 0x12, 0x92, 0x3e, - 0x90, 0xbf, 0x46, 0x2f, 0x08, 0x2b, 0x35, 0x3d, 0x6b, 0x7f, 0xc4, 0x9a, 0x26, 0x0e, 0x2f, 0x09, - 0xa3, 0xfa, 0x1e, 0xe0, 0x10, 0xa5, 0x70, 0xdc, 0x51, 0x7d, 0xe5, 0xc8, 0x18, 0xc3, 0x71, 0x74, - 0x80, 0xb9, 0xc7, 0xd6, 0x66, 0xde, 0xc0, 0x56, 0x03, 0xd0, 0xe1, 0xd1, 0x3a, 0x0b, 0x66, 0xb8, - 0xa9, 0xbf, 0x7f, 0xf1, 0x8c, 0x90, 0x96, 0xf4, 0xc0, 0x7a, 0xc0, 0xb2, 0x91, 0x2f, 0x0c, 0x24, - 0x58, 0xf0, 0x95, 0x21, 0x62, 0x2c, 0xf7, 0xba, 0xf9, 0x63, 0xd8, 0x98, 0xb0, 0xfa, 0x5d, 0x1e, - 0xab, 0x9a, 0x88, 0xd5, 0xdd, 0x32, 0x6c, 0x92, 0x1b, 0xd3, 0xa4, 0xe6, 0x8d, 0x6f, 0x0b, 0xe0, - 0xd2, 0x05, 0xb8, 0x9e, 0x39, 0x34, 0x1d, 0xe9, 0x23, 0xf6, 0x46, 0x85, 0x5e, 0xee, 0x54, 0xda, - 0x37, 0xad, 0x36, 0x89, 0x32, 0x30, 0x82, 0xcb, 0x89, 0xff, 0x8c, 0x07, 0xe5, 0xbc, 0x08, 0xca, - 0x03, 0x32, 0xcc, 0x10, 0x28, 0x8a, 0xc0, 0xe6, 0xa9, 0xfc, 0xe2, 0x38, 0x0d, 0x31, 0x7c, 0x6d, - 0x6f, 0x38, 0x3f, 0xf6, 0x9d, 0x5f, 0x35, 0xff, 0xed, 0x00, 0xa4, 0x87, 0x04, 0x90, 0xb4, 0xc3, - 0xd2, 0x95, 0x3e, 0x56, 0x2f, 0xa7, 0x43, 0x57, 0x9d, 0x4e, 0xaf, 0x46, 0x33, 0x74, 0xb1, 0x99, - 0x9b, 0x22, 0xcc, 0xdc, 0x12, 0x9e, 0x71, 0x08, 0x5d, 0x77, 0x7d, 0xe2, 0x06, 0xa9, 0x53, 0x6e, - 0xc4, 0x67, 0x1c, 0x06, 0x52, 0x90, 0x3e, 0x38, 0xff, 0xa0, 0x00, 0xb0, 0xe2, 0x3a, 0x7b, 0x9d, - 0x9a, 0xdb, 0x42, 0x2e, 0xfc, 0x9b, 0x70, 0xb2, 0xf6, 0x92, 0x11, 0x4c, 0xd6, 0x36, 0x00, 0xd8, - 0x0e, 0x0a, 0x67, 0xbd, 0xd1, 0x93, 0xe4, 0xa6, 0x66, 0x21, 0x51, 0x3a, 0x57, 0x86, 0x78, 0xcd, - 0xef, 0x0f, 0x89, 0x18, 0xc7, 0x8d, 0x2f, 0x61, 0x71, 0xa3, 0x9c, 0xac, 0xbd, 0x23, 0xc0, 0xda, - 0x10, 0xb0, 0x7e, 0xe0, 0x10, 0x94, 0xa4, 0x8f, 0xf9, 0x3f, 0x4e, 0x80, 0x69, 0xba, 0xb5, 0x4a, - 0x79, 0xfa, 0x77, 0x21, 0xe8, 0xbf, 0x3c, 0x02, 0xd0, 0x37, 0xc1, 0x8c, 0x13, 0x96, 0x4e, 0xc7, - 0x3f, 0x7e, 0xb1, 0x2c, 0x16, 0x76, 0x8e, 0x2e, 0x5d, 0x28, 0x06, 0x7e, 0x98, 0x47, 0x5e, 0x17, - 0x91, 0xbf, 0x37, 0x86, 0xdf, 0x5c, 0x89, 0xa3, 0x84, 0xfe, 0x9d, 0x01, 0xf4, 0x9b, 0x02, 0xf4, - 0xa5, 0xc3, 0x90, 0x32, 0x86, 0x2b, 0x0e, 0x14, 0x90, 0x23, 0x27, 0x12, 0x7f, 0x23, 0xc5, 0xb5, - 0x98, 0x79, 0x30, 0x41, 0x54, 0x36, 0x98, 0x23, 0xfa, 0xaf, 0xf8, 0x8b, 0xb9, 0xe5, 0x21, 0x37, - 0xf0, 0x2e, 0xf1, 0x5f, 0x31, 0x0d, 0xbe, 0x27, 0x78, 0x77, 0xbe, 0x40, 0x37, 0x8d, 0x83, 0x84, - 0xa1, 0x27, 0x90, 0x3c, 0xc7, 0x47, 0x76, 0x46, 0x71, 0x98, 0x09, 0xe4, 0x00, 0x42, 0xd2, 0x07, - 0xfe, 0x0b, 0x39, 0x30, 0x4f, 0x57, 0x00, 0x97, 0x5d, 0x67, 0xb7, 0xe7, 0x46, 0x31, 0xeb, 0xf0, - 0xb2, 0x70, 0x2b, 0x98, 0xf3, 0x04, 0x1f, 0x78, 0x26, 0x13, 0x3d, 0xa9, 0xf0, 0x4f, 0x79, 0xff, - 0x97, 0x67, 0x8b, 0x48, 0x2e, 0xc6, 0x30, 0x30, 0x8a, 0xf6, 0xc4, 0x9b, 0x2a, 0x92, 0x84, 0x72, - 0x0b, 0x8a, 0xca, 0x50, 0xeb, 0xcb, 0x81, 0x4c, 0xe5, 0x65, 0x64, 0xea, 0x7d, 0x81, 0x4c, 0xfd, - 0x88, 0x20, 0x53, 0x2b, 0x87, 0x67, 0x49, 0xfa, 0xb2, 0xf5, 0xea, 0x60, 0x13, 0x2f, 0xd8, 0x62, - 0xdd, 0x4d, 0x61, 0x63, 0x95, 0xf7, 0x1d, 0xcb, 0x09, 0xbe, 0x63, 0xe2, 0x1d, 0x20, 0x09, 0x56, - 0x2d, 0x44, 0xaa, 0x23, 0x64, 0x69, 0x0e, 0x64, 0x2d, 0x9f, 0xba, 0xac, 0xd5, 0x1a, 0x6a, 0x5d, - 0x22, 0xb6, 0xa2, 0x31, 0xac, 0x03, 0xce, 0x81, 0xc2, 0xb2, 0xd5, 0xf6, 0x90, 0x0b, 0xbf, 0xc4, - 0x56, 0x25, 0x5e, 0x9d, 0xe2, 0x00, 0xb0, 0x04, 0x0a, 0x5b, 0xa4, 0x36, 0x66, 0x32, 0xdf, 0x21, - 0xa7, 0x3d, 0x94, 0x42, 0x9d, 0xfd, 0x9b, 0x34, 0x22, 0x62, 0x4f, 0x31, 0x23, 0x5b, 0xce, 0x48, - 0x10, 0x11, 0x71, 0x30, 0x09, 0x63, 0xb9, 0x0c, 0xac, 0xa0, 0xa3, 0x5d, 0x3c, 0xc6, 0x5f, 0x4a, - 0x0f, 0xe1, 0x22, 0x50, 0xac, 0x56, 0x97, 0x74, 0x8e, 0x53, 0x3a, 0x7e, 0x4c, 0xea, 0xd7, 0xd5, - 0xcb, 0x2a, 0x4a, 0xf2, 0xb8, 0xfd, 0xba, 0xa4, 0xa8, 0x48, 0x1f, 0xb3, 0xef, 0x10, 0xa7, 0xde, - 0x4e, 0xdb, 0x6c, 0x22, 0x4c, 0x7d, 0x6a, 0xa8, 0xd1, 0x9e, 0x2c, 0xe7, 0xf7, 0x64, 0x9c, 0x9e, - 0xe6, 0x0f, 0xa1, 0xa7, 0xc3, 0x2e, 0x19, 0x07, 0x3c, 0x27, 0x0d, 0x3f, 0xb2, 0x25, 0xe3, 0x58, - 0x32, 0xc6, 0x70, 0xd5, 0xab, 0x7f, 0x78, 0x79, 0xac, 0xda, 0x3a, 0xec, 0x86, 0x1a, 0x63, 0xd6, - 0xc8, 0x0e, 0x2a, 0x0f, 0xb3, 0xa1, 0x16, 0x4d, 0xc3, 0x18, 0xd0, 0x9a, 0x63, 0x68, 0x7d, 0x96, - 0x0d, 0xa3, 0x29, 0xef, 0x69, 0x77, 0x1d, 0xd7, 0x4b, 0xb6, 0xa7, 0x8d, 0xa9, 0xd3, 0xc9, 0x7f, - 0x49, 0x0f, 0xc9, 0x89, 0x67, 0xd9, 0x47, 0x35, 0x7c, 0x26, 0x38, 0x24, 0x37, 0x88, 0x80, 0xf4, - 0xe1, 0x7d, 0xf3, 0x11, 0x0d, 0x9e, 0xc3, 0xaa, 0x23, 0xd3, 0x81, 0x91, 0x0d, 0x9d, 0xc3, 0xa8, - 0x63, 0x34, 0x0d, 0xe9, 0xe3, 0xf5, 0xf7, 0xdc, 0xc0, 0xf9, 0xc6, 0x31, 0x0e, 0x9c, 0xbe, 0x66, - 0xe6, 0x87, 0xd4, 0xcc, 0x61, 0xf7, 0xea, 0x18, 0xaf, 0x47, 0x37, 0x60, 0x0e, 0xb3, 0x57, 0x17, - 0x43, 0x44, 0xfa, 0x88, 0xbf, 0x49, 0x01, 0xf9, 0xfa, 0xf8, 0xc7, 0xcb, 0x61, 0xe7, 0x22, 0x84, - 0x57, 0xf5, 0x91, 0x0d, 0x97, 0xc3, 0xcc, 0x45, 0x22, 0x49, 0x18, 0xc3, 0x65, 0x07, 0xc7, 0xc1, - 0x0c, 0x59, 0x12, 0xf1, 0xb7, 0xc4, 0xff, 0x9e, 0x8d, 0x9a, 0xaf, 0x4f, 0x51, 0x57, 0x9f, 0x05, - 0x26, 0xfd, 0x7d, 0x33, 0x36, 0x72, 0x2e, 0xc8, 0xe9, 0x67, 0xb0, 0xef, 0x16, 0xfc, 0x7f, 0x28, - 0xc7, 0x95, 0x91, 0xef, 0xab, 0x0f, 0xeb, 0xb8, 0x72, 0xa4, 0x7b, 0xeb, 0x7f, 0x12, 0x8e, 0xa8, - 0xff, 0x31, 0x3d, 0xcc, 0x7b, 0xf7, 0xdc, 0x73, 0x7d, 0xf6, 0xdc, 0x3f, 0xca, 0x63, 0x59, 0x17, - 0xb1, 0xbc, 0x4f, 0x96, 0x85, 0x23, 0x1c, 0x6b, 0xdf, 0x15, 0xc0, 0x79, 0x5e, 0x80, 0x73, 0xf1, - 0x50, 0xb4, 0x8c, 0xe1, 0x90, 0x6a, 0x2e, 0x1c, 0x73, 0x3f, 0x96, 0xa2, 0x1e, 0xf7, 0x9c, 0x80, - 0xc9, 0x1d, 0x38, 0x01, 0x23, 0x68, 0x7a, 0xfe, 0x90, 0x9a, 0xfe, 0x31, 0x5e, 0x3a, 0x0c, 0x51, - 0x3a, 0x9e, 0x29, 0x8f, 0xc8, 0xe8, 0x46, 0xe6, 0x77, 0x07, 0xe2, 0x71, 0x41, 0x10, 0x8f, 0xf2, - 0xe1, 0x88, 0x49, 0x5f, 0x3e, 0xfe, 0xd0, 0x9f, 0xd0, 0x1e, 0xb1, 0xbe, 0x0f, 0xbb, 0x55, 0x2c, - 0x30, 0x71, 0x64, 0x23, 0xf7, 0x30, 0x5b, 0xc5, 0x83, 0x28, 0x19, 0x43, 0xfc, 0xbb, 0x59, 0x30, - 0x4d, 0x68, 0xba, 0x60, 0xb5, 0xb6, 0x91, 0x07, 0x7f, 0x95, 0xfa, 0x93, 0xfa, 0xd1, 0x46, 0x47, - 0x14, 0x12, 0x2a, 0xea, 0x6c, 0x72, 0x52, 0x8f, 0x0e, 0x4a, 0xe4, 0x02, 0x47, 0xe0, 0xb8, 0xa3, - 0x56, 0x0e, 0xa4, 0x20, 0x7d, 0xc8, 0x3e, 0x4c, 0xdd, 0x6d, 0xd6, 0xcc, 0xab, 0xce, 0x9e, 0x07, - 0x9f, 0x3f, 0x82, 0x0e, 0x7a, 0x11, 0x14, 0xda, 0xa4, 0x34, 0x76, 0x84, 0x26, 0x7e, 0xba, 0xc3, - 0x58, 0x40, 0xeb, 0xd7, 0xd9, 0x9f, 0x49, 0xcf, 0xd1, 0x84, 0x7c, 0xa4, 0xe5, 0x8c, 0xfb, 0x1c, - 0xcd, 0x80, 0xfa, 0xc7, 0x72, 0xaf, 0xd1, 0x24, 0xae, 0xdd, 0xda, 0xb5, 0xbc, 0x11, 0x45, 0xdb, - 0x68, 0xe3, 0xb2, 0xfc, 0x68, 0x1b, 0xe4, 0x25, 0xe9, 0xe9, 0x5e, 0x8e, 0x2b, 0xf8, 0xf7, 0x71, - 0x9f, 0xee, 0x8d, 0xaf, 0x3e, 0x7d, 0x4c, 0xfe, 0x0b, 0xd5, 0xac, 0xf3, 0xd4, 0x51, 0x3a, 0x45, - 0x1f, 0xec, 0xa1, 0x95, 0x85, 0x92, 0x76, 0x74, 0xca, 0xd2, 0xb7, 0xfe, 0xf4, 0x81, 0x79, 0xff, - 0x19, 0x90, 0x5f, 0x42, 0x17, 0xf7, 0xb6, 0xe1, 0xbd, 0x60, 0xd2, 0x70, 0x11, 0xaa, 0xd8, 0x5b, - 0x0e, 0xe6, 0xae, 0x87, 0x9f, 0x7d, 0x48, 0xd8, 0x1b, 0xc6, 0x63, 0x07, 0x99, 0xad, 0xf0, 0xac, - 0xa0, 0xff, 0x0a, 0x5f, 0x96, 0x05, 0xb9, 0xba, 0x67, 0x7a, 0x70, 0x2a, 0xc0, 0x16, 0x3e, 0x9f, - 0xc7, 0xe2, 0x5e, 0x11, 0x8b, 0x5b, 0x05, 0x5e, 0x10, 0x0a, 0x16, 0xf0, 0xff, 0x11, 0x00, 0x40, - 0x30, 0xf9, 0x70, 0xd7, 0xb1, 0x71, 0x0e, 0xff, 0xb8, 0xaa, 0xff, 0x0e, 0x5f, 0x15, 0xb0, 0xfb, - 0x7e, 0x81, 0xdd, 0x4f, 0x90, 0xab, 0x62, 0x0c, 0x2b, 0x6d, 0x59, 0x30, 0x85, 0x59, 0xbb, 0x8a, - 0xcc, 0x56, 0x17, 0x3e, 0x36, 0x14, 0xfe, 0x08, 0x36, 0xc3, 0x0f, 0x48, 0x07, 0x40, 0xa5, 0xad, - 0x0a, 0x0a, 0x8f, 0xf6, 0xe8, 0xf0, 0x37, 0xff, 0xb3, 0x62, 0xe0, 0x98, 0x73, 0x20, 0x67, 0xd9, - 0x5b, 0x0e, 0xf3, 0x2f, 0xbc, 0x3e, 0xa2, 0x6c, 0x2c, 0x13, 0x3a, 0xc9, 0x28, 0x19, 0x1d, 0x35, - 0x9e, 0xac, 0xb1, 0x5c, 0x34, 0x98, 0xc3, 0xb5, 0xc3, 0xff, 0x63, 0x20, 0xb3, 0x55, 0x15, 0xe4, - 0x3a, 0xa6, 0xb7, 0xc3, 0xaa, 0x26, 0xcf, 0xd8, 0x46, 0xde, 0xb3, 0x4d, 0xdb, 0xb1, 0xaf, 0xee, - 0x5a, 0xcf, 0x09, 0xee, 0x33, 0x16, 0xd2, 0x30, 0xe5, 0xdb, 0xc8, 0x46, 0xae, 0xe9, 0xa1, 0xfa, - 0xfe, 0x36, 0x99, 0x63, 0x4d, 0xea, 0x7c, 0x52, 0x62, 0xf9, 0xc7, 0x14, 0x47, 0xcb, 0xff, 0x96, - 0xd5, 0x46, 0x24, 0xaa, 0x16, 0x93, 0x7f, 0xff, 0x3d, 0x91, 0xfc, 0xf7, 0xa9, 0x22, 0x7d, 0x34, - 0xbe, 0x9b, 0x05, 0x33, 0x75, 0x2c, 0x70, 0xf5, 0xbd, 0xdd, 0x5d, 0xd3, 0xbd, 0x0a, 0x6f, 0x0e, - 0x51, 0xe1, 0x44, 0x33, 0x23, 0xfa, 0xa5, 0xfc, 0x81, 0xf4, 0x55, 0xde, 0x4c, 0xb5, 0xb9, 0x1a, - 0x12, 0xeb, 0xc1, 0x93, 0x41, 0x1e, 0x8b, 0xb7, 0xef, 0x71, 0x19, 0xab, 0x08, 0x34, 0xa7, 0x64, - 0xf4, 0xb1, 0x81, 0xb4, 0x8d, 0x21, 0xf2, 0x49, 0x16, 0x1c, 0xaf, 0x7b, 0x66, 0xf3, 0xd2, 0x8a, - 0xe3, 0x3a, 0x7b, 0x9e, 0x65, 0xa3, 0x2e, 0x7c, 0x4c, 0x88, 0x80, 0x2f, 0xff, 0x99, 0x50, 0xfe, - 0xe1, 0xbf, 0x66, 0x64, 0x47, 0xd1, 0xa0, 0x5b, 0xe5, 0x8b, 0x8f, 0x08, 0x26, 0x26, 0x37, 0x2e, - 0xca, 0x94, 0x38, 0x96, 0x53, 0x12, 0x45, 0xed, 0x4a, 0xc7, 0x71, 0xbd, 0x35, 0xa7, 0x69, 0xb6, - 0xbb, 0x9e, 0xe3, 0x22, 0x58, 0x8b, 0xe5, 0x1a, 0xee, 0x61, 0x5a, 0x4e, 0x33, 0x1c, 0x1c, 0xd9, - 0x1b, 0x2f, 0x76, 0x8a, 0x28, 0xe3, 0x1f, 0x96, 0xde, 0x65, 0xa4, 0x5c, 0xe9, 0xa5, 0x28, 0x42, - 0xce, 0xfb, 0x75, 0x69, 0xc9, 0x0e, 0xb6, 0xc8, 0xed, 0x3c, 0x4a, 0x11, 0x35, 0x86, 0xa5, 0xf2, - 0x2c, 0x98, 0xad, 0xef, 0x5d, 0x0c, 0x0a, 0xe9, 0xf2, 0x46, 0xc8, 0x6b, 0xa4, 0x23, 0x8a, 0x30, - 0xc1, 0xe3, 0x0b, 0x8a, 0xe0, 0xef, 0x2d, 0x60, 0xb6, 0xcb, 0x67, 0x63, 0x78, 0x8b, 0x89, 0x92, - 0x91, 0x44, 0x06, 0xd7, 0x9a, 0x3e, 0x03, 0xdf, 0x9d, 0x05, 0xb3, 0xb5, 0x0e, 0xb2, 0x51, 0x8b, - 0x7a, 0x41, 0x0a, 0x0c, 0x7c, 0x59, 0x42, 0x06, 0x0a, 0x05, 0x45, 0x30, 0x30, 0xf4, 0x58, 0x5e, - 0xf2, 0x99, 0x17, 0x26, 0x24, 0x62, 0x5c, 0x5c, 0x6d, 0xe9, 0x33, 0xee, 0x8b, 0x59, 0x30, 0xad, - 0xef, 0xd9, 0x1b, 0xae, 0x83, 0x47, 0x63, 0x17, 0xde, 0x17, 0x76, 0x10, 0x77, 0x80, 0x13, 0xad, - 0x3d, 0x97, 0xac, 0x3f, 0x55, 0xec, 0x3a, 0x6a, 0x3a, 0x76, 0xab, 0x4b, 0xda, 0x91, 0xd7, 0x0f, - 0x7e, 0xb8, 0x27, 0xf7, 0xc8, 0xd7, 0x95, 0x0c, 0xfc, 0x59, 0xe9, 0xb0, 0x44, 0xb4, 0xf1, 0x5c, - 0xd5, 0xf2, 0x3d, 0x81, 0x64, 0xf0, 0xa1, 0x41, 0x35, 0xa4, 0xcf, 0xdc, 0x0f, 0x66, 0x81, 0x5a, - 0x6a, 0x36, 0x9d, 0x3d, 0xdb, 0xab, 0xa3, 0x36, 0x6a, 0x7a, 0x86, 0x6b, 0x36, 0x11, 0x3c, 0x1e, - 0xf0, 0x98, 0x71, 0xed, 0x65, 0xd2, 0xfb, 0x8b, 0xb4, 0x4d, 0x07, 0xcb, 0x4c, 0xc0, 0x3c, 0xb9, - 0x5d, 0x44, 0xc9, 0x8a, 0xc6, 0x70, 0xcf, 0x4e, 0x16, 0xe4, 0x36, 0x2c, 0x7b, 0x9b, 0x8f, 0xd6, - 0x74, 0x12, 0xdb, 0x3a, 0x2d, 0x74, 0x85, 0x49, 0x23, 0x7d, 0x51, 0xef, 0x04, 0x27, 0xed, 0xbd, - 0xdd, 0x8b, 0xc8, 0xad, 0x6d, 0x91, 0x91, 0xa0, 0x6b, 0x38, 0x75, 0x64, 0x53, 0x43, 0x29, 0xaf, - 0xf7, 0xfd, 0x26, 0x9a, 0x09, 0x12, 0x06, 0x2e, 0xa6, 0x24, 0x82, 0xd7, 0x01, 0x51, 0x59, 0x8e, - 0xa8, 0x44, 0xa6, 0x6d, 0x9f, 0xc2, 0xd3, 0xe7, 0xef, 0xd7, 0xb2, 0x60, 0x62, 0x1d, 0x79, 0xae, - 0xd5, 0xec, 0xc2, 0xcf, 0xe3, 0x61, 0x08, 0x79, 0x1b, 0xa6, 0x6b, 0xee, 0x22, 0x0f, 0xb9, 0x5d, - 0xa8, 0x85, 0x4c, 0x87, 0x60, 0xb2, 0xd3, 0x36, 0xbd, 0x2d, 0xc7, 0xdd, 0x65, 0x36, 0x43, 0xf0, - 0x8e, 0xed, 0x83, 0x7d, 0xe4, 0x76, 0x43, 0xb2, 0xfc, 0x57, 0x26, 0xe0, 0xf2, 0xd6, 0x18, 0x23, - 0x65, 0x41, 0x20, 0xe3, 0x50, 0xd6, 0x98, 0x4c, 0x89, 0x63, 0xb9, 0x4b, 0x46, 0x59, 0x73, 0xb6, - 0xe1, 0x2b, 0x14, 0x90, 0x23, 0x92, 0xf7, 0xa6, 0x8c, 0x30, 0x85, 0xd8, 0x45, 0xdd, 0xae, 0xb9, - 0x8d, 0xfc, 0x29, 0x04, 0x7b, 0x55, 0xef, 0x06, 0xf9, 0x36, 0xda, 0x47, 0x6d, 0x42, 0xc6, 0xdc, - 0x9d, 0x37, 0x0b, 0x2d, 0x5b, 0x73, 0xb6, 0x17, 0x70, 0x59, 0x0b, 0xac, 0x9c, 0x85, 0x35, 0x9c, - 0x55, 0xa7, 0x7f, 0x9c, 0x7d, 0x16, 0xc8, 0x93, 0x77, 0x75, 0x0a, 0xe4, 0x97, 0xb4, 0xc5, 0xcd, - 0x95, 0xe2, 0x31, 0xfc, 0xe8, 0xd3, 0x37, 0x05, 0xf2, 0xcb, 0x25, 0xa3, 0xb4, 0x56, 0xcc, 0xe2, - 0x76, 0x54, 0xaa, 0xcb, 0xb5, 0xa2, 0x82, 0x13, 0x37, 0x4a, 0xd5, 0x4a, 0xb9, 0x98, 0x53, 0xa7, - 0xc1, 0xc4, 0x85, 0x92, 0x5e, 0xad, 0x54, 0x57, 0x8a, 0x79, 0xf8, 0xb7, 0x3c, 0x7e, 0xf7, 0x88, - 0xf8, 0xdd, 0x12, 0x45, 0x53, 0x3f, 0xc8, 0x7e, 0x25, 0x80, 0xec, 0x3e, 0x01, 0xb2, 0x1f, 0x90, - 0x29, 0x64, 0x0c, 0x28, 0x65, 0xc1, 0xc4, 0x86, 0xeb, 0x34, 0x51, 0xb7, 0x0b, 0x7f, 0x29, 0x0b, - 0x0a, 0x65, 0xd3, 0x6e, 0xa2, 0x36, 0xbc, 0x2e, 0x84, 0x8a, 0xfa, 0x02, 0x65, 0x82, 0xe3, 0x00, - 0xff, 0xc0, 0x73, 0xe6, 0x01, 0x91, 0x33, 0xb7, 0x0b, 0x8d, 0x62, 0xe5, 0x2e, 0xd0, 0x32, 0x23, - 0xf8, 0xf3, 0xda, 0x80, 0x3f, 0x65, 0x81, 0x3f, 0xe7, 0xe4, 0x8b, 0x4a, 0x9f, 0x4b, 0xdf, 0xce, - 0x80, 0x93, 0x2b, 0xc8, 0x46, 0xae, 0xd5, 0xa4, 0xc4, 0xfb, 0xed, 0xbf, 0x4f, 0x6c, 0xff, 0xe3, - 0x05, 0xa2, 0xfb, 0xfd, 0x21, 0x36, 0xfe, 0xd5, 0x41, 0xe3, 0x1f, 0x10, 0x1a, 0x7f, 0x87, 0x64, - 0x39, 0x63, 0xb8, 0x38, 0x76, 0x0a, 0xcc, 0x54, 0x1d, 0xcf, 0xda, 0xb2, 0x9a, 0x74, 0xe3, 0xf8, - 0xe5, 0x0a, 0xc8, 0xad, 0x59, 0x5d, 0x8f, 0x3f, 0x81, 0x7e, 0x13, 0x98, 0xb6, 0xec, 0x66, 0x7b, - 0xaf, 0x85, 0x74, 0x64, 0x52, 0x59, 0x99, 0xd4, 0xf9, 0xa4, 0x70, 0x3d, 0x1e, 0x93, 0xa5, 0xf8, - 0xeb, 0xf1, 0x9f, 0x92, 0xb6, 0x9d, 0x78, 0x12, 0xc8, 0xf9, 0xee, 0x88, 0x21, 0xa9, 0x04, 0x66, - 0x6d, 0x2e, 0xab, 0x7f, 0xe4, 0xbc, 0x37, 0x62, 0x33, 0x5f, 0x9c, 0x2e, 0xfe, 0x01, 0xdf, 0x2b, - 0x65, 0x6a, 0x0d, 0x22, 0x28, 0x19, 0x32, 0xcb, 0xc9, 0x91, 0x51, 0x55, 0x30, 0x57, 0xa9, 0x1a, - 0x9a, 0x5e, 0x2d, 0xad, 0xb1, 0x2c, 0x0a, 0xfc, 0x6e, 0x16, 0xe4, 0x75, 0xd4, 0x69, 0x5f, 0xe5, - 0x43, 0x72, 0x32, 0xef, 0xae, 0x4c, 0xe0, 0xdd, 0xa5, 0x2e, 0x03, 0x60, 0x36, 0x71, 0xc5, 0xe4, - 0xee, 0x91, 0x6c, 0xdf, 0x40, 0x71, 0x42, 0x03, 0x4b, 0x41, 0x6e, 0x9d, 0xfb, 0x13, 0xbe, 0x50, - 0x7a, 0xb9, 0x47, 0x28, 0x8d, 0x50, 0x18, 0xd1, 0x1d, 0xbc, 0x4f, 0x6a, 0x85, 0x66, 0x60, 0x71, - 0x47, 0xc3, 0xfe, 0x2f, 0x67, 0x41, 0xce, 0xc0, 0xf3, 0x2f, 0x6e, 0x2a, 0xf6, 0xc9, 0xe1, 0x64, - 0x1c, 0x17, 0x13, 0x21, 0xe3, 0xf7, 0x83, 0x19, 0x5e, 0x62, 0xd9, 0xfe, 0x46, 0xac, 0x88, 0x0b, - 0x3f, 0x0c, 0x23, 0xe1, 0x7d, 0xc8, 0x39, 0x1a, 0x16, 0x7f, 0xe5, 0x76, 0x00, 0xd6, 0x11, 0xb6, - 0x6b, 0xbb, 0x3b, 0x56, 0x07, 0xfe, 0x37, 0x05, 0x4c, 0xad, 0x20, 0xaf, 0xee, 0x99, 0xde, 0x5e, - 0xb7, 0x67, 0x8d, 0xd2, 0x76, 0xca, 0x66, 0x73, 0x07, 0xb1, 0xee, 0xc8, 0x7f, 0x85, 0xef, 0x54, - 0x64, 0x37, 0x01, 0xc3, 0x7a, 0x16, 0x82, 0x3a, 0x22, 0x30, 0x79, 0x22, 0xc8, 0xb5, 0x4c, 0xcf, - 0x64, 0x58, 0x5c, 0xd7, 0x83, 0x45, 0x58, 0x90, 0x4e, 0xb2, 0xc1, 0xdf, 0xca, 0xca, 0xec, 0x02, - 0x4a, 0xd4, 0x9f, 0x0c, 0x84, 0xf7, 0x66, 0x86, 0x40, 0xe1, 0x04, 0x98, 0xad, 0xd6, 0x8c, 0xc6, - 0x5a, 0x6d, 0x65, 0x45, 0xc3, 0xa9, 0x45, 0x45, 0x3d, 0x0d, 0xd4, 0x8d, 0xd2, 0x43, 0xeb, 0x5a, - 0xd5, 0x68, 0x54, 0x6b, 0x4b, 0x1a, 0xfb, 0x33, 0xa7, 0x1e, 0x07, 0xd3, 0xe5, 0x52, 0x79, 0xd5, - 0x4f, 0xc8, 0xab, 0xf3, 0xe0, 0xe4, 0xba, 0xb6, 0xbe, 0xa8, 0xe9, 0xf5, 0xd5, 0xca, 0x46, 0x03, - 0x17, 0xb3, 0x5c, 0xdb, 0xac, 0x2e, 0x15, 0x0b, 0x2a, 0x04, 0xa7, 0xb9, 0x2f, 0x17, 0xf4, 0x5a, - 0x75, 0xa5, 0x51, 0x37, 0x4a, 0x86, 0x56, 0x9c, 0x50, 0xaf, 0x01, 0xc7, 0xcb, 0xa5, 0x2a, 0xc9, - 0x5e, 0xae, 0x55, 0xab, 0x5a, 0xd9, 0x28, 0x4e, 0xc2, 0x7f, 0xcd, 0x81, 0xe9, 0x4a, 0xb7, 0x6a, - 0xee, 0xa2, 0xf3, 0x66, 0xdb, 0x6a, 0xc1, 0x9f, 0xe5, 0xac, 0xc9, 0x5b, 0xc0, 0xac, 0x4b, 0x1f, - 0x51, 0xcb, 0xb0, 0x10, 0x45, 0x73, 0x56, 0x17, 0x13, 0xd5, 0xd3, 0xa0, 0x60, 0x93, 0x02, 0x18, - 0x6b, 0xd8, 0x9b, 0xba, 0x08, 0x00, 0x7d, 0x32, 0xc2, 0x5b, 0xf0, 0xce, 0xf6, 0x6a, 0x93, 0xb9, - 0x8b, 0xba, 0xc8, 0xdd, 0xb7, 0x9a, 0xc8, 0xcf, 0xa9, 0x73, 0x7f, 0xc1, 0xaf, 0x28, 0xb2, 0x8b, - 0x82, 0x1c, 0xa8, 0x5c, 0x73, 0x22, 0x7a, 0xc3, 0x9f, 0x51, 0x64, 0x96, 0xf4, 0xa4, 0x8a, 0x4c, - 0x26, 0x29, 0x2f, 0xce, 0x0e, 0x21, 0x29, 0xb3, 0x60, 0xca, 0xa8, 0xd5, 0x1a, 0xf5, 0xd5, 0x9a, - 0x6e, 0x14, 0x15, 0x75, 0x06, 0x4c, 0xe2, 0xd7, 0xb5, 0x5a, 0x75, 0xa5, 0x98, 0x53, 0x4f, 0x81, - 0x13, 0xab, 0xa5, 0x7a, 0xa3, 0x52, 0x3d, 0x5f, 0x5a, 0xab, 0x2c, 0x35, 0xca, 0xab, 0x25, 0xbd, - 0x5e, 0xcc, 0xab, 0xd7, 0x81, 0x53, 0x46, 0x45, 0xd3, 0x1b, 0xcb, 0x5a, 0xc9, 0xd8, 0xd4, 0xb5, - 0x7a, 0xa3, 0x5a, 0x6b, 0x54, 0x4b, 0xeb, 0x5a, 0xb1, 0x80, 0xd5, 0x9f, 0x7c, 0x0a, 0xc5, 0x66, - 0xe2, 0xa0, 0x30, 0x4e, 0x46, 0x08, 0xe3, 0x54, 0xaf, 0x30, 0x02, 0x5e, 0xac, 0x74, 0xad, 0xae, - 0xe9, 0xe7, 0xb5, 0xe2, 0x74, 0x3f, 0x59, 0x9b, 0x51, 0x4f, 0x82, 0x22, 0xa6, 0xa1, 0x51, 0xa9, - 0xfb, 0x39, 0x97, 0x8a, 0xb3, 0xf0, 0x63, 0x05, 0x70, 0x5a, 0x47, 0xdb, 0x56, 0xd7, 0x43, 0xee, - 0x86, 0x79, 0x75, 0x17, 0xd9, 0x9e, 0xdf, 0xc9, 0xff, 0xef, 0xc4, 0xc2, 0xb8, 0x0e, 0x66, 0x3b, - 0xb4, 0x8c, 0x75, 0xe4, 0xed, 0x38, 0x2d, 0x36, 0x0a, 0x3f, 0x3e, 0xb2, 0xe7, 0x58, 0xd8, 0xe0, - 0xb3, 0xeb, 0xe2, 0xdf, 0x9c, 0x6c, 0x2b, 0x31, 0xb2, 0x9d, 0x1b, 0x46, 0xb6, 0xd5, 0x1b, 0xc0, - 0xd4, 0x5e, 0x17, 0xb9, 0xda, 0xae, 0x69, 0xb5, 0xfd, 0x5b, 0xcc, 0x82, 0x04, 0xf8, 0xb6, 0x9c, - 0xac, 0x9b, 0x29, 0xd7, 0x96, 0xfe, 0x6c, 0x8c, 0xe8, 0x5b, 0xcf, 0x00, 0xc0, 0x1a, 0xbb, 0xe9, - 0xb6, 0x99, 0xb0, 0x72, 0x29, 0x98, 0xbe, 0x8b, 0x56, 0xbb, 0x6d, 0xd9, 0xdb, 0xc1, 0x62, 0x7d, - 0x98, 0x00, 0x5f, 0xac, 0xc8, 0xb8, 0x9d, 0x26, 0xa5, 0x2d, 0x99, 0x36, 0xbd, 0x30, 0x3b, 0xe6, - 0x7e, 0xf7, 0xa0, 0xea, 0x14, 0xd4, 0x22, 0x98, 0x21, 0x69, 0x4c, 0x03, 0x8b, 0x13, 0xb8, 0x0f, - 0xf6, 0x8b, 0x5b, 0xd7, 0x8c, 0xd5, 0xda, 0x52, 0xf0, 0x6d, 0x12, 0x17, 0x89, 0x89, 0x29, 0x55, - 0x1f, 0x22, 0xda, 0x38, 0xa5, 0x3e, 0x06, 0x5c, 0xc7, 0x75, 0xd8, 0xa5, 0x35, 0x5d, 0x2b, 0x2d, - 0x3d, 0xd4, 0xd0, 0x9e, 0x5d, 0xa9, 0x1b, 0x75, 0x51, 0xb9, 0x7c, 0x3d, 0x9a, 0xc6, 0xf4, 0x6a, - 0xeb, 0xa5, 0xca, 0x1a, 0xeb, 0xdf, 0x97, 0x6b, 0xfa, 0x7a, 0xc9, 0x28, 0xce, 0xc0, 0x57, 0x28, - 0xa0, 0xb8, 0x82, 0xbc, 0x0d, 0xc7, 0xf5, 0xcc, 0xf6, 0x9a, 0x65, 0x5f, 0xda, 0x74, 0xdb, 0xbc, - 0xcd, 0xf4, 0x2f, 0xd2, 0x67, 0x6b, 0xc5, 0x21, 0x52, 0x28, 0x30, 0x7a, 0x19, 0xbb, 0x43, 0xb2, - 0x85, 0xc2, 0x14, 0x26, 0xc0, 0xe7, 0x66, 0x65, 0xce, 0xd2, 0xca, 0xd7, 0x9a, 0x4c, 0x4e, 0x9e, - 0x37, 0xee, 0xf1, 0xb9, 0x0f, 0x6a, 0x05, 0xf8, 0x48, 0x0e, 0x4c, 0x2e, 0x5b, 0xb6, 0xd9, 0xb6, - 0x9e, 0x23, 0x04, 0x88, 0x0b, 0xfb, 0x98, 0x4c, 0x4c, 0x1f, 0x93, 0x1d, 0x6a, 0xfc, 0xfc, 0x45, - 0x45, 0x76, 0xc3, 0x82, 0xe3, 0xbd, 0x4f, 0x64, 0xc4, 0xe0, 0xf9, 0xfb, 0x59, 0x99, 0x2d, 0x89, - 0xc1, 0xe5, 0x25, 0xc3, 0xf0, 0x13, 0xdf, 0x1f, 0x36, 0x56, 0x8f, 0x7e, 0x4f, 0xf6, 0x13, 0x85, - 0x29, 0xf8, 0x67, 0x0a, 0x80, 0x2b, 0xc8, 0x3b, 0x8f, 0xdc, 0x60, 0x2a, 0x40, 0x7a, 0x7d, 0x66, - 0x6f, 0x73, 0x2a, 0xfb, 0x26, 0x1e, 0xc0, 0x0b, 0x22, 0x80, 0xa5, 0x18, 0xe5, 0x89, 0x28, 0x3a, - 0x42, 0x79, 0x2b, 0xa0, 0xd0, 0x25, 0xdf, 0x99, 0x98, 0x3d, 0x39, 0x7a, 0xb8, 0x24, 0x85, 0xf1, - 0xa5, 0xd3, 0x82, 0x75, 0x56, 0x00, 0xfc, 0x4e, 0x30, 0x09, 0xfa, 0x61, 0x41, 0x3a, 0x96, 0x0f, - 0x4d, 0x6c, 0x32, 0x79, 0x71, 0xd3, 0x15, 0x97, 0x7e, 0xf6, 0x0d, 0xfc, 0x42, 0x0e, 0x9c, 0xec, - 0xd7, 0x1c, 0xfe, 0x1e, 0xb9, 0x93, 0x20, 0x8f, 0xc8, 0x88, 0x4f, 0x95, 0x9d, 0xbe, 0xa8, 0x4f, - 0x01, 0xa7, 0xd8, 0x86, 0xe9, 0x45, 0x64, 0x38, 0x55, 0x74, 0xb9, 0xdb, 0x46, 0x9e, 0x87, 0x5c, - 0xd2, 0xb2, 0x49, 0xbd, 0xff, 0x47, 0xf8, 0x77, 0x8a, 0xac, 0x6b, 0xfa, 0x00, 0x7e, 0x47, 0x68, - 0xfa, 0x4f, 0x2b, 0x32, 0xce, 0xe6, 0xc9, 0xca, 0x4e, 0x86, 0xe2, 0x0b, 0xc6, 0x3d, 0xc2, 0xf7, - 0x1f, 0x5a, 0x89, 0xce, 0xd3, 0x74, 0x7f, 0x84, 0x3e, 0xaf, 0xe9, 0x95, 0xe5, 0x8a, 0x86, 0xc7, - 0xfb, 0x53, 0xe0, 0x44, 0xf8, 0x6d, 0xe9, 0xa1, 0x46, 0x5d, 0xab, 0x1a, 0xc5, 0x49, 0xdc, 0x81, - 0xd0, 0xe4, 0xe5, 0x52, 0x65, 0x4d, 0x5b, 0x6a, 0x18, 0x35, 0xfc, 0x65, 0x69, 0xb8, 0x31, 0x1f, - 0x3e, 0x3f, 0x07, 0x8e, 0x13, 0xde, 0x5e, 0x25, 0x5c, 0xc5, 0x4c, 0xe9, 0xf1, 0x5c, 0x09, 0x00, - 0x9a, 0xa2, 0xec, 0x85, 0x9f, 0x91, 0xbe, 0x23, 0x8c, 0x83, 0xb0, 0xa7, 0x8e, 0x08, 0xc9, 0xf8, - 0x76, 0x56, 0xe6, 0xbc, 0xa7, 0x74, 0xb1, 0xc9, 0x84, 0xe2, 0x9f, 0xc7, 0x3d, 0x14, 0x44, 0x83, - 0x4f, 0xcc, 0xbf, 0x32, 0xf9, 0xf9, 0xd9, 0x1b, 0x15, 0x9d, 0x88, 0xc3, 0x1c, 0x00, 0x24, 0x85, - 0x48, 0x10, 0x95, 0x83, 0xbe, 0x03, 0x49, 0x94, 0x1c, 0x94, 0xca, 0x46, 0xe5, 0xbc, 0x16, 0x25, - 0x07, 0x9f, 0x56, 0xc0, 0xe4, 0x0a, 0xf2, 0xf0, 0x64, 0xa7, 0x0b, 0x9f, 0x21, 0xb1, 0x30, 0x83, - 0xed, 0x0b, 0x72, 0x39, 0x72, 0x30, 0x3f, 0xa7, 0x6f, 0xf0, 0xa7, 0x86, 0xb1, 0x0d, 0xfc, 0xaa, - 0x23, 0x06, 0x92, 0xa7, 0x81, 0xbc, 0x87, 0x3f, 0xb3, 0xf5, 0xe1, 0xc7, 0x46, 0x8e, 0x23, 0xb8, - 0x90, 0x25, 0xd3, 0x33, 0x75, 0x9a, 0x9f, 0x1b, 0x36, 0x24, 0x8d, 0x8a, 0x08, 0x42, 0xbe, 0x1f, - 0x0d, 0xc3, 0xbf, 0x55, 0xc0, 0x29, 0xaa, 0x1f, 0xa5, 0x4e, 0xa7, 0xee, 0x39, 0x2e, 0xd2, 0x51, - 0x13, 0x59, 0x1d, 0xaf, 0x67, 0xe1, 0xcd, 0xa5, 0xa9, 0xfe, 0xce, 0x1e, 0x7b, 0x85, 0x6f, 0x50, - 0x64, 0x23, 0x1a, 0x1e, 0xd0, 0xc7, 0x9e, 0xfa, 0x22, 0x94, 0xfd, 0xa3, 0x59, 0x99, 0x18, 0x85, - 0x09, 0x0b, 0x4f, 0x06, 0xd4, 0x87, 0x8e, 0x00, 0x28, 0x7f, 0x49, 0x45, 0xd7, 0xca, 0x5a, 0x65, - 0x03, 0x0f, 0x02, 0x37, 0x82, 0xeb, 0x37, 0x36, 0xf5, 0xf2, 0x6a, 0xa9, 0xae, 0x35, 0x74, 0x6d, - 0xa5, 0x52, 0x37, 0xf4, 0x92, 0x51, 0xa9, 0xf9, 0x04, 0x4c, 0xa8, 0x37, 0x80, 0xf9, 0xfa, 0xe6, - 0x62, 0xbd, 0xac, 0x57, 0x36, 0x48, 0xba, 0xae, 0x55, 0xb5, 0x0b, 0xec, 0xeb, 0x24, 0xfc, 0x40, - 0x11, 0x4c, 0x63, 0xcb, 0xbc, 0x4e, 0x0d, 0x76, 0xf8, 0xcd, 0x1c, 0x98, 0xd6, 0x51, 0xd7, 0x69, - 0xef, 0x13, 0xe3, 0x7d, 0x5c, 0x73, 0x82, 0x6f, 0x29, 0xb2, 0xa7, 0xa1, 0x38, 0x62, 0x17, 0x38, - 0x42, 0xa3, 0x67, 0x80, 0xa6, 0x1f, 0x1d, 0x98, 0xd9, 0x2d, 0x61, 0x82, 0xba, 0x00, 0x54, 0xe7, - 0xb2, 0x8d, 0xdc, 0x7a, 0xf3, 0xb2, 0xe6, 0xed, 0x94, 0x5a, 0x2d, 0x17, 0x75, 0xbb, 0x6c, 0x59, - 0xa1, 0xcf, 0x17, 0xf5, 0x36, 0x70, 0x9c, 0xa4, 0x72, 0x99, 0xe9, 0xd1, 0xcd, 0xde, 0xe4, 0x20, - 0x67, 0xc9, 0xbe, 0xea, 0xe7, 0xcc, 0x73, 0x39, 0xc3, 0x64, 0xde, 0xf9, 0xb0, 0x20, 0xfa, 0xbc, - 0xde, 0x04, 0xa6, 0x6d, 0x73, 0x17, 0x69, 0x57, 0x3a, 0x96, 0x8b, 0xba, 0xf3, 0x13, 0x64, 0x37, - 0x8d, 0x4f, 0x82, 0xbf, 0x2f, 0x75, 0x7a, 0x4b, 0x8e, 0x63, 0xc9, 0x64, 0x7f, 0x65, 0x08, 0xd1, - 0xef, 0xd3, 0xcf, 0x28, 0xf0, 0x03, 0x0a, 0x98, 0x61, 0x44, 0x95, 0xec, 0xab, 0x95, 0x16, 0xbc, - 0x51, 0x30, 0x4b, 0x4d, 0x9c, 0xe6, 0x9b, 0xa5, 0xe4, 0x05, 0xfe, 0x9c, 0x22, 0xeb, 0x4e, 0xd4, - 0xa7, 0xe1, 0xa4, 0x8e, 0x68, 0x17, 0x97, 0x2d, 0x67, 0x8f, 0xb9, 0xd4, 0x4c, 0xea, 0xf4, 0x25, - 0xcd, 0xd5, 0x36, 0xf8, 0x41, 0x29, 0x67, 0x25, 0xc9, 0x66, 0x1c, 0x11, 0x80, 0x1f, 0x57, 0xc0, - 0x1c, 0xa3, 0xaa, 0xce, 0xbc, 0x66, 0xa5, 0xdc, 0xc7, 0x7f, 0x5e, 0xda, 0x10, 0xec, 0xd3, 0x7e, - 0x56, 0xd3, 0xa3, 0x06, 0xc8, 0x0f, 0x4b, 0x85, 0x1a, 0x91, 0x6e, 0xc8, 0x11, 0x41, 0xf9, 0xf6, - 0x1c, 0x98, 0xde, 0xec, 0x22, 0x97, 0xf9, 0xc5, 0xc1, 0xd7, 0xe6, 0x80, 0xb2, 0x82, 0x84, 0x1d, - 0xce, 0x17, 0xe5, 0x64, 0x57, 0xeb, 0xf8, 0xc6, 0x72, 0x85, 0x62, 0x1b, 0x29, 0x02, 0xb6, 0x5b, - 0xc1, 0x1c, 0x65, 0x69, 0xc9, 0xf3, 0xb0, 0x91, 0xe8, 0x1f, 0x02, 0xe8, 0x49, 0x1d, 0xc5, 0x1e, - 0x0e, 0xa9, 0x0b, 0x67, 0x29, 0x63, 0x9a, 0xd6, 0xd0, 0x16, 0x0d, 0x44, 0x95, 0xd3, 0x7b, 0x52, - 0xc9, 0xc5, 0xcd, 0x1d, 0x44, 0xbd, 0x41, 0xb9, 0xcc, 0x79, 0x92, 0xb9, 0xdf, 0x27, 0xf8, 0x4d, - 0xa9, 0x08, 0x7d, 0xf2, 0xdc, 0x49, 0x26, 0x0b, 0x9d, 0xd1, 0x98, 0x24, 0x27, 0x41, 0x11, 0xe7, - 0x20, 0x1b, 0x23, 0xba, 0x56, 0xaf, 0xad, 0x9d, 0xd7, 0xfa, 0xaf, 0x2f, 0xe4, 0xe1, 0x0b, 0x14, - 0x30, 0xb5, 0xe8, 0x3a, 0x66, 0xab, 0x69, 0x76, 0x3d, 0xf8, 0x9d, 0x2c, 0x98, 0xd9, 0x30, 0xaf, - 0xb6, 0x1d, 0xb3, 0x45, 0x3c, 0x11, 0x7b, 0xfa, 0x82, 0x0e, 0xfd, 0xe4, 0xf7, 0x05, 0xec, 0x55, - 0x74, 0xb3, 0x0f, 0x1c, 0xe1, 0x33, 0x32, 0x57, 0x89, 0x05, 0xfb, 0x6f, 0xd9, 0x7e, 0xa1, 0xbf, - 0x7c, 0xba, 0x16, 0x78, 0x9a, 0x22, 0x2c, 0xca, 0x0f, 0xc8, 0x05, 0xf3, 0x92, 0x29, 0xf2, 0x68, - 0xb6, 0xcb, 0x1f, 0x99, 0x04, 0x85, 0x25, 0x44, 0xac, 0xb8, 0xdf, 0xce, 0x82, 0x09, 0x76, 0x99, - 0x3e, 0xbc, 0x5b, 0x70, 0x72, 0x6c, 0x91, 0x0c, 0x41, 0x77, 0x1c, 0xbc, 0xe3, 0xc9, 0x3a, 0x77, - 0x7a, 0x89, 0x3c, 0x27, 0x70, 0xff, 0xa2, 0xf5, 0x46, 0x5c, 0xe0, 0x9f, 0xcc, 0xfd, 0x2b, 0xb6, - 0xa8, 0xf4, 0x9d, 0xa0, 0xde, 0x99, 0x65, 0x3e, 0x4f, 0x5c, 0xaf, 0xf7, 0xab, 0xbc, 0x7c, 0xc6, - 0xba, 0x81, 0x31, 0xe2, 0x63, 0xbc, 0x96, 0xee, 0x02, 0x13, 0x94, 0xe7, 0xfe, 0x7c, 0xb4, 0xd7, - 0x81, 0x80, 0x16, 0x41, 0x4e, 0x32, 0xf9, 0x39, 0x25, 0x7d, 0xc7, 0xa2, 0x2b, 0x1f, 0xcb, 0x89, - 0xbe, 0x99, 0x2a, 0xf2, 0x2e, 0x3b, 0xee, 0xa5, 0xba, 0x67, 0x7a, 0x08, 0xfe, 0x73, 0x16, 0x28, - 0x75, 0xe4, 0xf1, 0x67, 0x89, 0xab, 0xe0, 0x04, 0x6d, 0x10, 0xcb, 0x48, 0xfa, 0x6f, 0xda, 0x90, - 0x9b, 0xfa, 0x32, 0x81, 0xcb, 0xa7, 0x1f, 0xfc, 0x15, 0xfe, 0x52, 0xdf, 0x10, 0x0a, 0xd9, 0x3e, - 0x93, 0x06, 0xc6, 0x19, 0x9e, 0x40, 0x2c, 0x60, 0x11, 0x72, 0xfa, 0x7b, 0x52, 0x66, 0xb5, 0x5c, - 0x99, 0x47, 0xd2, 0x15, 0x9c, 0x9d, 0x00, 0x79, 0x6d, 0xb7, 0xe3, 0x5d, 0x3d, 0xfb, 0x38, 0x30, - 0x5b, 0xf7, 0x5c, 0x64, 0xee, 0x72, 0x36, 0xb5, 0xe7, 0x5c, 0x42, 0xb6, 0x6f, 0x53, 0x93, 0x97, - 0x7b, 0xee, 0x06, 0x13, 0xb6, 0xd3, 0x30, 0xf7, 0xbc, 0x1d, 0xf5, 0xc6, 0x03, 0x97, 0xde, 0xaf, - 0x53, 0x6f, 0xdd, 0x1a, 0x3b, 0x4b, 0xf3, 0x95, 0x7b, 0x89, 0x55, 0x55, 0xb0, 0x9d, 0xd2, 0x9e, - 0xb7, 0xb3, 0x78, 0xc3, 0xc7, 0xff, 0xe6, 0x4c, 0xe6, 0xd3, 0x7f, 0x73, 0x26, 0xf3, 0xe5, 0xbf, - 0x39, 0x93, 0xf9, 0xf9, 0xaf, 0x9e, 0x39, 0xf6, 0xe9, 0xaf, 0x9e, 0x39, 0xf6, 0xf9, 0xaf, 0x9e, - 0x39, 0xf6, 0xc3, 0xd9, 0xce, 0xc5, 0x8b, 0x05, 0x52, 0xca, 0x5d, 0xff, 0x6f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x2c, 0x0a, 0xf3, 0xa5, 0xc4, 0xdd, 0x01, 0x00, + 0x59, 0x2f, 0x8a, 0x4f, 0x55, 0x56, 0x55, 0x77, 0x47, 0xbf, 0x4c, 0x4d, 0xee, 0xcc, 0xec, 0x6c, + 0xec, 0x32, 0x3b, 0xcc, 0x2e, 0xcb, 0xba, 0x2c, 0x3d, 0xb0, 0x0b, 0xc2, 0x2e, 0xbb, 0xec, 0x56, + 0x57, 0x67, 0x77, 0x17, 0xdb, 0x5d, 0xd5, 0x64, 0x65, 0xcf, 0xb0, 0xfa, 0xf3, 0x57, 0x27, 0xa7, + 0x2a, 0xba, 0x3b, 0x77, 0xaa, 0x33, 0xcb, 0xac, 0xec, 0x9e, 0x19, 0xee, 0xe7, 0xdc, 0xa3, 0x22, + 0xb2, 0xbe, 0x70, 0x10, 0x91, 0xa3, 0x80, 0x80, 0x80, 0xe0, 0x01, 0x05, 0xe4, 0x65, 0x41, 0x10, + 0x51, 0x5e, 0x56, 0x10, 0x11, 0x11, 0x44, 0x01, 0xe5, 0x23, 0x08, 0x72, 0xf0, 0xdc, 0xc3, 0xf1, + 0xea, 0xe7, 0x08, 0x07, 0x85, 0xeb, 0xfd, 0xc4, 0x4b, 0x66, 0x46, 0x54, 0x57, 0x66, 0x45, 0x56, + 0x57, 0x56, 0x2f, 0x7a, 0xff, 0xcb, 0x8c, 0x8c, 0x8c, 0x78, 0xe2, 0xf9, 0x3e, 0x11, 0xf1, 0xc4, + 0x13, 0x4f, 0x3c, 0x01, 0x4e, 0x75, 0x2e, 0x9e, 0xeb, 0xb8, 0x8e, 0xe7, 0x74, 0xcf, 0x35, 0x9d, + 0x9d, 0x1d, 0xd3, 0x6e, 0x75, 0xe7, 0xc9, 0xbb, 0x3a, 0x61, 0xda, 0x57, 0xbd, 0xab, 0x1d, 0x04, + 0x6f, 0xee, 0x5c, 0xda, 0x3a, 0xd7, 0xb6, 0x2e, 0x9e, 0xeb, 0x5c, 0x3c, 0xb7, 0xe3, 0xb4, 0x50, + 0xdb, 0xff, 0x81, 0xbc, 0xb0, 0xec, 0xf0, 0xd6, 0xa8, 0x5c, 0x6d, 0xa7, 0x69, 0xb6, 0xbb, 0x9e, + 0xe3, 0x22, 0x96, 0xf3, 0x64, 0x58, 0x25, 0xda, 0x43, 0xb6, 0xe7, 0x97, 0x70, 0xc3, 0x96, 0xe3, + 0x6c, 0xb5, 0x11, 0xfd, 0x76, 0x71, 0x77, 0xf3, 0x5c, 0xd7, 0x73, 0x77, 0x9b, 0x1e, 0xfb, 0x7a, + 0xa6, 0xf7, 0x6b, 0x0b, 0x75, 0x9b, 0xae, 0xd5, 0xf1, 0x1c, 0x97, 0xe6, 0x38, 0xfb, 0xe2, 0x0f, + 0x4c, 0x00, 0x45, 0xef, 0x34, 0xe1, 0xb7, 0x26, 0x80, 0x52, 0xea, 0x74, 0xe0, 0xa3, 0x59, 0x00, + 0x96, 0x91, 0x77, 0x1e, 0xb9, 0x5d, 0xcb, 0xb1, 0xe1, 0x51, 0x30, 0xa1, 0xa3, 0x1f, 0xdd, 0x45, + 0x5d, 0xef, 0xee, 0xdc, 0xc3, 0x5f, 0x57, 0x32, 0xf0, 0x8d, 0x59, 0x30, 0xa9, 0xa3, 0x6e, 0xc7, + 0xb1, 0xbb, 0x48, 0xbd, 0x1f, 0xe4, 0x91, 0xeb, 0x3a, 0xee, 0xa9, 0xcc, 0x99, 0xcc, 0xad, 0xd3, + 0x77, 0xdc, 0x36, 0xcf, 0x9a, 0x3f, 0xaf, 0x77, 0x9a, 0xf3, 0xa5, 0x4e, 0x67, 0x3e, 0x2c, 0x69, + 0xde, 0xff, 0x69, 0x5e, 0xc3, 0x7f, 0xe8, 0xf4, 0x47, 0xf5, 0x14, 0x98, 0xd8, 0xa3, 0x19, 0x4e, + 0x65, 0xcf, 0x64, 0x6e, 0x9d, 0xd2, 0xfd, 0x57, 0xfc, 0xa5, 0x85, 0x3c, 0xd3, 0x6a, 0x77, 0x4f, + 0x29, 0xf4, 0x0b, 0x7b, 0x85, 0xaf, 0xcf, 0x80, 0x3c, 0x29, 0x44, 0x2d, 0x83, 0x5c, 0xd3, 0x69, + 0x21, 0x52, 0xfd, 0xdc, 0x1d, 0xe7, 0xe4, 0xab, 0x9f, 0x2f, 0x3b, 0x2d, 0xa4, 0x93, 0x9f, 0xd5, + 0x33, 0x60, 0xda, 0x67, 0x4b, 0x48, 0x06, 0x9f, 0x74, 0xf6, 0x0e, 0x90, 0xc3, 0xf9, 0xd5, 0x49, + 0x90, 0xab, 0x6e, 0xac, 0xae, 0x16, 0x8f, 0xa8, 0xc7, 0xc0, 0xec, 0x46, 0xf5, 0x81, 0x6a, 0xed, + 0x42, 0xb5, 0xa1, 0xe9, 0x7a, 0x4d, 0x2f, 0x66, 0xd4, 0x59, 0x30, 0xb5, 0x50, 0x5a, 0x6c, 0x54, + 0xaa, 0xeb, 0x1b, 0x46, 0x31, 0x0b, 0x5f, 0xa3, 0x80, 0xb9, 0x3a, 0xf2, 0x16, 0xd1, 0x9e, 0xd5, + 0x44, 0x75, 0xcf, 0xf4, 0x10, 0x7c, 0x49, 0x26, 0x60, 0xa6, 0xba, 0x81, 0x2b, 0x0d, 0x3e, 0xb1, + 0x06, 0xdc, 0xb9, 0xaf, 0x01, 0x62, 0x09, 0xf3, 0xec, 0xef, 0x79, 0x2e, 0x4d, 0xe7, 0xcb, 0x39, + 0xfb, 0x64, 0x30, 0xcd, 0x7d, 0x53, 0xe7, 0x00, 0x58, 0x28, 0x95, 0x1f, 0x58, 0xd6, 0x6b, 0x1b, + 0xd5, 0xc5, 0xe2, 0x11, 0xfc, 0xbe, 0x54, 0xd3, 0x35, 0xf6, 0x9e, 0x81, 0xdf, 0xc9, 0x70, 0x60, + 0x2e, 0x8a, 0x60, 0xce, 0x0f, 0x26, 0xa6, 0x0f, 0xa0, 0xf0, 0x4d, 0x01, 0x38, 0xcb, 0x02, 0x38, + 0x77, 0x26, 0x2b, 0x2e, 0x7d, 0x80, 0x5e, 0x98, 0x05, 0x93, 0xf5, 0xed, 0x5d, 0xaf, 0xe5, 0x5c, + 0xb6, 0xe1, 0x54, 0x80, 0x0c, 0xfc, 0x26, 0xcf, 0x93, 0x67, 0x8b, 0x3c, 0xb9, 0x75, 0x7f, 0x23, + 0x58, 0x09, 0x11, 0xdc, 0xf8, 0xd5, 0x80, 0x1b, 0x25, 0x81, 0x1b, 0x4f, 0x96, 0x2d, 0x28, 0x7d, + 0x3e, 0xfc, 0xfc, 0x9d, 0x20, 0x5f, 0xef, 0x98, 0x4d, 0x04, 0x3f, 0xa9, 0x80, 0x99, 0x55, 0x64, + 0xee, 0xa1, 0x52, 0xa7, 0xe3, 0x3a, 0x7b, 0x08, 0x96, 0x43, 0x79, 0x3d, 0x05, 0x26, 0xba, 0x38, + 0x53, 0xa5, 0x45, 0x5a, 0x30, 0xa5, 0xfb, 0xaf, 0xea, 0x69, 0x00, 0xac, 0x16, 0xb2, 0x3d, 0xcb, + 0xb3, 0x50, 0xf7, 0x54, 0xf6, 0x8c, 0x72, 0xeb, 0x94, 0xce, 0xa5, 0xc0, 0x6f, 0x65, 0x65, 0x65, + 0x8c, 0x50, 0x31, 0xcf, 0x53, 0x10, 0xc1, 0xd5, 0x37, 0x64, 0x65, 0x64, 0x6c, 0x60, 0x71, 0xc9, + 0x78, 0xfb, 0xb6, 0x4c, 0x72, 0xe6, 0xe2, 0x1c, 0xd5, 0x5a, 0xa3, 0xbe, 0x51, 0x5e, 0x69, 0xd4, + 0xd7, 0x4b, 0x65, 0xad, 0x88, 0xd4, 0xe3, 0xa0, 0x48, 0x1e, 0x1b, 0x95, 0x7a, 0x63, 0x51, 0x5b, + 0xd5, 0x0c, 0x6d, 0xb1, 0xb8, 0xa9, 0xaa, 0x60, 0x4e, 0xd7, 0x9e, 0xbb, 0xa1, 0xd5, 0x8d, 0xc6, + 0x52, 0xa9, 0xb2, 0xaa, 0x2d, 0x16, 0xb7, 0xf0, 0xcf, 0xab, 0x95, 0xb5, 0x8a, 0xd1, 0xd0, 0xb5, + 0x52, 0x79, 0x45, 0x5b, 0x2c, 0x6e, 0xab, 0xd7, 0x82, 0x6b, 0xaa, 0xb5, 0x46, 0x69, 0x7d, 0x5d, + 0xaf, 0x9d, 0xd7, 0x1a, 0xec, 0x8f, 0x7a, 0xd1, 0xa2, 0x15, 0x19, 0x8d, 0xfa, 0x4a, 0x49, 0xd7, + 0x4a, 0x0b, 0xab, 0x5a, 0xf1, 0x21, 0xf8, 0x02, 0x05, 0xcc, 0xae, 0x99, 0x97, 0x50, 0x7d, 0xdb, + 0x74, 0x91, 0x79, 0xb1, 0x8d, 0xe0, 0x4d, 0x12, 0x78, 0xc2, 0x4f, 0xf2, 0x78, 0x69, 0x22, 0x5e, + 0xe7, 0xfa, 0x30, 0x58, 0xa8, 0x22, 0x02, 0xb0, 0xff, 0x1d, 0x74, 0x83, 0x15, 0x01, 0xb0, 0xa7, + 0x25, 0x2c, 0x2f, 0x19, 0x62, 0x3f, 0xf1, 0x18, 0x40, 0x0c, 0x7e, 0x49, 0x01, 0x73, 0x15, 0x7b, + 0xcf, 0xf2, 0xd0, 0x32, 0xb2, 0x91, 0x8b, 0xe7, 0x01, 0x29, 0x18, 0xde, 0xa8, 0x70, 0x30, 0x2c, + 0x89, 0x30, 0x3c, 0xa5, 0x0f, 0xdb, 0xc4, 0x3a, 0x22, 0x66, 0xdb, 0x1b, 0xc0, 0x94, 0x45, 0xf2, + 0x95, 0xad, 0x16, 0xe3, 0x58, 0x98, 0xa0, 0xde, 0x0c, 0x66, 0xe9, 0xcb, 0x92, 0xd5, 0x46, 0x0f, + 0xa0, 0xab, 0x6c, 0xde, 0x15, 0x13, 0xe1, 0xcf, 0x05, 0x9d, 0xaf, 0x22, 0x60, 0xf9, 0xf4, 0xa4, + 0x44, 0x25, 0x03, 0xf3, 0xe5, 0x8f, 0x85, 0xee, 0xb7, 0xaf, 0x97, 0x59, 0xf0, 0x7b, 0x59, 0x30, + 0x5d, 0xf7, 0x9c, 0x0e, 0x16, 0x59, 0xcb, 0xde, 0x92, 0x03, 0xf7, 0xe3, 0x7c, 0x1f, 0x2b, 0x8b, + 0xe0, 0x3e, 0xb9, 0x0f, 0x1f, 0xb9, 0x0a, 0x22, 0x7a, 0xd8, 0xb7, 0x82, 0x1e, 0xb6, 0x24, 0xa0, + 0x72, 0x47, 0xa2, 0xd2, 0xbe, 0x0f, 0xfb, 0xd7, 0xcb, 0x15, 0x50, 0xf4, 0xc5, 0xcc, 0x2b, 0xef, + 0xba, 0x2e, 0xb2, 0x3d, 0x39, 0x10, 0xfe, 0x92, 0x07, 0x61, 0x45, 0x04, 0xe1, 0x8e, 0x18, 0x61, + 0xf6, 0x6b, 0x49, 0xb1, 0x8f, 0xfd, 0x7e, 0x80, 0xe6, 0x03, 0x02, 0x9a, 0xcf, 0x48, 0x4e, 0x56, + 0x32, 0x48, 0x57, 0x86, 0x40, 0xf4, 0x38, 0x28, 0xe2, 0x39, 0xa9, 0x6c, 0x54, 0xce, 0x6b, 0x8d, + 0x4a, 0xf5, 0x7c, 0xc5, 0xd0, 0x8a, 0x08, 0xbe, 0x4c, 0x01, 0x33, 0x94, 0x34, 0x1d, 0xed, 0x39, + 0x97, 0x24, 0x47, 0xbd, 0x2f, 0x25, 0x54, 0x16, 0xf8, 0x1a, 0x22, 0x7a, 0xc6, 0xcf, 0x24, 0x50, + 0x16, 0x62, 0x8a, 0x7b, 0x2c, 0x8d, 0x56, 0xfb, 0xba, 0xc1, 0x56, 0x9f, 0xde, 0xd2, 0x77, 0xb4, + 0x7a, 0x79, 0x0e, 0x00, 0xda, 0xc8, 0xf3, 0x16, 0xba, 0x0c, 0xd7, 0x42, 0x4c, 0x04, 0xb1, 0xcd, + 0x0c, 0x14, 0xdb, 0x6c, 0x3f, 0xb1, 0x7d, 0x2f, 0x3f, 0x67, 0x2d, 0x88, 0xe8, 0xdd, 0x1e, 0xc9, + 0x6e, 0x4c, 0x49, 0xf4, 0xea, 0xd0, 0x17, 0x94, 0xac, 0xa8, 0x75, 0xde, 0x00, 0xa6, 0xc8, 0x63, + 0xd5, 0xdc, 0x41, 0xac, 0x0f, 0x85, 0x09, 0xea, 0x59, 0x30, 0x43, 0x33, 0x36, 0x1d, 0x1b, 0xb7, + 0x27, 0x47, 0x32, 0x08, 0x69, 0x18, 0xc4, 0xa6, 0x8b, 0x4c, 0xcf, 0x71, 0x49, 0x19, 0x79, 0x0a, + 0x22, 0x97, 0x04, 0xbf, 0x11, 0xf4, 0x42, 0x4d, 0x90, 0x9c, 0xa7, 0x26, 0x69, 0x4a, 0x32, 0xb9, + 0xd9, 0x1b, 0xae, 0xff, 0xd1, 0x5e, 0xd7, 0xc0, 0x68, 0x2f, 0x91, 0xa5, 0x1d, 0x52, 0x4f, 0x02, + 0x95, 0xa5, 0xe2, 0xbc, 0xe5, 0x5a, 0xd5, 0xd0, 0xaa, 0x46, 0x71, 0xb3, 0xaf, 0x44, 0x6d, 0xc1, + 0x37, 0xe4, 0x40, 0xee, 0x39, 0x8e, 0x65, 0xc3, 0x17, 0x66, 0x04, 0x91, 0xb0, 0x91, 0x77, 0xd9, + 0x71, 0x2f, 0x05, 0x1d, 0x35, 0x4c, 0x88, 0xc7, 0x26, 0x14, 0x25, 0x65, 0xa0, 0x28, 0xe5, 0xfa, + 0x89, 0xd2, 0x2f, 0xf0, 0xa2, 0x74, 0x8f, 0x28, 0x4a, 0xb7, 0xf4, 0xe1, 0x3f, 0x26, 0x3e, 0x62, + 0x00, 0xf8, 0x58, 0x30, 0x00, 0xdc, 0x27, 0xc0, 0xf8, 0x24, 0xb9, 0x62, 0x92, 0x01, 0xf8, 0xc5, + 0x54, 0x3b, 0x7e, 0x3f, 0xa8, 0xb7, 0x22, 0xa0, 0xde, 0xee, 0x33, 0x26, 0x58, 0xfb, 0x87, 0x8e, + 0x87, 0xf6, 0x0f, 0x13, 0x97, 0xd4, 0x13, 0xe0, 0xd8, 0x62, 0x65, 0x69, 0x49, 0xd3, 0xb5, 0xaa, + 0xd1, 0xa8, 0x6a, 0xc6, 0x85, 0x9a, 0xfe, 0x40, 0xb1, 0x0d, 0x5f, 0xaf, 0x00, 0x80, 0x39, 0x54, + 0x36, 0xed, 0x26, 0x6a, 0xcb, 0x8d, 0xe8, 0xff, 0x33, 0x9b, 0x6c, 0x4c, 0x08, 0xcb, 0x8f, 0x80, + 0xf3, 0xd5, 0x59, 0xf9, 0x5e, 0x19, 0x59, 0x58, 0x32, 0x50, 0xdf, 0xf2, 0x58, 0xd0, 0x3d, 0xaf, + 0x01, 0x47, 0xfd, 0xf2, 0x58, 0xf6, 0xfe, 0xcb, 0xbe, 0xb7, 0xe7, 0xc0, 0x1c, 0x83, 0xc5, 0x5f, + 0xc7, 0x3f, 0x9c, 0x91, 0x59, 0xc8, 0x43, 0x30, 0xc9, 0x96, 0xed, 0xfe, 0xf0, 0x1e, 0xbc, 0xab, + 0xcb, 0x60, 0xba, 0x83, 0xdc, 0x1d, 0xab, 0xdb, 0xb5, 0x1c, 0x9b, 0x1a, 0xe4, 0xe6, 0xee, 0x78, + 0x42, 0xc0, 0x71, 0x62, 0xbb, 0x9c, 0x5f, 0x37, 0x5d, 0xcf, 0x6a, 0x5a, 0x1d, 0xd3, 0xf6, 0xd6, + 0xc3, 0xcc, 0x3a, 0xff, 0x27, 0x7c, 0x69, 0xc2, 0x65, 0x8d, 0xd8, 0x92, 0x08, 0x91, 0xf8, 0x40, + 0x82, 0x25, 0x49, 0x6c, 0x81, 0xc9, 0xc4, 0xe2, 0xd1, 0x54, 0xc5, 0xa2, 0x0f, 0xde, 0x5b, 0xea, + 0x75, 0xe0, 0x44, 0xa5, 0x5a, 0xae, 0xe9, 0xba, 0x56, 0x36, 0x1a, 0xeb, 0x9a, 0xbe, 0x56, 0xa9, + 0xd7, 0x2b, 0xb5, 0x6a, 0xfd, 0x20, 0xbd, 0x1d, 0x7e, 0x42, 0x09, 0x24, 0x66, 0x11, 0x35, 0xdb, + 0x96, 0x8d, 0xe0, 0x7d, 0x07, 0x14, 0x18, 0xd1, 0xea, 0x23, 0x8f, 0x33, 0xab, 0x3f, 0x02, 0xe7, + 0xd7, 0x25, 0xc7, 0xb9, 0x7f, 0x81, 0xff, 0x86, 0xbb, 0xff, 0x97, 0x14, 0x70, 0x8c, 0xeb, 0x88, + 0x3a, 0xda, 0x19, 0x99, 0x25, 0xef, 0x27, 0xf8, 0xbe, 0x5b, 0x11, 0x31, 0xed, 0xa7, 0x4d, 0xef, + 0x23, 0x23, 0x02, 0xd6, 0xb7, 0x04, 0xb0, 0xae, 0x0a, 0xb0, 0x3e, 0x73, 0x88, 0x32, 0x93, 0x21, + 0xfb, 0x5b, 0xa9, 0x22, 0x7b, 0x1d, 0x38, 0xb1, 0x5e, 0xd2, 0x8d, 0x4a, 0xb9, 0xb2, 0x5e, 0xc2, + 0xf3, 0x28, 0x37, 0x65, 0x47, 0xa8, 0xeb, 0x22, 0xe8, 0x7d, 0xf1, 0xfd, 0xbd, 0x1c, 0xb8, 0xa1, + 0xff, 0x40, 0x5b, 0xde, 0x36, 0xed, 0x2d, 0x04, 0x2d, 0x19, 0xa8, 0x17, 0xc1, 0x44, 0x93, 0x64, + 0xa7, 0x38, 0xf3, 0x5b, 0x37, 0x31, 0x63, 0x39, 0xad, 0x41, 0xf7, 0x7f, 0x85, 0xef, 0xe2, 0x05, + 0xc2, 0x10, 0x05, 0xe2, 0xd9, 0xf1, 0xe0, 0xed, 0xa3, 0x3b, 0x42, 0x36, 0x3e, 0x1d, 0xc8, 0xc6, + 0x05, 0x41, 0x36, 0xca, 0x07, 0x2b, 0x3e, 0x99, 0x98, 0xfc, 0xd1, 0x63, 0x61, 0x00, 0x88, 0x94, + 0x26, 0x2b, 0x7a, 0x56, 0xe8, 0x3b, 0xdc, 0xbf, 0x56, 0x01, 0x85, 0x45, 0xd4, 0x46, 0xb2, 0x96, + 0xc8, 0xbf, 0xcf, 0xca, 0x6e, 0x88, 0x50, 0x18, 0x68, 0xd9, 0xd1, 0xd6, 0x11, 0xcf, 0xda, 0x41, + 0x5d, 0xcf, 0xdc, 0xe9, 0x10, 0x56, 0x2b, 0x7a, 0x98, 0x00, 0x7f, 0x32, 0x2b, 0xb3, 0x5d, 0x12, + 0x53, 0xcd, 0xbf, 0x0d, 0x9b, 0xe2, 0x57, 0xe7, 0x40, 0xe1, 0x82, 0xd9, 0x6e, 0x23, 0x0f, 0x7e, + 0x2d, 0x0b, 0x0a, 0x65, 0xbc, 0x26, 0x45, 0xf0, 0x49, 0x21, 0x58, 0x10, 0x4c, 0xba, 0x8e, 0xe3, + 0xad, 0x9b, 0xde, 0x36, 0x43, 0x2b, 0x78, 0x67, 0xdb, 0xb4, 0xbf, 0xc9, 0x83, 0x76, 0x9f, 0x08, + 0xda, 0x0f, 0x08, 0xdc, 0xa4, 0x15, 0xcd, 0xd3, 0x4a, 0x22, 0x50, 0x83, 0x60, 0x72, 0xc7, 0x46, + 0x3b, 0x8e, 0x6d, 0x35, 0xfd, 0x99, 0xde, 0x7f, 0x87, 0x1f, 0x0e, 0x56, 0xc9, 0x0b, 0x02, 0x66, + 0xf3, 0xd2, 0xb5, 0x24, 0x03, 0xad, 0x3e, 0x04, 0x66, 0x37, 0x82, 0xeb, 0x29, 0x04, 0x0d, 0xa3, + 0xd6, 0x28, 0xeb, 0x5a, 0xc9, 0xd0, 0x1a, 0xab, 0xb5, 0x72, 0x69, 0xb5, 0xa1, 0x6b, 0xeb, 0xb5, + 0x22, 0x82, 0xff, 0x2d, 0x8b, 0x99, 0xdb, 0x74, 0xf6, 0x90, 0x0b, 0x97, 0xa5, 0xf8, 0x1c, 0xc7, + 0x13, 0x86, 0xc1, 0x2f, 0x48, 0x6f, 0x95, 0x33, 0xee, 0x30, 0x0a, 0x22, 0x86, 0xc2, 0x8f, 0x48, + 0x6d, 0x7b, 0xc7, 0x16, 0xf5, 0x18, 0xe0, 0xf4, 0xff, 0xca, 0x82, 0x89, 0xb2, 0x63, 0xef, 0x21, + 0xd7, 0xe3, 0xb5, 0x4c, 0x9e, 0x9b, 0x19, 0x91, 0x9b, 0x78, 0x68, 0x42, 0xb6, 0xe7, 0x3a, 0x1d, + 0x5f, 0xcd, 0xf4, 0x5f, 0xe1, 0xaf, 0x27, 0xe5, 0x30, 0xab, 0x39, 0xda, 0xdc, 0xd4, 0xbf, 0x22, + 0x81, 0x3c, 0xa5, 0xa7, 0x03, 0xbc, 0x3e, 0x09, 0x2e, 0xfd, 0x09, 0x48, 0x7f, 0x97, 0xf7, 0xcb, + 0x0a, 0x98, 0xa5, 0x9d, 0xaf, 0x8e, 0xc8, 0xbc, 0x08, 0x6b, 0xbc, 0xa1, 0xa7, 0x87, 0xf9, 0x2b, + 0x47, 0x04, 0xf6, 0x17, 0xcc, 0x4e, 0x27, 0x30, 0xfa, 0xad, 0x1c, 0xd1, 0xd9, 0x3b, 0x15, 0xf3, + 0x85, 0x02, 0xc8, 0x99, 0xbb, 0xde, 0x36, 0xfc, 0x9e, 0xb4, 0xca, 0x2f, 0x0c, 0x06, 0x8c, 0x9e, + 0x08, 0x48, 0x8e, 0x83, 0xbc, 0xe7, 0x5c, 0x42, 0x3e, 0x1f, 0xe8, 0x0b, 0x86, 0xc3, 0xec, 0x74, + 0x0c, 0xf2, 0x81, 0xc1, 0xe1, 0xbf, 0xe3, 0x19, 0xc6, 0x6c, 0x36, 0x9d, 0x5d, 0xdb, 0xab, 0xf8, + 0x86, 0xbf, 0x30, 0x01, 0x7e, 0x3e, 0x23, 0xb3, 0x84, 0x90, 0x20, 0x30, 0x19, 0x64, 0x17, 0x87, + 0xe8, 0x4a, 0xf3, 0xe0, 0xb6, 0xd2, 0xfa, 0x7a, 0xc3, 0xa8, 0x3d, 0xa0, 0x55, 0xc3, 0xe9, 0xbe, + 0x51, 0xa9, 0x36, 0x8c, 0x15, 0xad, 0x51, 0xde, 0xd0, 0x89, 0x75, 0xa6, 0x54, 0x2e, 0xd7, 0x36, + 0xaa, 0x46, 0x11, 0xc1, 0xb7, 0x66, 0xc1, 0x4c, 0xb9, 0xed, 0x74, 0x03, 0x84, 0x6f, 0x0c, 0x11, + 0x0e, 0xd8, 0x98, 0xe1, 0xd8, 0x08, 0xff, 0x25, 0x23, 0xbb, 0xd5, 0xeb, 0x33, 0x84, 0x2b, 0x3e, + 0x62, 0x94, 0xfa, 0x75, 0xa9, 0xad, 0xde, 0xc1, 0xe5, 0xa5, 0xdf, 0x25, 0x3e, 0x7b, 0x37, 0x98, + 0x28, 0x51, 0xc1, 0x80, 0x7f, 0x9d, 0x01, 0x85, 0xb2, 0x63, 0x6f, 0x5a, 0x5b, 0xea, 0x2d, 0x60, + 0x0e, 0xd9, 0xe6, 0xc5, 0x36, 0x5a, 0x34, 0x3d, 0x73, 0xcf, 0x42, 0x97, 0x49, 0x03, 0x26, 0xf5, + 0x9e, 0x54, 0x4c, 0x14, 0x4b, 0x41, 0x17, 0x77, 0xb7, 0x08, 0x51, 0x93, 0x3a, 0x9f, 0xa4, 0x3e, + 0x13, 0x5c, 0x4b, 0x5f, 0xd7, 0x5d, 0xe4, 0xa2, 0x36, 0x32, 0xbb, 0x08, 0x2b, 0xa3, 0x36, 0x6a, + 0x13, 0xa1, 0x9d, 0xd4, 0xa3, 0x3e, 0xab, 0x67, 0xc1, 0x0c, 0xfd, 0x44, 0x54, 0x9d, 0x2e, 0x11, + 0xe3, 0x49, 0x5d, 0x48, 0x53, 0x9f, 0x0c, 0xf2, 0xe8, 0x8a, 0xe7, 0x9a, 0xa7, 0x5a, 0x04, 0xaf, + 0x6b, 0xe7, 0xa9, 0xaf, 0xd7, 0xbc, 0xef, 0xeb, 0x35, 0x5f, 0x27, 0x9e, 0x60, 0x3a, 0xcd, 0x05, + 0x7f, 0x65, 0x32, 0x50, 0x24, 0xfe, 0x35, 0x1b, 0x0a, 0x86, 0x0a, 0x72, 0xb6, 0xb9, 0x83, 0x98, + 0x5c, 0x90, 0x67, 0xf5, 0x36, 0x70, 0xd4, 0xdc, 0x33, 0x3d, 0xd3, 0x5d, 0x75, 0x9a, 0x66, 0x9b, + 0x4c, 0x7e, 0x7e, 0xcf, 0xef, 0xfd, 0x40, 0xec, 0xf0, 0x9e, 0xe3, 0x22, 0x92, 0xcb, 0xb7, 0xc3, + 0xfb, 0x09, 0xb8, 0x74, 0xab, 0xe9, 0xd8, 0x84, 0x7e, 0x45, 0x27, 0xcf, 0x98, 0x2b, 0x2d, 0xab, + 0x8b, 0x1b, 0x42, 0x4a, 0xa9, 0x52, 0x83, 0x72, 0xfd, 0xaa, 0xdd, 0x24, 0x36, 0xf8, 0x49, 0x3d, + 0xea, 0xb3, 0xba, 0x00, 0xa6, 0x99, 0xf9, 0x79, 0x0d, 0xcb, 0x55, 0x81, 0xc8, 0xd5, 0x19, 0xd1, + 0x93, 0x86, 0xe2, 0x39, 0x5f, 0x0d, 0xf3, 0xe9, 0xfc, 0x4f, 0xea, 0xfd, 0xe0, 0x7a, 0xf6, 0x5a, + 0xde, 0xed, 0x7a, 0xce, 0x0e, 0x05, 0x7d, 0xc9, 0x6a, 0xd3, 0x16, 0x4c, 0x90, 0x16, 0xc4, 0x65, + 0x51, 0xef, 0x00, 0xc7, 0x3b, 0x2e, 0xda, 0x44, 0xee, 0x83, 0xe6, 0xce, 0xee, 0x15, 0xc3, 0x35, + 0xed, 0x6e, 0xc7, 0x71, 0xbd, 0x53, 0x93, 0x84, 0xf8, 0xbe, 0xdf, 0xd8, 0x40, 0x39, 0x09, 0x0a, + 0x94, 0x7d, 0xf0, 0x25, 0x79, 0x69, 0x27, 0x3a, 0xd6, 0xa0, 0x58, 0xf5, 0xec, 0x29, 0x60, 0x82, + 0x8d, 0x70, 0x04, 0xa8, 0xe9, 0x3b, 0x4e, 0xf6, 0xac, 0xe6, 0x58, 0x29, 0xba, 0x9f, 0x4d, 0xbd, + 0x13, 0x14, 0x9a, 0xa4, 0x59, 0x04, 0xb3, 0xe9, 0x3b, 0xae, 0xef, 0x5f, 0x29, 0xc9, 0xa2, 0xb3, + 0xac, 0xf0, 0x0b, 0x8a, 0x94, 0xdf, 0x5d, 0x1c, 0xc5, 0xc9, 0x7a, 0xf5, 0x37, 0xb2, 0x43, 0x0c, + 0x9b, 0xb7, 0x83, 0x5b, 0xd9, 0x98, 0xc8, 0xf4, 0x8f, 0xc5, 0xc6, 0xc2, 0x86, 0xaf, 0x82, 0x63, + 0xad, 0xa4, 0x6e, 0x94, 0x74, 0xbc, 0x7e, 0x5a, 0xc4, 0xaa, 0xfb, 0x6d, 0xe0, 0x96, 0x01, 0xb9, + 0x35, 0xa3, 0x51, 0x2d, 0xad, 0x69, 0xc5, 0x4d, 0x51, 0xb7, 0xa9, 0x1b, 0xb5, 0xf5, 0x86, 0xbe, + 0x51, 0xad, 0x56, 0xaa, 0xcb, 0xb4, 0x30, 0xac, 0x12, 0x9e, 0x0c, 0x33, 0x5c, 0xd0, 0x2b, 0x86, + 0xd6, 0x28, 0xd7, 0xaa, 0x4b, 0x95, 0xe5, 0xa2, 0x35, 0x48, 0x31, 0x7a, 0x48, 0x3d, 0x03, 0x6e, + 0x10, 0x28, 0xa9, 0xd4, 0xaa, 0x78, 0x3d, 0x51, 0x2e, 0x55, 0xcb, 0x1a, 0x5e, 0x3c, 0x5c, 0x52, + 0x21, 0x38, 0x41, 0x8b, 0x6b, 0x2c, 0x55, 0x56, 0xf9, 0x2d, 0x80, 0x8f, 0x67, 0xd4, 0x53, 0xe0, + 0x1a, 0xfe, 0x5b, 0xa5, 0x7a, 0xbe, 0xb4, 0x5a, 0x59, 0x2c, 0xfe, 0x61, 0x46, 0xbd, 0x19, 0xdc, + 0x28, 0xfc, 0x45, 0xad, 0xf9, 0x8d, 0xca, 0x62, 0x63, 0xad, 0x52, 0x5f, 0x2b, 0x19, 0xe5, 0x95, + 0xe2, 0x27, 0xc8, 0x7a, 0x21, 0x50, 0x80, 0x39, 0x67, 0xb8, 0x97, 0xf3, 0x73, 0x7a, 0x49, 0x14, + 0xd4, 0x27, 0xf5, 0x85, 0x3d, 0x5e, 0x87, 0x7d, 0x34, 0x98, 0x1d, 0x16, 0x05, 0x11, 0x7a, 0x4a, + 0x82, 0xb2, 0x92, 0xc9, 0x90, 0x31, 0x84, 0x08, 0x9d, 0x01, 0x37, 0x54, 0x35, 0x8a, 0x94, 0xae, + 0x95, 0x6b, 0xe7, 0x35, 0xbd, 0x71, 0xa1, 0xb4, 0xba, 0xaa, 0x19, 0x8d, 0xa5, 0x8a, 0x5e, 0x37, + 0x8a, 0x9b, 0xf0, 0x9f, 0xb2, 0xc1, 0x1a, 0x9a, 0xe3, 0xd6, 0x5f, 0x67, 0x93, 0x76, 0xeb, 0xd8, + 0xb5, 0xf2, 0xd3, 0x41, 0xa1, 0xeb, 0x99, 0xde, 0x6e, 0x97, 0xf5, 0xea, 0xc7, 0xf5, 0xef, 0xd5, + 0xf3, 0x75, 0x92, 0x49, 0x67, 0x99, 0xe1, 0x17, 0x32, 0x49, 0xba, 0xe9, 0x08, 0x96, 0xd1, 0xd6, + 0x10, 0x2c, 0x3e, 0x0d, 0xa0, 0x2f, 0xed, 0x95, 0x7a, 0xa3, 0xb4, 0xaa, 0x6b, 0xa5, 0xc5, 0x07, + 0x83, 0xc5, 0x33, 0x52, 0x4f, 0x80, 0x63, 0x1b, 0x55, 0xbc, 0x1c, 0x26, 0xdd, 0xa5, 0x56, 0xad, + 0x6a, 0x65, 0xcc, 0xf7, 0x9f, 0x24, 0xa6, 0x6a, 0xac, 0x41, 0x13, 0xba, 0xb1, 0x96, 0xc3, 0xf1, + 0xff, 0xeb, 0xd2, 0x1e, 0x1d, 0xa1, 0x84, 0xf1, 0x65, 0x8d, 0x16, 0x87, 0xcf, 0x4b, 0x39, 0x71, + 0x48, 0x51, 0x92, 0x0c, 0x8f, 0xff, 0x30, 0x04, 0x1e, 0x27, 0xc0, 0x31, 0x1e, 0x0f, 0xe2, 0xcc, + 0x11, 0x0d, 0xc3, 0x57, 0x26, 0x41, 0xa1, 0x8e, 0xda, 0xa8, 0xe9, 0xc1, 0xb7, 0x73, 0xca, 0xc4, + 0x1c, 0xc8, 0x06, 0xce, 0x03, 0x59, 0xab, 0x25, 0x2c, 0x9f, 0xb3, 0x3d, 0xcb, 0xe7, 0x18, 0x35, + 0x40, 0x49, 0xa4, 0x06, 0xe4, 0x52, 0x50, 0x03, 0xf2, 0xc3, 0xab, 0x01, 0x85, 0x41, 0x6a, 0x00, + 0xfc, 0xb5, 0x42, 0xd2, 0x51, 0x82, 0xb2, 0xfa, 0x70, 0x27, 0xff, 0xff, 0x99, 0x4b, 0x32, 0xaa, + 0xf4, 0xa5, 0x38, 0x99, 0x14, 0x7f, 0x4f, 0x49, 0xc1, 0xfc, 0xa0, 0xde, 0x04, 0x6e, 0x0c, 0xdf, + 0x1b, 0xda, 0xf3, 0x2a, 0x75, 0xa3, 0x4e, 0x66, 0xfc, 0x72, 0x4d, 0xd7, 0x37, 0xd6, 0xa9, 0xe5, + 0xee, 0x24, 0x50, 0xc3, 0x52, 0xf4, 0x8d, 0x2a, 0x9d, 0xdf, 0xb7, 0xc4, 0xd2, 0x97, 0x2a, 0xd5, + 0xc5, 0x46, 0xd0, 0x67, 0xaa, 0x4b, 0xb5, 0xe2, 0x36, 0x5e, 0xb2, 0x71, 0xa5, 0xe3, 0x09, 0x9a, + 0xd5, 0x50, 0xaa, 0x2e, 0x36, 0xd6, 0xaa, 0xda, 0x5a, 0xad, 0x5a, 0x29, 0x93, 0xf4, 0xba, 0x66, + 0x14, 0x2d, 0x3c, 0xd1, 0xf4, 0x68, 0x14, 0x75, 0xad, 0xa4, 0x97, 0x57, 0x34, 0x9d, 0x56, 0xf9, + 0x90, 0x7a, 0x0b, 0x38, 0x5b, 0xaa, 0xd6, 0x0c, 0x9c, 0x52, 0xaa, 0x3e, 0x68, 0x3c, 0xb8, 0xae, + 0x35, 0xd6, 0xf5, 0x5a, 0x59, 0xab, 0xd7, 0x71, 0x3f, 0x65, 0xfa, 0x47, 0xb1, 0xad, 0x3e, 0x1b, + 0xdc, 0xcd, 0x91, 0xa6, 0x19, 0x64, 0x9b, 0x68, 0xad, 0x46, 0x3c, 0x05, 0x16, 0xb5, 0xc6, 0x4a, + 0xa9, 0xde, 0xa8, 0x54, 0xcb, 0xb5, 0xb5, 0xf5, 0x92, 0x51, 0xc1, 0xdd, 0x79, 0x5d, 0xaf, 0x19, + 0xb5, 0xc6, 0x79, 0x4d, 0xaf, 0x57, 0x6a, 0xd5, 0xa2, 0x8d, 0x9b, 0xcc, 0xf5, 0x7f, 0x7f, 0x1c, + 0x76, 0xd4, 0x1b, 0xc0, 0x29, 0x3f, 0x7d, 0xb5, 0x86, 0x19, 0xcd, 0x69, 0x24, 0x9d, 0x54, 0x35, + 0x92, 0x7f, 0xce, 0x82, 0x5c, 0xdd, 0x73, 0x3a, 0xf0, 0x07, 0xc2, 0x01, 0xe6, 0x34, 0x00, 0x2e, + 0xd9, 0xf5, 0xc1, 0xab, 0x30, 0xb6, 0x2e, 0xe3, 0x52, 0xe0, 0x1f, 0x48, 0x9b, 0xaa, 0xc3, 0x31, + 0xdb, 0xe9, 0x44, 0xe8, 0x2a, 0xdf, 0x91, 0xf3, 0xdd, 0x8f, 0x2e, 0x28, 0x99, 0xbc, 0xff, 0xcc, + 0x30, 0xc6, 0x68, 0x08, 0x4e, 0x72, 0xb0, 0x61, 0xfe, 0xfb, 0x22, 0x81, 0xd4, 0x6b, 0xc1, 0x35, + 0x3d, 0xc2, 0x45, 0x64, 0x6a, 0x53, 0x7d, 0x3c, 0x78, 0x1c, 0x27, 0xde, 0xda, 0x5a, 0xed, 0xbc, + 0x16, 0x08, 0xf2, 0x62, 0xc9, 0x28, 0x15, 0xb7, 0xe0, 0x67, 0x15, 0x90, 0x5b, 0x73, 0xf6, 0x7a, + 0x77, 0x08, 0x6c, 0x74, 0x99, 0xb3, 0x85, 0xfa, 0xaf, 0xa2, 0xaf, 0xb2, 0x14, 0xdb, 0xd7, 0xa2, + 0x77, 0x03, 0x3f, 0x9f, 0x4d, 0xc2, 0xf6, 0xb5, 0x83, 0x6e, 0x01, 0xfe, 0xdd, 0x30, 0x6c, 0x8f, + 0x60, 0x2d, 0x52, 0xcf, 0x82, 0xd3, 0xe1, 0x87, 0xca, 0xa2, 0x56, 0x35, 0x2a, 0x4b, 0x0f, 0x86, + 0xcc, 0xad, 0xe8, 0x52, 0xec, 0x1f, 0x34, 0x8c, 0xc5, 0xaf, 0x34, 0x4e, 0x81, 0xe3, 0xe1, 0xb7, + 0x65, 0xcd, 0xf0, 0xbf, 0x3c, 0x04, 0x5f, 0x98, 0x07, 0x33, 0x74, 0x58, 0xdf, 0xe8, 0xb4, 0x4c, + 0x0f, 0xc1, 0x3b, 0x43, 0x74, 0x6f, 0x05, 0x47, 0x2b, 0xeb, 0x4b, 0xf5, 0xba, 0xe7, 0xb8, 0xe6, + 0x16, 0x2a, 0xb5, 0x5a, 0x2e, 0xe3, 0x56, 0x6f, 0x32, 0x7c, 0x44, 0xda, 0xce, 0x27, 0x4e, 0x25, + 0xb4, 0xce, 0x08, 0xd4, 0xbf, 0x2c, 0x65, 0x97, 0x93, 0x28, 0x30, 0x19, 0xfa, 0x0f, 0x8d, 0xb8, + 0xcf, 0x45, 0xe3, 0xb2, 0x79, 0xf6, 0x45, 0x59, 0x30, 0x65, 0x58, 0x3b, 0xe8, 0xf9, 0x8e, 0x8d, + 0xba, 0xea, 0x04, 0x50, 0x96, 0xd7, 0x8c, 0xe2, 0x11, 0xfc, 0x80, 0x95, 0xaa, 0x0c, 0x79, 0xd0, + 0x70, 0x05, 0xf8, 0xa1, 0x64, 0x14, 0x15, 0xfc, 0xb0, 0xa6, 0x19, 0xc5, 0x1c, 0x7e, 0xa8, 0x6a, + 0x46, 0x31, 0x8f, 0x1f, 0xd6, 0x57, 0x8d, 0x62, 0x01, 0x3f, 0x54, 0xea, 0x46, 0x71, 0x02, 0x3f, + 0x2c, 0xd4, 0x8d, 0xe2, 0x24, 0x7e, 0x38, 0x5f, 0x37, 0x8a, 0x53, 0xf8, 0xa1, 0x6c, 0x18, 0x45, + 0x80, 0x1f, 0x9e, 0x53, 0x37, 0x8a, 0xd3, 0xf8, 0xa1, 0x54, 0x36, 0x8a, 0x33, 0xe4, 0x41, 0x33, + 0x8a, 0xb3, 0xf8, 0xa1, 0x5e, 0x37, 0x8a, 0x73, 0xa4, 0xe4, 0xba, 0x51, 0x3c, 0x4a, 0xea, 0xaa, + 0x18, 0xc5, 0x22, 0x7e, 0x58, 0xa9, 0x1b, 0xc5, 0x63, 0x24, 0x73, 0xdd, 0x28, 0xaa, 0xa4, 0xd2, + 0xba, 0x51, 0xbc, 0x86, 0xe4, 0xa9, 0x1b, 0xc5, 0xe3, 0xa4, 0x8a, 0xba, 0x51, 0x3c, 0x41, 0xc8, + 0xd0, 0x8c, 0xe2, 0x49, 0x92, 0x47, 0x37, 0x8a, 0xd7, 0x92, 0x4f, 0x55, 0xa3, 0x78, 0x8a, 0x10, + 0xa6, 0x19, 0xc5, 0xeb, 0xc8, 0x83, 0x6e, 0x14, 0x21, 0xf9, 0x54, 0x32, 0x8a, 0xd7, 0xc3, 0xc7, + 0x81, 0xa9, 0x65, 0xe4, 0x51, 0x10, 0x61, 0x11, 0x28, 0xcb, 0xc8, 0xe3, 0xd5, 0xf8, 0xaf, 0x2a, + 0xe0, 0x5a, 0xb6, 0xf4, 0x5b, 0x72, 0x9d, 0x9d, 0x55, 0xb4, 0x65, 0x36, 0xaf, 0x6a, 0x57, 0xb0, + 0x0a, 0x05, 0xeb, 0x82, 0xe9, 0xaa, 0x13, 0x0e, 0x46, 0xe4, 0x39, 0x56, 0xe3, 0xf4, 0x8d, 0x51, + 0x4a, 0x68, 0x8c, 0x62, 0x1a, 0xd9, 0x3f, 0xf2, 0x12, 0x2d, 0xd8, 0x8f, 0x33, 0x3d, 0xf6, 0x63, + 0xdc, 0x4d, 0x3a, 0xc8, 0xed, 0x3a, 0xb6, 0xd9, 0xae, 0xb3, 0xed, 0x52, 0x6a, 0xf5, 0xea, 0x4d, + 0x56, 0x9f, 0xeb, 0xf7, 0x0c, 0xaa, 0x95, 0x3d, 0x2b, 0x6e, 0x85, 0xdb, 0xdb, 0xcc, 0x88, 0x4e, + 0xf2, 0x89, 0xa0, 0x93, 0x18, 0x42, 0x27, 0xb9, 0xff, 0x00, 0x65, 0x27, 0xeb, 0x2f, 0x95, 0xe1, + 0x96, 0x16, 0xa1, 0x33, 0xa1, 0x6f, 0xae, 0x56, 0xe0, 0x67, 0xb3, 0xe0, 0xa4, 0x66, 0xf7, 0xd3, + 0xf0, 0x79, 0x59, 0x78, 0x2b, 0x0f, 0xcd, 0xba, 0xc8, 0xd2, 0xbb, 0xfb, 0x36, 0xbb, 0x7f, 0x99, + 0x11, 0x1c, 0xfd, 0x54, 0xc0, 0xd1, 0xba, 0xc0, 0xd1, 0xfb, 0x86, 0x2f, 0x3a, 0x19, 0x43, 0xab, + 0x23, 0x1d, 0x80, 0x72, 0xf0, 0x1b, 0x39, 0xf0, 0x38, 0xea, 0xf1, 0xc0, 0x28, 0xa4, 0xbd, 0xac, + 0x64, 0xb7, 0x74, 0xd4, 0xf5, 0x4c, 0xd7, 0x13, 0x4e, 0xa1, 0xf6, 0x2c, 0xa5, 0x32, 0x29, 0x2c, + 0xa5, 0xb2, 0x03, 0x97, 0x52, 0xf0, 0xdd, 0xbc, 0xfa, 0x70, 0x41, 0xc4, 0xb8, 0xd4, 0x7f, 0xfc, + 0x8f, 0x6b, 0x61, 0x14, 0xd4, 0x81, 0x5e, 0xf1, 0x43, 0x02, 0xd4, 0x4b, 0x07, 0xae, 0x21, 0x19, + 0xe2, 0x7f, 0x30, 0x5a, 0x3d, 0x2f, 0xc7, 0x7f, 0x13, 0x95, 0x92, 0x62, 0x2b, 0x55, 0x05, 0xfd, + 0xd3, 0x13, 0x60, 0x8a, 0xf4, 0x85, 0x55, 0xcb, 0xbe, 0x04, 0x5f, 0xaf, 0x80, 0x99, 0x2a, 0xba, + 0x5c, 0xde, 0x36, 0xdb, 0x6d, 0x64, 0x6f, 0x21, 0x5e, 0x6d, 0x3f, 0x05, 0x26, 0xcc, 0x4e, 0xa7, + 0x1a, 0xee, 0x33, 0xf8, 0xaf, 0x6c, 0xfc, 0xfd, 0x7a, 0xdf, 0x4e, 0x9e, 0x89, 0xe9, 0xe4, 0x41, + 0xbd, 0xf3, 0x7c, 0x9d, 0x11, 0x2b, 0xe4, 0x33, 0x60, 0xba, 0xe9, 0x67, 0x09, 0xbc, 0xd5, 0xf9, + 0x24, 0xf8, 0xb7, 0x89, 0x86, 0x01, 0xa9, 0xca, 0x93, 0x09, 0x05, 0x1a, 0xb1, 0x1e, 0x72, 0x02, + 0x1c, 0x33, 0x6a, 0xb5, 0xc6, 0x5a, 0xa9, 0xfa, 0x60, 0x78, 0x4a, 0x74, 0x13, 0xbe, 0x3a, 0x07, + 0xe6, 0xea, 0x4e, 0x7b, 0x0f, 0x85, 0x30, 0x55, 0x42, 0x98, 0x7a, 0xf8, 0x94, 0xd9, 0xc7, 0x27, + 0xf5, 0x24, 0x28, 0x98, 0x76, 0xf7, 0x32, 0xf2, 0x75, 0x43, 0xf6, 0xc6, 0x60, 0xfc, 0x3d, 0xbe, + 0x1f, 0xeb, 0x22, 0x8c, 0xf7, 0x0c, 0xe0, 0xa4, 0x48, 0x55, 0x04, 0x90, 0x67, 0xc1, 0x4c, 0x97, + 0x6e, 0x16, 0x1a, 0xdc, 0x9e, 0xb0, 0x90, 0x46, 0x48, 0xa4, 0xbb, 0xd5, 0x0a, 0x23, 0x91, 0xbc, + 0xc1, 0xd7, 0x07, 0xdd, 0x7f, 0x43, 0x80, 0xb8, 0x74, 0x10, 0xc2, 0x92, 0x81, 0xfc, 0xda, 0x51, + 0xaf, 0xf0, 0x4e, 0x81, 0xe3, 0xac, 0xd7, 0x36, 0xca, 0x2b, 0xa5, 0xd5, 0x55, 0xad, 0xba, 0xac, + 0x35, 0x2a, 0x8b, 0x74, 0xab, 0x22, 0x4c, 0x29, 0x19, 0x86, 0xb6, 0xb6, 0x6e, 0xd4, 0x1b, 0xda, + 0xf3, 0xca, 0x9a, 0xb6, 0x48, 0x1c, 0x91, 0xc8, 0x49, 0x02, 0xdf, 0x65, 0xac, 0x54, 0xad, 0x5f, + 0xd0, 0xf4, 0xe2, 0xf6, 0xd9, 0x12, 0x98, 0xe6, 0xc6, 0x79, 0x4c, 0xdd, 0x22, 0xda, 0x34, 0x77, + 0xdb, 0x4c, 0x57, 0x2b, 0x1e, 0xc1, 0xd4, 0x11, 0xde, 0xd4, 0xec, 0xf6, 0xd5, 0x62, 0x46, 0x2d, + 0x82, 0x19, 0x7e, 0x48, 0x2f, 0x66, 0xe1, 0x77, 0xae, 0x07, 0x53, 0x17, 0x1c, 0xf7, 0x12, 0xf1, + 0x1e, 0x83, 0xef, 0xa3, 0xd1, 0x24, 0xfc, 0x73, 0x79, 0xdc, 0xc4, 0xfe, 0x5a, 0x79, 0x6f, 0x01, + 0xbf, 0xb4, 0xf9, 0x81, 0x67, 0xef, 0xce, 0x80, 0xe9, 0xcb, 0x7e, 0xee, 0xb0, 0xa7, 0x73, 0x49, + 0xf0, 0xbf, 0xca, 0xed, 0xff, 0x0f, 0xae, 0x32, 0xfd, 0xfd, 0xe9, 0xb7, 0x67, 0x41, 0x61, 0x19, + 0x79, 0xa5, 0x76, 0x9b, 0xe7, 0xdb, 0x2b, 0xa4, 0xcf, 0x53, 0x08, 0x8d, 0x28, 0xb5, 0xdb, 0xd1, + 0x9d, 0x8a, 0x63, 0x90, 0xef, 0xf7, 0x2b, 0xa4, 0xc1, 0x5f, 0x93, 0x3a, 0x09, 0x35, 0xa0, 0xc2, + 0xf4, 0x39, 0xf6, 0x26, 0x25, 0xd8, 0xe3, 0xfe, 0x69, 0x4e, 0xcb, 0x79, 0x6a, 0x18, 0x49, 0x24, + 0x13, 0xbf, 0x57, 0xee, 0xe7, 0x53, 0x1f, 0x00, 0x13, 0xbb, 0x5d, 0x54, 0x36, 0xbb, 0x88, 0xd0, + 0xd6, 0xdb, 0xd2, 0xda, 0xc5, 0x87, 0x50, 0xd3, 0x9b, 0xaf, 0xec, 0x60, 0x85, 0x7a, 0x83, 0x66, + 0x0c, 0x82, 0x73, 0xb0, 0x77, 0xdd, 0x2f, 0x01, 0xbe, 0x64, 0x08, 0xc8, 0x62, 0xf7, 0x7b, 0x23, + 0x8f, 0x5e, 0x25, 0x06, 0x6a, 0x04, 0x9b, 0xb4, 0xc3, 0x00, 0xf5, 0xe9, 0x2c, 0xc8, 0xd5, 0x3a, + 0xc8, 0x96, 0x73, 0x40, 0x7d, 0xbd, 0xbc, 0x97, 0x57, 0xd0, 0x30, 0x5c, 0x7a, 0x04, 0xf7, 0xce, + 0x81, 0x9c, 0x65, 0x6f, 0x3a, 0x4c, 0xc1, 0xbc, 0x3e, 0x62, 0x33, 0xa7, 0x62, 0x6f, 0x3a, 0x3a, + 0xc9, 0x28, 0xeb, 0xe0, 0x15, 0x57, 0x77, 0xfa, 0x2c, 0xfd, 0xe6, 0x24, 0x28, 0x50, 0xb1, 0x84, + 0x2f, 0x57, 0x80, 0x52, 0x6a, 0xb5, 0x22, 0x0e, 0x71, 0x64, 0xf7, 0x1d, 0xe2, 0x70, 0xc8, 0x6f, + 0x01, 0xdf, 0x83, 0x77, 0x31, 0x14, 0x84, 0xe4, 0x18, 0xcd, 0xba, 0x46, 0xa9, 0xd5, 0x8a, 0xf6, + 0x25, 0x0d, 0x2a, 0xcc, 0x8a, 0x15, 0xf2, 0x3d, 0x55, 0x91, 0xeb, 0xa9, 0x89, 0x07, 0xf4, 0x48, + 0xfa, 0xd2, 0x87, 0xe8, 0x1f, 0xb3, 0x60, 0x62, 0xd5, 0xea, 0x7a, 0x18, 0x9b, 0x92, 0x0c, 0x36, + 0x37, 0x80, 0x29, 0x9f, 0x35, 0x78, 0xe8, 0xc2, 0xe3, 0x72, 0x98, 0x00, 0xdf, 0xc0, 0xa3, 0xf3, + 0x1c, 0x11, 0x9d, 0xa7, 0xc5, 0xb7, 0x9e, 0x51, 0x11, 0xed, 0xa3, 0x1d, 0x56, 0x9b, 0xed, 0xad, + 0xf6, 0x37, 0x03, 0x86, 0xaf, 0x09, 0x0c, 0xbf, 0x6b, 0x98, 0x2a, 0xd3, 0x67, 0xfa, 0xe7, 0xb2, + 0x00, 0xe0, 0xba, 0xd9, 0x41, 0x98, 0x27, 0x0a, 0xc7, 0x5b, 0x63, 0xb8, 0xfb, 0x6a, 0x9e, 0xbb, + 0x6b, 0x22, 0x77, 0x9f, 0x31, 0xb8, 0xa9, 0x71, 0x07, 0x5e, 0xd4, 0x22, 0x50, 0xac, 0x80, 0xb5, + 0xf8, 0x11, 0xbe, 0x3d, 0x60, 0xea, 0xba, 0xc0, 0xd4, 0x7b, 0x86, 0xac, 0x29, 0x7d, 0xbe, 0xfe, + 0x65, 0x16, 0x4c, 0xd4, 0x91, 0x87, 0x87, 0x49, 0x78, 0x5e, 0xe6, 0xc8, 0x09, 0xd7, 0xb7, 0xb3, + 0x92, 0x7d, 0xfb, 0xdb, 0x19, 0xd9, 0x30, 0x19, 0x21, 0x67, 0x18, 0x4d, 0x11, 0x46, 0x80, 0x37, + 0x4a, 0x85, 0xc9, 0x18, 0x54, 0x5a, 0xfa, 0xdc, 0x7d, 0x6b, 0x36, 0xd8, 0x60, 0x7f, 0x92, 0xb0, + 0x40, 0xe3, 0xd5, 0xdb, 0xcc, 0x7e, 0xf5, 0xf6, 0x9f, 0x32, 0xc9, 0x55, 0x8d, 0xb8, 0xdd, 0xe5, + 0xc4, 0x0a, 0xc5, 0x08, 0x36, 0x7e, 0x87, 0xe1, 0xd7, 0x0b, 0x14, 0x50, 0x60, 0x16, 0xe2, 0xfb, + 0xe2, 0x2d, 0xc4, 0x83, 0x97, 0x08, 0xef, 0x1d, 0x42, 0x5d, 0x8b, 0x33, 0xdb, 0x06, 0x64, 0x64, + 0x39, 0x32, 0x6e, 0x07, 0x79, 0x12, 0xc7, 0x8f, 0xcd, 0x73, 0xe1, 0x9e, 0xbd, 0x5f, 0x84, 0x86, + 0xbf, 0xea, 0x34, 0x53, 0x62, 0x14, 0x46, 0x60, 0xe9, 0x1d, 0x06, 0x85, 0x97, 0x7d, 0x34, 0x13, + 0x28, 0x21, 0xef, 0xcd, 0x31, 0x15, 0xef, 0x63, 0x62, 0x44, 0x81, 0xa6, 0x63, 0x7b, 0xe8, 0x0a, + 0x67, 0x5b, 0x0f, 0x12, 0x62, 0x35, 0x83, 0x53, 0x60, 0xc2, 0x73, 0x79, 0x7b, 0xbb, 0xff, 0xca, + 0x8f, 0x38, 0x79, 0x71, 0xc4, 0xa9, 0x82, 0xb3, 0x96, 0xdd, 0x6c, 0xef, 0xb6, 0x90, 0x8e, 0xda, + 0x26, 0x6e, 0x55, 0xb7, 0xd4, 0x5d, 0x44, 0x1d, 0x64, 0xb7, 0x90, 0xed, 0x51, 0x3a, 0x7d, 0xdf, + 0x5a, 0x89, 0x9c, 0xf0, 0x6b, 0xbc, 0x60, 0xdc, 0x2b, 0x0a, 0xc6, 0x13, 0xfb, 0xad, 0x0f, 0x62, + 0x94, 0xd0, 0xbb, 0x00, 0xa0, 0x6d, 0x3b, 0x6f, 0xa1, 0xcb, 0x6c, 0x40, 0xbc, 0xae, 0x47, 0x15, + 0xad, 0x05, 0x19, 0x74, 0x2e, 0x33, 0xfc, 0x52, 0x20, 0x0c, 0xf7, 0x0b, 0xc2, 0x70, 0xbb, 0x24, + 0x09, 0xc9, 0xe4, 0xa0, 0x33, 0x84, 0xcd, 0x62, 0x16, 0x4c, 0x85, 0x96, 0x46, 0x45, 0xbd, 0x0e, + 0x9c, 0xf0, 0x7d, 0x17, 0xaa, 0x9a, 0xb6, 0x58, 0x6f, 0x6c, 0xac, 0x2f, 0xeb, 0xa5, 0x45, 0xad, + 0x08, 0x54, 0x15, 0xcc, 0xd5, 0x16, 0x9e, 0xa3, 0x95, 0x8d, 0xc0, 0xe5, 0x20, 0x07, 0xff, 0x3c, + 0x0b, 0xf2, 0xc4, 0x31, 0x1c, 0xfe, 0xc8, 0x88, 0x24, 0xa7, 0x2b, 0xec, 0xd4, 0x04, 0xeb, 0x0a, + 0xf9, 0x48, 0x7f, 0x8c, 0x99, 0x84, 0xaa, 0x03, 0x45, 0xfa, 0x8b, 0x29, 0x28, 0xfd, 0xee, 0x89, + 0xbb, 0x64, 0x7d, 0xdb, 0xb9, 0xfc, 0xef, 0xb9, 0x4b, 0xe2, 0xf6, 0x1f, 0x72, 0x97, 0xec, 0x43, + 0xc2, 0xd8, 0xbb, 0x64, 0x9f, 0x7e, 0x17, 0xd3, 0x4d, 0xe1, 0xdf, 0xe6, 0x02, 0xc3, 0xca, 0xff, + 0x75, 0x30, 0xc3, 0x4a, 0x09, 0xcc, 0x5a, 0xb6, 0x87, 0x5c, 0xdb, 0x6c, 0x2f, 0xb5, 0xcd, 0x2d, + 0xff, 0xf8, 0x71, 0xef, 0x2a, 0xbc, 0xc2, 0xe5, 0xd1, 0xc5, 0x3f, 0xd4, 0xd3, 0x00, 0x78, 0x68, + 0xa7, 0xd3, 0x36, 0xbd, 0x50, 0xf4, 0xb8, 0x14, 0x5e, 0xfa, 0x72, 0xa2, 0xf4, 0x3d, 0x05, 0x5c, + 0x43, 0x41, 0x33, 0xae, 0x76, 0xd0, 0x86, 0x6d, 0xfd, 0xe8, 0x2e, 0x09, 0x40, 0x43, 0x65, 0xb4, + 0xdf, 0x27, 0xf8, 0x3f, 0xa4, 0x8f, 0x51, 0xfa, 0x3d, 0x7b, 0xc0, 0x31, 0xca, 0xa0, 0x37, 0x29, + 0x3d, 0xbd, 0x29, 0x50, 0x08, 0x72, 0x12, 0x0a, 0x01, 0xcf, 0xf9, 0xbc, 0xa4, 0x32, 0xfd, 0x3a, + 0xa9, 0x73, 0x9a, 0x71, 0xcd, 0x48, 0x7f, 0x84, 0x7a, 0x9f, 0x02, 0xe6, 0x68, 0xd5, 0x0b, 0x8e, + 0x73, 0x69, 0xc7, 0x74, 0x2f, 0xf1, 0x6b, 0x8b, 0x21, 0xc4, 0x2d, 0xda, 0x52, 0xf6, 0x29, 0x1e, + 0xd9, 0x65, 0x11, 0xd9, 0xa7, 0x46, 0xb3, 0xc4, 0xa7, 0x6b, 0x3c, 0xc6, 0x8d, 0x37, 0x07, 0x98, + 0x3d, 0x47, 0xc0, 0xec, 0x07, 0x13, 0x13, 0x98, 0x3e, 0x76, 0x7f, 0x14, 0x60, 0xe7, 0x0f, 0xd8, + 0xa9, 0x61, 0xf7, 0xe5, 0xe1, 0xb0, 0xf3, 0xe9, 0x1a, 0x02, 0xbb, 0x22, 0x50, 0x2e, 0x05, 0x5b, + 0x4a, 0xf8, 0x91, 0x6f, 0x50, 0x2e, 0x3d, 0x34, 0x23, 0x48, 0x1e, 0x0b, 0x9a, 0xc7, 0x45, 0x12, + 0x6a, 0x9d, 0x54, 0x31, 0xfd, 0xa2, 0xb4, 0xbd, 0xa5, 0x2f, 0x83, 0x28, 0x75, 0xe3, 0xe9, 0x95, + 0x72, 0xc6, 0x1a, 0x79, 0x32, 0xd3, 0x47, 0xf3, 0x1f, 0x72, 0x60, 0xca, 0x3f, 0xcc, 0xea, 0xc1, + 0x3f, 0xe5, 0xa6, 0xf0, 0x93, 0xa0, 0xd0, 0x75, 0x76, 0xdd, 0x26, 0x62, 0x16, 0x30, 0xf6, 0x36, + 0x84, 0xb5, 0x66, 0xe0, 0xbc, 0xbc, 0x6f, 0xea, 0xcf, 0x25, 0x9e, 0xfa, 0x23, 0x15, 0x4b, 0xf8, + 0x12, 0xe9, 0xd0, 0x83, 0x02, 0x2e, 0x75, 0xe4, 0x3d, 0x16, 0xe7, 0xea, 0x0f, 0x49, 0xad, 0xf7, + 0x07, 0xb4, 0x24, 0x99, 0x58, 0xd5, 0x86, 0x50, 0x2a, 0xaf, 0x07, 0xd7, 0xfa, 0x39, 0x98, 0x36, + 0x49, 0xb4, 0xc7, 0x0d, 0x7d, 0xb5, 0xa8, 0xc0, 0x17, 0xe4, 0x40, 0x91, 0x92, 0x56, 0x0b, 0x14, + 0x2b, 0xf8, 0x8a, 0x43, 0xd7, 0x1e, 0xa3, 0x97, 0x83, 0x9f, 0xc9, 0xca, 0x86, 0x37, 0x12, 0x18, + 0x1f, 0xb6, 0x2e, 0x42, 0x92, 0x86, 0xe8, 0x4a, 0x31, 0xc2, 0x07, 0x7f, 0x23, 0x23, 0x13, 0x2d, + 0x49, 0x8e, 0xc4, 0xf4, 0x47, 0x9e, 0x37, 0xe4, 0xfc, 0xb8, 0x03, 0x4b, 0xae, 0xb3, 0xb3, 0xe1, + 0xb6, 0xe1, 0x87, 0xa5, 0x82, 0xd1, 0x45, 0xa8, 0xea, 0xd9, 0x48, 0x55, 0x1d, 0x4f, 0xd1, 0xbb, + 0x6e, 0xdb, 0x9f, 0xa2, 0x77, 0xdd, 0xf6, 0x10, 0x53, 0xb4, 0x7a, 0x0b, 0x98, 0x33, 0x5b, 0xad, + 0x75, 0x73, 0x0b, 0x95, 0xf1, 0x1a, 0xd8, 0xf6, 0xd8, 0x99, 0xe4, 0x9e, 0xd4, 0x04, 0x3b, 0x63, + 0x02, 0x10, 0x8c, 0x07, 0x8f, 0xa5, 0x9d, 0x31, 0x09, 0xfa, 0xd2, 0x97, 0x92, 0x4f, 0x64, 0xc1, + 0xac, 0xaf, 0xb8, 0x2e, 0x21, 0xaf, 0xb9, 0x0d, 0xef, 0x92, 0xb5, 0x50, 0x30, 0xd8, 0xb3, 0x01, + 0xec, 0xf0, 0x7b, 0x99, 0x84, 0xd8, 0x08, 0x35, 0x47, 0x98, 0x77, 0x12, 0x31, 0x33, 0xae, 0xc0, + 0xf4, 0x99, 0xf9, 0xa5, 0x2c, 0x00, 0x86, 0x13, 0x2c, 0xa0, 0x0e, 0xc0, 0xc9, 0x97, 0x49, 0x87, + 0x29, 0x67, 0x0d, 0x0f, 0xab, 0x4d, 0x2e, 0xe2, 0x92, 0x7b, 0x33, 0x83, 0x6a, 0x4a, 0x9f, 0xbf, + 0x1f, 0xc8, 0x82, 0xa9, 0xc5, 0xdd, 0x4e, 0xdb, 0x6a, 0x9a, 0x5e, 0xef, 0x86, 0x62, 0x34, 0x7b, + 0xc9, 0x7d, 0x23, 0x89, 0x34, 0x94, 0xa0, 0x8e, 0x08, 0x5e, 0xd2, 0xd3, 0x96, 0x59, 0xff, 0xb4, + 0xa5, 0xe4, 0x26, 0xc1, 0x80, 0xc2, 0xc7, 0x20, 0x9e, 0x0a, 0x38, 0x5a, 0xeb, 0x20, 0x7b, 0xc1, + 0x45, 0x66, 0xab, 0xe9, 0xee, 0xee, 0x5c, 0xec, 0xf2, 0xbb, 0xe1, 0xf1, 0x32, 0xca, 0xd9, 0x1c, + 0xb3, 0x82, 0xcd, 0x11, 0xfe, 0x94, 0x22, 0x7b, 0xf6, 0x97, 0xb3, 0x8c, 0x73, 0x34, 0x0c, 0x31, + 0x26, 0x27, 0xda, 0xc3, 0xe9, 0x31, 0x2f, 0xe6, 0x92, 0x98, 0x17, 0xdf, 0x22, 0x75, 0x92, 0x58, + 0xaa, 0x5d, 0x63, 0xd9, 0x8a, 0x9b, 0xab, 0x23, 0x2f, 0x02, 0xde, 0x9b, 0xc1, 0xec, 0xc5, 0xf0, + 0x4b, 0x00, 0xb1, 0x98, 0xd8, 0x67, 0x83, 0xfc, 0xad, 0x49, 0x97, 0xfc, 0x22, 0x09, 0x11, 0xe8, + 0x06, 0x08, 0x66, 0x65, 0x76, 0xe1, 0x12, 0xad, 0xdf, 0x63, 0xeb, 0x4f, 0x1f, 0x85, 0x8f, 0x66, + 0xc1, 0x34, 0xb9, 0x45, 0x65, 0xe1, 0x2a, 0x71, 0xcf, 0x7e, 0x82, 0x10, 0x6a, 0x2b, 0xd2, 0xe3, + 0xe7, 0xc5, 0x3c, 0x9b, 0x55, 0x90, 0x6b, 0x5b, 0xf6, 0x25, 0x7f, 0xfb, 0x14, 0x3f, 0x87, 0x31, + 0xf9, 0xb3, 0x7d, 0x62, 0xf2, 0x07, 0x06, 0xee, 0xa0, 0xde, 0x03, 0x5d, 0x12, 0x35, 0xb0, 0xb8, + 0xf4, 0xd9, 0xf8, 0xc7, 0x39, 0x50, 0xa8, 0x23, 0xd3, 0x6d, 0x6e, 0xc3, 0x57, 0x73, 0x07, 0xdd, + 0x97, 0xc0, 0xc4, 0xa6, 0xd5, 0xf6, 0x90, 0x4b, 0x1d, 0x47, 0xf8, 0x01, 0x9c, 0x76, 0xe4, 0x85, + 0xb6, 0xd3, 0xbc, 0x34, 0xcf, 0xb4, 0xc5, 0x79, 0x3f, 0x66, 0xd0, 0xfc, 0x12, 0xf9, 0x49, 0xf7, + 0x7f, 0x56, 0xef, 0x07, 0xf9, 0xae, 0xe3, 0x7a, 0x51, 0x41, 0x38, 0x23, 0x4a, 0xa9, 0x3b, 0xae, + 0xa7, 0xd3, 0x1f, 0x31, 0x98, 0x9b, 0xbb, 0xed, 0xb6, 0x81, 0xae, 0x78, 0xfe, 0x4a, 0xc1, 0x7f, + 0xc7, 0x6b, 0x7b, 0x67, 0x73, 0xb3, 0x8b, 0xe8, 0x3a, 0x35, 0xaf, 0xb3, 0x37, 0xf5, 0x38, 0xc8, + 0xb7, 0xad, 0x1d, 0x8b, 0xea, 0xb6, 0x79, 0x9d, 0xbe, 0xa8, 0xb7, 0x81, 0x62, 0xa8, 0x56, 0x53, + 0x42, 0x4f, 0x15, 0x48, 0x07, 0xdc, 0x97, 0x8e, 0x25, 0xe3, 0x12, 0xba, 0xda, 0x3d, 0x35, 0x41, + 0xbe, 0x93, 0x67, 0xd1, 0x4b, 0x4f, 0xc6, 0x54, 0x4e, 0xf9, 0x1a, 0xbd, 0x68, 0x72, 0x51, 0xd3, + 0x71, 0x5b, 0x3e, 0x6f, 0xa2, 0xf5, 0x5d, 0x96, 0x2f, 0x99, 0x81, 0xbb, 0x6f, 0xe5, 0xe9, 0xcb, + 0xd3, 0x2b, 0x0b, 0x78, 0x70, 0xc4, 0x55, 0x5f, 0xb0, 0xbc, 0xed, 0x35, 0xe4, 0x99, 0xf0, 0x8f, + 0x95, 0xff, 0x4f, 0xae, 0x62, 0xe4, 0x8a, 0x9e, 0xf9, 0xf6, 0x76, 0x5d, 0x1b, 0x73, 0x8b, 0x45, + 0x59, 0xe2, 0x52, 0xd4, 0x7b, 0xc0, 0x75, 0xe1, 0x9b, 0x6f, 0x67, 0x5b, 0x64, 0x6b, 0xa5, 0x29, + 0x92, 0x3d, 0x3a, 0x83, 0xba, 0x0e, 0x6e, 0xa2, 0x1f, 0x57, 0x8c, 0xb5, 0xd5, 0x15, 0x6b, 0x6b, + 0xbb, 0x6d, 0x6d, 0x6d, 0x7b, 0xdd, 0x8a, 0xdd, 0xf5, 0x90, 0xd9, 0xaa, 0x6d, 0xea, 0x34, 0x48, + 0x2e, 0x20, 0xe5, 0xc8, 0x64, 0x15, 0xdd, 0x47, 0xe4, 0x66, 0x2a, 0x5e, 0x1e, 0x22, 0xfa, 0xc3, + 0x0f, 0xe2, 0xfe, 0xd0, 0xdd, 0x6d, 0x07, 0x98, 0xde, 0xd0, 0x83, 0x69, 0x28, 0xd0, 0xbb, 0x6d, + 0xd2, 0x29, 0x48, 0xe6, 0xa4, 0x73, 0x56, 0x0c, 0x25, 0xe9, 0x77, 0x8e, 0xff, 0xa7, 0x00, 0xf2, + 0xcb, 0xae, 0xd9, 0xd9, 0x86, 0x2f, 0x48, 0x61, 0xac, 0x0d, 0xa4, 0x33, 0x3b, 0x48, 0x3a, 0x95, + 0x01, 0xd2, 0x99, 0xe3, 0xa4, 0x33, 0x7a, 0xab, 0xfb, 0x2c, 0x98, 0x69, 0x3a, 0xed, 0x36, 0x6a, + 0x62, 0x7e, 0x54, 0x5a, 0x24, 0x30, 0xc8, 0x94, 0x2e, 0xa4, 0x91, 0xe8, 0x69, 0xc8, 0xab, 0x53, + 0x03, 0x2c, 0x15, 0xfa, 0x30, 0x01, 0xbe, 0x22, 0x0b, 0x72, 0x5a, 0x6b, 0x0b, 0x09, 0x46, 0xda, + 0x0c, 0x67, 0xa4, 0x3d, 0x09, 0x0a, 0x9e, 0xe9, 0x6e, 0x21, 0xcf, 0x3f, 0x8e, 0x43, 0xdf, 0x82, + 0xa0, 0x6e, 0x0a, 0x17, 0xd4, 0xed, 0x19, 0x20, 0x87, 0x79, 0xc6, 0xc2, 0xa5, 0xdc, 0xd4, 0x0f, + 0x7e, 0xc2, 0xfb, 0x79, 0x5c, 0xe3, 0x3c, 0x6e, 0xb5, 0x4e, 0x7e, 0xe8, 0xc5, 0x3a, 0xbf, 0x0f, + 0x6b, 0x72, 0xdf, 0x47, 0xd3, 0xb1, 0x2b, 0x3b, 0xe6, 0x16, 0x62, 0xcd, 0x0c, 0x13, 0xfc, 0xaf, + 0xda, 0x8e, 0xf3, 0x90, 0xc5, 0xe2, 0xab, 0x85, 0x09, 0xb8, 0x09, 0xdb, 0x56, 0xab, 0x85, 0x6c, + 0xd6, 0xb3, 0xd9, 0xdb, 0xd9, 0xd3, 0x20, 0x87, 0x69, 0xc0, 0xf2, 0x83, 0x27, 0xfe, 0xe2, 0x11, + 0x75, 0x06, 0x77, 0x2b, 0xda, 0x79, 0x8b, 0x19, 0xd1, 0x58, 0x27, 0xe3, 0xbb, 0x41, 0x1b, 0xd7, + 0xbf, 0x73, 0x3d, 0x19, 0xe4, 0x6d, 0xa7, 0x85, 0x06, 0x4e, 0x35, 0x34, 0x97, 0xfa, 0x34, 0x90, + 0x47, 0x2d, 0x3c, 0x2a, 0x28, 0x24, 0xfb, 0xe9, 0x78, 0x5e, 0xea, 0x34, 0x73, 0x32, 0x07, 0x91, + 0x7e, 0xd4, 0xa6, 0xdf, 0x01, 0x7f, 0x65, 0x02, 0x1c, 0xa5, 0x63, 0x40, 0x7d, 0xf7, 0x22, 0x2e, + 0xea, 0x22, 0x82, 0x8f, 0x28, 0x42, 0x14, 0xc9, 0xee, 0xee, 0xc5, 0x40, 0x6d, 0xa4, 0x2f, 0x7c, + 0x07, 0xcd, 0x8e, 0x64, 0xd2, 0x52, 0x86, 0x9d, 0xb4, 0x84, 0x09, 0x48, 0xf1, 0xbb, 0x78, 0x38, + 0x5d, 0x15, 0x48, 0xb2, 0x3f, 0x5d, 0xf5, 0x9b, 0x6c, 0x4e, 0x81, 0x09, 0x73, 0xd3, 0x43, 0x6e, + 0xa5, 0x45, 0xe4, 0x71, 0x4a, 0xf7, 0x5f, 0xf1, 0x84, 0x78, 0x11, 0x6d, 0x3a, 0x2e, 0xee, 0xe9, + 0x53, 0x74, 0x42, 0xf4, 0xdf, 0xb9, 0xfe, 0x09, 0x84, 0x4d, 0x94, 0x5b, 0xc1, 0x51, 0x6b, 0xcb, + 0x76, 0x5c, 0x14, 0x78, 0xe6, 0x9d, 0x9a, 0xa1, 0x87, 0xc5, 0x7b, 0x92, 0xd5, 0xdb, 0xc1, 0x31, + 0xdb, 0x59, 0x44, 0x1d, 0xc6, 0x77, 0x8a, 0xea, 0x2c, 0xe9, 0x11, 0xfb, 0x3f, 0xec, 0x1b, 0x5a, + 0xe6, 0xf6, 0x0f, 0x2d, 0xf0, 0xd3, 0x49, 0xd7, 0xc3, 0x3d, 0xc0, 0x8f, 0x4c, 0x2f, 0x53, 0x9f, + 0x05, 0x66, 0x5a, 0xcc, 0x6f, 0xa7, 0x69, 0x05, 0xbd, 0x26, 0xf2, 0x3f, 0x21, 0x73, 0x28, 0x72, + 0x39, 0x5e, 0xe4, 0x96, 0xc1, 0x24, 0x39, 0xa5, 0x81, 0x65, 0x2e, 0xdf, 0x13, 0x8c, 0x8e, 0x2c, + 0xd9, 0x82, 0x46, 0x71, 0x6c, 0x9b, 0x2f, 0xb3, 0x5f, 0xf4, 0xe0, 0xe7, 0x64, 0x2b, 0xeb, 0x78, + 0x0e, 0xa5, 0xdf, 0x3d, 0x3f, 0x93, 0x03, 0x47, 0x97, 0x5d, 0x67, 0xb7, 0xd3, 0x0d, 0xbb, 0xe7, + 0x5f, 0xf7, 0xb7, 0xa6, 0x17, 0xc4, 0xb9, 0xa8, 0x7f, 0xc7, 0x3d, 0x03, 0xa6, 0x5d, 0x36, 0xa2, + 0x86, 0xb6, 0x75, 0x3e, 0x89, 0xef, 0xda, 0xca, 0x41, 0xba, 0x76, 0xd8, 0x41, 0x72, 0x42, 0x07, + 0xe9, 0x15, 0xe4, 0x7c, 0x1f, 0x41, 0xfe, 0xab, 0x6c, 0x42, 0x41, 0xee, 0x61, 0x51, 0x84, 0x20, + 0x97, 0x41, 0x61, 0x8b, 0x64, 0x64, 0x72, 0xfc, 0x24, 0xb9, 0x96, 0x91, 0xc2, 0x75, 0xf6, 0x6b, + 0xc8, 0x57, 0x85, 0xe3, 0x6b, 0x32, 0xa1, 0x8a, 0xa7, 0x36, 0x7d, 0xa1, 0x7a, 0x67, 0x0e, 0xcc, + 0x04, 0xb5, 0x93, 0x83, 0x0f, 0x99, 0x41, 0x03, 0xfe, 0x3e, 0xeb, 0x4c, 0x30, 0x94, 0x2a, 0xdc, + 0x50, 0xda, 0x67, 0xf0, 0x9b, 0x4e, 0x30, 0xf8, 0xcd, 0x44, 0x0c, 0x7e, 0xf0, 0xc7, 0x15, 0xd9, + 0xa0, 0xc5, 0xe2, 0x18, 0x40, 0x5a, 0xf7, 0x58, 0x1e, 0xd5, 0x24, 0x43, 0x27, 0x0f, 0x6e, 0x55, + 0xfa, 0x42, 0xf3, 0xc1, 0x2c, 0x38, 0x46, 0x47, 0xc3, 0x0d, 0xbb, 0x1b, 0x8c, 0x45, 0x8f, 0x17, + 0xdd, 0x0a, 0x70, 0x9b, 0xba, 0x81, 0x5b, 0x01, 0x79, 0x13, 0x8d, 0xe0, 0xb1, 0x67, 0x96, 0x84, + 0x31, 0x97, 0xab, 0x25, 0xc2, 0xa2, 0x24, 0x77, 0x2a, 0x49, 0xb2, 0xd0, 0xf4, 0x19, 0xf8, 0x8b, + 0x0a, 0x98, 0xaa, 0x23, 0x6f, 0xd5, 0xbc, 0xea, 0xec, 0x7a, 0xd0, 0x94, 0x35, 0x7f, 0x3f, 0x13, + 0x14, 0xda, 0xe4, 0x17, 0x76, 0x03, 0xd7, 0x99, 0xbe, 0xf6, 0x63, 0xb2, 0xd1, 0x4b, 0x8b, 0xd6, + 0x59, 0x7e, 0xf1, 0xb0, 0x98, 0xcc, 0xee, 0x43, 0x40, 0xdd, 0x48, 0x4c, 0xa7, 0x89, 0xf6, 0x26, + 0xa2, 0xaa, 0x4e, 0x1f, 0x96, 0x9f, 0x52, 0xc0, 0x6c, 0x1d, 0x79, 0x95, 0xee, 0x92, 0xb9, 0xe7, + 0xb8, 0x96, 0x87, 0xf8, 0xcb, 0x20, 0xe2, 0xa1, 0x39, 0x0d, 0x80, 0x15, 0xfc, 0xc6, 0xa2, 0x81, + 0x73, 0x29, 0xf0, 0x37, 0x92, 0xee, 0x18, 0x0b, 0x74, 0x8c, 0x04, 0x84, 0x44, 0x7b, 0x98, 0x71, + 0xd5, 0xa7, 0x0f, 0xc4, 0xe7, 0xb3, 0x0c, 0x88, 0x92, 0xdb, 0xdc, 0xb6, 0xf6, 0x50, 0x2b, 0x21, + 0x10, 0xfe, 0x6f, 0x21, 0x10, 0x41, 0x41, 0x89, 0xb7, 0x87, 0x05, 0x3a, 0x46, 0xb1, 0x3d, 0x1c, + 0x57, 0xe0, 0x58, 0x4e, 0xa1, 0xe2, 0xa1, 0x87, 0xd9, 0x18, 0xee, 0x93, 0x65, 0x6b, 0xa8, 0xc2, + 0x65, 0x79, 0x15, 0x6e, 0xa8, 0x81, 0x85, 0xd6, 0x3d, 0x48, 0xa6, 0x73, 0x69, 0x0c, 0x2c, 0x7d, + 0xab, 0x4e, 0x9f, 0xe9, 0xef, 0x51, 0xc0, 0x89, 0x40, 0xe1, 0xa9, 0x23, 0x6f, 0xd1, 0xec, 0x6e, + 0x5f, 0x74, 0x4c, 0xb7, 0xc5, 0xdf, 0xcc, 0x36, 0xf4, 0x51, 0x0c, 0xf8, 0x17, 0x3c, 0x08, 0x55, + 0x11, 0x84, 0xbe, 0x7e, 0x41, 0x7d, 0x69, 0x19, 0xc5, 0x20, 0x13, 0xeb, 0xba, 0xf4, 0x5b, 0x01, + 0x58, 0xcf, 0x15, 0xc0, 0xba, 0x77, 0x58, 0x12, 0xd3, 0x07, 0xee, 0x97, 0xe9, 0x8c, 0xc0, 0xb9, + 0xb0, 0x3d, 0x28, 0x0b, 0x58, 0x84, 0x0b, 0x93, 0x12, 0x7d, 0xda, 0x60, 0x98, 0x39, 0x62, 0xa0, + 0xfb, 0x59, 0xba, 0x73, 0xc4, 0x21, 0xba, 0x96, 0xbd, 0x53, 0x01, 0x45, 0x72, 0x3e, 0x97, 0x73, + 0xef, 0x83, 0x0f, 0xc9, 0xa2, 0xb3, 0xcf, 0x95, 0x70, 0x22, 0xa9, 0x2b, 0x21, 0x7c, 0x47, 0x52, + 0x87, 0xc1, 0x5e, 0x6a, 0x47, 0x82, 0x58, 0x22, 0x7f, 0xc0, 0x01, 0x14, 0xa4, 0x0f, 0xda, 0x7f, + 0x56, 0x00, 0xc0, 0x1d, 0x9a, 0xf9, 0xa8, 0x3d, 0x4f, 0x16, 0xae, 0x73, 0xbc, 0x13, 0x25, 0x06, + 0xea, 0x44, 0x0f, 0x50, 0xb4, 0xc4, 0xd0, 0xfb, 0xed, 0x8d, 0x49, 0x7d, 0x97, 0x42, 0xaa, 0x46, + 0x02, 0x4b, 0x22, 0x6f, 0xa6, 0xc8, 0xba, 0xd3, 0x07, 0xe4, 0xb7, 0xb3, 0x20, 0x6f, 0x38, 0x75, + 0xe4, 0x1d, 0x5c, 0x15, 0x48, 0x7c, 0x9e, 0x92, 0xd4, 0x3b, 0x8a, 0xf3, 0x94, 0xfd, 0x0a, 0x4a, + 0x9f, 0x75, 0x8f, 0x64, 0xc1, 0x8c, 0xe1, 0x94, 0x03, 0x63, 0x95, 0xbc, 0x2f, 0x98, 0xfc, 0xc5, + 0x4b, 0x41, 0x03, 0xc3, 0x6a, 0x0e, 0x74, 0xf1, 0xd2, 0xe0, 0xf2, 0xd2, 0xe7, 0xdb, 0x5d, 0xe0, + 0xe8, 0x86, 0xdd, 0x72, 0x74, 0xd4, 0x72, 0x98, 0x49, 0x56, 0x55, 0x41, 0x6e, 0xd7, 0x6e, 0x39, + 0x84, 0xe4, 0xbc, 0x4e, 0x9e, 0x71, 0x9a, 0x8b, 0x5a, 0x0e, 0xdb, 0xaf, 0x23, 0xcf, 0xf0, 0x6b, + 0x0a, 0xc8, 0xe1, 0x7f, 0xe5, 0x59, 0xfd, 0x4e, 0x25, 0xe1, 0x09, 0x51, 0x5c, 0xfc, 0x48, 0x34, + 0xa1, 0xfb, 0x38, 0x23, 0x35, 0xf5, 0x10, 0xbb, 0x29, 0xaa, 0x3e, 0x8e, 0x15, 0xa1, 0x71, 0x5a, + 0x3d, 0x05, 0x26, 0x2e, 0xb6, 0x9d, 0xe6, 0xa5, 0xf0, 0x20, 0x23, 0x7b, 0x55, 0x6f, 0x03, 0x79, + 0xd7, 0xb4, 0xb7, 0x10, 0x33, 0x7e, 0x1f, 0xef, 0x19, 0x0b, 0xc9, 0x4e, 0xb4, 0x4e, 0xb3, 0xc0, + 0x77, 0x24, 0x39, 0x9b, 0xda, 0xa7, 0xf1, 0xc9, 0xe4, 0x61, 0x71, 0x88, 0x63, 0x04, 0x45, 0x30, + 0x53, 0x2e, 0xd1, 0x2b, 0xce, 0xd6, 0x6a, 0xe7, 0xb5, 0xa2, 0x42, 0x60, 0xc6, 0x3c, 0x49, 0x11, + 0x66, 0x5c, 0xfc, 0xbf, 0x5b, 0x98, 0xfb, 0x34, 0xfe, 0x30, 0x60, 0xfe, 0x44, 0x16, 0xcc, 0xae, + 0x5a, 0x5d, 0x2f, 0xca, 0x9b, 0x36, 0x26, 0x3c, 0xcf, 0x4b, 0x92, 0xaa, 0xca, 0x42, 0x3d, 0xd2, + 0x71, 0x79, 0x12, 0xa9, 0xc3, 0x71, 0x55, 0x8c, 0xc7, 0xed, 0x9b, 0x50, 0x40, 0xaf, 0x25, 0x92, + 0xe6, 0x64, 0x62, 0x45, 0x29, 0xac, 0x64, 0xfc, 0x8a, 0x52, 0x64, 0xdd, 0xe9, 0xf3, 0xf7, 0x6b, + 0x59, 0x70, 0x0c, 0x57, 0x1f, 0x67, 0x96, 0x8a, 0x66, 0xf3, 0x40, 0xb3, 0x54, 0x62, 0xcb, 0xf8, + 0x3e, 0x5a, 0x46, 0x61, 0x19, 0x1f, 0x54, 0xe8, 0x98, 0xd9, 0x1c, 0x61, 0x86, 0x1d, 0xc4, 0xe6, + 0x18, 0x33, 0xec, 0xf0, 0x6c, 0x8e, 0x37, 0xc5, 0x0e, 0xc9, 0xe6, 0x43, 0x33, 0xb0, 0xfe, 0x9a, + 0x12, 0xb0, 0x39, 0xd2, 0xb6, 0x11, 0xc3, 0xe6, 0xc4, 0xc7, 0xb3, 0xe0, 0xbb, 0x86, 0x64, 0xfc, + 0x88, 0xed, 0x1b, 0xc3, 0xc0, 0x74, 0x88, 0x36, 0x8e, 0x57, 0x2a, 0x60, 0x8e, 0x51, 0xd1, 0x7f, + 0xc9, 0x1c, 0x83, 0x51, 0xe2, 0x25, 0x73, 0x62, 0x1f, 0x7b, 0x91, 0xb2, 0xf1, 0xfb, 0xd8, 0xc7, + 0xd6, 0x9f, 0x3e, 0x38, 0x5f, 0xcf, 0x81, 0x93, 0x98, 0x84, 0x35, 0xa7, 0x65, 0x6d, 0x5e, 0xa5, + 0x54, 0x9c, 0x37, 0xdb, 0xbb, 0xa8, 0x0b, 0xdf, 0x97, 0x95, 0x45, 0xe9, 0xff, 0x07, 0x80, 0xd3, + 0x41, 0x2e, 0x8d, 0x70, 0xc3, 0x80, 0xba, 0x27, 0xaa, 0xb1, 0xfb, 0x6b, 0x0a, 0xa2, 0xce, 0xd6, + 0xfc, 0x42, 0x74, 0xae, 0x3c, 0xac, 0x15, 0x4e, 0x05, 0x5f, 0x7a, 0x1d, 0x3e, 0x32, 0xfb, 0x1d, + 0x3e, 0x6e, 0x05, 0x8a, 0xd9, 0x6a, 0x05, 0x50, 0xf5, 0x6e, 0x66, 0x93, 0x3a, 0x75, 0x9c, 0x05, + 0xe7, 0xec, 0xa2, 0xf0, 0xe8, 0x4b, 0x44, 0xce, 0x2e, 0xf2, 0xd4, 0x79, 0x50, 0xa0, 0x57, 0x34, + 0x05, 0x16, 0xfd, 0xfe, 0x99, 0x59, 0x2e, 0x51, 0xb5, 0xab, 0x89, 0x62, 0x78, 0x57, 0x22, 0xce, + 0xf4, 0x1b, 0xa7, 0x43, 0x3d, 0x59, 0x17, 0x04, 0xec, 0xd9, 0x43, 0x97, 0x3c, 0x9e, 0xdd, 0xb0, + 0x52, 0xa7, 0xd3, 0xbe, 0x6a, 0xb0, 0xd3, 0xf4, 0x89, 0x76, 0xc3, 0xb8, 0x43, 0xf9, 0xd9, 0xde, + 0x43, 0xf9, 0xc9, 0x77, 0xc3, 0x04, 0x3a, 0x46, 0xb1, 0x1b, 0x16, 0x57, 0xe0, 0x18, 0xec, 0x91, + 0x79, 0xaa, 0x35, 0xb3, 0xe0, 0x81, 0x6f, 0xce, 0xf6, 0x75, 0xa7, 0x02, 0xa2, 0x3b, 0x55, 0xbf, + 0xb8, 0x82, 0xb1, 0x41, 0x53, 0xd5, 0xa7, 0x81, 0xc2, 0xa6, 0xe3, 0xee, 0x98, 0xfe, 0xc6, 0x7d, + 0xaf, 0xf7, 0x36, 0x0b, 0xd8, 0xb7, 0x44, 0xf2, 0xe8, 0x2c, 0x2f, 0x5e, 0x8f, 0x3c, 0xdf, 0xea, + 0xb0, 0x70, 0x58, 0xf8, 0x51, 0xbd, 0x19, 0xcc, 0xb2, 0xa8, 0x58, 0x55, 0xd4, 0xf5, 0x50, 0x8b, + 0x1d, 0x4f, 0x16, 0x13, 0xd5, 0xb3, 0x60, 0x86, 0x25, 0x2c, 0x59, 0x6d, 0xd4, 0x65, 0x77, 0x12, + 0x0a, 0x69, 0xea, 0x49, 0x50, 0xb0, 0xba, 0xcf, 0xe9, 0x3a, 0x36, 0xf1, 0xc9, 0x9d, 0xd4, 0xd9, + 0x1b, 0x71, 0xdb, 0xa1, 0xf9, 0x02, 0x65, 0x95, 0x3a, 0xd1, 0xf7, 0x26, 0xc3, 0xcf, 0x0e, 0xb3, + 0x70, 0x48, 0x1c, 0x28, 0x11, 0xa3, 0xb0, 0xdb, 0x6c, 0x22, 0xd4, 0x62, 0xa7, 0x0d, 0xfc, 0xd7, + 0x84, 0x21, 0x14, 0x13, 0x2f, 0x33, 0x0e, 0x29, 0x86, 0xe2, 0x87, 0x4f, 0x80, 0x02, 0x8d, 0x2b, + 0x0e, 0x5f, 0x3e, 0xd7, 0x57, 0x18, 0xe7, 0x44, 0x61, 0xdc, 0x00, 0x33, 0xb6, 0x83, 0xab, 0x5b, + 0x37, 0x5d, 0x73, 0xa7, 0x1b, 0x67, 0x45, 0xa4, 0xe5, 0x06, 0x53, 0x46, 0x95, 0xfb, 0x6d, 0xe5, + 0x88, 0x2e, 0x14, 0xa3, 0xfe, 0xff, 0xc1, 0xd1, 0x8b, 0xec, 0x84, 0x6d, 0x97, 0x95, 0x9c, 0x8d, + 0xf6, 0xb9, 0xeb, 0x29, 0x79, 0x41, 0xfc, 0x73, 0xe5, 0x88, 0xde, 0x5b, 0x98, 0xfa, 0xc3, 0x60, + 0x0e, 0xbf, 0xb6, 0x9c, 0xcb, 0x3e, 0xe1, 0x4a, 0xb4, 0xa2, 0xd1, 0x53, 0xfc, 0x9a, 0xf0, 0xe3, + 0xca, 0x11, 0xbd, 0xa7, 0x28, 0xb5, 0x06, 0xc0, 0xb6, 0xb7, 0xd3, 0x66, 0x05, 0xe7, 0xa2, 0x45, + 0xb2, 0xa7, 0xe0, 0x95, 0xe0, 0xa7, 0x95, 0x23, 0x3a, 0x57, 0x84, 0xba, 0x0a, 0xa6, 0xbc, 0x2b, + 0x1e, 0x2b, 0x2f, 0x1f, 0xbd, 0xb9, 0xdd, 0x53, 0x9e, 0xe1, 0xff, 0xb3, 0x72, 0x44, 0x0f, 0x0b, + 0x50, 0x2b, 0x60, 0xb2, 0x73, 0x91, 0x15, 0x56, 0xe8, 0x73, 0x97, 0x72, 0xff, 0xc2, 0xd6, 0x2f, + 0x06, 0x65, 0x05, 0xbf, 0x63, 0xc2, 0x9a, 0xdd, 0x3d, 0x56, 0xd6, 0x84, 0x34, 0x61, 0x65, 0xff, + 0x1f, 0x4c, 0x58, 0x50, 0x80, 0x5a, 0x01, 0x53, 0x5d, 0xdb, 0xec, 0x74, 0xb7, 0x1d, 0xaf, 0x7b, + 0x6a, 0xb2, 0xc7, 0x2f, 0x32, 0xba, 0xb4, 0x3a, 0xfb, 0x47, 0x0f, 0xff, 0x56, 0x9f, 0x06, 0x4e, + 0xec, 0x92, 0xfb, 0xd9, 0xb4, 0x2b, 0x56, 0xd7, 0xb3, 0xec, 0x2d, 0x3f, 0xb8, 0x1f, 0x1d, 0x4d, + 0xfa, 0x7f, 0x54, 0xe7, 0xd9, 0x29, 0x05, 0x40, 0xfa, 0x26, 0xec, 0xdd, 0x8c, 0xa3, 0xd5, 0x72, + 0x87, 0x13, 0x9e, 0x05, 0x72, 0xf8, 0x13, 0xf1, 0x2c, 0x9c, 0xeb, 0x6f, 0xe8, 0xeb, 0x95, 0x1d, + 0xd2, 0x81, 0xf1, 0x4f, 0x78, 0x6e, 0xb4, 0x9d, 0x75, 0xd7, 0xd9, 0x72, 0x51, 0xb7, 0xcb, 0x1c, + 0x0e, 0xb9, 0x14, 0xdc, 0xc1, 0xad, 0xee, 0x9a, 0xb5, 0x45, 0xb5, 0x27, 0xe6, 0x8e, 0xcd, 0x27, + 0xd1, 0xd5, 0x66, 0x15, 0x5d, 0x26, 0x77, 0x7e, 0x9d, 0x3a, 0xea, 0xaf, 0x36, 0xfd, 0x14, 0x78, + 0x0b, 0x98, 0xe1, 0x3b, 0x19, 0xbd, 0x9c, 0xc4, 0x0a, 0x75, 0x2f, 0xf6, 0x06, 0x6f, 0x06, 0x73, + 0xa2, 0x4c, 0x73, 0x53, 0x8c, 0xe2, 0x0f, 0x85, 0xf0, 0x26, 0x70, 0xb4, 0xa7, 0x63, 0xf9, 0x67, + 0xf6, 0x33, 0xe1, 0x99, 0xfd, 0x33, 0x00, 0x84, 0x52, 0xdc, 0xb7, 0x98, 0x1b, 0xc1, 0x54, 0x20, + 0x97, 0x7d, 0x33, 0x7c, 0x25, 0x03, 0x26, 0x7d, 0x61, 0xeb, 0x97, 0x01, 0xcf, 0x2f, 0x36, 0xb7, + 0x81, 0xc0, 0x96, 0xd9, 0x42, 0x1a, 0x9e, 0x47, 0x42, 0x37, 0x5e, 0xc3, 0xf2, 0xda, 0xfe, 0x71, + 0x94, 0xde, 0x64, 0x75, 0x1d, 0x00, 0x8b, 0x60, 0x64, 0x84, 0xe7, 0x53, 0x9e, 0x92, 0xa0, 0x3f, + 0x50, 0x79, 0xe0, 0xca, 0x38, 0xfb, 0x78, 0x76, 0x78, 0x64, 0x0a, 0xe4, 0xeb, 0xeb, 0xa5, 0xb2, + 0x56, 0x3c, 0xa2, 0xce, 0x01, 0xa0, 0x3d, 0x6f, 0x5d, 0xd3, 0x2b, 0x5a, 0xb5, 0xac, 0x15, 0x33, + 0xf0, 0x55, 0x59, 0x30, 0x15, 0x74, 0x82, 0xbe, 0x8d, 0xd4, 0x98, 0x68, 0x0d, 0xbc, 0xff, 0x61, + 0x7f, 0xa7, 0xe2, 0x85, 0xec, 0x99, 0xe0, 0xda, 0xdd, 0x2e, 0x5a, 0xb2, 0xdc, 0xae, 0xa7, 0x3b, + 0x97, 0x97, 0x1c, 0x37, 0x08, 0x67, 0xe9, 0xdf, 0x73, 0x1c, 0xf1, 0x19, 0x6b, 0x14, 0x2d, 0x44, + 0x8e, 0x30, 0x20, 0x97, 0x59, 0x86, 0xc3, 0x04, 0x5c, 0xae, 0x47, 0x2f, 0x16, 0xee, 0x22, 0xdd, + 0xb9, 0xdc, 0x2d, 0xd9, 0xad, 0xb2, 0xd3, 0xde, 0xdd, 0xb1, 0xbb, 0x4c, 0x27, 0x88, 0xfa, 0x8c, + 0xb9, 0x43, 0x6e, 0x77, 0x99, 0x03, 0xa0, 0x5c, 0x5b, 0x5d, 0xd5, 0xca, 0x46, 0xa5, 0x56, 0x2d, + 0x1e, 0xc1, 0xdc, 0x32, 0x4a, 0x0b, 0xab, 0x98, 0x3b, 0x3f, 0x02, 0x26, 0xfd, 0x3e, 0xbd, 0xef, + 0x52, 0xe7, 0x12, 0x98, 0xf4, 0x7b, 0x39, 0x9b, 0x11, 0x9e, 0xd0, 0x7b, 0x14, 0x6d, 0xc7, 0x74, + 0x3d, 0xe2, 0x3f, 0xed, 0x17, 0xb2, 0x60, 0x76, 0x91, 0x1e, 0xfc, 0x76, 0xf6, 0xc9, 0x8c, 0x02, + 0x15, 0xcc, 0x95, 0x56, 0x57, 0x1b, 0x35, 0xbd, 0x51, 0xad, 0x19, 0x2b, 0x95, 0xea, 0x32, 0x9d, + 0x21, 0x2b, 0xcb, 0xd5, 0x9a, 0xae, 0xd1, 0x09, 0xb2, 0x5e, 0xcc, 0xd0, 0xdb, 0x85, 0x16, 0x26, + 0x41, 0xa1, 0x43, 0xb8, 0x0b, 0xbf, 0xa8, 0x24, 0x3c, 0x69, 0x1a, 0xe0, 0x14, 0x71, 0xff, 0x89, + 0xe0, 0x83, 0x9e, 0xed, 0x73, 0x4e, 0xeb, 0x2c, 0x98, 0xa1, 0xba, 0x5c, 0x97, 0x98, 0xef, 0xd9, + 0x15, 0x82, 0x42, 0x1a, 0xfc, 0x68, 0x36, 0xc1, 0xf1, 0xd3, 0xbe, 0x14, 0x25, 0x53, 0x2e, 0xfe, + 0x6c, 0x98, 0xdb, 0x84, 0x54, 0x30, 0x57, 0xa9, 0x1a, 0x9a, 0x5e, 0x2d, 0xad, 0xb2, 0x2c, 0x8a, + 0x7a, 0x0a, 0x1c, 0xaf, 0xd6, 0x58, 0x00, 0xa7, 0x3a, 0xb9, 0xb7, 0x74, 0x6d, 0xbd, 0xa6, 0x1b, + 0xc5, 0xbc, 0x7a, 0x12, 0xa8, 0xf4, 0x59, 0xb8, 0xf6, 0xb7, 0xa0, 0x3e, 0x11, 0xdc, 0xb4, 0x5a, + 0x59, 0xab, 0x18, 0x8d, 0xda, 0x52, 0x43, 0xaf, 0x5d, 0xa8, 0x63, 0x04, 0x75, 0x6d, 0xb5, 0x84, + 0x05, 0x89, 0xbb, 0x65, 0x68, 0x42, 0xbd, 0x06, 0x1c, 0x25, 0x37, 0x88, 0x91, 0xab, 0x83, 0x69, + 0x7d, 0x93, 0xea, 0x0d, 0xe0, 0x54, 0xa5, 0x5a, 0xdf, 0x58, 0x5a, 0xaa, 0x94, 0x2b, 0x5a, 0xd5, + 0x68, 0xac, 0x6b, 0xfa, 0x5a, 0xa5, 0x5e, 0xc7, 0xff, 0x16, 0xa7, 0xe0, 0x87, 0x15, 0x50, 0xa0, + 0x63, 0x26, 0x7c, 0xaf, 0x02, 0x66, 0xcf, 0x9b, 0x6d, 0x0b, 0x4f, 0x14, 0xe4, 0x72, 0x27, 0x78, + 0xa3, 0xe0, 0x9a, 0xee, 0x91, 0x4b, 0xa0, 0x98, 0x6b, 0x3a, 0x79, 0x81, 0x3f, 0xc9, 0x8b, 0x86, + 0x21, 0x8a, 0xc6, 0xb3, 0x63, 0x80, 0xa0, 0x35, 0xce, 0x0b, 0xb5, 0x45, 0x2c, 0x6e, 0x5e, 0x17, + 0xe0, 0x7c, 0x41, 0xc0, 0xb9, 0x7c, 0xb0, 0xe2, 0x93, 0x81, 0xff, 0x2b, 0xa3, 0x02, 0xbf, 0x08, + 0x66, 0x36, 0xaa, 0xa5, 0x0d, 0x63, 0xa5, 0xa6, 0x57, 0x7e, 0x88, 0x84, 0x81, 0x9d, 0x05, 0x53, + 0x4b, 0x35, 0x7d, 0xa1, 0xb2, 0xb8, 0xa8, 0x55, 0x8b, 0x79, 0xf5, 0x5a, 0x70, 0x4d, 0x5d, 0xd3, + 0xcf, 0x57, 0xca, 0x5a, 0x63, 0xa3, 0x5a, 0x3a, 0x5f, 0xaa, 0xac, 0x92, 0x31, 0xa2, 0x10, 0x73, + 0x31, 0xd5, 0x04, 0xfc, 0xb1, 0x1c, 0x00, 0xb4, 0xe9, 0x58, 0x93, 0xe6, 0xaf, 0x2f, 0xfa, 0xf3, + 0xa4, 0x8b, 0x86, 0xb0, 0x98, 0x88, 0xfe, 0x5b, 0x01, 0x93, 0x2e, 0xfb, 0xc0, 0xcc, 0x27, 0x83, + 0xca, 0xa1, 0x8f, 0x7e, 0x69, 0x7a, 0xf0, 0x3b, 0x7c, 0x5f, 0x92, 0x35, 0x42, 0x24, 0x61, 0xc9, + 0x90, 0x5c, 0x1a, 0x0d, 0x90, 0xf0, 0xc5, 0x19, 0x30, 0x27, 0x36, 0x0c, 0x37, 0x82, 0x28, 0x53, + 0x72, 0x8d, 0x10, 0x7f, 0xe6, 0x94, 0xac, 0xb3, 0x77, 0xb2, 0xe9, 0x14, 0xf8, 0x3d, 0x93, 0x9e, + 0xc6, 0xf4, 0x35, 0x96, 0x62, 0x06, 0x13, 0x8f, 0x95, 0x0e, 0x7a, 0x77, 0xad, 0x71, 0xc5, 0x2b, + 0x2a, 0xf0, 0x91, 0x1c, 0x98, 0x15, 0xee, 0x47, 0x82, 0xff, 0x94, 0x91, 0xb9, 0xf3, 0x84, 0xbb, + 0x79, 0x29, 0x73, 0xd0, 0x9b, 0x97, 0xce, 0xfe, 0x44, 0x06, 0x4c, 0xb0, 0x44, 0xc2, 0xe0, 0x5a, + 0x15, 0xeb, 0x02, 0x47, 0xc1, 0xf4, 0xb2, 0x66, 0x34, 0xea, 0x46, 0x49, 0x37, 0xb4, 0xc5, 0x62, + 0x46, 0x3d, 0x01, 0x8e, 0xad, 0x6b, 0x7a, 0xbd, 0x86, 0xf9, 0xb9, 0xae, 0xd7, 0xc8, 0x40, 0x48, + 0xd9, 0x8c, 0x61, 0x58, 0xd5, 0x16, 0x97, 0xb5, 0xc6, 0x42, 0xa9, 0xae, 0x15, 0x15, 0xfc, 0x6f, + 0xb5, 0x66, 0x68, 0xf5, 0xc6, 0x62, 0xa5, 0xa4, 0x3f, 0x58, 0xcc, 0xe1, 0x7f, 0xeb, 0x86, 0x5e, + 0x32, 0xb4, 0xe5, 0x4a, 0x99, 0xdc, 0xf8, 0x8b, 0x7b, 0x40, 0x1e, 0x4f, 0xa6, 0xda, 0xda, 0xba, + 0xf1, 0x60, 0xb1, 0x90, 0xdc, 0xab, 0xaf, 0xb7, 0x71, 0x63, 0xf6, 0xea, 0x8b, 0xab, 0x7e, 0x0c, + 0x57, 0x43, 0x29, 0xa0, 0x48, 0x29, 0xd0, 0xae, 0x74, 0x90, 0x6b, 0x21, 0xbb, 0x89, 0xe0, 0x25, + 0x99, 0x90, 0x71, 0xfb, 0xe2, 0x57, 0x91, 0x39, 0x82, 0xd3, 0x3c, 0xe9, 0x4b, 0x8f, 0xd2, 0x9e, + 0xdb, 0xa7, 0xb4, 0x7f, 0x2a, 0xa9, 0x5b, 0x5f, 0x2f, 0xb9, 0x23, 0x81, 0xec, 0xe3, 0x49, 0xdc, + 0xfa, 0x06, 0x50, 0x30, 0x96, 0x48, 0x90, 0x11, 0x73, 0x7a, 0x51, 0x81, 0x6f, 0x9f, 0x02, 0x45, + 0x4a, 0x28, 0xe7, 0x2b, 0xf5, 0x8b, 0xec, 0x92, 0xaa, 0x46, 0x82, 0xd0, 0x4f, 0xfe, 0xd1, 0xdc, + 0xac, 0x78, 0x34, 0x57, 0x30, 0xbd, 0x29, 0xbd, 0xfb, 0xdb, 0x49, 0xbb, 0x1f, 0xe7, 0x18, 0x15, + 0x7d, 0x45, 0x52, 0x7a, 0xdd, 0x2f, 0xb6, 0xfa, 0xf1, 0x5c, 0xa4, 0xc2, 0xae, 0x4a, 0xd2, 0x64, + 0x91, 0x89, 0xbf, 0x2f, 0x2a, 0xa9, 0x97, 0xac, 0xe0, 0x98, 0x16, 0x73, 0x89, 0x52, 0x7a, 0x5e, + 0xb2, 0x83, 0x28, 0x48, 0x1f, 0x85, 0xef, 0x65, 0x41, 0xae, 0xee, 0xb8, 0xde, 0xa8, 0x30, 0x48, + 0xba, 0xb3, 0xc7, 0x71, 0xa0, 0x1e, 0xbd, 0x72, 0x4a, 0x6f, 0x67, 0x2f, 0xbe, 0xfe, 0x31, 0x44, + 0xcf, 0x3a, 0x0a, 0xe6, 0x28, 0x25, 0x41, 0x2c, 0xf3, 0xef, 0x66, 0xe9, 0x78, 0xf5, 0x80, 0x2c, + 0x22, 0x67, 0xc1, 0x0c, 0xb7, 0xb3, 0x16, 0xdc, 0xab, 0xc9, 0xa7, 0xc1, 0x5f, 0xe7, 0x71, 0x59, + 0x14, 0x71, 0xe9, 0xb7, 0x6e, 0x0c, 0xc2, 0x81, 0x8f, 0x6a, 0x64, 0x4a, 0x12, 0x88, 0x2b, 0xa6, + 0xf2, 0xf4, 0x11, 0x79, 0xa1, 0x02, 0x0a, 0xcc, 0xb3, 0x69, 0xa4, 0x08, 0x24, 0xed, 0x19, 0x01, + 0x13, 0xe4, 0x3c, 0xa0, 0x94, 0x51, 0xf7, 0x8c, 0xf8, 0xfa, 0xd3, 0xc7, 0xe1, 0x5f, 0x99, 0xcb, + 0x5e, 0x69, 0xcf, 0xb4, 0xda, 0xe6, 0xc5, 0x76, 0x82, 0x00, 0x98, 0x1f, 0x4d, 0x78, 0x48, 0x29, + 0x68, 0xaa, 0x50, 0x5f, 0x04, 0xc7, 0x9f, 0x0e, 0xa6, 0xdc, 0xc0, 0xb0, 0xe6, 0x9f, 0xe1, 0xee, + 0x71, 0x97, 0x64, 0xdf, 0xf5, 0x30, 0x67, 0xa2, 0x13, 0x49, 0x52, 0xf4, 0x8c, 0xe5, 0x04, 0xc5, + 0x74, 0xa9, 0xd5, 0x5a, 0x42, 0xa6, 0xb7, 0xeb, 0xa2, 0x56, 0xa2, 0x29, 0x42, 0x64, 0xd1, 0x14, + 0xcf, 0x09, 0x21, 0x6c, 0xd5, 0xaa, 0x88, 0xce, 0x0f, 0x0e, 0x18, 0x0d, 0x7c, 0x5a, 0x46, 0x32, + 0x24, 0xbd, 0x2d, 0x80, 0xa4, 0x26, 0x40, 0xf2, 0xac, 0xe1, 0x88, 0x48, 0x1f, 0x90, 0x5f, 0x52, + 0xc0, 0x1c, 0xd5, 0x13, 0x46, 0x8d, 0xc9, 0xef, 0x26, 0xf4, 0x84, 0xe0, 0x6e, 0x8b, 0xe0, 0xc9, + 0x19, 0x09, 0x2c, 0x49, 0xfc, 0x26, 0xe4, 0xe8, 0x48, 0x1f, 0x99, 0xcf, 0x16, 0x00, 0xe0, 0xbc, + 0xdb, 0x3e, 0x5a, 0x08, 0x43, 0x48, 0xc1, 0x77, 0xb0, 0xf5, 0x47, 0x5d, 0x88, 0x4d, 0xca, 0x79, + 0xae, 0x05, 0xdb, 0x2a, 0x62, 0xa2, 0xd4, 0xac, 0xf2, 0x67, 0x09, 0x75, 0x5e, 0xe6, 0x5b, 0x36, + 0x70, 0x72, 0x1f, 0x72, 0x94, 0x7b, 0x34, 0x81, 0xf2, 0x3b, 0x88, 0x94, 0x64, 0xa8, 0xad, 0x0e, + 0xb1, 0x96, 0x3c, 0x05, 0x8e, 0xeb, 0x5a, 0x69, 0xb1, 0x56, 0x5d, 0x7d, 0x90, 0xbf, 0x56, 0xa0, + 0xa8, 0xf0, 0x8b, 0x93, 0x54, 0x60, 0x7b, 0x43, 0xc2, 0x31, 0x50, 0xe4, 0x55, 0xdc, 0x6a, 0x85, + 0x5b, 0xce, 0x0f, 0x1e, 0xd5, 0x24, 0x8a, 0x3d, 0x4c, 0x14, 0xde, 0x32, 0xc5, 0x75, 0xa3, 0x9f, + 0x56, 0x40, 0x31, 0xbc, 0x85, 0x96, 0xdd, 0x11, 0x53, 0x13, 0x9d, 0xdf, 0x3a, 0x74, 0x17, 0x25, + 0x74, 0x7e, 0xf3, 0x13, 0xd4, 0x5b, 0xc0, 0x5c, 0x73, 0x1b, 0x35, 0x2f, 0x55, 0x6c, 0x7f, 0x77, + 0x98, 0x6e, 0x25, 0xf6, 0xa4, 0x8a, 0xc0, 0x3c, 0x20, 0x02, 0x23, 0x2e, 0xa2, 0x85, 0x49, 0x9a, + 0x27, 0x2a, 0x02, 0x97, 0x3f, 0x0c, 0x70, 0xa9, 0x0a, 0xb8, 0xdc, 0x3d, 0x54, 0xa9, 0xc9, 0x60, + 0xa9, 0x0e, 0x01, 0x0b, 0x04, 0x27, 0x6b, 0xeb, 0x46, 0xa5, 0x56, 0x6d, 0x6c, 0xd4, 0xb5, 0xc5, + 0xc6, 0x82, 0x0f, 0x4e, 0xbd, 0xa8, 0xc0, 0x6f, 0x64, 0xc1, 0x04, 0x25, 0xab, 0xdb, 0x73, 0x6b, + 0x6c, 0xbc, 0xd7, 0x1f, 0x7c, 0xbb, 0xf4, 0x19, 0xfe, 0x80, 0x11, 0xac, 0x9e, 0x88, 0x71, 0xea, + 0x99, 0x60, 0x82, 0x82, 0xec, 0x3b, 0x8d, 0x9c, 0x8e, 0x18, 0xa5, 0x58, 0x31, 0xba, 0x9f, 0x5d, + 0xf2, 0x3c, 0xff, 0x00, 0x32, 0xd2, 0x9f, 0x59, 0xde, 0xa4, 0x50, 0x35, 0xf8, 0x82, 0xe5, 0x6d, + 0x13, 0xa7, 0x40, 0xf8, 0x5c, 0x19, 0x13, 0xe5, 0xed, 0x20, 0xbf, 0x87, 0x73, 0x0f, 0x70, 0xb0, + 0xa4, 0x99, 0xe0, 0x87, 0xa4, 0x23, 0x5f, 0x09, 0xf2, 0x19, 0xd0, 0x14, 0xbd, 0xe1, 0x39, 0x68, + 0x24, 0x54, 0xa1, 0x70, 0xa8, 0x49, 0xb9, 0x55, 0x49, 0x1c, 0x33, 0x4d, 0x8a, 0xa4, 0xb1, 0xac, + 0xe4, 0x27, 0x56, 0xac, 0xae, 0xe7, 0xb8, 0x57, 0xe1, 0x1b, 0x33, 0x60, 0xe2, 0x3c, 0x72, 0xbb, + 0x96, 0x63, 0xef, 0xdb, 0xd5, 0x3e, 0x03, 0xa6, 0x3b, 0x2e, 0xda, 0xb3, 0x9c, 0xdd, 0x6e, 0x68, + 0x41, 0xe1, 0x93, 0x30, 0x4b, 0xcc, 0x5d, 0x6f, 0xdb, 0x71, 0xc3, 0xc0, 0x06, 0xfe, 0xbb, 0x7a, + 0x1a, 0x00, 0xfa, 0x5c, 0x35, 0x77, 0x10, 0xdb, 0xab, 0xe7, 0x52, 0x54, 0x15, 0xe4, 0x3c, 0x6b, + 0x07, 0xb1, 0xb8, 0x84, 0xe4, 0x19, 0x4b, 0x09, 0x89, 0x22, 0xc6, 0xa2, 0xb5, 0x29, 0xba, 0xff, + 0x0a, 0xff, 0xab, 0x02, 0xa6, 0x97, 0x91, 0xc7, 0x48, 0xed, 0xf2, 0xe1, 0x81, 0x62, 0x62, 0x77, + 0xe3, 0x79, 0xb0, 0x6d, 0x76, 0xfd, 0xdf, 0x02, 0x33, 0xa9, 0x98, 0x18, 0xc6, 0x48, 0x54, 0xb8, + 0x30, 0xa8, 0xf0, 0x91, 0xac, 0xec, 0x81, 0x54, 0xc6, 0xcc, 0x79, 0x8e, 0xc0, 0xc8, 0x41, 0x60, + 0x72, 0x8f, 0xe5, 0xd8, 0x17, 0xb3, 0x96, 0x2f, 0x89, 0x15, 0xa3, 0x07, 0xb9, 0x25, 0x8f, 0xb2, + 0x0e, 0xa6, 0x24, 0x7d, 0xf1, 0xfa, 0xb6, 0x02, 0xa6, 0xeb, 0xdb, 0xce, 0x65, 0x46, 0x00, 0x7f, + 0x63, 0x6d, 0x1c, 0x54, 0x37, 0x80, 0xa9, 0xbd, 0x1e, 0x98, 0xc2, 0x84, 0xe8, 0x8b, 0x55, 0xe1, + 0xc3, 0x4a, 0x52, 0x98, 0x38, 0xe2, 0x46, 0x7e, 0xed, 0xa9, 0xfa, 0x83, 0x60, 0x82, 0x51, 0xcd, + 0x0c, 0x1d, 0xf1, 0x00, 0xfb, 0x99, 0xf9, 0x06, 0xe6, 0xc4, 0x06, 0x26, 0x43, 0x3e, 0xba, 0x71, + 0x63, 0x88, 0x0c, 0x9f, 0x25, 0x81, 0x0c, 0x7c, 0xe0, 0xcb, 0x23, 0x00, 0x1e, 0x7e, 0x27, 0x23, + 0x6b, 0x0e, 0x0c, 0x38, 0x10, 0x50, 0x70, 0xa0, 0x48, 0xfb, 0x03, 0x8b, 0x4b, 0x9f, 0x9f, 0xaf, + 0xca, 0x81, 0x99, 0x45, 0x6b, 0x73, 0x33, 0x18, 0xf5, 0x5e, 0x9a, 0x91, 0x63, 0x69, 0xf4, 0x56, + 0x32, 0xd6, 0x2e, 0x77, 0x5d, 0x17, 0xd9, 0x7e, 0xa3, 0x58, 0x77, 0xea, 0x49, 0x55, 0x6f, 0x05, + 0x47, 0xfd, 0x81, 0xde, 0xcf, 0x48, 0xc5, 0xb2, 0x37, 0x19, 0x7e, 0x4b, 0x7a, 0x2f, 0xc9, 0xe7, + 0x28, 0xdf, 0xa4, 0x88, 0x0e, 0x78, 0x0f, 0x98, 0xdd, 0xa6, 0xb9, 0xc9, 0x82, 0xdb, 0x1f, 0x2c, + 0x4f, 0xf6, 0x44, 0x34, 0x5d, 0x43, 0xdd, 0xae, 0xb9, 0x85, 0x74, 0x31, 0x73, 0x4f, 0xf7, 0x55, + 0x92, 0x5c, 0x2b, 0x22, 0xb7, 0x2d, 0x25, 0xd1, 0x92, 0xf4, 0xa5, 0xe3, 0xab, 0x8f, 0x07, 0xb9, + 0x25, 0xab, 0x8d, 0xe0, 0xcf, 0x64, 0xc1, 0x94, 0x8e, 0x9a, 0x8e, 0xdd, 0xc4, 0x6f, 0x9c, 0x63, + 0xc9, 0x3f, 0xf0, 0x7d, 0xe7, 0x7e, 0x11, 0x9a, 0xdb, 0x84, 0x06, 0xe1, 0x72, 0xe6, 0x83, 0x32, + 0x22, 0xfa, 0xcd, 0xeb, 0x03, 0xde, 0x94, 0x05, 0xde, 0x9c, 0x93, 0x2f, 0x6a, 0x0c, 0x01, 0xd3, + 0xb1, 0xc2, 0xbf, 0xb9, 0xd9, 0x76, 0x4c, 0xc1, 0xe4, 0xd4, 0xab, 0xdb, 0xdc, 0x06, 0x8a, 0xfe, + 0xf9, 0x00, 0xc7, 0x5b, 0xb7, 0x6c, 0x3b, 0x38, 0x80, 0xba, 0x2f, 0x5d, 0xdc, 0x2d, 0x8d, 0x8d, + 0xe1, 0x41, 0xda, 0xce, 0x6a, 0x8f, 0x90, 0xec, 0x5b, 0xc0, 0xdc, 0xc5, 0xab, 0x1e, 0xea, 0xb2, + 0x5c, 0xac, 0xda, 0x9c, 0xde, 0x93, 0x0a, 0xdf, 0x23, 0x15, 0xeb, 0x23, 0xa6, 0xc2, 0x64, 0xac, + 0x5e, 0x19, 0x62, 0xdd, 0x75, 0x1c, 0x14, 0xab, 0xb5, 0x45, 0x8d, 0xf8, 0x39, 0xf9, 0x8e, 0x23, + 0x5b, 0xf0, 0x65, 0x0a, 0x98, 0x21, 0x4e, 0x03, 0x3e, 0x0a, 0x37, 0x49, 0xac, 0x02, 0xe0, 0x97, + 0xa4, 0x7d, 0xa0, 0x48, 0x93, 0xf9, 0x0a, 0xa2, 0x19, 0xbd, 0x69, 0xb5, 0x7b, 0x19, 0x9d, 0xd7, + 0x7b, 0x52, 0xfb, 0x00, 0xa2, 0xf4, 0x05, 0xe4, 0x77, 0xa4, 0x1c, 0xa1, 0x06, 0x51, 0x77, 0x58, + 0xa8, 0x7c, 0x40, 0x01, 0xd3, 0x78, 0xd5, 0xe1, 0x83, 0x52, 0x13, 0x40, 0x71, 0xec, 0xf6, 0xd5, + 0xd0, 0x18, 0xe1, 0xbf, 0x26, 0xea, 0x24, 0x7f, 0x29, 0xbd, 0x5e, 0x26, 0x2c, 0xe2, 0x68, 0x19, + 0x13, 0x7e, 0xef, 0x97, 0x5a, 0x45, 0x0f, 0x20, 0xee, 0xb0, 0xe0, 0xfb, 0xcd, 0x3c, 0x28, 0x6c, + 0x74, 0x08, 0x72, 0x5f, 0xcb, 0xca, 0x44, 0xb7, 0xde, 0xe7, 0x04, 0x8f, 0xd5, 0xac, 0xb6, 0xd3, + 0x34, 0xdb, 0xeb, 0xe1, 0x69, 0xa2, 0x30, 0x41, 0xbd, 0x9b, 0xf9, 0xc5, 0xd1, 0xa3, 0x58, 0xb7, + 0xc4, 0x06, 0x7e, 0x26, 0x3c, 0xe2, 0x0e, 0x1c, 0xdc, 0x0e, 0x8e, 0xb5, 0xac, 0xae, 0x79, 0xb1, + 0x8d, 0x34, 0xbb, 0xe9, 0x5e, 0xa5, 0xec, 0xa0, 0x3e, 0x44, 0xfb, 0x3f, 0xa8, 0xf7, 0x82, 0x7c, + 0xd7, 0xbb, 0xda, 0xa6, 0x0b, 0x3f, 0xfe, 0x7c, 0x42, 0x64, 0x55, 0x75, 0x9c, 0x5d, 0xa7, 0x7f, + 0xf1, 0x97, 0x3e, 0x4e, 0x48, 0x5e, 0x60, 0x79, 0x27, 0x28, 0x38, 0xae, 0xb5, 0x65, 0xd1, 0xfb, + 0x14, 0xe6, 0xf6, 0xc5, 0x33, 0xa3, 0xaa, 0x40, 0x8d, 0x64, 0xd1, 0x59, 0x56, 0xf8, 0xfe, 0xac, + 0x6c, 0xf0, 0x14, 0x42, 0x23, 0x05, 0x67, 0x3c, 0x97, 0x58, 0xbe, 0x56, 0x2a, 0xac, 0x49, 0x34, + 0x59, 0xe9, 0x4f, 0xc2, 0x9f, 0xcb, 0x82, 0xc9, 0x45, 0xe7, 0xb2, 0x4d, 0x04, 0xf6, 0x2e, 0x39, + 0x9d, 0xb5, 0xcf, 0x41, 0x37, 0xf1, 0xea, 0xad, 0x58, 0xaf, 0x76, 0xd2, 0x5a, 0xbf, 0xca, 0x08, + 0x18, 0x62, 0x7b, 0x80, 0xe4, 0x55, 0x49, 0x71, 0xf5, 0xa4, 0xcf, 0xd7, 0x3f, 0x51, 0x40, 0x6e, + 0xd1, 0x75, 0x3a, 0xf0, 0x6d, 0x99, 0x04, 0x1b, 0xfe, 0x2d, 0xd7, 0xe9, 0x18, 0xe4, 0x16, 0x94, + 0xd0, 0x95, 0x9f, 0x4f, 0x53, 0xef, 0x02, 0x93, 0x1d, 0xa7, 0x6b, 0x79, 0xfe, 0x72, 0x60, 0xee, + 0x8e, 0xc7, 0xf5, 0xed, 0x95, 0xeb, 0x2c, 0x93, 0x1e, 0x64, 0xc7, 0xa3, 0x2f, 0x61, 0x21, 0xe6, + 0x0b, 0x66, 0xa3, 0x7f, 0x13, 0x4c, 0x4f, 0x2a, 0x7c, 0x39, 0x8f, 0xe4, 0xb3, 0x44, 0x24, 0x9f, + 0xd0, 0x87, 0xc3, 0xae, 0xd3, 0x19, 0xc9, 0x16, 0xdd, 0xab, 0x03, 0x54, 0x9f, 0x2d, 0xa0, 0x7a, + 0x9b, 0x54, 0x9d, 0xe9, 0x23, 0xfa, 0xfe, 0x1c, 0x00, 0x44, 0x5d, 0xd8, 0xc0, 0x0b, 0x19, 0x39, + 0x5d, 0xe9, 0xa7, 0x72, 0x1c, 0x2f, 0x4b, 0x22, 0x2f, 0x9f, 0x14, 0xa1, 0x8d, 0x90, 0xe2, 0x23, + 0x38, 0x5a, 0x02, 0xf9, 0x5d, 0xfc, 0x99, 0x71, 0x54, 0xb2, 0x08, 0xf2, 0xaa, 0xd3, 0x3f, 0xe1, + 0x1f, 0x67, 0x40, 0x9e, 0x24, 0xa8, 0xa7, 0x01, 0x20, 0x13, 0x34, 0x3d, 0x14, 0x92, 0x21, 0x53, + 0x31, 0x97, 0x42, 0xa4, 0xd5, 0x6a, 0xb1, 0xcf, 0x54, 0xf5, 0x0d, 0x13, 0xf0, 0xdf, 0x64, 0xda, + 0x26, 0x65, 0xb1, 0x89, 0x9c, 0x4b, 0xc1, 0x7f, 0x93, 0xb7, 0x55, 0xb4, 0x49, 0x83, 0xe1, 0xe6, + 0xf4, 0x30, 0x21, 0xf8, 0x7b, 0x35, 0xb8, 0xf0, 0xc4, 0xff, 0x9b, 0xa4, 0xe0, 0x45, 0x2d, 0x11, + 0xcb, 0x85, 0xb0, 0x8a, 0x02, 0xc9, 0xd4, 0x9b, 0x0c, 0xdf, 0x10, 0x88, 0xcd, 0xa2, 0x20, 0x36, + 0x4f, 0x49, 0xc0, 0xde, 0xf4, 0x85, 0xe7, 0x2b, 0x79, 0x30, 0x55, 0x75, 0x5a, 0x4c, 0x76, 0xb8, + 0x85, 0xdf, 0xc7, 0xf3, 0x89, 0x16, 0x7e, 0x41, 0x19, 0x11, 0x02, 0x72, 0xbf, 0x28, 0x20, 0x72, + 0x25, 0xf0, 0xf2, 0xa1, 0x2e, 0x80, 0x02, 0x91, 0xde, 0xfd, 0x17, 0xd9, 0xc4, 0x15, 0x41, 0x58, + 0xab, 0xb3, 0x3f, 0xff, 0xcd, 0xc9, 0xd8, 0x7f, 0x02, 0x79, 0xd2, 0xc0, 0x98, 0xbd, 0x11, 0xb1, + 0xa1, 0xd9, 0xf8, 0x86, 0x2a, 0xf1, 0x0d, 0xcd, 0xf5, 0x36, 0x34, 0xc9, 0x7a, 0x3e, 0x4a, 0x42, + 0xd2, 0x97, 0xf1, 0xff, 0x31, 0x01, 0x40, 0xd5, 0xdc, 0xb3, 0xb6, 0xe8, 0xde, 0xea, 0x5f, 0xf8, + 0xeb, 0x18, 0xb6, 0x0b, 0xfa, 0x9f, 0xb9, 0x89, 0xf0, 0x2e, 0x30, 0xc1, 0xe6, 0x3d, 0xd6, 0x90, + 0x1b, 0x85, 0x86, 0x84, 0xa5, 0x50, 0xf5, 0xf2, 0x8a, 0xa7, 0xfb, 0xf9, 0x85, 0xab, 0xfd, 0xb2, + 0x3d, 0x57, 0xfb, 0xf5, 0xdd, 0x1d, 0x88, 0xba, 0xf0, 0x0f, 0xbe, 0x47, 0x7a, 0x83, 0x8a, 0xa3, + 0x87, 0x6b, 0x51, 0x44, 0x17, 0xbc, 0x13, 0x4c, 0x38, 0xc1, 0x76, 0xb0, 0x12, 0x69, 0xcf, 0xaa, + 0xd8, 0x9b, 0x8e, 0xee, 0xe7, 0x94, 0xdc, 0x95, 0x92, 0xa2, 0x63, 0x2c, 0x87, 0x1c, 0x4e, 0x2e, + 0xfb, 0x81, 0x85, 0x70, 0x3b, 0x2e, 0x58, 0xde, 0xf6, 0xaa, 0x65, 0x5f, 0xea, 0xc2, 0xff, 0x20, + 0xa7, 0x41, 0x72, 0xf8, 0x67, 0x93, 0xe1, 0x2f, 0xc6, 0x6d, 0xa8, 0x8b, 0xa8, 0xdd, 0x1b, 0x55, + 0x4a, 0x7f, 0x6a, 0x23, 0x00, 0xbc, 0x1b, 0x14, 0x28, 0xa1, 0x6c, 0x10, 0x3d, 0x1b, 0x89, 0x5f, + 0x50, 0x92, 0xce, 0xfe, 0x80, 0x8f, 0x04, 0x38, 0x9e, 0x17, 0x70, 0x5c, 0x38, 0x10, 0x65, 0xa9, + 0x43, 0x7a, 0xf6, 0xa9, 0x60, 0x82, 0x71, 0x5a, 0x9d, 0xe3, 0x7b, 0x71, 0xf1, 0x88, 0x0a, 0x40, + 0x61, 0xcd, 0xd9, 0x43, 0x86, 0x53, 0xcc, 0xe0, 0x67, 0x4c, 0x9f, 0xe1, 0x14, 0xb3, 0xf0, 0x35, + 0x93, 0x60, 0x32, 0x88, 0xe8, 0xf2, 0xb9, 0x2c, 0x28, 0x86, 0x97, 0xf0, 0xd3, 0x16, 0xc9, 0xfb, + 0x56, 0xfe, 0x92, 0xb4, 0x83, 0x44, 0x10, 0x69, 0xa5, 0xb7, 0x32, 0xc9, 0x5b, 0xc6, 0xdf, 0x2a, + 0xe5, 0x30, 0x21, 0x5b, 0x4b, 0xfa, 0x5d, 0xed, 0x53, 0x59, 0x90, 0x2f, 0xb7, 0x1d, 0x1b, 0x25, + 0xba, 0x64, 0xbc, 0xff, 0x8e, 0x02, 0xfc, 0xf1, 0xac, 0xac, 0xae, 0x11, 0x32, 0x00, 0xd7, 0x2d, + 0xc9, 0x5b, 0xb9, 0x49, 0x2a, 0xb6, 0xe8, 0xf4, 0x19, 0xfa, 0x8d, 0x2c, 0x98, 0xa2, 0xb1, 0x51, + 0x4a, 0xed, 0x36, 0x7c, 0x5c, 0xc8, 0xd4, 0x3e, 0x51, 0x71, 0xe0, 0xef, 0x48, 0x3b, 0xb8, 0x07, + 0xad, 0x0a, 0xca, 0x4e, 0x10, 0x24, 0x26, 0x99, 0xbf, 0xb5, 0xdc, 0x9e, 0xd8, 0x40, 0x82, 0xd2, + 0x67, 0xf5, 0x9f, 0x67, 0xb1, 0x02, 0x60, 0x5f, 0x5a, 0x77, 0xd1, 0x9e, 0x85, 0x2e, 0xc3, 0xeb, + 0x43, 0x66, 0xef, 0x0f, 0xfc, 0xf0, 0x66, 0x69, 0x23, 0x0e, 0x57, 0x64, 0xe4, 0x96, 0xd4, 0x74, + 0x3b, 0xcc, 0xc4, 0x46, 0xf1, 0xde, 0x68, 0x1c, 0x5c, 0x31, 0x3a, 0x9f, 0x5d, 0xd2, 0x66, 0x13, + 0x4d, 0x45, 0xfa, 0x8c, 0x7d, 0x78, 0x02, 0x4c, 0x6e, 0xd8, 0xdd, 0x4e, 0xdb, 0xec, 0x6e, 0xc3, + 0xef, 0x2a, 0xc1, 0x1d, 0xdf, 0x4f, 0x17, 0xce, 0x97, 0xff, 0xe8, 0x2e, 0x72, 0x7d, 0x7f, 0x29, + 0xfa, 0xd2, 0xff, 0x12, 0x59, 0xf8, 0x7e, 0x45, 0x76, 0x91, 0xea, 0x57, 0x1a, 0x7f, 0xf9, 0x75, + 0x05, 0x4c, 0x76, 0xac, 0xa6, 0xb7, 0xeb, 0x06, 0x57, 0x92, 0x3e, 0x59, 0xae, 0x94, 0x75, 0xfa, + 0x97, 0x1e, 0xfc, 0x0e, 0x4d, 0x30, 0xc1, 0x12, 0xf7, 0x6d, 0x0b, 0xed, 0x3f, 0x2f, 0x79, 0x12, + 0x14, 0x4c, 0xd7, 0xb3, 0xba, 0xfe, 0x95, 0xcf, 0xec, 0x0d, 0x0f, 0x97, 0xf4, 0x69, 0xc3, 0x6d, + 0xfb, 0x91, 0x28, 0x82, 0x04, 0xf8, 0x01, 0xa9, 0xf5, 0x63, 0x7c, 0xcb, 0x93, 0x41, 0xfe, 0xc0, + 0x10, 0xb6, 0xe6, 0x6b, 0xc1, 0x35, 0x7a, 0xc9, 0xd0, 0x1a, 0x34, 0x70, 0x41, 0x10, 0xa3, 0xa0, + 0x05, 0xbf, 0xcb, 0xdb, 0xef, 0xc4, 0x39, 0x82, 0x71, 0x31, 0x9c, 0x23, 0x82, 0x84, 0x98, 0x39, + 0xe2, 0x37, 0xa5, 0x77, 0x77, 0x02, 0x96, 0x0c, 0xb0, 0xe5, 0xc5, 0xdd, 0xfc, 0xf2, 0x41, 0xa9, + 0x9d, 0x9a, 0x41, 0x35, 0x1d, 0x22, 0xfb, 0x7f, 0x7d, 0x02, 0x4c, 0x2c, 0x9b, 0xed, 0x36, 0x72, + 0xaf, 0xe2, 0xa9, 0xa5, 0xe8, 0x53, 0xb8, 0x66, 0xda, 0xd6, 0x26, 0x5e, 0xdf, 0xc7, 0x0e, 0x7a, + 0xef, 0x91, 0x8e, 0x2a, 0xca, 0xea, 0x98, 0xef, 0x2d, 0x3f, 0x82, 0xe7, 0xe7, 0x40, 0xce, 0xb2, + 0x37, 0x1d, 0x36, 0xf4, 0xf5, 0x5a, 0xd1, 0xfd, 0x9f, 0xc9, 0x12, 0x84, 0x64, 0x94, 0x0c, 0x2c, + 0x2a, 0x49, 0x45, 0xfa, 0x23, 0xe0, 0x6f, 0xe5, 0xc0, 0xac, 0x4f, 0x44, 0xc5, 0x6e, 0xa1, 0x2b, + 0xbc, 0x49, 0xe5, 0x65, 0x39, 0xd9, 0x43, 0x51, 0xbd, 0xed, 0x21, 0x45, 0x45, 0xb0, 0xd4, 0x00, + 0xa0, 0x69, 0x7a, 0x68, 0xcb, 0x71, 0xad, 0x60, 0x5c, 0x7b, 0x5a, 0x92, 0xd2, 0xca, 0xf4, 0xef, + 0xab, 0x3a, 0x57, 0x8e, 0x7a, 0x2f, 0x98, 0x46, 0xc1, 0xb9, 0x67, 0xdf, 0xe4, 0x12, 0x8b, 0x17, + 0x9f, 0x1f, 0xfe, 0xb9, 0xd4, 0xd9, 0x2b, 0x99, 0x66, 0x26, 0xc3, 0xac, 0x31, 0x5c, 0x1f, 0xda, + 0xa8, 0xae, 0x95, 0xf4, 0xfa, 0x4a, 0x69, 0x75, 0xb5, 0x52, 0x5d, 0x0e, 0x82, 0x78, 0xa8, 0x60, + 0x6e, 0xb1, 0x76, 0xa1, 0xca, 0x45, 0x59, 0xc9, 0xc1, 0x75, 0x30, 0xe9, 0xf3, 0xab, 0x9f, 0xb3, + 0x23, 0xcf, 0x33, 0xe6, 0xec, 0xc8, 0x25, 0x61, 0x25, 0xcb, 0x6a, 0x06, 0x0e, 0x33, 0xe4, 0x19, + 0xfe, 0x91, 0x09, 0xf2, 0xc4, 0x36, 0x0e, 0xdf, 0x49, 0xee, 0x84, 0xee, 0xb4, 0xcd, 0x26, 0x82, + 0x3b, 0x09, 0xb4, 0x6a, 0x3f, 0xcc, 0x7d, 0x76, 0x5f, 0x98, 0x7b, 0xf2, 0xc8, 0xb4, 0xb7, 0xe3, + 0xfd, 0xec, 0xf1, 0x3a, 0xcd, 0x22, 0x1e, 0x53, 0x8a, 0xdd, 0x25, 0xa1, 0x66, 0x7c, 0x46, 0x66, + 0x84, 0x48, 0x46, 0xd3, 0x94, 0x4c, 0xa3, 0x94, 0xdb, 0x4f, 0x89, 0xa3, 0x28, 0xfd, 0x1e, 0xff, + 0xc5, 0x1c, 0xc8, 0xd7, 0x3b, 0x6d, 0xcb, 0x83, 0xaf, 0xcc, 0x8e, 0x04, 0x33, 0x7a, 0x35, 0x81, + 0x32, 0xf0, 0x6a, 0x82, 0x70, 0x17, 0x34, 0x27, 0xb1, 0x0b, 0x6a, 0xa0, 0x2b, 0x9e, 0xb8, 0x0b, + 0x7a, 0x17, 0x0b, 0xc4, 0x45, 0xf7, 0x50, 0x9f, 0xd0, 0x87, 0xa5, 0xa4, 0x59, 0x7d, 0x22, 0xbc, + 0x9d, 0x7d, 0x2a, 0x0b, 0x34, 0x05, 0x40, 0x61, 0xa1, 0x66, 0x18, 0xb5, 0xb5, 0xe2, 0x11, 0x12, + 0xa1, 0xa4, 0xb6, 0x5e, 0xcc, 0xa8, 0x53, 0x20, 0x5f, 0xa9, 0x56, 0x35, 0xbd, 0x98, 0x25, 0xa1, + 0xaf, 0x2a, 0xc6, 0xaa, 0x56, 0x54, 0xc4, 0x38, 0xd5, 0xb1, 0x6a, 0xb4, 0x58, 0x77, 0x9a, 0xe2, + 0x25, 0xa7, 0x50, 0x47, 0xd3, 0x93, 0xbe, 0x70, 0xfd, 0x17, 0x05, 0xe4, 0xd7, 0x90, 0xbb, 0x85, + 0xe0, 0x8f, 0x26, 0xd8, 0xac, 0xdb, 0xb4, 0xdc, 0x2e, 0x0d, 0x14, 0x16, 0x6e, 0xd6, 0xf1, 0x69, + 0xea, 0xcd, 0x60, 0xb6, 0x8b, 0x9a, 0x8e, 0xdd, 0xf2, 0x33, 0xd1, 0xf1, 0x48, 0x4c, 0x84, 0xaf, + 0x48, 0x08, 0x19, 0x21, 0x74, 0x24, 0x3b, 0x6e, 0x49, 0x80, 0xe9, 0x57, 0x6b, 0xfa, 0xc0, 0x7c, + 0x4b, 0xc1, 0x3f, 0x75, 0xae, 0xc2, 0x57, 0x48, 0xef, 0xa2, 0xde, 0x0e, 0x0a, 0x44, 0x4c, 0xfd, + 0x39, 0xba, 0xff, 0x78, 0xcc, 0xf2, 0xa8, 0x0b, 0xe0, 0x58, 0x17, 0xb5, 0x51, 0xd3, 0x43, 0x2d, + 0xdc, 0x75, 0xf5, 0x81, 0x83, 0xc2, 0xfe, 0xec, 0xf0, 0x4f, 0x79, 0x00, 0xef, 0x11, 0x01, 0xbc, + 0xa5, 0x0f, 0x2b, 0x71, 0x83, 0xa2, 0x75, 0x65, 0xdc, 0x8c, 0x7a, 0xdb, 0x09, 0x8c, 0xdb, 0xfe, + 0x3b, 0xfe, 0xb6, 0xed, 0xed, 0xb4, 0xc9, 0x37, 0xe6, 0xc1, 0xef, 0xbf, 0xab, 0xf3, 0x60, 0xc2, + 0xb4, 0xaf, 0x92, 0x4f, 0xb9, 0x98, 0x56, 0xfb, 0x99, 0xe0, 0x6b, 0x02, 0xe4, 0xef, 0x13, 0x90, + 0x7f, 0x92, 0x1c, 0xb9, 0xe9, 0x03, 0xff, 0x93, 0x13, 0x20, 0xbf, 0x6e, 0x76, 0x3d, 0x04, 0xff, + 0x6f, 0x45, 0x16, 0xf9, 0x5b, 0xc0, 0xdc, 0xa6, 0xd3, 0xdc, 0xed, 0xa2, 0x96, 0xd8, 0x29, 0x7b, + 0x52, 0x47, 0x81, 0xb9, 0x7a, 0x1b, 0x28, 0xfa, 0x89, 0xac, 0x58, 0x7f, 0x3b, 0x7d, 0x5f, 0x3a, + 0x89, 0x7a, 0xdc, 0x5d, 0x37, 0x5d, 0xaf, 0xb6, 0x49, 0xd2, 0x82, 0xa8, 0xc7, 0x7c, 0xa2, 0x00, + 0x7d, 0x21, 0x06, 0xfa, 0x89, 0x68, 0xe8, 0x27, 0x25, 0xa0, 0x57, 0x4b, 0x60, 0x72, 0xd3, 0x6a, + 0x23, 0xf2, 0xc3, 0x14, 0xf9, 0xa1, 0xdf, 0x9c, 0x44, 0x78, 0x1f, 0xcc, 0x49, 0x4b, 0x56, 0x1b, + 0xe9, 0xc1, 0x6f, 0xfe, 0x42, 0x06, 0x84, 0x0b, 0x99, 0x55, 0xea, 0xdf, 0x8a, 0x15, 0x2f, 0xdb, + 0xdc, 0x41, 0xbe, 0x11, 0xcd, 0x66, 0xa7, 0x47, 0x5a, 0xa6, 0x67, 0x12, 0x30, 0x66, 0x74, 0xf2, + 0x2c, 0xfa, 0x77, 0x28, 0xbd, 0xfe, 0x1d, 0x2f, 0x52, 0x92, 0x8d, 0x88, 0x3e, 0xb1, 0x11, 0x3d, + 0xea, 0xa2, 0x0f, 0x10, 0xd5, 0x14, 0x83, 0x77, 0x0c, 0x4c, 0xd3, 0x74, 0x91, 0xb7, 0xce, 0x7b, + 0x54, 0xe4, 0x75, 0x31, 0x91, 0xb8, 0xd6, 0x75, 0xeb, 0xe6, 0x0e, 0x22, 0x95, 0x95, 0xf1, 0x37, + 0xe6, 0x32, 0xb5, 0x2f, 0x3d, 0x1c, 0x7f, 0xf3, 0xa3, 0x1e, 0x7f, 0xfb, 0xb5, 0x31, 0xfd, 0x6e, + 0xf8, 0xba, 0x1c, 0x50, 0xca, 0xbb, 0xde, 0x63, 0x7a, 0xf8, 0xfd, 0x9e, 0xb4, 0xbf, 0x0a, 0x1b, + 0xcf, 0x22, 0x2f, 0x05, 0x1f, 0xd3, 0xe8, 0x9b, 0x50, 0x4a, 0xe4, 0xfc, 0x62, 0xa2, 0xda, 0x96, + 0xbe, 0x8c, 0xbc, 0x4d, 0x09, 0x1c, 0x1e, 0x5f, 0x98, 0x39, 0xb8, 0x6a, 0x0e, 0xe9, 0xf8, 0xc4, + 0x8d, 0x0c, 0xc1, 0xbb, 0x3f, 0xf0, 0xe4, 0x84, 0x18, 0x69, 0x64, 0x9b, 0x9c, 0xb0, 0x72, 0x46, + 0xa7, 0x2f, 0xf0, 0x55, 0xd2, 0x6e, 0xe0, 0x94, 0x6d, 0xb1, 0x2e, 0x81, 0xc9, 0x74, 0x2a, 0xb9, + 0x8b, 0x1f, 0x63, 0xaa, 0x4d, 0x1f, 0xb0, 0xbf, 0x8f, 0x36, 0x19, 0x0e, 0x83, 0x18, 0x7c, 0xad, + 0xf4, 0xb6, 0x12, 0x6d, 0xf6, 0x00, 0x7b, 0x61, 0x32, 0x7e, 0xcb, 0x6d, 0x3a, 0xc5, 0x56, 0x9c, + 0x3e, 0xc7, 0xbf, 0xa9, 0x80, 0x02, 0xdd, 0x4a, 0x84, 0x6f, 0xc9, 0x24, 0xb8, 0x31, 0xdb, 0x13, + 0x5d, 0x01, 0x83, 0xf7, 0x24, 0x36, 0x07, 0xc1, 0x65, 0x30, 0x97, 0xc8, 0x65, 0x50, 0x3c, 0x57, + 0x29, 0xd1, 0x8f, 0x68, 0x1b, 0x53, 0x5e, 0x4e, 0x26, 0xe9, 0x61, 0x7d, 0x09, 0x4a, 0x1f, 0xef, + 0x9f, 0xce, 0x83, 0x19, 0x5a, 0xf5, 0x05, 0xab, 0xb5, 0x85, 0x3c, 0xf8, 0xee, 0xec, 0xf7, 0x0f, + 0xea, 0x6a, 0x15, 0xcc, 0x5c, 0x26, 0x64, 0xaf, 0x9a, 0x57, 0x9d, 0x5d, 0x8f, 0x59, 0x2e, 0x6e, + 0x8b, 0xb5, 0x7b, 0xd0, 0x76, 0xce, 0xd3, 0x3f, 0x74, 0xe1, 0x7f, 0xcc, 0x63, 0x6a, 0xf0, 0xa7, + 0x8e, 0x58, 0x05, 0xa2, 0x64, 0xf1, 0x49, 0xea, 0x49, 0x50, 0xd8, 0xb3, 0xd0, 0xe5, 0x4a, 0x8b, + 0x69, 0xb7, 0xec, 0x4d, 0x3c, 0x42, 0x1e, 0xbb, 0xff, 0xca, 0xc3, 0xcd, 0x68, 0x49, 0x57, 0x0a, + 0xe5, 0x76, 0x61, 0x07, 0x92, 0x35, 0x86, 0x33, 0xbe, 0xe2, 0xc5, 0x8a, 0x49, 0x2e, 0xec, 0x8f, + 0x52, 0x9c, 0xc5, 0x80, 0x16, 0xb1, 0x27, 0x48, 0x28, 0x03, 0x46, 0x7c, 0xe7, 0xa2, 0x5c, 0x94, + 0x85, 0x01, 0x55, 0xa7, 0xcf, 0xf9, 0x37, 0x28, 0x60, 0xaa, 0x8e, 0xbc, 0x25, 0x0b, 0xb5, 0x5b, + 0x5d, 0xe8, 0x1e, 0x5c, 0x35, 0x3a, 0x07, 0x0a, 0x9b, 0xa4, 0xb0, 0x41, 0xe7, 0x0f, 0x58, 0x36, + 0xf8, 0xba, 0xac, 0xec, 0xce, 0x2e, 0xb3, 0xbe, 0xf9, 0xd4, 0x8e, 0x04, 0x26, 0x39, 0xcf, 0xdc, + 0xf8, 0x9a, 0xd3, 0x47, 0xe9, 0xed, 0x0a, 0x98, 0x61, 0x37, 0xb1, 0x95, 0xda, 0xd6, 0x96, 0x0d, + 0x77, 0x47, 0xd0, 0x43, 0xd4, 0xa7, 0x80, 0xbc, 0x89, 0x4b, 0x63, 0x4e, 0xfa, 0xb0, 0xef, 0xe0, + 0x49, 0xea, 0xd3, 0x69, 0xc6, 0x04, 0xc1, 0x14, 0x43, 0xc1, 0xf6, 0x69, 0x1e, 0x63, 0x30, 0xc5, + 0x81, 0x95, 0xa7, 0x8f, 0xd8, 0x97, 0x15, 0x70, 0x9c, 0x11, 0x70, 0x1e, 0xb9, 0x9e, 0xd5, 0x34, + 0xdb, 0x14, 0xb9, 0x17, 0x67, 0x46, 0x01, 0xdd, 0x0a, 0x98, 0xdd, 0xe3, 0x8b, 0x65, 0x10, 0x9e, + 0xed, 0x0b, 0xa1, 0x40, 0x80, 0x2e, 0xfe, 0x98, 0x20, 0x28, 0x9d, 0xc0, 0x55, 0xa1, 0xcc, 0x31, + 0x06, 0xa5, 0x93, 0x26, 0x22, 0x7d, 0x88, 0x5f, 0x9e, 0xa3, 0x01, 0x6a, 0xc2, 0xe1, 0xf3, 0x2f, + 0xa4, 0xb1, 0xdd, 0x00, 0xd3, 0x04, 0x4b, 0xfa, 0x23, 0x33, 0x43, 0xc4, 0x08, 0x71, 0x30, 0xee, + 0xb0, 0xcb, 0x9f, 0x82, 0x7f, 0x75, 0xbe, 0x1c, 0x78, 0x01, 0x80, 0xf0, 0x13, 0x3f, 0x48, 0x67, + 0xa2, 0x06, 0xe9, 0xac, 0xdc, 0x20, 0xfd, 0x66, 0xe9, 0xe0, 0x25, 0xfd, 0xc9, 0x3e, 0xb8, 0x78, + 0xc8, 0x85, 0xad, 0x18, 0x5c, 0x7b, 0xfa, 0x72, 0xf1, 0x9a, 0x5c, 0xef, 0x95, 0xdb, 0x1f, 0x1d, + 0xc9, 0x7a, 0x8a, 0x1f, 0x0f, 0x94, 0x9e, 0xf1, 0xe0, 0x00, 0x9a, 0xf4, 0xad, 0xe0, 0x28, 0xad, + 0xa2, 0x1c, 0x90, 0x95, 0xa7, 0xa1, 0x19, 0x7a, 0x92, 0xe1, 0xa3, 0x43, 0x08, 0xc1, 0xa0, 0xfb, + 0xc0, 0xe3, 0x06, 0xb9, 0x64, 0xca, 0x6e, 0x52, 0x01, 0x39, 0xbc, 0x6b, 0xc4, 0xbf, 0x91, 0xa3, + 0xda, 0xee, 0x06, 0xb9, 0x9f, 0x0b, 0x7e, 0x21, 0x37, 0x8a, 0x19, 0xe1, 0x7e, 0x90, 0x23, 0xae, + 0xea, 0x4a, 0xa4, 0x49, 0x23, 0xac, 0x32, 0xbc, 0x3c, 0x0d, 0x5d, 0xf1, 0x56, 0x8e, 0xe8, 0xe4, + 0x4f, 0xf5, 0x36, 0x70, 0xf4, 0xa2, 0xd9, 0xbc, 0xb4, 0xe5, 0x3a, 0xbb, 0xe4, 0x26, 0x23, 0x87, + 0x5d, 0x89, 0x44, 0xae, 0x96, 0x13, 0x3f, 0xa8, 0x77, 0xf8, 0xaa, 0x43, 0x7e, 0x90, 0xea, 0xb0, + 0x72, 0x84, 0x29, 0x0f, 0xea, 0x53, 0x83, 0x41, 0xa7, 0x10, 0x3b, 0xe8, 0xac, 0x1c, 0xf1, 0x87, + 0x1d, 0x75, 0x11, 0x4c, 0xb6, 0xac, 0x3d, 0xb2, 0x55, 0x4d, 0x56, 0x5d, 0x83, 0x8e, 0x12, 0x2f, + 0x5a, 0x7b, 0x74, 0x63, 0x7b, 0xe5, 0x88, 0x1e, 0xfc, 0xa9, 0x2e, 0x83, 0x29, 0xb2, 0x2d, 0x40, + 0x8a, 0x99, 0x4c, 0x74, 0x4c, 0x78, 0xe5, 0x88, 0x1e, 0xfe, 0x8b, 0xb5, 0x8f, 0x1c, 0x39, 0xc3, + 0x71, 0x9f, 0xbf, 0xdd, 0x9e, 0x49, 0xb4, 0xdd, 0x8e, 0x79, 0x41, 0x37, 0xdc, 0x4f, 0x82, 0x7c, + 0x93, 0x70, 0x38, 0xcb, 0x38, 0x4c, 0x5f, 0xd5, 0x7b, 0x40, 0x6e, 0xc7, 0x74, 0xfd, 0xc5, 0xf3, + 0x2d, 0x83, 0xcb, 0x5d, 0x33, 0xdd, 0x4b, 0x18, 0x41, 0xfc, 0xd7, 0xc2, 0x04, 0xc8, 0x13, 0xc6, + 0x05, 0x0f, 0xf0, 0x6d, 0x39, 0xaa, 0x86, 0x94, 0x1d, 0x1b, 0x4f, 0xfb, 0x86, 0xe3, 0x1f, 0x74, + 0xf9, 0x50, 0x66, 0x34, 0x1a, 0x64, 0xdf, 0x3b, 0xaa, 0x95, 0xc8, 0x3b, 0xaa, 0x7b, 0x2e, 0x4b, + 0xcd, 0xf5, 0x5e, 0x96, 0x1a, 0x9a, 0x0f, 0xf2, 0x83, 0x1d, 0x55, 0xfe, 0x74, 0x08, 0xd5, 0xa5, + 0x97, 0x11, 0xd1, 0x2b, 0xf0, 0xb6, 0x65, 0x73, 0x6d, 0xf6, 0x5f, 0x13, 0x0e, 0x4a, 0x49, 0x95, + 0x9a, 0x01, 0xe4, 0xa5, 0x3f, 0x36, 0xfd, 0x46, 0x0e, 0x9c, 0xa2, 0x57, 0xf2, 0xee, 0x21, 0xc3, + 0x11, 0xef, 0x0e, 0x84, 0x9f, 0x1c, 0x89, 0xd0, 0xf4, 0x99, 0x70, 0x94, 0xbe, 0x13, 0xce, 0xbe, + 0xc3, 0xc6, 0xb9, 0x01, 0x87, 0x8d, 0xf3, 0xc9, 0x2c, 0x87, 0xbf, 0xc7, 0xcb, 0xcf, 0xba, 0x28, + 0x3f, 0x77, 0x47, 0x00, 0xd4, 0x8f, 0x2f, 0x23, 0xd1, 0x6f, 0xde, 0x19, 0x48, 0x4a, 0x5d, 0x90, + 0x94, 0xfb, 0x86, 0x27, 0x24, 0x7d, 0x69, 0xf9, 0xdd, 0x1c, 0xb8, 0x26, 0x24, 0xa6, 0x8a, 0x2e, + 0x33, 0x41, 0xf9, 0xdc, 0x48, 0x04, 0x25, 0x79, 0x2c, 0x83, 0xb4, 0x25, 0xe6, 0x8f, 0xa5, 0xcf, + 0x00, 0xf5, 0x02, 0x15, 0xf0, 0x26, 0x42, 0x58, 0x4e, 0x82, 0x02, 0x1d, 0x61, 0x18, 0x34, 0xec, + 0x2d, 0xe1, 0x70, 0x23, 0x77, 0x72, 0x48, 0x96, 0xb6, 0x31, 0xc8, 0x0f, 0xb3, 0x6b, 0x18, 0xbb, + 0xae, 0x5d, 0xb1, 0x3d, 0x07, 0xfe, 0xc4, 0x48, 0x04, 0x27, 0xf0, 0x86, 0x53, 0x86, 0xf1, 0x86, + 0x1b, 0xca, 0xca, 0xe1, 0xb7, 0xe0, 0x50, 0xac, 0x1c, 0x11, 0x95, 0xa7, 0x8f, 0xdf, 0x3b, 0x14, + 0x7a, 0x3d, 0x7f, 0x1d, 0x79, 0x0b, 0xa2, 0x86, 0x08, 0x1f, 0x1c, 0x05, 0x90, 0xc7, 0x7d, 0x35, + 0x89, 0xdd, 0x2e, 0x45, 0x5e, 0xc4, 0x13, 0x4f, 0xb1, 0xb7, 0x1c, 0x08, 0xcb, 0xc1, 0x1e, 0x0a, + 0x47, 0x82, 0x94, 0xdc, 0xe5, 0x06, 0x09, 0xc8, 0x48, 0x1f, 0xb3, 0x97, 0x2a, 0xa0, 0xc0, 0xae, + 0x62, 0xdf, 0x48, 0xc5, 0x61, 0x42, 0x8c, 0x75, 0x2c, 0xb1, 0x23, 0x97, 0xf8, 0xc2, 0xf2, 0xf4, + 0xf6, 0xe2, 0x0e, 0xe9, 0x46, 0xf2, 0x6f, 0x65, 0xc1, 0x74, 0x1d, 0x79, 0x65, 0xd3, 0x75, 0x2d, + 0x73, 0x6b, 0x54, 0x1e, 0xdf, 0xb2, 0xde, 0xc3, 0xf0, 0xdb, 0x19, 0xd9, 0xf3, 0x34, 0x81, 0x21, + 0xdc, 0x27, 0x35, 0x22, 0xb6, 0x9f, 0xdc, 0x55, 0xf0, 0x83, 0x4a, 0x1b, 0x83, 0xc7, 0x76, 0x16, + 0x4c, 0xf8, 0x67, 0xea, 0xce, 0x09, 0xe7, 0x2c, 0xb7, 0xbd, 0x1d, 0xff, 0x18, 0x0c, 0x79, 0xde, + 0x7f, 0x96, 0x0b, 0xbe, 0x3a, 0xa1, 0xa3, 0x7c, 0xfc, 0x81, 0xc0, 0x64, 0x7d, 0x2c, 0x89, 0x3b, + 0xfc, 0x61, 0x1d, 0x01, 0xfc, 0x9d, 0x09, 0x66, 0x8e, 0x5c, 0x35, 0x3d, 0x74, 0x05, 0xfe, 0x85, + 0x02, 0x26, 0xea, 0xc8, 0xc3, 0xf3, 0x2d, 0x26, 0xff, 0xc0, 0x12, 0xae, 0x72, 0x16, 0x8f, 0x29, + 0x66, 0xc3, 0x78, 0x0e, 0x98, 0xea, 0xb8, 0x4e, 0x13, 0x75, 0xbb, 0xcc, 0x7a, 0xc1, 0x3b, 0xaa, + 0xf5, 0x9b, 0xfd, 0x09, 0x69, 0xf3, 0xeb, 0xfe, 0x3f, 0x7a, 0xf8, 0x7b, 0x52, 0x35, 0x80, 0x96, + 0xc4, 0x1a, 0x38, 0x6e, 0x35, 0x20, 0xae, 0xf2, 0xf4, 0x81, 0xfe, 0x8c, 0x02, 0x66, 0xea, 0xc8, + 0x0b, 0xb8, 0x98, 0x60, 0x93, 0x23, 0x1a, 0x5e, 0x01, 0x4a, 0xe5, 0x60, 0x50, 0xca, 0x5f, 0x90, + 0x27, 0x72, 0x33, 0x28, 0x6c, 0x8c, 0x17, 0xe4, 0xc9, 0x51, 0x30, 0x86, 0xe3, 0x6b, 0x4f, 0x00, + 0x53, 0x84, 0x16, 0xd2, 0x61, 0x7f, 0x2e, 0x17, 0x76, 0xde, 0xcf, 0xa7, 0xd4, 0x79, 0xef, 0x05, + 0x79, 0x72, 0xf1, 0x3e, 0xe9, 0xb8, 0xd3, 0x32, 0x6a, 0xfb, 0x1a, 0xce, 0xae, 0xd3, 0xbf, 0xfa, + 0xfb, 0x69, 0xe6, 0x93, 0xf9, 0x69, 0xbe, 0x31, 0x9b, 0x68, 0x26, 0xa4, 0x6b, 0x87, 0x11, 0x76, + 0xf9, 0x04, 0xf3, 0x66, 0x4c, 0xdd, 0xe9, 0x0b, 0xc7, 0x8b, 0x15, 0x30, 0x89, 0xe7, 0x6d, 0xa2, + 0x8f, 0x5f, 0x38, 0xb8, 0x38, 0xf4, 0x57, 0xf4, 0x13, 0x8e, 0xc0, 0x3e, 0x47, 0x46, 0xa7, 0xde, + 0x27, 0x18, 0x81, 0xe3, 0x2a, 0x4f, 0x1f, 0x8f, 0x77, 0x51, 0x3c, 0x48, 0x7f, 0x80, 0x6f, 0x52, + 0x80, 0xb2, 0x8c, 0xbc, 0x71, 0x6b, 0x91, 0x6f, 0x97, 0x0e, 0x55, 0x24, 0x30, 0x8c, 0xd0, 0x3c, + 0xbf, 0x8c, 0x46, 0xd3, 0x81, 0xe4, 0x62, 0x14, 0x49, 0x11, 0x90, 0x3e, 0x6a, 0xef, 0xa5, 0xa8, + 0xd1, 0xcd, 0x85, 0x1f, 0x1b, 0xc1, 0xa8, 0x3a, 0x5e, 0xc3, 0x87, 0xcf, 0x40, 0x52, 0xc6, 0x61, + 0xf5, 0xb7, 0x7e, 0x95, 0x8f, 0xe5, 0x42, 0x3a, 0x80, 0x3b, 0xfb, 0x36, 0x6a, 0x5e, 0x42, 0x2d, + 0xf8, 0xc3, 0x07, 0x87, 0xee, 0x14, 0x98, 0x68, 0xd2, 0xd2, 0x08, 0x78, 0x93, 0xba, 0xff, 0x9a, + 0xe0, 0x76, 0x65, 0x71, 0x20, 0xa2, 0xbf, 0x8f, 0xf1, 0x76, 0x65, 0x89, 0xea, 0xc7, 0xa0, 0xb6, + 0xd0, 0x55, 0x46, 0xa5, 0xe9, 0xd8, 0xf0, 0x3f, 0x1e, 0x1c, 0x96, 0x1b, 0xc0, 0x94, 0xd5, 0x74, + 0xec, 0xca, 0x8e, 0x1f, 0xdc, 0x6f, 0x4a, 0x0f, 0x13, 0xfc, 0xaf, 0xda, 0x8e, 0xf3, 0x90, 0xc5, + 0x76, 0xcd, 0xc3, 0x84, 0x61, 0x95, 0x09, 0x4c, 0xfa, 0x61, 0x29, 0x13, 0x7d, 0xea, 0x4e, 0x1f, + 0xb2, 0x47, 0x43, 0xef, 0x36, 0x3a, 0x14, 0x3e, 0x26, 0xac, 0xc0, 0xc3, 0x4c, 0x67, 0x7c, 0x2b, + 0x0e, 0x65, 0x3a, 0x8b, 0x21, 0x60, 0x0c, 0xf7, 0x8b, 0x84, 0x38, 0xa6, 0x6e, 0x03, 0x3e, 0x00, + 0x3a, 0xa3, 0x53, 0x0f, 0x87, 0x44, 0xe7, 0x70, 0x54, 0xc4, 0x0f, 0xb2, 0x50, 0x97, 0x4c, 0xe3, + 0x81, 0xff, 0x69, 0x14, 0xe0, 0xdc, 0x3d, 0x8c, 0xbf, 0x02, 0xf5, 0x56, 0x48, 0x70, 0x2f, 0xf4, + 0x3e, 0x0e, 0xe2, 0x52, 0xc6, 0x78, 0x63, 0xba, 0x4c, 0xfd, 0xe9, 0x03, 0xf8, 0xb3, 0x0a, 0x98, + 0x23, 0x3e, 0x02, 0x6d, 0x64, 0xba, 0x74, 0xa0, 0x1c, 0x89, 0xa3, 0xfc, 0xbb, 0xa4, 0x03, 0xfc, + 0x88, 0x7c, 0x08, 0xe9, 0x18, 0x09, 0x14, 0x72, 0xd1, 0x7d, 0x24, 0x49, 0x18, 0xcb, 0x36, 0x4a, + 0x31, 0x20, 0x81, 0x89, 0xf8, 0x68, 0xf0, 0x48, 0xe8, 0x91, 0x2b, 0x32, 0xc3, 0xef, 0x6c, 0x63, + 0xf6, 0xc8, 0x95, 0x21, 0x62, 0x0c, 0x57, 0x46, 0x3e, 0x85, 0x19, 0x9c, 0x0d, 0x72, 0x6d, 0xfa, + 0x6b, 0x73, 0xc1, 0x89, 0xb6, 0xcf, 0x8c, 0xc4, 0x03, 0xf3, 0x00, 0x81, 0xed, 0x55, 0x90, 0x73, + 0x9d, 0xcb, 0xd4, 0xb4, 0x35, 0xab, 0x93, 0x67, 0xa2, 0xf2, 0x3b, 0xed, 0xdd, 0x1d, 0x9b, 0x9e, + 0x0c, 0x9d, 0xd5, 0xfd, 0x57, 0xf5, 0x66, 0x30, 0x7b, 0xd9, 0xf2, 0xb6, 0x57, 0x90, 0xd9, 0x42, + 0xae, 0xee, 0x5c, 0x26, 0x1e, 0x73, 0x93, 0xba, 0x98, 0x28, 0xfa, 0xaf, 0x48, 0xe8, 0x97, 0xe4, + 0x2e, 0xf5, 0xb1, 0x1c, 0x7f, 0x4b, 0xa2, 0x79, 0x46, 0x53, 0x95, 0xbe, 0xc0, 0xbc, 0x4f, 0x01, + 0x53, 0xba, 0x73, 0x99, 0x09, 0xc9, 0xff, 0x79, 0xb8, 0x32, 0x92, 0x78, 0xa1, 0x47, 0xef, 0xc6, + 0xf7, 0xc9, 0x1f, 0xfb, 0x42, 0x2f, 0xb6, 0xfa, 0xb1, 0x9c, 0x5c, 0x9a, 0xd1, 0x9d, 0xcb, 0x75, + 0xe4, 0xd1, 0x1e, 0x01, 0x1b, 0x23, 0x72, 0xb2, 0xb6, 0xba, 0xb4, 0x40, 0xb6, 0x0e, 0x0f, 0xde, + 0x93, 0xee, 0x22, 0x04, 0x0c, 0x0a, 0x48, 0x1c, 0xf7, 0x2e, 0xc2, 0x40, 0x0a, 0xc6, 0x10, 0x23, + 0x45, 0x01, 0xd3, 0xba, 0x73, 0x19, 0x4f, 0x0d, 0x4b, 0x56, 0xbb, 0x3d, 0x9a, 0x19, 0x32, 0xa9, + 0xf2, 0xef, 0xb3, 0xc1, 0xa7, 0x62, 0xec, 0xca, 0xff, 0x00, 0x02, 0xd2, 0x87, 0xe1, 0x45, 0xb4, + 0xb3, 0xf8, 0x33, 0xb4, 0x3d, 0x1a, 0x1c, 0x86, 0xed, 0x10, 0x01, 0x19, 0x87, 0xd6, 0x21, 0xa2, + 0x28, 0x18, 0xcb, 0xce, 0xc9, 0x5c, 0x99, 0x4c, 0xf3, 0xa3, 0xed, 0x13, 0x8f, 0x24, 0x73, 0x4d, + 0x64, 0xd3, 0xae, 0x40, 0xc8, 0x48, 0xd0, 0x48, 0xe0, 0x82, 0x28, 0x41, 0x43, 0xfa, 0x78, 0x7c, + 0x58, 0x01, 0x33, 0x94, 0x84, 0xc7, 0x88, 0x16, 0x30, 0x54, 0xa7, 0xe2, 0x5b, 0x70, 0x38, 0x9d, + 0x2a, 0x86, 0x82, 0xb1, 0xdc, 0xd2, 0x89, 0xf5, 0xb8, 0x21, 0x8e, 0x8f, 0x47, 0x21, 0x38, 0xb4, + 0x32, 0x36, 0xc2, 0x23, 0xe4, 0xc3, 0x28, 0x63, 0x87, 0x74, 0x8c, 0xfc, 0x45, 0x41, 0x2f, 0x1a, + 0x25, 0x06, 0x07, 0xe8, 0x0a, 0x23, 0x84, 0x61, 0xc8, 0xae, 0x70, 0x48, 0x48, 0x7c, 0x45, 0x01, + 0x80, 0x12, 0xb0, 0xe6, 0xec, 0x91, 0x4b, 0x79, 0x46, 0x30, 0x9c, 0xf5, 0xba, 0xd5, 0x2b, 0x03, + 0xdc, 0xea, 0x13, 0x86, 0x70, 0x49, 0x6a, 0x09, 0xe4, 0xb8, 0x8c, 0x1b, 0x39, 0x76, 0x4b, 0x60, + 0x7c, 0xfd, 0xe9, 0x63, 0xfc, 0x25, 0xaa, 0xcd, 0x85, 0x07, 0x4c, 0x7f, 0x79, 0x24, 0x28, 0x73, + 0xab, 0x7f, 0x45, 0x5c, 0xfd, 0x1f, 0x00, 0xdb, 0x61, 0x75, 0xc4, 0x41, 0x07, 0x47, 0xd3, 0xd7, + 0x11, 0x0f, 0xef, 0x80, 0xe8, 0x8f, 0xe5, 0xc0, 0x51, 0x36, 0x88, 0x7c, 0x3f, 0x40, 0x9c, 0xf0, + 0x1c, 0x9e, 0x30, 0x48, 0x0e, 0x40, 0x79, 0x54, 0x06, 0xa9, 0x24, 0xa6, 0x4c, 0x09, 0xf2, 0xc6, + 0x62, 0xdd, 0x28, 0x68, 0x57, 0x3a, 0xa6, 0xdd, 0x92, 0x0f, 0xf7, 0x3b, 0x00, 0x78, 0xdf, 0xd6, + 0xa8, 0x88, 0xb6, 0xc6, 0x3e, 0x96, 0xc9, 0xc4, 0x3b, 0xd7, 0x84, 0x65, 0x94, 0xdc, 0xb1, 0xef, + 0x5c, 0x47, 0xd7, 0x9d, 0x3e, 0x4a, 0x8f, 0x28, 0x20, 0x57, 0x77, 0x5c, 0x0f, 0x3e, 0x9c, 0xa4, + 0x77, 0x52, 0xce, 0x87, 0x20, 0xf9, 0xef, 0x6a, 0x59, 0xb8, 0x35, 0xf9, 0x5c, 0xfc, 0x51, 0x67, + 0xd3, 0x33, 0x89, 0x57, 0x37, 0xae, 0x9f, 0xbb, 0x3e, 0x39, 0x69, 0x3c, 0x1d, 0xca, 0xbf, 0x7a, + 0xf4, 0x01, 0x8c, 0xd4, 0xe2, 0xe9, 0x44, 0xd6, 0x9c, 0x3e, 0x6e, 0xff, 0x7d, 0x8e, 0xf9, 0xb6, + 0x2e, 0x59, 0x6d, 0x04, 0x1f, 0xa6, 0x2e, 0x23, 0x55, 0x73, 0x07, 0xc9, 0x1f, 0x89, 0x89, 0x75, + 0x6d, 0x25, 0xf1, 0x65, 0x95, 0x30, 0xbe, 0x6c, 0xd2, 0x0e, 0x45, 0x0f, 0xa0, 0x53, 0x92, 0xc6, + 0xdd, 0xa1, 0x62, 0xea, 0x1e, 0x4b, 0x9c, 0xce, 0x63, 0x75, 0xe4, 0x51, 0xa5, 0xb2, 0xe6, 0xdf, + 0xc0, 0xf2, 0x23, 0x23, 0x89, 0xd8, 0x19, 0x5c, 0xf0, 0xa2, 0xf4, 0x5c, 0xf0, 0xf2, 0x3e, 0x1e, + 0x9c, 0x35, 0x11, 0x9c, 0x67, 0x44, 0x33, 0x48, 0x24, 0x72, 0x24, 0x30, 0xbd, 0x3d, 0x80, 0x69, + 0x5d, 0x80, 0xe9, 0x9e, 0x21, 0xa9, 0x48, 0x1f, 0xb0, 0xcf, 0x63, 0x55, 0x85, 0x2c, 0xfa, 0x4b, + 0x76, 0x8b, 0x45, 0x58, 0xfd, 0xc7, 0xc3, 0xde, 0x6c, 0xdb, 0x1f, 0x82, 0x55, 0x88, 0xe5, 0x9c, + 0xef, 0xbd, 0xad, 0x7e, 0x81, 0x86, 0x73, 0xc5, 0x83, 0x28, 0xd9, 0x69, 0x93, 0xbf, 0xb1, 0x3e, + 0xf8, 0x0f, 0xfe, 0x49, 0x32, 0xfb, 0x1b, 0x29, 0xa2, 0x87, 0x71, 0x29, 0xeb, 0x40, 0x09, 0x2c, + 0x73, 0x12, 0xd4, 0xfd, 0xfb, 0x70, 0x0b, 0x0b, 0x23, 0x81, 0x0c, 0xe9, 0x16, 0x46, 0x0a, 0x38, + 0x4c, 0xb7, 0xb0, 0x41, 0x04, 0x8c, 0xe1, 0x96, 0xf9, 0x3c, 0xdb, 0x95, 0x27, 0x3e, 0x93, 0xf0, + 0xaf, 0xb2, 0xa9, 0xcf, 0xb6, 0xdf, 0xc9, 0x24, 0xf2, 0x63, 0x26, 0x74, 0xc5, 0x4f, 0xb7, 0x49, + 0x3c, 0x93, 0xe3, 0x8a, 0x1b, 0x83, 0xfd, 0x27, 0x4b, 0x7c, 0xca, 0x2f, 0x58, 0x2d, 0x6f, 0x7b, + 0x44, 0x27, 0x33, 0x2e, 0xe3, 0xb2, 0xfc, 0xeb, 0x8a, 0xc9, 0x0b, 0xfc, 0x97, 0x4c, 0xa2, 0x50, + 0x50, 0x01, 0x4b, 0x08, 0x59, 0x11, 0x2c, 0x4e, 0x10, 0xc0, 0x29, 0xb6, 0xbc, 0x31, 0x4a, 0xf4, + 0x79, 0xab, 0x85, 0x9c, 0xc7, 0xa0, 0x44, 0x13, 0xba, 0x46, 0x27, 0xd1, 0x71, 0xc5, 0xfd, 0x3b, + 0x95, 0xe8, 0x80, 0x25, 0x23, 0x92, 0xe8, 0xd8, 0xf2, 0xd2, 0xe7, 0xf1, 0xab, 0x67, 0xd8, 0x82, + 0x68, 0xd5, 0xb2, 0x2f, 0xc1, 0x7f, 0x2a, 0xf8, 0x17, 0x25, 0x5f, 0xb0, 0xbc, 0x6d, 0x16, 0xd3, + 0xe5, 0x77, 0xa5, 0xef, 0x38, 0x19, 0x22, 0x6e, 0x8b, 0x18, 0x16, 0x2a, 0xbf, 0x2f, 0x2c, 0x54, + 0x09, 0xcc, 0x5a, 0xb6, 0x87, 0x5c, 0xdb, 0x6c, 0x2f, 0xb5, 0xcd, 0xad, 0xee, 0xa9, 0x89, 0xbe, + 0x97, 0xd0, 0x55, 0xb8, 0x3c, 0xba, 0xf8, 0x07, 0x7f, 0x9d, 0xe4, 0xa4, 0x78, 0x2d, 0x7e, 0x44, + 0x14, 0xab, 0xa9, 0xe8, 0x28, 0x56, 0x41, 0x94, 0x2a, 0x30, 0x38, 0xc8, 0xb5, 0xac, 0x8e, 0x9b, + 0x30, 0x6c, 0xdf, 0x39, 0xc9, 0x68, 0x6a, 0x41, 0x08, 0xc7, 0x5f, 0x55, 0x12, 0x59, 0xe9, 0xb0, + 0x20, 0xcc, 0xf7, 0x0a, 0x41, 0x62, 0x0d, 0x95, 0x6f, 0xbc, 0xd2, 0xd3, 0xf8, 0x40, 0xe5, 0xc9, + 0x49, 0xa8, 0x3c, 0xbc, 0x50, 0xe5, 0xe5, 0x84, 0x2a, 0x89, 0xd1, 0x4f, 0xa6, 0xb5, 0x63, 0x38, + 0x55, 0x94, 0x07, 0xc7, 0xfc, 0xa8, 0xb5, 0x9d, 0x0e, 0x32, 0x5d, 0xd3, 0x6e, 0x22, 0xf8, 0x68, + 0x76, 0x14, 0x6a, 0xef, 0x12, 0x98, 0xb4, 0x9a, 0x8e, 0x5d, 0xb7, 0x9e, 0xef, 0x5f, 0x12, 0x17, + 0x1f, 0x2c, 0x9d, 0x70, 0xa4, 0xc2, 0xfe, 0xd0, 0x83, 0x7f, 0xd5, 0x0a, 0x98, 0x6a, 0x9a, 0x6e, + 0x8b, 0x06, 0xd3, 0xcb, 0xf7, 0x5c, 0xc8, 0x14, 0x59, 0x50, 0xd9, 0xff, 0x45, 0x0f, 0xff, 0x56, + 0x6b, 0x22, 0x13, 0x0b, 0x3d, 0x51, 0x39, 0x22, 0x0b, 0x5b, 0x0c, 0x7f, 0x12, 0x78, 0x8e, 0xb9, + 0xe3, 0xa2, 0x36, 0xb9, 0x13, 0x9e, 0x8e, 0x10, 0x53, 0x7a, 0x98, 0x90, 0x74, 0x99, 0x4f, 0xaa, + 0xda, 0x87, 0xc6, 0xb8, 0x97, 0xf9, 0x52, 0x54, 0xa4, 0x2f, 0x99, 0xef, 0x2c, 0x80, 0x59, 0x3a, + 0xaa, 0x31, 0x76, 0xc2, 0x9f, 0x25, 0x57, 0x3a, 0x7b, 0x0f, 0xa0, 0xab, 0xb0, 0x7e, 0xf0, 0x39, + 0xb9, 0x08, 0x94, 0x4b, 0x41, 0xe0, 0x40, 0xfc, 0x98, 0x74, 0xff, 0xdd, 0xa7, 0x6b, 0x9e, 0xd2, + 0x34, 0xee, 0xfd, 0xf7, 0xf8, 0xea, 0xd3, 0xc7, 0xe7, 0x17, 0x14, 0xa0, 0x94, 0x5a, 0x2d, 0xd8, + 0x3c, 0x38, 0x14, 0x67, 0xc0, 0xb4, 0xdf, 0x67, 0xc2, 0x58, 0x8e, 0x7c, 0x52, 0x52, 0x63, 0x66, + 0xc0, 0x9b, 0x52, 0x6b, 0xec, 0xbb, 0x03, 0x31, 0x75, 0xa7, 0x0f, 0xca, 0x2f, 0x4f, 0xb0, 0x4e, + 0xb3, 0xe0, 0x38, 0x97, 0xc8, 0x91, 0x97, 0x87, 0x15, 0x90, 0x5f, 0x42, 0x5e, 0x73, 0x7b, 0x44, + 0x7d, 0x66, 0xd7, 0x6d, 0xfb, 0x7d, 0x66, 0xdf, 0xfd, 0xf4, 0x83, 0x75, 0x58, 0x9f, 0xac, 0x79, + 0x42, 0xd2, 0xb8, 0xa3, 0x34, 0xc7, 0xd6, 0x9e, 0x3e, 0x38, 0xff, 0xa2, 0x80, 0xb9, 0xc0, 0xc2, + 0x45, 0x31, 0xf9, 0xf9, 0xc7, 0x9c, 0xdd, 0x12, 0x7e, 0x2e, 0x59, 0xa8, 0xb3, 0x80, 0xa7, 0x62, + 0xcb, 0x52, 0x36, 0x2c, 0x26, 0x08, 0x82, 0x26, 0x47, 0xe0, 0x18, 0x56, 0xf0, 0x0a, 0x98, 0x24, + 0x04, 0x2d, 0x5a, 0x7b, 0xc4, 0x05, 0x50, 0x30, 0x34, 0xfe, 0xf8, 0x48, 0x0c, 0x8d, 0xf7, 0x88, + 0x86, 0x46, 0xc9, 0xc8, 0xc5, 0xbe, 0x9d, 0x31, 0xa1, 0x4f, 0x0c, 0xfe, 0x7f, 0xe4, 0x66, 0xc6, + 0x04, 0x3e, 0x31, 0x03, 0xea, 0x4f, 0x1f, 0xd1, 0x4f, 0x36, 0xd8, 0x60, 0xeb, 0x6f, 0x8c, 0xc2, + 0xff, 0x7e, 0x0c, 0xe4, 0xce, 0xe3, 0x87, 0xff, 0x15, 0xde, 0x6c, 0xf5, 0x8a, 0x11, 0x04, 0x59, + 0x78, 0x36, 0xc8, 0xe1, 0xf2, 0xd9, 0xb2, 0xe5, 0x36, 0xb9, 0x5d, 0x5a, 0x4c, 0x88, 0x4e, 0xfe, + 0x53, 0x4f, 0x82, 0x42, 0xd7, 0xd9, 0x75, 0x9b, 0x58, 0x7d, 0xc6, 0x12, 0xc3, 0xde, 0x92, 0x06, + 0x17, 0x15, 0x8a, 0x9e, 0x1f, 0x9d, 0xeb, 0x27, 0x77, 0xd1, 0x91, 0x22, 0x5c, 0x74, 0x94, 0x60, + 0xff, 0x40, 0x82, 0xb6, 0xf4, 0x25, 0xe2, 0xaf, 0xc8, 0x9d, 0x7f, 0xad, 0x51, 0xc1, 0x1e, 0xc1, + 0x96, 0x83, 0x8a, 0x43, 0x52, 0xc7, 0x6d, 0x91, 0xb5, 0x41, 0x3c, 0xf7, 0xb1, 0x3a, 0x6e, 0x4b, + 0xd0, 0x30, 0x96, 0xd3, 0xe6, 0x05, 0xe6, 0x6c, 0xfa, 0xe0, 0x28, 0xd1, 0xcd, 0x09, 0x42, 0x7f, + 0x20, 0x74, 0x46, 0xe8, 0x84, 0x3a, 0x34, 0x3a, 0x87, 0xe4, 0x86, 0xfa, 0x07, 0x0a, 0x89, 0x68, + 0xe9, 0x2b, 0x39, 0xf2, 0x17, 0x16, 0x25, 0x86, 0x08, 0xcf, 0xc1, 0x42, 0x3c, 0xe7, 0xd9, 0xe1, + 0x43, 0x7c, 0x8b, 0xac, 0xe3, 0xe8, 0x1f, 0x77, 0x88, 0x6f, 0x59, 0x42, 0xd2, 0x07, 0xf2, 0xd7, + 0xe8, 0x05, 0x61, 0xa5, 0xa6, 0x67, 0xed, 0x8d, 0xb8, 0xa7, 0x89, 0xd3, 0x4b, 0xc2, 0xa8, 0xbe, + 0xfb, 0x38, 0x44, 0x29, 0x1c, 0x77, 0x54, 0x5f, 0x39, 0x32, 0xc6, 0x70, 0x1c, 0x1d, 0x60, 0xee, + 0x31, 0xdb, 0xcc, 0x9b, 0x98, 0x35, 0x00, 0x1d, 0x1c, 0xad, 0xb3, 0x60, 0x86, 0x5b, 0xfa, 0xfb, + 0x17, 0xcf, 0x08, 0x69, 0x49, 0x0f, 0xac, 0x07, 0x2c, 0x1b, 0xb9, 0x61, 0x20, 0x81, 0xc1, 0x57, + 0x86, 0x88, 0xb1, 0xdc, 0xeb, 0xe6, 0xcf, 0x61, 0x63, 0xc2, 0xea, 0x77, 0x79, 0xac, 0x6a, 0x22, + 0x56, 0x77, 0xc9, 0xb0, 0x49, 0x6e, 0x4e, 0x93, 0x5a, 0x37, 0xbe, 0x23, 0x80, 0x4b, 0x17, 0xe0, + 0x7a, 0xf6, 0xd0, 0x74, 0xa4, 0x8f, 0xd8, 0x9b, 0x15, 0x7a, 0xb9, 0x53, 0x69, 0xcf, 0xb4, 0xda, + 0x24, 0xca, 0xc0, 0x08, 0x2e, 0x27, 0xfe, 0x33, 0x1e, 0x94, 0xf3, 0x22, 0x28, 0xf7, 0xcb, 0x30, + 0x43, 0xa0, 0x28, 0x02, 0x9b, 0xa7, 0xf3, 0xc6, 0x71, 0x1a, 0x62, 0xf8, 0xda, 0xde, 0x70, 0x7e, + 0xec, 0x3b, 0x6f, 0x35, 0xff, 0xed, 0x00, 0xa4, 0x07, 0x05, 0x90, 0xb4, 0x83, 0xd2, 0x95, 0x3e, + 0x56, 0xaf, 0xa4, 0x53, 0x57, 0x9d, 0x2e, 0xaf, 0x46, 0x33, 0x75, 0xb1, 0x95, 0x9b, 0x22, 0xac, + 0xdc, 0x12, 0x9e, 0x71, 0x08, 0x5d, 0x77, 0x7d, 0xe2, 0x06, 0x75, 0xa7, 0xdc, 0x88, 0xcf, 0x38, + 0x0c, 0xa4, 0x20, 0x7d, 0x70, 0xfe, 0x41, 0x01, 0x60, 0xd9, 0x75, 0x76, 0x3b, 0x35, 0xb7, 0x85, + 0x5c, 0xf8, 0x37, 0xe1, 0x62, 0xed, 0x65, 0x23, 0x58, 0xac, 0xad, 0x03, 0xb0, 0x15, 0x14, 0xce, + 0x46, 0xa3, 0xa7, 0xc8, 0x2d, 0xcd, 0x42, 0xa2, 0x74, 0xae, 0x0c, 0xf1, 0x9a, 0xdf, 0xe7, 0x8a, + 0x18, 0xc7, 0xcd, 0x2f, 0x61, 0x71, 0xa3, 0x5c, 0xac, 0xbd, 0x2b, 0xc0, 0xda, 0x10, 0xb0, 0xbe, + 0xff, 0x00, 0x94, 0xa4, 0x8f, 0xf9, 0x3f, 0x4e, 0x80, 0x69, 0xba, 0xb5, 0x4a, 0x79, 0xfa, 0x77, + 0x21, 0xe8, 0xbf, 0x3c, 0x02, 0xd0, 0x37, 0xc0, 0x8c, 0x13, 0x96, 0x4e, 0xe7, 0x3f, 0xde, 0x58, + 0x16, 0x0b, 0x3b, 0x47, 0x97, 0x2e, 0x14, 0x03, 0x3f, 0xc2, 0x23, 0xaf, 0x8b, 0xc8, 0xdf, 0x13, + 0xc3, 0x6f, 0xae, 0xc4, 0x51, 0x42, 0xff, 0xee, 0x00, 0xfa, 0x0d, 0x01, 0xfa, 0xd2, 0x41, 0x48, + 0x19, 0xc3, 0x15, 0x07, 0x0a, 0xc8, 0x91, 0x13, 0x89, 0xbf, 0x91, 0xa2, 0x2d, 0xe6, 0x14, 0x98, + 0x20, 0x5d, 0x36, 0x58, 0x23, 0xfa, 0xaf, 0xf8, 0x8b, 0xb9, 0xe9, 0x21, 0x37, 0xf0, 0x2e, 0xf1, + 0x5f, 0x31, 0x0d, 0xbe, 0x27, 0x78, 0xf7, 0x54, 0x81, 0x6e, 0x1a, 0x07, 0x09, 0x43, 0x2f, 0x20, + 0x79, 0x8e, 0x8f, 0xec, 0x8c, 0xe2, 0x30, 0x0b, 0xc8, 0x01, 0x84, 0xa4, 0x0f, 0xfc, 0x17, 0x72, + 0xe0, 0x14, 0xb5, 0x00, 0x2e, 0xb9, 0xce, 0x4e, 0xcf, 0x8d, 0x62, 0xd6, 0xc1, 0x65, 0xe1, 0x16, + 0x30, 0xe7, 0x09, 0x3e, 0xf0, 0x4c, 0x26, 0x7a, 0x52, 0xe1, 0x9f, 0xf2, 0xfe, 0x2f, 0xcf, 0x13, + 0x91, 0x5c, 0x88, 0x61, 0x60, 0x14, 0xed, 0x89, 0x37, 0x55, 0x24, 0x09, 0xe5, 0x0c, 0x8a, 0xca, + 0x50, 0xf6, 0xe5, 0x40, 0xa6, 0xf2, 0x32, 0x32, 0xf5, 0xfe, 0x40, 0xa6, 0x7e, 0x58, 0x90, 0xa9, + 0xe5, 0x83, 0xb3, 0x24, 0x7d, 0xd9, 0x7a, 0x6d, 0xb0, 0x89, 0x17, 0x6c, 0xb1, 0xee, 0xa4, 0xb0, + 0xb1, 0xca, 0xfb, 0x8e, 0xe5, 0x04, 0xdf, 0x31, 0xf1, 0x0e, 0x90, 0x04, 0x56, 0x0b, 0x91, 0xea, + 0x08, 0x59, 0x9a, 0x03, 0x59, 0xcb, 0xa7, 0x2e, 0x6b, 0xb5, 0x86, 0xb2, 0x4b, 0xc4, 0x56, 0x34, + 0x06, 0x3b, 0xe0, 0x1c, 0x28, 0x2c, 0x59, 0x6d, 0x0f, 0xb9, 0xf0, 0x4b, 0xcc, 0x2a, 0xf1, 0xda, + 0x14, 0x27, 0x80, 0x45, 0x50, 0xd8, 0x24, 0xb5, 0x31, 0x95, 0xf9, 0x76, 0xb9, 0xde, 0x43, 0x29, + 0xd4, 0xd9, 0xbf, 0x49, 0x23, 0x22, 0xf6, 0x14, 0x33, 0x32, 0x73, 0x46, 0x82, 0x88, 0x88, 0x83, + 0x49, 0x18, 0xcb, 0x65, 0x60, 0x05, 0x1d, 0xed, 0xe0, 0x39, 0xfe, 0x52, 0x7a, 0x08, 0x17, 0x81, + 0x62, 0xb5, 0xba, 0x64, 0x70, 0x9c, 0xd2, 0xf1, 0x63, 0x52, 0xbf, 0xae, 0x5e, 0x56, 0x51, 0x92, + 0xc7, 0xed, 0xd7, 0x25, 0x45, 0x45, 0xfa, 0x98, 0x7d, 0x87, 0x38, 0xf5, 0x76, 0xda, 0x66, 0x13, + 0x61, 0xea, 0x53, 0x43, 0x8d, 0x8e, 0x64, 0x39, 0x7f, 0x24, 0xe3, 0xfa, 0x69, 0xfe, 0x00, 0xfd, + 0x74, 0x58, 0x93, 0x71, 0xc0, 0x73, 0xd2, 0xf0, 0x43, 0x33, 0x19, 0xc7, 0x92, 0x31, 0x86, 0xab, + 0x5e, 0xfd, 0xc3, 0xcb, 0x63, 0xed, 0xad, 0xc3, 0x6e, 0xa8, 0x31, 0x66, 0x8d, 0xec, 0xa0, 0xf2, + 0x30, 0x1b, 0x6a, 0xd1, 0x34, 0x8c, 0x01, 0xad, 0x39, 0x86, 0xd6, 0x67, 0xd9, 0x34, 0x9a, 0xf2, + 0x9e, 0x76, 0xd7, 0x71, 0xbd, 0x64, 0x7b, 0xda, 0x98, 0x3a, 0x9d, 0xfc, 0x97, 0xf4, 0x90, 0x9c, + 0x78, 0x96, 0x7d, 0x54, 0xd3, 0x67, 0x82, 0x43, 0x72, 0x83, 0x08, 0x48, 0x1f, 0xde, 0xb7, 0x1e, + 0xd2, 0xe4, 0x39, 0x6c, 0x77, 0x64, 0x7d, 0x60, 0x64, 0x53, 0xe7, 0x30, 0xdd, 0x31, 0x9a, 0x86, + 0xf4, 0xf1, 0xfa, 0x7b, 0x6e, 0xe2, 0x7c, 0xf3, 0x18, 0x27, 0x4e, 0xbf, 0x67, 0xe6, 0x87, 0xec, + 0x99, 0xc3, 0xee, 0xd5, 0x31, 0x5e, 0x8f, 0x6e, 0xc2, 0x1c, 0x66, 0xaf, 0x2e, 0x86, 0x88, 0xf4, + 0x11, 0x7f, 0x8b, 0x02, 0xf2, 0xf5, 0xf1, 0xcf, 0x97, 0xc3, 0xae, 0x45, 0x08, 0xaf, 0xea, 0x23, + 0x9b, 0x2e, 0x87, 0x59, 0x8b, 0x44, 0x92, 0x30, 0x86, 0xcb, 0x0e, 0x8e, 0x82, 0x19, 0x62, 0x12, + 0xf1, 0xb7, 0xc4, 0xff, 0x9e, 0xcd, 0x9a, 0x6f, 0x4c, 0xb1, 0xaf, 0x3e, 0x07, 0x4c, 0xfa, 0xfb, + 0x66, 0x6c, 0xe6, 0x9c, 0x97, 0xeb, 0x9f, 0xc1, 0xbe, 0x5b, 0xf0, 0xff, 0x81, 0x1c, 0x57, 0x46, + 0xbe, 0xaf, 0x3e, 0xac, 0xe3, 0xca, 0xa1, 0xee, 0xad, 0xff, 0x49, 0x38, 0xa3, 0xfe, 0xc7, 0xf4, + 0x30, 0xef, 0xdd, 0x73, 0xcf, 0xf5, 0xd9, 0x73, 0x7f, 0x94, 0xc7, 0xb2, 0x2e, 0x62, 0x79, 0xaf, + 0x2c, 0x0b, 0x47, 0x38, 0xd7, 0x3e, 0x12, 0xc0, 0x79, 0x5e, 0x80, 0x73, 0xe1, 0x40, 0xb4, 0x8c, + 0xe1, 0x90, 0x6a, 0x2e, 0x9c, 0x73, 0x3f, 0x96, 0x62, 0x3f, 0xee, 0x39, 0x01, 0x93, 0xdb, 0x77, + 0x02, 0x46, 0xe8, 0xe9, 0xf9, 0x03, 0xf6, 0xf4, 0x8f, 0xf1, 0xd2, 0x61, 0x88, 0xd2, 0xf1, 0x6c, + 0x79, 0x44, 0x46, 0x37, 0x33, 0xbf, 0x27, 0x10, 0x8f, 0x0b, 0x82, 0x78, 0x94, 0x0f, 0x46, 0x4c, + 0xfa, 0xf2, 0xf1, 0x87, 0xfe, 0x82, 0xf6, 0x90, 0xfb, 0xfb, 0xb0, 0x5b, 0xc5, 0x02, 0x13, 0x47, + 0x36, 0x73, 0x0f, 0xb3, 0x55, 0x3c, 0x88, 0x92, 0x31, 0xc4, 0xbf, 0x9b, 0x05, 0xd3, 0x84, 0xa6, + 0x0b, 0x56, 0x6b, 0x0b, 0x79, 0xf0, 0x57, 0xa9, 0x3f, 0xa9, 0x1f, 0x6d, 0x74, 0x44, 0x21, 0xa1, + 0xa2, 0xce, 0x26, 0x27, 0xf5, 0xe8, 0xa0, 0x44, 0xce, 0x73, 0x04, 0x8e, 0x3b, 0x6a, 0xe5, 0x40, + 0x0a, 0xd2, 0x87, 0xec, 0x23, 0xd4, 0xdd, 0x66, 0xd5, 0xbc, 0xea, 0xec, 0x7a, 0xf0, 0x85, 0x23, + 0x18, 0xa0, 0x17, 0x40, 0xa1, 0x4d, 0x4a, 0x63, 0x47, 0x68, 0xe2, 0x97, 0x3b, 0x8c, 0x05, 0xb4, + 0x7e, 0x9d, 0xfd, 0x99, 0xf4, 0x1c, 0x4d, 0xc8, 0x47, 0x5a, 0xce, 0xb8, 0xcf, 0xd1, 0x0c, 0xa8, + 0x7f, 0x2c, 0xf7, 0x1a, 0x4d, 0xe2, 0xda, 0xad, 0x1d, 0xcb, 0x1b, 0x51, 0xb4, 0x8d, 0x36, 0x2e, + 0xcb, 0x8f, 0xb6, 0x41, 0x5e, 0x92, 0x9e, 0xee, 0xe5, 0xb8, 0x82, 0x7f, 0x1f, 0xf7, 0xe9, 0xde, + 0xf8, 0xea, 0xd3, 0xc7, 0xe4, 0xbf, 0xd0, 0x9e, 0x75, 0x9e, 0x3a, 0x4a, 0xa7, 0xe8, 0x83, 0x3d, + 0x74, 0x67, 0xa1, 0xa4, 0x1d, 0x5e, 0x67, 0xe9, 0x5b, 0x7f, 0xfa, 0xc0, 0x7c, 0xe0, 0x34, 0xc8, + 0x2f, 0xa2, 0x8b, 0xbb, 0x5b, 0xf0, 0x1e, 0x30, 0x69, 0xb8, 0x08, 0x55, 0xec, 0x4d, 0x07, 0x73, + 0xd7, 0xc3, 0xcf, 0x3e, 0x24, 0xec, 0x0d, 0xe3, 0xb1, 0x8d, 0xcc, 0x56, 0x78, 0x56, 0xd0, 0x7f, + 0x85, 0xaf, 0xc8, 0x82, 0x5c, 0xdd, 0x33, 0x3d, 0x38, 0x15, 0x60, 0x0b, 0x5f, 0xc8, 0x63, 0x71, + 0x8f, 0x88, 0xc5, 0x2d, 0x02, 0x2f, 0x08, 0x05, 0xf3, 0xf8, 0xff, 0x08, 0x00, 0x20, 0x98, 0x7c, + 0xa8, 0xeb, 0xd8, 0x38, 0x87, 0x7f, 0x5c, 0xd5, 0x7f, 0x87, 0xaf, 0x09, 0xd8, 0x7d, 0x9f, 0xc0, + 0xee, 0x27, 0xc9, 0x55, 0x31, 0x06, 0x4b, 0x5b, 0x16, 0x4c, 0x61, 0xd6, 0xae, 0x20, 0xb3, 0xd5, + 0x85, 0x8f, 0x0f, 0x85, 0x3f, 0x82, 0xcd, 0xf0, 0x83, 0xd2, 0x01, 0x50, 0x69, 0xab, 0x82, 0xc2, + 0xa3, 0x3d, 0x3a, 0xfc, 0xcd, 0xff, 0xac, 0x18, 0x38, 0xe6, 0x1c, 0xc8, 0x59, 0xf6, 0xa6, 0xc3, + 0xfc, 0x0b, 0xaf, 0x8f, 0x28, 0x1b, 0xcb, 0x84, 0x4e, 0x32, 0x4a, 0x46, 0x47, 0x8d, 0x27, 0x6b, + 0x2c, 0x17, 0x0d, 0xe6, 0x70, 0xed, 0xf0, 0xff, 0x18, 0xc8, 0x6c, 0x55, 0x05, 0xb9, 0x8e, 0xe9, + 0x6d, 0xb3, 0xaa, 0xc9, 0x33, 0xd6, 0x91, 0x77, 0x6d, 0xd3, 0x76, 0xec, 0xab, 0x3b, 0xd6, 0xf3, + 0x83, 0xfb, 0x8c, 0x85, 0x34, 0x4c, 0xf9, 0x16, 0xb2, 0x91, 0x6b, 0x7a, 0xa8, 0xbe, 0xb7, 0x45, + 0xd6, 0x58, 0x93, 0x3a, 0x9f, 0x94, 0x58, 0xfe, 0x31, 0xc5, 0xd1, 0xf2, 0xbf, 0x69, 0xb5, 0x11, + 0x89, 0xaa, 0xc5, 0xe4, 0xdf, 0x7f, 0x4f, 0x24, 0xff, 0x7d, 0xaa, 0x48, 0x1f, 0x8d, 0xef, 0x66, + 0xc1, 0x4c, 0x1d, 0x0b, 0x5c, 0x7d, 0x77, 0x67, 0xc7, 0x74, 0xaf, 0xc2, 0x9b, 0x42, 0x54, 0x38, + 0xd1, 0xcc, 0x88, 0x7e, 0x29, 0x7f, 0x20, 0x7d, 0x95, 0x37, 0xeb, 0xda, 0x5c, 0x0d, 0x89, 0xfb, + 0xc1, 0x53, 0x41, 0x1e, 0x8b, 0xb7, 0xef, 0x71, 0x19, 0xdb, 0x11, 0x68, 0x4e, 0xc9, 0xe8, 0x63, + 0x03, 0x69, 0x1b, 0x43, 0xe4, 0x93, 0x2c, 0x38, 0x5a, 0xf7, 0xcc, 0xe6, 0xa5, 0x65, 0xc7, 0x75, + 0x76, 0x3d, 0xcb, 0x46, 0x5d, 0xf8, 0xb8, 0x10, 0x01, 0x5f, 0xfe, 0x33, 0xa1, 0xfc, 0xc3, 0x7f, + 0xcd, 0xc8, 0xce, 0xa2, 0xc1, 0xb0, 0xca, 0x17, 0x1f, 0x11, 0x4c, 0x4c, 0x6e, 0x5e, 0x94, 0x29, + 0x71, 0x2c, 0xa7, 0x24, 0x8a, 0xda, 0x95, 0x8e, 0xe3, 0x7a, 0xab, 0x4e, 0xd3, 0x6c, 0x77, 0x3d, + 0xc7, 0x45, 0xb0, 0x16, 0xcb, 0x35, 0x3c, 0xc2, 0xb4, 0x9c, 0x66, 0x38, 0x39, 0xb2, 0x37, 0x5e, + 0xec, 0x14, 0x51, 0xc6, 0x3f, 0x22, 0xbd, 0xcb, 0x48, 0xb9, 0xd2, 0x4b, 0x51, 0x84, 0x9c, 0xf7, + 0x1b, 0xd2, 0x92, 0x1d, 0x6c, 0x91, 0xdb, 0x79, 0x94, 0x22, 0x6a, 0x0c, 0xa6, 0xf2, 0x2c, 0x98, + 0xad, 0xef, 0x5e, 0x0c, 0x0a, 0xe9, 0xf2, 0x4a, 0xc8, 0xeb, 0xa4, 0x23, 0x8a, 0x30, 0xc1, 0xe3, + 0x0b, 0x8a, 0xe0, 0xef, 0xcd, 0x60, 0xb6, 0xcb, 0x67, 0x63, 0x78, 0x8b, 0x89, 0x92, 0x91, 0x44, + 0x06, 0xd7, 0x9a, 0x3e, 0x03, 0xdf, 0x93, 0x05, 0xb3, 0xb5, 0x0e, 0xb2, 0x51, 0x8b, 0x7a, 0x41, + 0x0a, 0x0c, 0x7c, 0x45, 0x42, 0x06, 0x0a, 0x05, 0x45, 0x30, 0x30, 0xf4, 0x58, 0x5e, 0xf4, 0x99, + 0x17, 0x26, 0x24, 0x62, 0x5c, 0x5c, 0x6d, 0xe9, 0x33, 0xee, 0x8b, 0x59, 0x30, 0xad, 0xef, 0xda, + 0xeb, 0xae, 0x83, 0x67, 0x63, 0x17, 0xde, 0x1b, 0x0e, 0x10, 0xb7, 0x83, 0x63, 0xad, 0x5d, 0x97, + 0xd8, 0x9f, 0x2a, 0x76, 0x1d, 0x35, 0x1d, 0xbb, 0xd5, 0x25, 0xed, 0xc8, 0xeb, 0xfb, 0x3f, 0xdc, + 0x9d, 0x7b, 0xf8, 0xeb, 0x4a, 0x06, 0xfe, 0xac, 0x74, 0x58, 0x22, 0xda, 0x78, 0xae, 0x6a, 0xf9, + 0x91, 0x40, 0x32, 0xf8, 0xd0, 0xa0, 0x1a, 0xd2, 0x67, 0xee, 0x87, 0xb2, 0x40, 0x2d, 0x35, 0x9b, + 0xce, 0xae, 0xed, 0xd5, 0x51, 0x1b, 0x35, 0x3d, 0xc3, 0x35, 0x9b, 0x08, 0x1e, 0x0d, 0x78, 0xcc, + 0xb8, 0xf6, 0x0a, 0xe9, 0xfd, 0x45, 0xda, 0xa6, 0xfd, 0x65, 0x26, 0x60, 0x9e, 0xdc, 0x2e, 0xa2, + 0x64, 0x45, 0x63, 0xb8, 0x67, 0x27, 0x0b, 0x72, 0xeb, 0x96, 0xbd, 0xc5, 0x47, 0x6b, 0x3a, 0x8e, + 0x75, 0x9d, 0x16, 0xba, 0xc2, 0xa4, 0x91, 0xbe, 0xa8, 0x77, 0x80, 0xe3, 0xf6, 0xee, 0xce, 0x45, + 0xe4, 0xd6, 0x36, 0xc9, 0x4c, 0xd0, 0x35, 0x9c, 0x3a, 0xb2, 0xa9, 0xa2, 0x94, 0xd7, 0xfb, 0x7e, + 0x13, 0xd5, 0x04, 0x09, 0x05, 0x17, 0x53, 0x12, 0xc1, 0xeb, 0x80, 0xa8, 0x2c, 0x47, 0x54, 0x22, + 0xd5, 0xb6, 0x4f, 0xe1, 0xe9, 0xf3, 0xf7, 0x6b, 0x59, 0x30, 0xb1, 0x86, 0x3c, 0xd7, 0x6a, 0x76, + 0xe1, 0xe7, 0xf1, 0x34, 0x84, 0xbc, 0x75, 0xd3, 0x35, 0x77, 0x90, 0x87, 0xdc, 0x2e, 0xd4, 0x42, + 0xa6, 0x43, 0x30, 0xd9, 0x69, 0x9b, 0xde, 0xa6, 0xe3, 0xee, 0x30, 0x9d, 0x21, 0x78, 0xc7, 0xfa, + 0xc1, 0x1e, 0x72, 0xbb, 0x21, 0x59, 0xfe, 0x2b, 0x13, 0x70, 0x79, 0x6d, 0x8c, 0x91, 0x32, 0x2f, + 0x90, 0x71, 0x20, 0x6d, 0x4c, 0xa6, 0xc4, 0xb1, 0xdc, 0x25, 0xa3, 0xac, 0x3a, 0x5b, 0xf0, 0x55, + 0x0a, 0xc8, 0x11, 0xc9, 0x7b, 0x4b, 0x46, 0x58, 0x42, 0xec, 0xa0, 0x6e, 0xd7, 0xdc, 0x42, 0xfe, + 0x12, 0x82, 0xbd, 0xaa, 0x77, 0x81, 0x7c, 0x1b, 0xed, 0xa1, 0x36, 0x21, 0x63, 0xee, 0x8e, 0x9b, + 0x84, 0x96, 0xad, 0x3a, 0x5b, 0xf3, 0xb8, 0xac, 0x79, 0x56, 0xce, 0xfc, 0x2a, 0xce, 0xaa, 0xd3, + 0x3f, 0xce, 0x3e, 0x07, 0xe4, 0xc9, 0xbb, 0x3a, 0x05, 0xf2, 0x8b, 0xda, 0xc2, 0xc6, 0x72, 0xf1, + 0x08, 0x7e, 0xf4, 0xe9, 0x9b, 0x02, 0xf9, 0xa5, 0x92, 0x51, 0x5a, 0x2d, 0x66, 0x71, 0x3b, 0x2a, + 0xd5, 0xa5, 0x5a, 0x51, 0xc1, 0x89, 0xeb, 0xa5, 0x6a, 0xa5, 0x5c, 0xcc, 0xa9, 0xd3, 0x60, 0xe2, + 0x42, 0x49, 0xaf, 0x56, 0xaa, 0xcb, 0xc5, 0x3c, 0xfc, 0x5b, 0x1e, 0xbf, 0xbb, 0x45, 0xfc, 0x6e, + 0x8e, 0xa2, 0xa9, 0x1f, 0x64, 0xbf, 0x12, 0x40, 0x76, 0xaf, 0x00, 0xd9, 0x0f, 0xc8, 0x14, 0x32, + 0x06, 0x94, 0xb2, 0x60, 0x62, 0xdd, 0x75, 0x9a, 0xa8, 0xdb, 0x85, 0xbf, 0x94, 0x05, 0x85, 0xb2, + 0x69, 0x37, 0x51, 0x1b, 0x5e, 0x17, 0x42, 0x45, 0x7d, 0x81, 0x32, 0xc1, 0x71, 0x80, 0x7f, 0xe0, + 0x39, 0x73, 0xbf, 0xc8, 0x99, 0xdb, 0x84, 0x46, 0xb1, 0x72, 0xe7, 0x69, 0x99, 0x11, 0xfc, 0x79, + 0x7d, 0xc0, 0x9f, 0xb2, 0xc0, 0x9f, 0x73, 0xf2, 0x45, 0xa5, 0xcf, 0xa5, 0x6f, 0x67, 0xc0, 0xf1, + 0x65, 0x64, 0x23, 0xd7, 0x6a, 0x52, 0xe2, 0xfd, 0xf6, 0xdf, 0x2b, 0xb6, 0xff, 0x89, 0x02, 0xd1, + 0xfd, 0xfe, 0x10, 0x1b, 0xff, 0xda, 0xa0, 0xf1, 0xf7, 0x0b, 0x8d, 0xbf, 0x5d, 0xb2, 0x9c, 0x31, + 0x5c, 0x1c, 0x3b, 0x05, 0x66, 0xaa, 0x8e, 0x67, 0x6d, 0x5a, 0x4d, 0xba, 0x71, 0xfc, 0x4a, 0x05, + 0xe4, 0x56, 0xad, 0xae, 0xc7, 0x9f, 0x40, 0x3f, 0x03, 0xa6, 0x2d, 0xbb, 0xd9, 0xde, 0x6d, 0x21, + 0x1d, 0x99, 0x54, 0x56, 0x26, 0x75, 0x3e, 0x29, 0xb4, 0xc7, 0x63, 0xb2, 0x14, 0xdf, 0x1e, 0xff, + 0x29, 0x69, 0xdd, 0x89, 0x27, 0x81, 0x9c, 0xef, 0x8e, 0x98, 0x92, 0x4a, 0x60, 0xd6, 0xe6, 0xb2, + 0xfa, 0x47, 0xce, 0x7b, 0x23, 0x36, 0xf3, 0xc5, 0xe9, 0xe2, 0x1f, 0xf0, 0x7d, 0x52, 0xaa, 0xd6, + 0x20, 0x82, 0x92, 0x21, 0xb3, 0x94, 0x1c, 0x19, 0x55, 0x05, 0x73, 0x95, 0xaa, 0xa1, 0xe9, 0xd5, + 0xd2, 0x2a, 0xcb, 0xa2, 0xc0, 0xef, 0x66, 0x41, 0x5e, 0x47, 0x9d, 0xf6, 0x55, 0x3e, 0x24, 0x27, + 0xf3, 0xee, 0xca, 0x04, 0xde, 0x5d, 0xea, 0x12, 0x00, 0x66, 0x13, 0x57, 0x4c, 0xee, 0x1e, 0xc9, + 0xf6, 0x0d, 0x14, 0x27, 0x34, 0xb0, 0x14, 0xe4, 0xd6, 0xb9, 0x3f, 0xe1, 0x8b, 0xa5, 0xcd, 0x3d, + 0x42, 0x69, 0x84, 0xc2, 0x88, 0xe1, 0xe0, 0xfd, 0x52, 0x16, 0x9a, 0x81, 0xc5, 0x1d, 0x0e, 0xfb, + 0xbf, 0x9c, 0x05, 0x39, 0x03, 0xaf, 0xbf, 0xb8, 0xa5, 0xd8, 0x27, 0x87, 0x93, 0x71, 0x5c, 0x4c, + 0x84, 0x8c, 0xdf, 0x07, 0x66, 0x78, 0x89, 0x65, 0xfb, 0x1b, 0xb1, 0x22, 0x2e, 0xfc, 0x30, 0x8c, + 0x84, 0xf7, 0x21, 0xe7, 0x70, 0x58, 0xfc, 0x95, 0xdb, 0x00, 0x58, 0x43, 0x58, 0xaf, 0xed, 0x6e, + 0x5b, 0x1d, 0xf8, 0xdf, 0x14, 0x30, 0xb5, 0x8c, 0xbc, 0xba, 0x67, 0x7a, 0xbb, 0xdd, 0x1e, 0x1b, + 0xa5, 0xed, 0x94, 0xcd, 0xe6, 0x36, 0x62, 0xc3, 0x91, 0xff, 0x0a, 0xdf, 0xad, 0xc8, 0x6e, 0x02, + 0x86, 0xf5, 0xcc, 0x07, 0x75, 0x44, 0x60, 0xf2, 0x64, 0x90, 0x6b, 0x99, 0x9e, 0xc9, 0xb0, 0xb8, + 0xae, 0x07, 0x8b, 0xb0, 0x20, 0x9d, 0x64, 0x83, 0xbf, 0x95, 0x95, 0xd9, 0x05, 0x94, 0xa8, 0x3f, + 0x19, 0x08, 0xef, 0xcb, 0x0c, 0x81, 0xc2, 0x31, 0x30, 0x5b, 0xad, 0x19, 0x8d, 0xd5, 0xda, 0xf2, + 0xb2, 0x86, 0x53, 0x8b, 0x8a, 0x7a, 0x12, 0xa8, 0xeb, 0xa5, 0x07, 0xd7, 0xb4, 0xaa, 0xd1, 0xa8, + 0xd6, 0x16, 0x35, 0xf6, 0x67, 0x4e, 0x3d, 0x0a, 0xa6, 0xcb, 0xa5, 0xf2, 0x8a, 0x9f, 0x90, 0x57, + 0x4f, 0x81, 0xe3, 0x6b, 0xda, 0xda, 0x82, 0xa6, 0xd7, 0x57, 0x2a, 0xeb, 0x0d, 0x5c, 0xcc, 0x52, + 0x6d, 0xa3, 0xba, 0x58, 0x2c, 0xa8, 0x10, 0x9c, 0xe4, 0xbe, 0x5c, 0xd0, 0x6b, 0xd5, 0xe5, 0x46, + 0xdd, 0x28, 0x19, 0x5a, 0x71, 0x42, 0xbd, 0x06, 0x1c, 0x2d, 0x97, 0xaa, 0x24, 0x7b, 0xb9, 0x56, + 0xad, 0x6a, 0x65, 0xa3, 0x38, 0x09, 0xff, 0x35, 0x07, 0xa6, 0x2b, 0xdd, 0xaa, 0xb9, 0x83, 0xce, + 0x9b, 0x6d, 0xab, 0x05, 0x7f, 0x96, 0xd3, 0x26, 0x6f, 0x06, 0xb3, 0x2e, 0x7d, 0x44, 0x2d, 0xc3, + 0x42, 0x14, 0xcd, 0x59, 0x5d, 0x4c, 0x54, 0x4f, 0x82, 0x82, 0x4d, 0x0a, 0x60, 0xac, 0x61, 0x6f, + 0xea, 0x02, 0x00, 0xf4, 0xc9, 0x08, 0x6f, 0xc1, 0x3b, 0xdb, 0xdb, 0x9b, 0xcc, 0x1d, 0xd4, 0x45, + 0xee, 0x9e, 0xd5, 0x44, 0x7e, 0x4e, 0x9d, 0xfb, 0x0b, 0x7e, 0x45, 0x91, 0x35, 0x0a, 0x72, 0xa0, + 0x72, 0xcd, 0x89, 0x18, 0x0d, 0x7f, 0x46, 0x91, 0x31, 0xe9, 0x49, 0x15, 0x99, 0x4c, 0x52, 0x5e, + 0x9a, 0x1d, 0x42, 0x52, 0x66, 0xc1, 0x94, 0x51, 0xab, 0x35, 0xea, 0x2b, 0x35, 0xdd, 0x28, 0x2a, + 0xea, 0x0c, 0x98, 0xc4, 0xaf, 0xab, 0xb5, 0xea, 0x72, 0x31, 0xa7, 0x9e, 0x00, 0xc7, 0x56, 0x4a, + 0xf5, 0x46, 0xa5, 0x7a, 0xbe, 0xb4, 0x5a, 0x59, 0x6c, 0x94, 0x57, 0x4a, 0x7a, 0xbd, 0x98, 0x57, + 0xaf, 0x03, 0x27, 0x8c, 0x8a, 0xa6, 0x37, 0x96, 0xb4, 0x92, 0xb1, 0xa1, 0x6b, 0xf5, 0x46, 0xb5, + 0xd6, 0xa8, 0x96, 0xd6, 0xb4, 0x62, 0x01, 0x77, 0x7f, 0xf2, 0x29, 0x14, 0x9b, 0x89, 0xfd, 0xc2, + 0x38, 0x19, 0x21, 0x8c, 0x53, 0xbd, 0xc2, 0x08, 0x78, 0xb1, 0xd2, 0xb5, 0xba, 0xa6, 0x9f, 0xd7, + 0x8a, 0xd3, 0xfd, 0x64, 0x6d, 0x46, 0x3d, 0x0e, 0x8a, 0x98, 0x86, 0x46, 0xa5, 0xee, 0xe7, 0x5c, + 0x2c, 0xce, 0xc2, 0x8f, 0x15, 0xc0, 0x49, 0x1d, 0x6d, 0x59, 0x5d, 0x0f, 0xb9, 0xeb, 0xe6, 0xd5, + 0x1d, 0x64, 0x7b, 0xfe, 0x20, 0xff, 0xbf, 0x13, 0x0b, 0xe3, 0x1a, 0x98, 0xed, 0xd0, 0x32, 0xd6, + 0x90, 0xb7, 0xed, 0xb4, 0xd8, 0x2c, 0xfc, 0xc4, 0xc8, 0x91, 0x63, 0x7e, 0x9d, 0xcf, 0xae, 0x8b, + 0x7f, 0x73, 0xb2, 0xad, 0xc4, 0xc8, 0x76, 0x6e, 0x18, 0xd9, 0x56, 0x6f, 0x00, 0x53, 0xbb, 0x5d, + 0xe4, 0x6a, 0x3b, 0xa6, 0xd5, 0xf6, 0x6f, 0x31, 0x0b, 0x12, 0xe0, 0x3b, 0x72, 0xb2, 0x6e, 0xa6, + 0x5c, 0x5b, 0xfa, 0xb3, 0x31, 0x62, 0x6c, 0x3d, 0x0d, 0x00, 0x6b, 0xec, 0x86, 0xdb, 0x66, 0xc2, + 0xca, 0xa5, 0x60, 0xfa, 0x2e, 0x5a, 0xed, 0xb6, 0x65, 0x6f, 0x05, 0xc6, 0xfa, 0x30, 0x01, 0xbe, + 0x54, 0x91, 0x71, 0x3b, 0x4d, 0x4a, 0x5b, 0xb2, 0xde, 0xf4, 0xe2, 0xec, 0x98, 0xc7, 0xdd, 0xfd, + 0x5d, 0xa7, 0xa0, 0x16, 0xc1, 0x0c, 0x49, 0x63, 0x3d, 0xb0, 0x38, 0x81, 0xc7, 0x60, 0xbf, 0xb8, + 0x35, 0xcd, 0x58, 0xa9, 0x2d, 0x06, 0xdf, 0x26, 0x71, 0x91, 0x98, 0x98, 0x52, 0xf5, 0x41, 0xd2, + 0x1b, 0xa7, 0xd4, 0xc7, 0x81, 0xeb, 0xb8, 0x01, 0xbb, 0xb4, 0xaa, 0x6b, 0xa5, 0xc5, 0x07, 0x1b, + 0xda, 0xf3, 0x2a, 0x75, 0xa3, 0x2e, 0x76, 0x2e, 0xbf, 0x1f, 0x4d, 0x63, 0x7a, 0xb5, 0xb5, 0x52, + 0x65, 0x95, 0x8d, 0xef, 0x4b, 0x35, 0x7d, 0xad, 0x64, 0x14, 0x67, 0xe0, 0xab, 0x14, 0x50, 0x5c, + 0x46, 0xde, 0xba, 0xe3, 0x7a, 0x66, 0x7b, 0xd5, 0xb2, 0x2f, 0x6d, 0xb8, 0x6d, 0x5e, 0x67, 0xfa, + 0x17, 0xe9, 0xb3, 0xb5, 0xe2, 0x14, 0x29, 0x14, 0x18, 0x6d, 0xc6, 0xee, 0x90, 0x6c, 0xa1, 0x30, + 0x85, 0x09, 0xf0, 0xc7, 0xb3, 0x32, 0x67, 0x69, 0xe5, 0x6b, 0x4d, 0x26, 0x27, 0x2f, 0x18, 0xf7, + 0xfc, 0xdc, 0x07, 0xb5, 0x02, 0x7c, 0x38, 0x07, 0x26, 0x97, 0x2c, 0xdb, 0x6c, 0x5b, 0xcf, 0x17, + 0x02, 0xc4, 0x85, 0x63, 0x4c, 0x26, 0x66, 0x8c, 0xc9, 0x0e, 0x35, 0x7f, 0xfe, 0xa2, 0x22, 0xbb, + 0x61, 0xc1, 0xf1, 0xde, 0x27, 0x32, 0x62, 0xf2, 0xfc, 0xfd, 0xac, 0xcc, 0x96, 0xc4, 0xe0, 0xf2, + 0x92, 0x61, 0xf8, 0x89, 0xef, 0x0f, 0x1d, 0xab, 0xa7, 0x7f, 0x4f, 0xf6, 0x13, 0x85, 0x29, 0xf8, + 0x67, 0x0a, 0x80, 0xcb, 0xc8, 0x3b, 0x8f, 0xdc, 0x60, 0x29, 0x40, 0x46, 0x7d, 0xa6, 0x6f, 0x73, + 0x5d, 0xf6, 0x2d, 0x3c, 0x80, 0x17, 0x44, 0x00, 0x4b, 0x31, 0x9d, 0x27, 0xa2, 0xe8, 0x88, 0xce, + 0x5b, 0x01, 0x85, 0x2e, 0xf9, 0xce, 0xc4, 0xec, 0xa9, 0xd1, 0xd3, 0x25, 0x29, 0x8c, 0x2f, 0x9d, + 0x16, 0xac, 0xb3, 0x02, 0xe0, 0x77, 0x82, 0x45, 0xd0, 0x0f, 0x09, 0xd2, 0xb1, 0x74, 0x60, 0x62, + 0x93, 0xc9, 0x8b, 0x9b, 0xae, 0xb8, 0xf4, 0xd3, 0x6f, 0xe0, 0x17, 0x72, 0xe0, 0x78, 0xbf, 0xe6, + 0xf0, 0xf7, 0xc8, 0x1d, 0x07, 0x79, 0x44, 0x66, 0x7c, 0xda, 0xd9, 0xe9, 0x8b, 0xfa, 0x34, 0x70, + 0x82, 0x6d, 0x98, 0x5e, 0x44, 0x86, 0x53, 0x45, 0x97, 0xbb, 0x6d, 0xe4, 0x79, 0xc8, 0x25, 0x2d, + 0x9b, 0xd4, 0xfb, 0x7f, 0x84, 0x7f, 0xa7, 0xc8, 0xba, 0xa6, 0x0f, 0xe0, 0x77, 0x44, 0x4f, 0xff, + 0x69, 0x45, 0xc6, 0xd9, 0x3c, 0x59, 0xd9, 0xc9, 0x50, 0x7c, 0xd1, 0xb8, 0x67, 0xf8, 0xfe, 0x53, + 0x2b, 0xe9, 0xf3, 0x34, 0xdd, 0x9f, 0xa1, 0xcf, 0x6b, 0x7a, 0x65, 0xa9, 0xa2, 0xe1, 0xf9, 0xfe, + 0x04, 0x38, 0x16, 0x7e, 0x5b, 0x7c, 0xb0, 0x51, 0xd7, 0xaa, 0x46, 0x71, 0x12, 0x0f, 0x20, 0x34, + 0x79, 0xa9, 0x54, 0x59, 0xd5, 0x16, 0x1b, 0x46, 0x0d, 0x7f, 0x59, 0x1c, 0x6e, 0xce, 0x87, 0x2f, + 0xcc, 0x81, 0xa3, 0x84, 0xb7, 0x57, 0x09, 0x57, 0x31, 0x53, 0x7a, 0x3c, 0x57, 0x02, 0x80, 0xa6, + 0x28, 0x7b, 0xe1, 0x67, 0xa4, 0xef, 0x08, 0xe3, 0x20, 0xec, 0xa9, 0x23, 0x42, 0x32, 0xbe, 0x9d, + 0x95, 0x39, 0xef, 0x29, 0x5d, 0x6c, 0x32, 0xa1, 0xf8, 0xe7, 0x71, 0x4f, 0x05, 0xd1, 0xe0, 0x13, + 0xf5, 0xaf, 0x4c, 0x7e, 0x7e, 0xde, 0x7a, 0x45, 0x27, 0xe2, 0x30, 0x07, 0x00, 0x49, 0x21, 0x12, + 0x44, 0xe5, 0xa0, 0xef, 0x44, 0x12, 0x25, 0x07, 0xa5, 0xb2, 0x51, 0x39, 0xaf, 0x45, 0xc9, 0xc1, + 0xa7, 0x15, 0x30, 0xb9, 0x8c, 0x3c, 0xbc, 0xd8, 0xe9, 0xc2, 0x67, 0x49, 0x18, 0x66, 0xb0, 0x7e, + 0x41, 0x2e, 0x47, 0x0e, 0xd6, 0xe7, 0xf4, 0x0d, 0xfe, 0xd4, 0x30, 0xba, 0x81, 0x5f, 0x75, 0xc4, + 0x44, 0xf2, 0x0c, 0x90, 0xf7, 0xf0, 0x67, 0x66, 0x1f, 0x7e, 0x7c, 0xe4, 0x3c, 0x82, 0x0b, 0x59, + 0x34, 0x3d, 0x53, 0xa7, 0xf9, 0xb9, 0x69, 0x43, 0x52, 0xa9, 0x88, 0x20, 0xe4, 0xfb, 0x51, 0x31, + 0xfc, 0x5b, 0x05, 0x9c, 0xa0, 0xfd, 0xa3, 0xd4, 0xe9, 0xd4, 0x3d, 0xc7, 0x45, 0x3a, 0x6a, 0x22, + 0xab, 0xe3, 0xf5, 0x18, 0xde, 0x5c, 0x9a, 0xea, 0xef, 0xec, 0xb1, 0x57, 0xf8, 0x26, 0x45, 0x36, + 0xa2, 0xe1, 0xbe, 0xfe, 0xd8, 0x53, 0x5f, 0x44, 0x67, 0x7f, 0x34, 0x2b, 0x13, 0xa3, 0x30, 0x61, + 0xe1, 0xc9, 0x80, 0xfa, 0xf0, 0x21, 0x00, 0xe5, 0x9b, 0x54, 0x74, 0xad, 0xac, 0x55, 0xd6, 0xf1, + 0x24, 0x70, 0x23, 0xb8, 0x7e, 0x7d, 0x43, 0x2f, 0xaf, 0x94, 0xea, 0x5a, 0x43, 0xd7, 0x96, 0x2b, + 0x75, 0x43, 0x2f, 0x19, 0x95, 0x9a, 0x4f, 0xc0, 0x84, 0x7a, 0x03, 0x38, 0x55, 0xdf, 0x58, 0xa8, + 0x97, 0xf5, 0xca, 0x3a, 0x49, 0xd7, 0xb5, 0xaa, 0x76, 0x81, 0x7d, 0x9d, 0x84, 0x1f, 0x2c, 0x82, + 0x69, 0xac, 0x99, 0xd7, 0xa9, 0xc2, 0x0e, 0xbf, 0x99, 0x03, 0xd3, 0x3a, 0xea, 0x3a, 0xed, 0x3d, + 0xa2, 0xbc, 0x8f, 0x6b, 0x4d, 0xf0, 0x2d, 0x45, 0xf6, 0x34, 0x14, 0x47, 0xec, 0x3c, 0x47, 0x68, + 0xf4, 0x0a, 0xd0, 0xf4, 0xa3, 0x03, 0x33, 0xbd, 0x25, 0x4c, 0x50, 0xe7, 0x81, 0xea, 0x5c, 0xb6, + 0x91, 0x5b, 0x6f, 0x5e, 0xd6, 0xbc, 0xed, 0x52, 0xab, 0xe5, 0xa2, 0x6e, 0x97, 0x99, 0x15, 0xfa, + 0x7c, 0x51, 0x6f, 0x05, 0x47, 0x49, 0x2a, 0x97, 0x99, 0x1e, 0xdd, 0xec, 0x4d, 0x0e, 0x72, 0x96, + 0xec, 0xab, 0x7e, 0xce, 0x3c, 0x97, 0x33, 0x4c, 0xe6, 0x9d, 0x0f, 0x0b, 0xa2, 0xcf, 0xeb, 0x19, + 0x30, 0x6d, 0x9b, 0x3b, 0x48, 0xbb, 0xd2, 0xb1, 0x5c, 0xd4, 0x3d, 0x35, 0x41, 0x76, 0xd3, 0xf8, + 0x24, 0xf8, 0xfb, 0x52, 0xa7, 0xb7, 0xe4, 0x38, 0x96, 0x4c, 0xf6, 0x97, 0x87, 0x10, 0xfd, 0x3e, + 0xe3, 0x8c, 0x02, 0x3f, 0xa8, 0x80, 0x19, 0x46, 0x54, 0xc9, 0xbe, 0x5a, 0x69, 0xc1, 0x1b, 0x05, + 0xb5, 0xd4, 0xc4, 0x69, 0xbe, 0x5a, 0x4a, 0x5e, 0xe0, 0xcf, 0x29, 0xb2, 0xee, 0x44, 0x7d, 0x1a, + 0x4e, 0xea, 0x88, 0x76, 0x71, 0xd9, 0x74, 0x76, 0x99, 0x4b, 0xcd, 0xa4, 0x4e, 0x5f, 0xd2, 0xb4, + 0xb6, 0xc1, 0x0f, 0x49, 0x39, 0x2b, 0x49, 0x36, 0xe3, 0x90, 0x00, 0xfc, 0xb8, 0x02, 0xe6, 0x18, + 0x55, 0x75, 0xe6, 0x35, 0x2b, 0xe5, 0x3e, 0xfe, 0xf3, 0xd2, 0x8a, 0x60, 0x9f, 0xf6, 0xb3, 0x9a, + 0x1e, 0x33, 0x40, 0x7e, 0x44, 0x2a, 0xd4, 0x88, 0x74, 0x43, 0x0e, 0x09, 0xca, 0x77, 0xe6, 0xc0, + 0xf4, 0x46, 0x17, 0xb9, 0xcc, 0x2f, 0x0e, 0xbe, 0x3e, 0x07, 0x94, 0x65, 0x24, 0xec, 0x70, 0xbe, + 0x24, 0x27, 0x6b, 0xad, 0xe3, 0x1b, 0xcb, 0x15, 0x8a, 0x75, 0xa4, 0x08, 0xd8, 0x6e, 0x01, 0x73, + 0x94, 0xa5, 0x25, 0xcf, 0xc3, 0x4a, 0xa2, 0x7f, 0x08, 0xa0, 0x27, 0x75, 0x14, 0x7b, 0x38, 0xa4, + 0x2e, 0x9c, 0xa5, 0x8c, 0x69, 0x5a, 0x45, 0x9b, 0x34, 0x10, 0x55, 0x4e, 0xef, 0x49, 0x25, 0x17, + 0x37, 0x77, 0x10, 0xf5, 0x06, 0xe5, 0x32, 0xe7, 0x49, 0xe6, 0x7e, 0x9f, 0xe0, 0x37, 0xa5, 0x22, + 0xf4, 0xc9, 0x73, 0x27, 0x99, 0x2c, 0x74, 0x46, 0xa3, 0x92, 0x1c, 0x07, 0x45, 0x9c, 0x83, 0x6c, + 0x8c, 0xe8, 0x5a, 0xbd, 0xb6, 0x7a, 0x5e, 0xeb, 0x6f, 0x5f, 0xc8, 0xc3, 0x17, 0x29, 0x60, 0x6a, + 0xc1, 0x75, 0xcc, 0x56, 0xd3, 0xec, 0x7a, 0xf0, 0x3b, 0x59, 0x30, 0xb3, 0x6e, 0x5e, 0x6d, 0x3b, + 0x66, 0x8b, 0x78, 0x22, 0xf6, 0x8c, 0x05, 0x1d, 0xfa, 0xc9, 0x1f, 0x0b, 0xd8, 0xab, 0xe8, 0x66, + 0x1f, 0x38, 0xc2, 0x67, 0x64, 0xae, 0x12, 0x0b, 0xf6, 0xdf, 0xb2, 0xfd, 0x42, 0x7f, 0xf9, 0x74, + 0xcd, 0xf3, 0x34, 0x45, 0x68, 0x94, 0x1f, 0x94, 0x0b, 0xe6, 0x25, 0x53, 0xe4, 0xe1, 0x6c, 0x97, + 0x3f, 0x3c, 0x09, 0x0a, 0x8b, 0x88, 0x68, 0x71, 0xbf, 0x9d, 0x05, 0x13, 0xec, 0x32, 0x7d, 0x78, + 0x97, 0xe0, 0xe4, 0xd8, 0x22, 0x19, 0x82, 0xe1, 0x38, 0x78, 0xc7, 0x8b, 0x75, 0xee, 0xf4, 0x12, + 0x79, 0x4e, 0xe0, 0xfe, 0x45, 0xeb, 0x8d, 0xb8, 0xc0, 0x3f, 0x99, 0xfb, 0x57, 0x6c, 0x51, 0xe9, + 0x3b, 0x41, 0xbd, 0x3b, 0xcb, 0x7c, 0x9e, 0xb8, 0x51, 0xef, 0x57, 0x79, 0xf9, 0x8c, 0x75, 0x03, + 0x63, 0xc4, 0xc7, 0x78, 0x2d, 0xdd, 0x09, 0x26, 0x28, 0xcf, 0xfd, 0xf5, 0x68, 0xaf, 0x03, 0x01, + 0x2d, 0x82, 0x9c, 0x64, 0xf2, 0x73, 0x4a, 0xfa, 0x8e, 0x45, 0x57, 0x3e, 0x96, 0x13, 0x7d, 0x33, + 0x55, 0xe4, 0x5d, 0x76, 0xdc, 0x4b, 0x75, 0xcf, 0xf4, 0x10, 0xfc, 0xe7, 0x2c, 0x50, 0xea, 0xc8, + 0xe3, 0xcf, 0x12, 0x57, 0xc1, 0x31, 0xda, 0x20, 0x96, 0x91, 0x8c, 0xdf, 0xb4, 0x21, 0x67, 0xfa, + 0x32, 0x81, 0xcb, 0xa7, 0xef, 0xff, 0x15, 0xfe, 0x52, 0xdf, 0x10, 0x0a, 0xd9, 0x3e, 0x8b, 0x06, + 0xc6, 0x19, 0x9e, 0x40, 0x2c, 0x60, 0x11, 0x72, 0xfa, 0x7b, 0x52, 0x6a, 0xb5, 0x5c, 0x99, 0x87, + 0x32, 0x14, 0x9c, 0x9d, 0x00, 0x79, 0x6d, 0xa7, 0xe3, 0x5d, 0x3d, 0xfb, 0x04, 0x30, 0x5b, 0xf7, + 0x5c, 0x64, 0xee, 0x70, 0x3a, 0xb5, 0xe7, 0x5c, 0x42, 0xb6, 0xaf, 0x53, 0x93, 0x97, 0xbb, 0xef, + 0x02, 0x13, 0xb6, 0xd3, 0x30, 0x77, 0xbd, 0x6d, 0xf5, 0xc6, 0x7d, 0x97, 0xde, 0xaf, 0x51, 0x6f, + 0xdd, 0x1a, 0x3b, 0x4b, 0xf3, 0x95, 0x7b, 0x88, 0x56, 0x55, 0xb0, 0x9d, 0xd2, 0xae, 0xb7, 0xbd, + 0x70, 0xc3, 0xc7, 0xff, 0xe6, 0x74, 0xe6, 0xd3, 0x7f, 0x73, 0x3a, 0xf3, 0xe5, 0xbf, 0x39, 0x9d, + 0xf9, 0xf9, 0xaf, 0x9e, 0x3e, 0xf2, 0xe9, 0xaf, 0x9e, 0x3e, 0xf2, 0xf9, 0xaf, 0x9e, 0x3e, 0xf2, + 0x43, 0xd9, 0xce, 0xc5, 0x8b, 0x05, 0x52, 0xca, 0x9d, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x74, 0xca, 0x11, 0x38, 0x6d, 0xdf, 0x01, 0x00, } func (m *Rpc) Marshal() (dAtA []byte, err error) { @@ -83948,6 +84185,169 @@ func (m *RpcRelationOptionsResponseError) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *RpcRelationListWithValue) 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 *RpcRelationListWithValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcRelationListWithValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *RpcRelationListWithValueRequest) 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 *RpcRelationListWithValueRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcRelationListWithValueRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size, err := m.Value.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintCommands(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcRelationListWithValueResponse) 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 *RpcRelationListWithValueResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcRelationListWithValueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Counters) > 0 { + dAtA181 := make([]byte, len(m.Counters)*10) + var j180 int + for _, num1 := range m.Counters { + num := uint64(num1) + for num >= 1<<7 { + dAtA181[j180] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j180++ + } + dAtA181[j180] = uint8(num) + j180++ + } + i -= j180 + copy(dAtA[i:], dAtA181[:j180]) + i = encodeVarintCommands(dAtA, i, uint64(j180)) + i-- + dAtA[i] = 0x1a + } + if len(m.RelationKeys) > 0 { + for iNdEx := len(m.RelationKeys) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RelationKeys[iNdEx]) + copy(dAtA[i:], m.RelationKeys[iNdEx]) + i = encodeVarintCommands(dAtA, i, uint64(len(m.RelationKeys[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintCommands(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RpcRelationListWithValueResponseError) 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 *RpcRelationListWithValueResponseError) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RpcRelationListWithValueResponseError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintCommands(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if m.Code != 0 { + i = encodeVarintCommands(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *RpcHistory) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -115756,6 +116156,74 @@ func (m *RpcRelationOptionsResponseError) Size() (n int) { return n } +func (m *RpcRelationListWithValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *RpcRelationListWithValueRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + if m.Value != nil { + l = m.Value.Size() + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + +func (m *RpcRelationListWithValueResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovCommands(uint64(l)) + } + if len(m.RelationKeys) > 0 { + for _, s := range m.RelationKeys { + l = len(s) + n += 1 + l + sovCommands(uint64(l)) + } + } + if len(m.Counters) > 0 { + l = 0 + for _, e := range m.Counters { + l += sovCommands(uint64(e)) + } + n += 1 + sovCommands(uint64(l)) + l + } + return n +} + +func (m *RpcRelationListWithValueResponseError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Code != 0 { + n += 1 + sovCommands(uint64(m.Code)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovCommands(uint64(l)) + } + return n +} + func (m *RpcHistory) Size() (n int) { if m == nil { return 0 @@ -170163,15 +170631,222 @@ func (m *RpcRelationListRemoveOptionRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Request: wiretype end group for non-group") + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OptionIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + 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 ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OptionIds = append(m.OptionIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckInObjects", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.CheckInObjects = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcRelationListRemoveOptionResponse) 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 ErrIntOverflowCommands + } + 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: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &RpcRelationListRemoveOptionResponseError{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcRelationListRemoveOptionResponseError) 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 ErrIntOverflowCommands + } + 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: Error: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= RpcRelationListRemoveOptionResponseErrorCode(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OptionIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -170199,13 +170874,113 @@ func (m *RpcRelationListRemoveOptionRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.OptionIds = append(m.OptionIds, string(dAtA[iNdEx:postIndex])) + m.Description = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CheckInObjects", wireType) + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err } - var v int + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcRelationOptions) 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 ErrIntOverflowCommands + } + 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: Options: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Options: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipCommands(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthCommands + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RpcRelationOptionsRequest) 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 ErrIntOverflowCommands + } + 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: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelationKey", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowCommands @@ -170215,12 +170990,24 @@ func (m *RpcRelationListRemoveOptionRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.CheckInObjects = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RelationKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -170242,7 +171029,7 @@ func (m *RpcRelationListRemoveOptionRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcRelationListRemoveOptionResponse) Unmarshal(dAtA []byte) error { +func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170301,12 +171088,48 @@ func (m *RpcRelationListRemoveOptionResponse) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Error == nil { - m.Error = &RpcRelationListRemoveOptionResponseError{} + m.Error = &RpcRelationOptionsResponseError{} } if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &model.RelationOptions{} + } + if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -170328,7 +171151,7 @@ func (m *RpcRelationListRemoveOptionResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcRelationListRemoveOptionResponseError) Unmarshal(dAtA []byte) error { +func (m *RpcRelationOptionsResponseError) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170371,7 +171194,7 @@ func (m *RpcRelationListRemoveOptionResponseError) Unmarshal(dAtA []byte) error } b := dAtA[iNdEx] iNdEx++ - m.Code |= RpcRelationListRemoveOptionResponseErrorCode(b&0x7F) << shift + m.Code |= RpcRelationOptionsResponseErrorCode(b&0x7F) << shift if b < 0x80 { break } @@ -170429,7 +171252,7 @@ func (m *RpcRelationListRemoveOptionResponseError) Unmarshal(dAtA []byte) error } return nil } -func (m *RpcRelationOptions) Unmarshal(dAtA []byte) error { +func (m *RpcRelationListWithValue) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170452,10 +171275,10 @@ func (m *RpcRelationOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Options: wiretype end group for non-group") + return fmt.Errorf("proto: ListWithValue: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Options: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ListWithValue: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -170479,7 +171302,7 @@ func (m *RpcRelationOptions) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcRelationOptionsRequest) Unmarshal(dAtA []byte) error { +func (m *RpcRelationListWithValueRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170510,7 +171333,7 @@ func (m *RpcRelationOptionsRequest) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RelationKey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -170538,7 +171361,43 @@ func (m *RpcRelationOptionsRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RelationKey = string(dAtA[iNdEx:postIndex]) + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Value == nil { + m.Value = &types.Value{} + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -170561,7 +171420,7 @@ func (m *RpcRelationOptionsRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { +func (m *RpcRelationListWithValueResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170620,7 +171479,7 @@ func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Error == nil { - m.Error = &RpcRelationOptionsResponseError{} + m.Error = &RpcRelationListWithValueResponseError{} } if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -170628,9 +171487,9 @@ func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RelationKeys", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowCommands @@ -170640,28 +171499,100 @@ func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthCommands } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthCommands } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &model.RelationOptions{} - } - if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.RelationKeys = append(m.RelationKeys, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 3: + if wireType == 0 { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Counters = append(m.Counters, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthCommands + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthCommands + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Counters) == 0 { + m.Counters = make([]int64, 0, elementCount) + } + for iNdEx < postIndex { + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowCommands + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Counters = append(m.Counters, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Counters", wireType) + } default: iNdEx = preIndex skippy, err := skipCommands(dAtA[iNdEx:]) @@ -170683,7 +171614,7 @@ func (m *RpcRelationOptionsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *RpcRelationOptionsResponseError) Unmarshal(dAtA []byte) error { +func (m *RpcRelationListWithValueResponseError) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -170726,7 +171657,7 @@ func (m *RpcRelationOptionsResponseError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Code |= RpcRelationOptionsResponseErrorCode(b&0x7F) << shift + m.Code |= RpcRelationListWithValueResponseErrorCode(b&0x7F) << shift if b < 0x80 { break } diff --git a/pb/protos/commands.proto b/pb/protos/commands.proto index 21176425b7..0642bc186b 100644 --- a/pb/protos/commands.proto +++ b/pb/protos/commands.proto @@ -3012,6 +3012,30 @@ message Rpc { } } } + + message ListWithValue { + message Request { + string spaceId = 1; + google.protobuf.Value value = 2; + } + + message Response { + Error error = 1; + repeated string relationKeys = 2; + repeated int64 counters = 3; + + message Error { + Code code = 1; + string description = 2; + + enum Code { + NULL = 0; + UNKNOWN_ERROR = 1; + BAD_INPUT = 2; + } + } + } + } } message History { diff --git a/pb/protos/service/service.proto b/pb/protos/service/service.proto index 6495fad572..af68b0c67a 100644 --- a/pb/protos/service/service.proto +++ b/pb/protos/service/service.proto @@ -128,6 +128,7 @@ service ClientCommands { rpc ObjectCreateRelationOption (anytype.Rpc.Object.CreateRelationOption.Request) returns (anytype.Rpc.Object.CreateRelationOption.Response); rpc RelationListRemoveOption (anytype.Rpc.Relation.ListRemoveOption.Request) returns (anytype.Rpc.Relation.ListRemoveOption.Response); rpc RelationOptions (anytype.Rpc.Relation.Options.Request) returns (anytype.Rpc.Relation.Options.Response); + rpc RelationListWithValue (anytype.Rpc.Relation.ListWithValue.Request) returns (anytype.Rpc.Relation.ListWithValue.Response); // Object Relations // *** diff --git a/pb/service/service.pb.go b/pb/service/service.pb.go index 70d78d42bc..0028e30bb1 100644 --- a/pb/service/service.pb.go +++ b/pb/service/service.pb.go @@ -26,316 +26,317 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) } var fileDescriptor_93a29dc403579097 = []byte{ - // 4931 bytes of a gzipped FileDescriptorProto + // 4950 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x24, 0x49, 0x52, 0xc0, 0xb7, 0x5f, 0x58, 0xa8, 0xe3, 0x16, 0xa8, 0x85, 0x65, 0x6f, 0xb9, 0x9b, 0xef, 0x6f, 0x8f, 0xdb, 0xb3, 0x33, 0xfb, 0x71, 0xec, 0x21, 0x21, 0x8f, 0x3d, 0xf6, 0x9a, 0xb3, 0x3d, 0xc6, 0x6d, 0xcf, 0x48, 0x2b, 0x21, 0x51, 0x53, 0x1d, 0x6e, 0x17, 0xae, 0xae, 0xac, 0xab, 0xca, 0x6e, - 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xd7, 0xf0, - 0x78, 0x12, 0x2f, 0xf0, 0x86, 0x76, 0xff, 0x91, 0x53, 0x65, 0x66, 0xe5, 0x47, 0x54, 0x46, 0x56, - 0x79, 0x9f, 0x66, 0xd4, 0xf1, 0x8b, 0x88, 0xcc, 0xca, 0xcc, 0xc8, 0xc8, 0x8f, 0x2a, 0x47, 0xd7, - 0xcb, 0x37, 0x1b, 0x65, 0xc5, 0x38, 0xab, 0x37, 0x6a, 0xa8, 0x96, 0x59, 0x0a, 0xed, 0xbf, 0x63, - 0xf1, 0x73, 0xfc, 0x6e, 0x52, 0xac, 0xf8, 0xaa, 0x84, 0x8f, 0x3e, 0x34, 0x64, 0xca, 0xe6, 0xf3, - 0xa4, 0x98, 0xd6, 0x12, 0xf9, 0xe8, 0x03, 0x23, 0x81, 0x25, 0x14, 0x5c, 0xfd, 0xfe, 0xf4, 0x7f, - 0xfe, 0x6f, 0x14, 0xbd, 0xb7, 0x95, 0x67, 0x50, 0xf0, 0x2d, 0xa5, 0x11, 0x7f, 0x15, 0x7d, 0x77, - 0xb3, 0x2c, 0x77, 0x81, 0xbf, 0x82, 0xaa, 0xce, 0x58, 0x11, 0xdf, 0x1e, 0x2b, 0x07, 0xe3, 0xe3, - 0x32, 0x1d, 0x6f, 0x96, 0xe5, 0xd8, 0x08, 0xc7, 0xc7, 0xf0, 0x93, 0x05, 0xd4, 0xfc, 0xa3, 0x3b, - 0x61, 0xa8, 0x2e, 0x59, 0x51, 0x43, 0x7c, 0x16, 0xfd, 0xc6, 0x66, 0x59, 0x4e, 0x80, 0x6f, 0x43, - 0x53, 0x81, 0x09, 0x4f, 0x38, 0xc4, 0xf7, 0x3b, 0xaa, 0x2e, 0xa0, 0x7d, 0x3c, 0xe8, 0x07, 0x95, - 0x9f, 0x93, 0xe8, 0x3b, 0x8d, 0x9f, 0xf3, 0x05, 0x9f, 0xb2, 0xcb, 0x22, 0xbe, 0xd9, 0x55, 0x54, - 0x22, 0x6d, 0xfb, 0x56, 0x08, 0x51, 0x56, 0x5f, 0x47, 0xbf, 0xfa, 0x3a, 0xc9, 0x73, 0xe0, 0x5b, - 0x15, 0x34, 0x05, 0x77, 0x75, 0xa4, 0x68, 0x2c, 0x65, 0xda, 0xee, 0xed, 0x20, 0xa3, 0x0c, 0x7f, - 0x15, 0x7d, 0x57, 0x4a, 0x8e, 0x21, 0x65, 0x4b, 0xa8, 0x62, 0xaf, 0x96, 0x12, 0x12, 0x8f, 0xbc, - 0x03, 0x61, 0xdb, 0x5b, 0xac, 0x58, 0x42, 0xc5, 0xfd, 0xb6, 0x95, 0x30, 0x6c, 0xdb, 0x40, 0xca, - 0xf6, 0xdf, 0x8d, 0xa2, 0xef, 0x6f, 0xa6, 0x29, 0x5b, 0x14, 0x7c, 0x9f, 0xa5, 0x49, 0xbe, 0x9f, - 0x15, 0x17, 0x87, 0x70, 0xb9, 0x75, 0xde, 0xf0, 0xc5, 0x0c, 0xe2, 0x67, 0xee, 0x53, 0x95, 0xe8, - 0x58, 0xb3, 0x63, 0x1b, 0xd6, 0xbe, 0x3f, 0xb9, 0x9a, 0x92, 0x2a, 0xcb, 0x3f, 0x8d, 0xa2, 0x6b, - 0xb8, 0x2c, 0x13, 0x96, 0x2f, 0xc1, 0x94, 0xe6, 0xd3, 0x1e, 0xc3, 0x2e, 0xae, 0xcb, 0xf3, 0xd9, - 0x55, 0xd5, 0x54, 0x89, 0xf2, 0xe8, 0x7d, 0xbb, 0xbb, 0x4c, 0xa0, 0x16, 0xc3, 0xe9, 0x21, 0xdd, - 0x23, 0x14, 0xa2, 0x3d, 0x3f, 0x1a, 0x82, 0x2a, 0x6f, 0x59, 0x14, 0x2b, 0x6f, 0x39, 0xab, 0xb5, - 0xb3, 0x07, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0x3d, 0x1c, 0x40, 0x2a, 0x57, 0x7f, 0x1c, 0xfd, 0xda, - 0x6b, 0x56, 0x5d, 0xd4, 0x65, 0x92, 0x82, 0x1a, 0x0a, 0x77, 0x5d, 0xed, 0x56, 0x8a, 0x47, 0xc3, - 0xbd, 0x3e, 0xcc, 0xea, 0xb4, 0xad, 0xf0, 0x65, 0x09, 0x38, 0x06, 0x19, 0xc5, 0x46, 0x48, 0x75, - 0x5a, 0x0c, 0x29, 0xdb, 0x17, 0x51, 0x6c, 0x6c, 0xbf, 0xf9, 0x13, 0x48, 0xf9, 0xe6, 0x74, 0x8a, - 0x5b, 0xc5, 0xe8, 0x0a, 0x62, 0xbc, 0x39, 0x9d, 0x52, 0xad, 0xe2, 0x47, 0x95, 0xb3, 0xcb, 0xe8, - 0x03, 0xe4, 0x6c, 0x3f, 0xab, 0x85, 0xc3, 0xf5, 0xb0, 0x15, 0x85, 0x69, 0xa7, 0xe3, 0xa1, 0xb8, - 0x72, 0xfc, 0x17, 0xa3, 0xe8, 0x7b, 0x1e, 0xcf, 0xc7, 0x30, 0x67, 0x4b, 0x88, 0x9f, 0xf4, 0x5b, - 0x93, 0xa4, 0xf6, 0xff, 0xf1, 0x15, 0x34, 0x3c, 0xdd, 0x64, 0x02, 0x39, 0xa4, 0x9c, 0xec, 0x26, - 0x52, 0xdc, 0xdb, 0x4d, 0x34, 0x66, 0x8d, 0xb0, 0x56, 0xb8, 0x0b, 0x7c, 0x6b, 0x51, 0x55, 0x50, - 0x70, 0xb2, 0x2d, 0x0d, 0xd2, 0xdb, 0x96, 0x0e, 0xea, 0xa9, 0xcf, 0x2e, 0xf0, 0xcd, 0x3c, 0x27, - 0xeb, 0x23, 0xc5, 0xbd, 0xf5, 0xd1, 0x98, 0xf2, 0x90, 0x46, 0xbf, 0x6e, 0x3d, 0x31, 0xbe, 0x57, - 0x9c, 0xb1, 0x98, 0x7e, 0x16, 0x42, 0xae, 0x7d, 0xdc, 0xef, 0xe5, 0x3c, 0xd5, 0x78, 0xf1, 0xb6, - 0x64, 0x15, 0xdd, 0x2c, 0x52, 0xdc, 0x5b, 0x0d, 0x8d, 0x29, 0x0f, 0x7f, 0x14, 0xbd, 0xa7, 0xa2, - 0x64, 0x3b, 0x9f, 0xdd, 0xf1, 0x86, 0x50, 0x3c, 0xa1, 0xdd, 0xed, 0xa1, 0x4c, 0x70, 0x50, 0x32, - 0x15, 0x7c, 0x6e, 0x7b, 0xf5, 0x50, 0xe8, 0xb9, 0x13, 0x86, 0x3a, 0xb6, 0xb7, 0x21, 0x07, 0xd2, - 0xb6, 0x14, 0xf6, 0xd8, 0xd6, 0x90, 0xb2, 0x5d, 0x45, 0xbf, 0xa5, 0x1f, 0x4b, 0x33, 0x8f, 0x0a, - 0x79, 0x13, 0xa4, 0xd7, 0x88, 0x7a, 0xdb, 0x90, 0xf6, 0xf5, 0x78, 0x18, 0xdc, 0xa9, 0x8f, 0x1a, - 0x81, 0xfe, 0xfa, 0xa0, 0xf1, 0x77, 0x27, 0x0c, 0x29, 0xdb, 0x7f, 0x3f, 0x8a, 0x7e, 0xa0, 0x64, - 0x2f, 0x8a, 0xe4, 0x4d, 0x0e, 0x62, 0x4a, 0x3c, 0x04, 0x7e, 0xc9, 0xaa, 0x8b, 0xc9, 0xaa, 0x48, - 0x89, 0xe9, 0xdf, 0x0f, 0xf7, 0x4c, 0xff, 0xa4, 0x92, 0x95, 0xf1, 0xa9, 0x8a, 0x72, 0x56, 0xe2, - 0x8c, 0xaf, 0xad, 0x01, 0x67, 0x25, 0x95, 0xf1, 0xb9, 0x48, 0xc7, 0xea, 0x41, 0x13, 0x36, 0xfd, - 0x56, 0x0f, 0xec, 0x38, 0x79, 0x2b, 0x84, 0x98, 0xb0, 0xd5, 0x76, 0x60, 0x56, 0x9c, 0x65, 0xb3, - 0xd3, 0x72, 0xda, 0x74, 0xe3, 0x87, 0xfe, 0x1e, 0x6a, 0x21, 0x44, 0xd8, 0x22, 0x50, 0xe5, 0xed, - 0x1f, 0x4d, 0x62, 0xa4, 0x86, 0xd2, 0x4e, 0xc5, 0xe6, 0xfb, 0x30, 0x4b, 0xd2, 0x95, 0x1a, 0xff, - 0x9f, 0x84, 0x06, 0x1e, 0xa6, 0x75, 0x21, 0x3e, 0xbd, 0xa2, 0x96, 0x2a, 0xcf, 0x7f, 0x8e, 0xa2, - 0x3b, 0x6d, 0xf5, 0xcf, 0x93, 0x62, 0x06, 0xaa, 0x3d, 0x65, 0xe9, 0x37, 0x8b, 0xe9, 0x31, 0xd4, - 0x3c, 0xa9, 0x78, 0xfc, 0x85, 0xbf, 0x92, 0x21, 0x1d, 0x5d, 0xb6, 0x1f, 0x7d, 0x2b, 0x5d, 0xd3, - 0xea, 0x93, 0x26, 0xb0, 0xa9, 0x10, 0xe0, 0xb6, 0xba, 0x90, 0xe0, 0x00, 0x70, 0x2b, 0x84, 0x98, - 0x56, 0x17, 0x82, 0xbd, 0x62, 0x99, 0x71, 0xd8, 0x85, 0x02, 0xaa, 0x6e, 0xab, 0x4b, 0x55, 0x17, - 0x21, 0x5a, 0x9d, 0x40, 0x4d, 0xb0, 0x71, 0xbc, 0xe9, 0xc9, 0x71, 0x2d, 0x60, 0xa4, 0x33, 0x3d, - 0x3e, 0x1e, 0x06, 0x9b, 0xd5, 0x9d, 0xe5, 0xf3, 0x18, 0x96, 0xec, 0x02, 0xaf, 0xee, 0x6c, 0x13, - 0x12, 0x20, 0x56, 0x77, 0x5e, 0xd0, 0xcc, 0x60, 0x96, 0x9f, 0x57, 0x19, 0x5c, 0xa2, 0x19, 0xcc, - 0x56, 0x6e, 0xc4, 0xc4, 0x0c, 0xe6, 0xc1, 0x94, 0x87, 0xc3, 0xe8, 0x57, 0x84, 0xf0, 0x0f, 0x58, - 0x56, 0xc4, 0xd7, 0x3d, 0x4a, 0x8d, 0x40, 0x5b, 0xbd, 0x41, 0x03, 0xa8, 0xc4, 0xcd, 0xaf, 0x5b, - 0x49, 0x91, 0x42, 0xee, 0x2d, 0xb1, 0x11, 0x07, 0x4b, 0xec, 0x60, 0x26, 0x75, 0x10, 0xc2, 0x26, - 0x7e, 0x4d, 0xce, 0x93, 0x2a, 0x2b, 0x66, 0xb1, 0x4f, 0xd7, 0x92, 0x13, 0xa9, 0x83, 0x8f, 0x43, - 0x5d, 0x58, 0x29, 0x6e, 0x96, 0x65, 0xd5, 0x84, 0x45, 0x5f, 0x17, 0x76, 0x91, 0x60, 0x17, 0xee, - 0xa0, 0x7e, 0x6f, 0xdb, 0x90, 0xe6, 0x59, 0x11, 0xf4, 0xa6, 0x90, 0x21, 0xde, 0x0c, 0x8a, 0x3a, - 0xef, 0x3e, 0x24, 0x4b, 0x68, 0x6b, 0xe6, 0x7b, 0x32, 0x36, 0x10, 0xec, 0xbc, 0x08, 0x34, 0xeb, - 0x34, 0x21, 0x3e, 0x48, 0x2e, 0xa0, 0x79, 0xc0, 0xd0, 0xcc, 0x6b, 0xb1, 0x4f, 0xdf, 0x21, 0x88, - 0x75, 0x9a, 0x9f, 0x54, 0xae, 0x16, 0xd1, 0x07, 0x42, 0x7e, 0x94, 0x54, 0x3c, 0x4b, 0xb3, 0x32, - 0x29, 0xda, 0xfc, 0xdf, 0x37, 0xae, 0x3b, 0x94, 0x76, 0xb9, 0x3e, 0x90, 0x56, 0x6e, 0xff, 0x7d, - 0x14, 0xdd, 0xc4, 0x7e, 0x8f, 0xa0, 0x9a, 0x67, 0x62, 0x19, 0x59, 0xcb, 0x20, 0x1c, 0x7f, 0x1e, - 0x36, 0xda, 0x51, 0xd0, 0xa5, 0xf9, 0xe1, 0xd5, 0x15, 0x55, 0xc1, 0xfe, 0x30, 0x8a, 0xe4, 0x72, - 0x45, 0x2c, 0x29, 0xdd, 0x51, 0xab, 0xd6, 0x31, 0xce, 0x7a, 0xf2, 0x66, 0x80, 0x30, 0x53, 0x85, - 0xfc, 0x5d, 0xac, 0x94, 0x63, 0xaf, 0x86, 0x10, 0x11, 0x53, 0x05, 0x42, 0x70, 0x41, 0x27, 0xe7, - 0xec, 0xd2, 0x5f, 0xd0, 0x46, 0x12, 0x2e, 0xa8, 0x22, 0xcc, 0xde, 0x95, 0x2a, 0xa8, 0x6f, 0xef, - 0xaa, 0x2d, 0x46, 0x68, 0xef, 0x0a, 0x33, 0xca, 0x30, 0x8b, 0x7e, 0xd3, 0x36, 0xfc, 0x9c, 0xb1, - 0x8b, 0x79, 0x52, 0x5d, 0xc4, 0x8f, 0x68, 0xe5, 0x96, 0xd1, 0x8e, 0xd6, 0x06, 0xb1, 0x26, 0x2c, - 0xd8, 0x0e, 0x9b, 0x44, 0xe3, 0xb4, 0xca, 0x51, 0x58, 0x70, 0x6c, 0x28, 0x84, 0x08, 0x0b, 0x04, - 0x6a, 0x22, 0xb7, 0xed, 0x6d, 0x02, 0x78, 0xb5, 0xe4, 0xa8, 0x4f, 0x80, 0x5a, 0x2d, 0x79, 0x30, - 0xdc, 0x85, 0x76, 0xab, 0xa4, 0x3c, 0xf7, 0x77, 0x21, 0x21, 0x0a, 0x77, 0xa1, 0x16, 0xc1, 0xed, - 0x3d, 0x81, 0xa4, 0x4a, 0xcf, 0xfd, 0xed, 0x2d, 0x65, 0xe1, 0xf6, 0xd6, 0x0c, 0x6e, 0x6f, 0x29, - 0x78, 0x9d, 0xf1, 0xf3, 0x03, 0xe0, 0x89, 0xbf, 0xbd, 0x5d, 0x26, 0xdc, 0xde, 0x1d, 0xd6, 0x64, - 0x32, 0xb6, 0xc3, 0xc9, 0xe2, 0x4d, 0x9d, 0x56, 0xd9, 0x1b, 0x88, 0x03, 0x56, 0x34, 0x44, 0x64, - 0x32, 0x24, 0x6c, 0x82, 0xb4, 0xf2, 0xd9, 0xca, 0xf6, 0xa6, 0x35, 0x0a, 0xd2, 0xad, 0x0d, 0x8b, - 0x20, 0x82, 0xb4, 0x9f, 0xc4, 0xd5, 0xdb, 0xad, 0xd8, 0xa2, 0xac, 0x7b, 0xaa, 0x87, 0xa0, 0x70, - 0xf5, 0xba, 0xb0, 0xf2, 0xf9, 0x36, 0xfa, 0x6d, 0xfb, 0x91, 0x9e, 0x16, 0xb5, 0xf6, 0xba, 0x4e, - 0x3f, 0x27, 0x0b, 0x23, 0xb6, 0xa5, 0x02, 0xb8, 0x49, 0x53, 0x5a, 0xcf, 0x7c, 0x1b, 0x78, 0x92, - 0xe5, 0x75, 0x7c, 0xcf, 0x6f, 0xa3, 0x95, 0x13, 0x69, 0x8a, 0x8f, 0xc3, 0x63, 0x76, 0x7b, 0x51, - 0xe6, 0x59, 0xda, 0xdd, 0x9f, 0x54, 0xba, 0x5a, 0x1c, 0x1e, 0xb3, 0x36, 0x86, 0x63, 0xd0, 0x04, - 0xb8, 0xfc, 0xcf, 0xc9, 0xaa, 0x04, 0x7f, 0x0c, 0x72, 0x90, 0x70, 0x0c, 0xc2, 0x28, 0xae, 0xcf, - 0x04, 0xf8, 0x7e, 0xb2, 0x62, 0x0b, 0x22, 0x06, 0x69, 0x71, 0xb8, 0x3e, 0x36, 0x66, 0x32, 0x05, - 0xed, 0x61, 0xaf, 0xe0, 0x50, 0x15, 0x49, 0xbe, 0x93, 0x27, 0xb3, 0x3a, 0x26, 0xc6, 0x8d, 0x4b, - 0x11, 0x99, 0x02, 0x4d, 0x7b, 0x1e, 0xe3, 0x5e, 0xbd, 0x93, 0x2c, 0x59, 0x95, 0x71, 0xfa, 0x31, - 0x1a, 0xa4, 0xf7, 0x31, 0x3a, 0xa8, 0xd7, 0xdb, 0x66, 0x95, 0x9e, 0x67, 0x4b, 0x98, 0x06, 0xbc, - 0xb5, 0xc8, 0x00, 0x6f, 0x16, 0xea, 0x69, 0xb4, 0x09, 0x5b, 0x54, 0x29, 0x90, 0x8d, 0x26, 0xc5, - 0xbd, 0x8d, 0xa6, 0x31, 0xe5, 0xe1, 0xaf, 0x47, 0xd1, 0xef, 0x48, 0xa9, 0xbd, 0x69, 0xb8, 0x9d, - 0xd4, 0xe7, 0x6f, 0x58, 0x52, 0x4d, 0xe3, 0x8f, 0x7d, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0xf4, 0x2a, - 0x2a, 0xf8, 0xb1, 0xee, 0x67, 0xb5, 0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3, - 0x38, 0x80, 0x08, 0xb9, 0x5c, 0xa0, 0xdf, 0x23, 0xf5, 0xdd, 0x55, 0xfa, 0xfd, 0x5e, 0x0e, 0xc7, - 0xc7, 0x46, 0xe8, 0xf6, 0x96, 0x75, 0xca, 0x86, 0xbf, 0xc7, 0x8c, 0x87, 0xe2, 0xa4, 0x67, 0x3d, - 0x2a, 0xc2, 0x9e, 0x3b, 0x23, 0x63, 0x3c, 0x14, 0x27, 0x3c, 0x5b, 0x61, 0x2d, 0xe4, 0xd9, 0x13, - 0xda, 0xc6, 0x43, 0x71, 0x9c, 0x51, 0x28, 0xa6, 0x9d, 0x17, 0x1e, 0x05, 0xec, 0xe0, 0xb9, 0x61, - 0x6d, 0x10, 0xab, 0x1c, 0xfe, 0xed, 0x28, 0xfa, 0xbe, 0xf1, 0x78, 0xc0, 0xa6, 0xd9, 0xd9, 0x4a, - 0x42, 0xaf, 0x92, 0x7c, 0x01, 0x75, 0xfc, 0x94, 0xb2, 0xd6, 0x65, 0x75, 0x09, 0x9e, 0x5d, 0x49, - 0x07, 0x8f, 0x9d, 0xcd, 0xb2, 0xcc, 0x57, 0x27, 0x30, 0x2f, 0x73, 0x72, 0xec, 0x38, 0x48, 0x78, - 0xec, 0x60, 0x14, 0x67, 0x9a, 0x27, 0xac, 0xc9, 0x63, 0xbd, 0x99, 0xa6, 0x10, 0x85, 0x33, 0xcd, - 0x16, 0xc1, 0xb9, 0xd2, 0x09, 0xdb, 0x62, 0x79, 0x0e, 0x29, 0xef, 0x1e, 0x3c, 0x6a, 0x4d, 0x43, - 0x84, 0x73, 0x25, 0x44, 0x9a, 0x35, 0x7a, 0xbb, 0x2e, 0x4a, 0x2a, 0x78, 0xbe, 0xda, 0xcf, 0x8a, - 0x8b, 0xd8, 0x9f, 0x16, 0x18, 0x80, 0x58, 0xa3, 0x7b, 0x41, 0xbc, 0xfe, 0x3a, 0x2d, 0xa6, 0xcc, - 0xbf, 0xfe, 0x6a, 0x24, 0xe1, 0xf5, 0x97, 0x22, 0xb0, 0xc9, 0x63, 0xa0, 0x4c, 0x36, 0x92, 0xb0, - 0x49, 0x45, 0xf8, 0x42, 0xa1, 0xda, 0xc9, 0x25, 0x43, 0x21, 0xda, 0xbb, 0xbd, 0xdf, 0xcb, 0xe1, - 0x1e, 0xda, 0x2e, 0xc4, 0x76, 0x80, 0xa7, 0xe7, 0xfe, 0x1e, 0xea, 0x20, 0xe1, 0x1e, 0x8a, 0x51, - 0x5c, 0xa5, 0x13, 0xa6, 0x17, 0x92, 0xf7, 0xfc, 0xfd, 0xa3, 0xb3, 0x88, 0xbc, 0xdf, 0xcb, 0xe1, - 0xa5, 0xd1, 0xde, 0x5c, 0x3c, 0x33, 0x6f, 0x27, 0x97, 0xb2, 0xf0, 0xd2, 0x48, 0x33, 0xb8, 0xf4, - 0x52, 0xd0, 0x3c, 0x4e, 0x7f, 0xe9, 0x8d, 0x3c, 0x5c, 0x7a, 0x87, 0x53, 0x4e, 0xfe, 0x75, 0x14, - 0x5d, 0xb7, 0xbd, 0x1c, 0xb2, 0x66, 0x8c, 0xbc, 0x4a, 0xf2, 0x6c, 0x9a, 0x70, 0x38, 0x61, 0x17, - 0x50, 0xa0, 0xbd, 0x15, 0xb7, 0xb4, 0x92, 0x1f, 0x3b, 0x0a, 0xc4, 0xde, 0xca, 0x20, 0x45, 0xdc, - 0x4f, 0x24, 0x7d, 0x5a, 0xc3, 0x56, 0x52, 0x13, 0x91, 0xcc, 0x41, 0xc2, 0xfd, 0x04, 0xa3, 0x38, - 0x5f, 0x95, 0xf2, 0x17, 0x6f, 0x4b, 0xa8, 0x32, 0x28, 0x52, 0xf0, 0xe7, 0xab, 0x98, 0x0a, 0xe7, - 0xab, 0x1e, 0xba, 0xb3, 0xf5, 0xa0, 0x83, 0x53, 0xf7, 0xee, 0x00, 0x26, 0x02, 0x77, 0x07, 0x08, - 0x14, 0x57, 0xd2, 0x00, 0xde, 0xed, 0xbb, 0x8e, 0x95, 0xe0, 0xf6, 0x1d, 0x4d, 0x77, 0x36, 0x74, - 0x34, 0x33, 0x69, 0x86, 0x49, 0x4f, 0xd1, 0x27, 0xf6, 0x70, 0x59, 0x1b, 0xc4, 0xfa, 0x77, 0x90, - 0x8e, 0x21, 0x4f, 0xc4, 0x14, 0x12, 0xd8, 0xa6, 0x69, 0x99, 0x21, 0x3b, 0x48, 0x16, 0xab, 0x1c, - 0xfe, 0xe5, 0x28, 0xfa, 0xc8, 0xe7, 0xf1, 0x65, 0x29, 0xfc, 0x3e, 0xe9, 0xb7, 0x25, 0x49, 0xe2, - 0x72, 0x44, 0x58, 0x43, 0x95, 0xe1, 0x4f, 0xa3, 0x0f, 0x5b, 0x91, 0xb9, 0x3b, 0xa1, 0x0a, 0xe0, - 0x26, 0x50, 0xba, 0xfc, 0x98, 0xd3, 0xee, 0x37, 0x06, 0xf3, 0x66, 0x6d, 0xe2, 0x96, 0xab, 0x46, - 0x6b, 0x13, 0x6d, 0x43, 0x89, 0x89, 0xb5, 0x89, 0x07, 0xc3, 0x33, 0x75, 0x8b, 0x34, 0xe3, 0xc4, - 0x17, 0xe3, 0xb4, 0x09, 0x7b, 0x94, 0x3c, 0xe8, 0x07, 0x71, 0xdf, 0x69, 0xc5, 0x6a, 0x49, 0xf0, - 0x28, 0x64, 0x01, 0x2d, 0x0b, 0xd6, 0x06, 0xb1, 0xca, 0xe1, 0x9f, 0x47, 0xdf, 0xeb, 0x54, 0x6c, - 0x07, 0x12, 0xbe, 0xa8, 0x60, 0x1a, 0x6f, 0xf4, 0x94, 0xbb, 0x05, 0xb5, 0xeb, 0x27, 0xc3, 0x15, - 0x3a, 0xb9, 0x6b, 0xcb, 0xc9, 0x26, 0xd6, 0x65, 0x78, 0x1a, 0x32, 0xe9, 0xb2, 0xc1, 0xdc, 0x95, - 0xd6, 0xe9, 0x2c, 0x3f, 0xed, 0x8e, 0xbc, 0xb9, 0x4c, 0xb2, 0x5c, 0x1c, 0x69, 0x7c, 0x1c, 0x32, - 0xea, 0xa0, 0xc1, 0xe5, 0x27, 0xa9, 0xd2, 0x89, 0x92, 0x62, 0xbc, 0x59, 0xcb, 0x96, 0xc7, 0xf4, - 0xa8, 0xf4, 0xac, 0x5a, 0xd6, 0x07, 0xd2, 0xca, 0x2d, 0x6f, 0xb7, 0xed, 0x9a, 0x9f, 0xed, 0x4e, - 0xee, 0xf3, 0xaa, 0x54, 0x3d, 0x3d, 0x7d, 0x7d, 0x20, 0xad, 0xbc, 0xfe, 0x59, 0xf4, 0x61, 0xd7, - 0xab, 0x9a, 0x14, 0x36, 0x7a, 0x4d, 0xa1, 0x79, 0xe1, 0xc9, 0x70, 0x05, 0x93, 0xea, 0x7f, 0x99, - 0xd5, 0x9c, 0x55, 0xab, 0xc9, 0x39, 0xbb, 0x6c, 0xef, 0x07, 0xbb, 0xa3, 0x55, 0x01, 0x63, 0x8b, - 0x20, 0x52, 0x7d, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x11, 0xd7, 0x84, 0x2b, 0x8b, 0xe8, 0x71, 0xe5, - 0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x97, 0x9e, 0xef, 0xfb, 0x8b, 0xda, 0xbd, 0xf8, 0xfc, 0xa0, - 0x1f, 0x34, 0xd9, 0x83, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, 0xfe, 0x92, 0xda, 0x08, 0x91, - 0x3d, 0x10, 0xa8, 0x49, 0x46, 0x77, 0xb2, 0x1c, 0xc4, 0xf9, 0xd8, 0xcb, 0xb3, 0xb3, 0x9c, 0x25, - 0x53, 0x94, 0x8c, 0x36, 0xe2, 0xb1, 0x2d, 0x27, 0x92, 0x51, 0x1f, 0x67, 0xae, 0x17, 0x35, 0xd2, - 0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0x2e, 0x25, 0x34, 0xb5, 0x90, 0xb8, 0x5e, 0xd4, 0x81, - 0xcc, 0x24, 0xd5, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, 0xd1, 0x12, 0x13, 0x93, 0x94, - 0x07, 0x33, 0x6b, 0xb2, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, 0x5a, 0x52, 0x42, 0xac, 0xc9, - 0x5c, 0xc2, 0xac, 0x2d, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, 0xde, 0xea, 0xaa, 0xb4, 0x32, - 0x62, 0x6d, 0x81, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, 0x15, 0x2b, 0xe3, 0x6b, 0x1e, - 0x85, 0xca, 0xba, 0xd9, 0x74, 0x9d, 0x94, 0x9b, 0x0b, 0x7a, 0xba, 0x6f, 0x9c, 0xd6, 0xc9, 0x0c, - 0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x41, 0xaf, 0x4b, 0xb9, 0xbd, 0xe2, 0x90, 0x4d, 0x95, - 0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x1c, 0x97, 0x1c, 0x26, 0xcb, 0x6c, 0xa6, - 0x27, 0x1c, 0x19, 0xb7, 0x6a, 0x74, 0x5c, 0x62, 0x98, 0xb1, 0x05, 0x11, 0xc7, 0x25, 0x24, 0xac, - 0x7c, 0xfe, 0xcb, 0x28, 0xba, 0x61, 0x98, 0xdd, 0x76, 0x17, 0x6b, 0xaf, 0x38, 0x63, 0xaf, 0x33, - 0x7e, 0xbe, 0x9f, 0x15, 0x17, 0x75, 0xfc, 0x19, 0x65, 0xd2, 0xcf, 0xeb, 0xa2, 0x7c, 0x7e, 0x65, - 0x3d, 0x93, 0x41, 0xb6, 0x5b, 0x3c, 0xe6, 0xec, 0x52, 0x6a, 0xa0, 0x0c, 0x52, 0xef, 0x04, 0x61, - 0x8e, 0xc8, 0x20, 0x43, 0xbc, 0x69, 0x62, 0xed, 0x3c, 0x67, 0x05, 0x6e, 0x62, 0x63, 0xa1, 0x11, - 0x12, 0x4d, 0xdc, 0x81, 0x4c, 0x3c, 0x6e, 0x45, 0x72, 0x37, 0x62, 0x33, 0xcf, 0x51, 0x3c, 0xd6, - 0xaa, 0x1a, 0x20, 0xe2, 0xb1, 0x17, 0x54, 0x7e, 0x8e, 0xa3, 0xef, 0x34, 0x8f, 0xf4, 0xa8, 0x82, - 0x65, 0x06, 0xf8, 0x98, 0xdd, 0x92, 0x10, 0xe3, 0xdf, 0x25, 0xcc, 0xc8, 0x3a, 0x2d, 0xea, 0x32, - 0x4f, 0xea, 0x73, 0x75, 0xf0, 0xea, 0xd6, 0xb9, 0x15, 0xe2, 0xa3, 0xd7, 0xbb, 0x3d, 0x94, 0x09, - 0xea, 0xad, 0x4c, 0x87, 0x98, 0x7b, 0x7e, 0xd5, 0x4e, 0x98, 0xb9, 0xdf, 0xcb, 0x99, 0x9d, 0xe0, - 0xdd, 0x24, 0xcf, 0xa1, 0x5a, 0xb5, 0xb2, 0x83, 0xa4, 0xc8, 0xce, 0xa0, 0xe6, 0x68, 0x27, 0x58, - 0x51, 0x63, 0x8c, 0x11, 0x3b, 0xc1, 0x01, 0xdc, 0x64, 0xf3, 0xc8, 0xf3, 0x5e, 0x31, 0x85, 0xb7, - 0x28, 0x9b, 0xc7, 0x76, 0x04, 0x43, 0x64, 0xf3, 0x14, 0x6b, 0x76, 0x44, 0x9f, 0xe7, 0x2c, 0xbd, - 0x50, 0x53, 0x80, 0xdb, 0xc0, 0x42, 0x82, 0xe7, 0x80, 0x5b, 0x21, 0xc4, 0x4c, 0x02, 0x42, 0x70, - 0x0c, 0x65, 0x9e, 0xa4, 0xf8, 0xae, 0x85, 0xd4, 0x51, 0x32, 0x62, 0x12, 0xc0, 0x0c, 0x2a, 0xae, - 0xba, 0xc3, 0xe1, 0x2b, 0x2e, 0xba, 0xc2, 0x71, 0x2b, 0x84, 0x98, 0x69, 0x50, 0x08, 0x26, 0x65, - 0x9e, 0x71, 0x34, 0x0c, 0xa4, 0x86, 0x90, 0x10, 0xc3, 0xc0, 0x25, 0x90, 0xc9, 0x03, 0xa8, 0x66, - 0xe0, 0x35, 0x29, 0x24, 0x41, 0x93, 0x2d, 0x61, 0xae, 0xe4, 0xc9, 0xba, 0xb3, 0x72, 0x85, 0xae, - 0xe4, 0xa9, 0x6a, 0xb1, 0x72, 0x45, 0x5c, 0xc9, 0x73, 0x00, 0x54, 0xc4, 0xa3, 0xa4, 0xe6, 0xfe, - 0x22, 0x0a, 0x49, 0xb0, 0x88, 0x2d, 0x61, 0xe6, 0x68, 0x59, 0xc4, 0x05, 0x47, 0x73, 0xb4, 0x2a, - 0x80, 0x75, 0x32, 0x7b, 0x9d, 0x94, 0x9b, 0x48, 0x22, 0x5b, 0x05, 0xf8, 0x4e, 0x06, 0xf9, 0xb4, - 0x46, 0x91, 0x44, 0x3d, 0xf7, 0x56, 0x4a, 0x44, 0x92, 0x2e, 0x85, 0xba, 0x92, 0xda, 0x37, 0xf6, - 0xd5, 0x0e, 0x6d, 0x19, 0xdf, 0x0a, 0x21, 0x26, 0x3e, 0xb5, 0x85, 0xde, 0x4a, 0xaa, 0x2a, 0x6b, - 0x26, 0xff, 0x7b, 0xfe, 0x02, 0xb5, 0x72, 0x22, 0x3e, 0xf9, 0x38, 0x34, 0xbc, 0xda, 0xc0, 0xed, - 0x2b, 0x18, 0x0e, 0xdd, 0xb7, 0x83, 0x8c, 0xc9, 0x38, 0x85, 0xc4, 0x3a, 0x5a, 0xf4, 0x3d, 0x4d, - 0xcf, 0xc9, 0xe2, 0xbd, 0x3e, 0xcc, 0xba, 0x32, 0xaf, 0x5d, 0x1c, 0xb0, 0x25, 0x9c, 0xb0, 0x17, - 0x6f, 0xb3, 0x9a, 0x67, 0xc5, 0x4c, 0xcd, 0xdc, 0xcf, 0x08, 0x4b, 0x3e, 0x98, 0xb8, 0x32, 0xdf, - 0xab, 0x64, 0x12, 0x08, 0x54, 0x96, 0x43, 0xb8, 0xf4, 0x26, 0x10, 0xd8, 0xa2, 0xe6, 0x88, 0x04, - 0x22, 0xc4, 0x9b, 0x7d, 0x14, 0xed, 0x5c, 0xbd, 0x57, 0x78, 0xc2, 0xda, 0x5c, 0x8e, 0xb2, 0x86, - 0x41, 0x62, 0x29, 0x1b, 0x54, 0x30, 0xeb, 0x4b, 0xed, 0xdf, 0x0c, 0xb1, 0x07, 0x84, 0x9d, 0xee, - 0x30, 0x7b, 0x38, 0x80, 0xf4, 0xb8, 0x32, 0xe7, 0xe3, 0x94, 0xab, 0xee, 0xf1, 0xf8, 0xc3, 0x01, - 0xa4, 0xb5, 0x27, 0x63, 0x57, 0xeb, 0x79, 0x92, 0x5e, 0xcc, 0x2a, 0xb6, 0x28, 0xa6, 0x5b, 0x2c, - 0x67, 0x15, 0xda, 0x93, 0x71, 0x4a, 0x8d, 0x50, 0x62, 0x4f, 0xa6, 0x47, 0xc5, 0x64, 0x70, 0x76, - 0x29, 0x36, 0xf3, 0x6c, 0x86, 0x57, 0xd4, 0x8e, 0x21, 0x01, 0x10, 0x19, 0x9c, 0x17, 0xf4, 0x74, - 0x22, 0xb9, 0xe2, 0xe6, 0x59, 0x9a, 0xe4, 0xd2, 0xdf, 0x06, 0x6d, 0xc6, 0x01, 0x7b, 0x3b, 0x91, - 0x47, 0xc1, 0x53, 0xcf, 0x93, 0x45, 0x55, 0xec, 0x15, 0x9c, 0x91, 0xf5, 0x6c, 0x81, 0xde, 0x7a, - 0x5a, 0x20, 0x0a, 0xab, 0x27, 0xf0, 0xb6, 0x29, 0x4d, 0xf3, 0x8f, 0x2f, 0xac, 0x36, 0xbf, 0x8f, - 0x95, 0x3c, 0x14, 0x56, 0x11, 0x87, 0x2a, 0xa3, 0x9c, 0xc8, 0x0e, 0x13, 0xd0, 0x76, 0xbb, 0xc9, - 0x83, 0x7e, 0xd0, 0xef, 0x67, 0xc2, 0x57, 0x39, 0x84, 0xfc, 0x08, 0x60, 0x88, 0x9f, 0x16, 0x34, - 0xdb, 0x2d, 0x4e, 0x7d, 0xce, 0x21, 0xbd, 0xe8, 0x5c, 0xf7, 0x71, 0x0b, 0x2a, 0x11, 0x62, 0xbb, - 0x85, 0x40, 0xfd, 0x4d, 0xb4, 0x97, 0xb2, 0x22, 0xd4, 0x44, 0x8d, 0x7c, 0x48, 0x13, 0x29, 0xce, - 0x2c, 0x7e, 0xb5, 0x54, 0xf5, 0x4c, 0xd9, 0x4c, 0x6b, 0x84, 0x05, 0x1b, 0x22, 0x16, 0xbf, 0x24, - 0x6c, 0x72, 0x72, 0xec, 0xf3, 0xa0, 0x7b, 0xbf, 0xb7, 0x63, 0xe5, 0x80, 0xbe, 0xdf, 0x4b, 0xb1, - 0x74, 0x25, 0x65, 0x1f, 0xe9, 0xb1, 0xe2, 0xf6, 0x93, 0xc7, 0xc3, 0x60, 0xb3, 0xe4, 0x71, 0x7c, - 0x6e, 0xe5, 0x90, 0x54, 0xd2, 0xeb, 0x7a, 0xc0, 0x90, 0xc1, 0x88, 0x25, 0x4f, 0x00, 0x47, 0x21, - 0xcc, 0xf1, 0xbc, 0xc5, 0x0a, 0x0e, 0x05, 0xf7, 0x85, 0x30, 0xd7, 0x98, 0x02, 0x43, 0x21, 0x8c, - 0x52, 0x40, 0xfd, 0x56, 0xec, 0x07, 0x01, 0x3f, 0x4c, 0xe6, 0xde, 0x8c, 0x4d, 0xee, 0xf5, 0x48, - 0x79, 0xa8, 0xdf, 0x22, 0xce, 0x3a, 0x70, 0xb3, 0xbd, 0x9c, 0x24, 0xd5, 0x4c, 0xef, 0x6e, 0x4c, - 0xe3, 0x27, 0xb4, 0x1d, 0x97, 0x24, 0x0e, 0xdc, 0xc2, 0x1a, 0x28, 0xec, 0xec, 0xcd, 0x93, 0x99, - 0xae, 0xa9, 0xa7, 0x06, 0x42, 0xde, 0xa9, 0xea, 0x83, 0x7e, 0x10, 0xf9, 0x79, 0x95, 0x4d, 0x81, - 0x05, 0xfc, 0x08, 0xf9, 0x10, 0x3f, 0x18, 0x44, 0xd9, 0x5b, 0x53, 0x6f, 0xb9, 0xa2, 0xdb, 0x2c, - 0xa6, 0x6a, 0x1d, 0x3b, 0x26, 0x1e, 0x0f, 0xe2, 0x42, 0xd9, 0x1b, 0xc1, 0xa3, 0x31, 0xda, 0x6e, - 0xd0, 0x86, 0xc6, 0xa8, 0xde, 0x7f, 0x1d, 0x32, 0x46, 0x7d, 0xb0, 0xf2, 0xf9, 0x53, 0x35, 0x46, - 0xb7, 0x13, 0x9e, 0x34, 0x79, 0xfb, 0xab, 0x0c, 0x2e, 0xd5, 0x42, 0xd8, 0x53, 0xdf, 0x96, 0x1a, - 0x8b, 0x17, 0xbb, 0xd0, 0xaa, 0x78, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0x56, 0x08, 0xbd, 0xbe, 0xd1, - 0x52, 0x61, 0x63, 0x30, 0x1f, 0xf0, 0xad, 0xde, 0x18, 0xed, 0xf5, 0x8d, 0x5e, 0x1b, 0xdd, 0x18, - 0xcc, 0x2b, 0xdf, 0x7f, 0xd5, 0x0e, 0x5c, 0xdb, 0x79, 0x93, 0x87, 0xa5, 0x3c, 0x5b, 0x82, 0x2f, - 0x9d, 0x74, 0xed, 0x69, 0x34, 0x94, 0x4e, 0xd2, 0x2a, 0xd6, 0x67, 0x46, 0x7c, 0xa5, 0x38, 0x62, - 0x75, 0x26, 0x0e, 0xcc, 0x9f, 0x0d, 0x30, 0xda, 0xc2, 0xa1, 0x45, 0x53, 0x48, 0xc9, 0x1c, 0x37, - 0x3a, 0xa8, 0xb9, 0xdd, 0xfb, 0x38, 0x60, 0xaf, 0x7b, 0xc9, 0x77, 0x7d, 0x20, 0x6d, 0x0e, 0xfe, - 0x1c, 0xc6, 0x3e, 0x71, 0x0c, 0xb5, 0xaa, 0xf7, 0xd0, 0xf1, 0xc9, 0x70, 0x05, 0xe5, 0xfe, 0x6f, - 0xda, 0x75, 0x05, 0xf6, 0xaf, 0x06, 0xc1, 0xd3, 0x21, 0x16, 0xd1, 0x40, 0x78, 0x76, 0x25, 0x1d, - 0x55, 0x90, 0xff, 0x18, 0x45, 0xb7, 0xbc, 0x05, 0x71, 0xcf, 0x9e, 0x7f, 0x77, 0x88, 0x6d, 0xff, - 0x19, 0xf4, 0x17, 0xdf, 0x46, 0x55, 0x95, 0xee, 0x1f, 0xda, 0xe5, 0x7d, 0xab, 0x21, 0xde, 0xc0, - 0x78, 0x59, 0x4d, 0xa1, 0x52, 0x23, 0x36, 0xd4, 0xe9, 0x0c, 0x8c, 0xc7, 0xed, 0xa7, 0x57, 0xd4, - 0xb2, 0x3e, 0x89, 0xe3, 0xc0, 0xea, 0xed, 0x37, 0xab, 0x3c, 0x21, 0xcb, 0x16, 0x8d, 0x0b, 0xf4, - 0xd9, 0x55, 0xd5, 0xa8, 0x91, 0x6c, 0xc1, 0xe2, 0x0d, 0xfb, 0x67, 0x03, 0x0d, 0x3b, 0xef, 0xdc, - 0x7f, 0x72, 0x35, 0x25, 0x55, 0x96, 0xff, 0x1a, 0x45, 0x77, 0x1d, 0xd6, 0x9c, 0x76, 0xa0, 0x3d, - 0x99, 0x1f, 0x05, 0xec, 0x53, 0x4a, 0xba, 0x70, 0xbf, 0xf7, 0xed, 0x94, 0xcd, 0xf7, 0x63, 0x1c, - 0x95, 0x9d, 0x2c, 0xe7, 0x50, 0x75, 0xbf, 0x1f, 0xe3, 0xda, 0x95, 0xd4, 0x98, 0xfe, 0x7e, 0x4c, - 0x00, 0xb7, 0xbe, 0x1f, 0xe3, 0xf1, 0xec, 0xfd, 0x7e, 0x8c, 0xd7, 0x5a, 0xf0, 0xfb, 0x31, 0x61, - 0x0d, 0x6a, 0xf2, 0x69, 0x8b, 0x20, 0x77, 0xd5, 0x07, 0x59, 0x74, 0x37, 0xd9, 0x9f, 0x5e, 0x45, - 0x85, 0x98, 0x7e, 0x25, 0x27, 0x6e, 0xc4, 0x0d, 0x78, 0xa6, 0xce, 0xad, 0xb8, 0x8d, 0xc1, 0xbc, - 0xf2, 0xfd, 0x13, 0xb5, 0xf6, 0xd2, 0x93, 0x0d, 0xab, 0xc4, 0xb7, 0x83, 0xd6, 0x42, 0x93, 0x47, - 0x63, 0xc1, 0x6e, 0xf9, 0xc7, 0xc3, 0x60, 0xa2, 0xba, 0x0d, 0xa1, 0x1a, 0x7d, 0xdc, 0x67, 0x08, - 0x35, 0xf9, 0xc6, 0x60, 0x9e, 0x98, 0xe4, 0xa4, 0x6f, 0xd9, 0xda, 0x03, 0x8c, 0xb9, 0x6d, 0xfd, - 0x64, 0xb8, 0x82, 0x72, 0xbf, 0x54, 0x49, 0xad, 0xed, 0x5e, 0xb4, 0xf3, 0x7a, 0x9f, 0xa9, 0x89, - 0xd3, 0xcc, 0xe3, 0xa1, 0x78, 0x28, 0xbd, 0xb1, 0x27, 0xf8, 0xbe, 0xf4, 0xc6, 0x3b, 0xc9, 0x7f, - 0x72, 0x35, 0x25, 0x55, 0x96, 0x7f, 0x1e, 0x45, 0xd7, 0xc9, 0xb2, 0xa8, 0x7e, 0xf0, 0xd9, 0x50, - 0xcb, 0xa8, 0x3f, 0x7c, 0x7e, 0x65, 0x3d, 0x55, 0xa8, 0x7f, 0x1b, 0x45, 0x37, 0x02, 0x85, 0x92, - 0x1d, 0xe4, 0x0a, 0xd6, 0xdd, 0x8e, 0xf2, 0xc3, 0xab, 0x2b, 0x52, 0xd3, 0xbd, 0x8d, 0x4f, 0xba, - 0x1f, 0x56, 0x09, 0xd8, 0x9e, 0xd0, 0x1f, 0x56, 0xe9, 0xd7, 0xc2, 0x5b, 0x50, 0x4d, 0x52, 0xa2, - 0x56, 0x46, 0xbe, 0x2d, 0x28, 0x91, 0xb3, 0xa0, 0x15, 0xd1, 0xfd, 0x5e, 0xce, 0xe7, 0xe4, 0xc5, - 0xdb, 0x32, 0x29, 0xa6, 0xb4, 0x13, 0x29, 0xef, 0x77, 0xa2, 0x39, 0xbc, 0x75, 0xd7, 0x48, 0x8f, - 0x59, 0xbb, 0xcc, 0x7b, 0x48, 0xe9, 0x6b, 0x24, 0xb8, 0x75, 0xd7, 0x41, 0x09, 0x6f, 0x2a, 0xa7, - 0x0d, 0x79, 0x43, 0xa9, 0xec, 0xa3, 0x21, 0x28, 0x5a, 0x40, 0x68, 0x6f, 0xfa, 0x44, 0xe0, 0x71, - 0xc8, 0x4a, 0xe7, 0x54, 0x60, 0x7d, 0x20, 0x4d, 0xb8, 0x9d, 0x00, 0xff, 0x12, 0x92, 0x29, 0x54, - 0x41, 0xb7, 0x9a, 0x1a, 0xe4, 0xd6, 0xa6, 0x7d, 0x6e, 0xb7, 0x58, 0xbe, 0x98, 0x17, 0xaa, 0x31, - 0x49, 0xb7, 0x36, 0xd5, 0xef, 0x16, 0xd1, 0x78, 0xd3, 0xd2, 0xb8, 0x15, 0xe9, 0xe5, 0xa3, 0xb0, - 0x19, 0x27, 0xab, 0x5c, 0x1b, 0xc4, 0xd2, 0xf5, 0x54, 0xdd, 0xa8, 0xa7, 0x9e, 0xa8, 0x27, 0xad, - 0x0f, 0xa4, 0xf1, 0xee, 0xa1, 0xe5, 0x56, 0xf7, 0xa7, 0x8d, 0x1e, 0x5b, 0x9d, 0x2e, 0xf5, 0x64, - 0xb8, 0x02, 0xde, 0xab, 0x55, 0xbd, 0xaa, 0x59, 0x17, 0xed, 0x64, 0x79, 0x1e, 0xaf, 0x05, 0xba, - 0x49, 0x0b, 0x05, 0xf7, 0x6a, 0x3d, 0x30, 0xd1, 0x93, 0xdb, 0xbd, 0xcd, 0x22, 0xee, 0xb3, 0x23, - 0xa8, 0x41, 0x3d, 0xd9, 0xa6, 0xd1, 0x7e, 0x9b, 0xf5, 0xa8, 0x75, 0x6d, 0xc7, 0xe1, 0x07, 0xd7, - 0xa9, 0xf0, 0xc6, 0x60, 0x1e, 0x5d, 0x06, 0x10, 0x94, 0x98, 0x59, 0xee, 0x50, 0x26, 0x9c, 0x99, - 0xe4, 0x6e, 0x0f, 0x85, 0xf6, 0x2c, 0xe5, 0x30, 0x7a, 0x9d, 0x4d, 0x67, 0xc0, 0xbd, 0xe7, 0x58, - 0x36, 0x10, 0x3c, 0xc7, 0x42, 0x20, 0x6a, 0x3a, 0xf9, 0xbb, 0xde, 0xac, 0xdd, 0x9b, 0xfa, 0x9a, - 0x4e, 0x29, 0x5b, 0x54, 0xa8, 0xe9, 0xbc, 0x34, 0x8a, 0x06, 0xda, 0xad, 0x7a, 0x89, 0xfe, 0x51, - 0xc8, 0x0c, 0x7a, 0x93, 0x7e, 0x6d, 0x10, 0x8b, 0x66, 0x14, 0xe3, 0x30, 0x9b, 0x67, 0xdc, 0x37, - 0xa3, 0x58, 0x36, 0x1a, 0x24, 0x34, 0xa3, 0x74, 0x51, 0xaa, 0x7a, 0x4d, 0x8e, 0xb0, 0x37, 0x0d, - 0x57, 0x4f, 0x32, 0xc3, 0xaa, 0xa7, 0xd9, 0xce, 0xb1, 0x6b, 0xa1, 0xbb, 0x0c, 0x3f, 0x57, 0x8b, - 0x65, 0x4f, 0xdf, 0x16, 0x2f, 0x57, 0x62, 0x30, 0x14, 0x75, 0x28, 0x05, 0x7c, 0x9c, 0xd0, 0x70, - 0xed, 0xc9, 0x70, 0x59, 0x42, 0x52, 0x25, 0x45, 0xea, 0x5d, 0x9c, 0x0a, 0x83, 0x1d, 0x32, 0xb4, - 0x38, 0x25, 0x35, 0xd0, 0xa1, 0xbe, 0xfb, 0x5a, 0xa4, 0x67, 0x28, 0xe8, 0xf7, 0x0f, 0xdd, 0xb7, - 0x22, 0x1f, 0x0e, 0x20, 0xf1, 0xa1, 0x7e, 0x0b, 0xe8, 0x6d, 0x79, 0xe9, 0xf4, 0xe3, 0x80, 0x29, - 0x17, 0x0d, 0x2d, 0x84, 0x69, 0x15, 0xd4, 0xa9, 0x75, 0x82, 0x0b, 0xfc, 0xc7, 0xb0, 0xf2, 0x75, - 0x6a, 0x93, 0x9f, 0x0a, 0x24, 0xd4, 0xa9, 0xbb, 0x28, 0xca, 0x33, 0xed, 0x75, 0xd0, 0xbd, 0x80, - 0xbe, 0xbd, 0xf4, 0xb9, 0xdf, 0xcb, 0xa1, 0x91, 0xb3, 0x9d, 0x2d, 0x9d, 0x53, 0x0c, 0x4f, 0x41, - 0xb7, 0xb3, 0xa5, 0xff, 0x10, 0x63, 0x6d, 0x10, 0x8b, 0x2f, 0x0c, 0x24, 0x1c, 0xde, 0xb6, 0x27, - 0xf9, 0x9e, 0xe2, 0x0a, 0x79, 0xe7, 0x28, 0xff, 0x41, 0x3f, 0x68, 0xae, 0xe7, 0x1e, 0x55, 0x2c, - 0x85, 0xba, 0x56, 0x5f, 0x9b, 0x73, 0xef, 0x3f, 0x29, 0xd9, 0x18, 0x7d, 0x6b, 0xee, 0x4e, 0x18, - 0x52, 0xb6, 0xbf, 0x8c, 0xde, 0xdd, 0x67, 0xb3, 0x09, 0x14, 0xd3, 0xf8, 0x07, 0xee, 0x85, 0x58, - 0x36, 0x1b, 0x37, 0x3f, 0x6b, 0x7b, 0xd7, 0x28, 0xb1, 0xb9, 0xd2, 0xb7, 0x0d, 0x6f, 0x16, 0xb3, - 0x09, 0x4f, 0x38, 0xba, 0xd2, 0x27, 0x7e, 0x1f, 0x37, 0x02, 0xe2, 0x4a, 0x9f, 0x03, 0x20, 0x7b, - 0x27, 0x15, 0x80, 0xd7, 0x5e, 0x23, 0x08, 0xda, 0x53, 0x80, 0x99, 0x75, 0xb5, 0xbd, 0x26, 0xb1, - 0xc5, 0x57, 0xf0, 0x8c, 0x8e, 0x90, 0x12, 0xb3, 0x6e, 0x97, 0x32, 0x9d, 0x41, 0x56, 0x5f, 0x7c, - 0x5b, 0x63, 0x31, 0x9f, 0x27, 0xd5, 0x0a, 0x75, 0x06, 0x55, 0x4b, 0x0b, 0x20, 0x3a, 0x83, 0x17, - 0x34, 0xbd, 0xbc, 0x7d, 0xcc, 0xe9, 0xc5, 0x2e, 0xab, 0xd8, 0x82, 0x67, 0x05, 0xe0, 0xef, 0x2b, - 0xe8, 0x07, 0x6a, 0x33, 0x44, 0x2f, 0xa7, 0x58, 0x93, 0x15, 0x0a, 0x42, 0xde, 0x0e, 0x14, 0xdf, - 0x6c, 0xad, 0x39, 0xab, 0xf0, 0xe9, 0xa0, 0xb4, 0x82, 0x21, 0x22, 0x2b, 0x24, 0x61, 0xd4, 0xf6, - 0x47, 0x59, 0x31, 0xf3, 0xb6, 0xfd, 0x91, 0xfd, 0xc5, 0xc3, 0x1b, 0x34, 0x60, 0xe2, 0xbb, 0x7c, - 0x68, 0xf2, 0x1b, 0x46, 0xea, 0x2d, 0x49, 0xef, 0x43, 0xb7, 0x09, 0x22, 0xbe, 0xfb, 0x49, 0xe4, - 0xea, 0x65, 0x09, 0x05, 0x4c, 0xdb, 0x3b, 0x70, 0x3e, 0x57, 0x0e, 0x11, 0x74, 0x85, 0x49, 0x13, - 0x55, 0x85, 0xfc, 0x78, 0x51, 0x1c, 0x55, 0xec, 0x2c, 0xcb, 0xa1, 0x42, 0x51, 0x55, 0xaa, 0x5b, - 0x72, 0x22, 0xaa, 0xfa, 0x38, 0x73, 0x99, 0x42, 0x48, 0x9d, 0x0f, 0x0f, 0x9f, 0x54, 0x49, 0x8a, - 0x2f, 0x53, 0x48, 0x1b, 0x5d, 0x8c, 0xd8, 0x49, 0x0b, 0xe0, 0xa6, 0xa7, 0x1f, 0x00, 0xaf, 0xb2, - 0xb4, 0x9e, 0x00, 0x3f, 0x4a, 0xaa, 0x64, 0x0e, 0x1c, 0x2a, 0xdc, 0xd3, 0x15, 0x32, 0x76, 0x18, - 0xa2, 0xa7, 0x53, 0xac, 0x72, 0xf8, 0xfb, 0xd1, 0xfb, 0x4d, 0xa0, 0x87, 0x42, 0x7d, 0x23, 0xff, - 0x85, 0xf8, 0xe3, 0x1a, 0xf1, 0x07, 0xda, 0xc6, 0x84, 0x57, 0x90, 0xcc, 0x5b, 0xdb, 0xef, 0xe9, - 0xdf, 0x05, 0xf8, 0x64, 0xd4, 0x34, 0xc8, 0x21, 0xe3, 0xd9, 0x59, 0xb3, 0xae, 0x52, 0xa7, 0x58, - 0xa8, 0x41, 0x6c, 0xf1, 0x38, 0xf0, 0xc9, 0x00, 0x1f, 0x67, 0x02, 0x8d, 0x2d, 0x3d, 0x86, 0x32, - 0xc7, 0x81, 0xc6, 0xd1, 0x16, 0x00, 0x11, 0x68, 0xbc, 0xa0, 0xe9, 0x5d, 0xb6, 0xf8, 0x04, 0xc2, - 0x95, 0x39, 0x81, 0x61, 0x95, 0x39, 0x71, 0xde, 0x11, 0xc8, 0xa3, 0xf7, 0x0f, 0x60, 0xfe, 0x06, - 0xaa, 0xfa, 0x3c, 0x2b, 0x77, 0x9b, 0x19, 0x36, 0xe1, 0x0b, 0xfc, 0x16, 0x9d, 0x21, 0xc6, 0x1a, - 0x21, 0xd2, 0x10, 0x02, 0x35, 0xa1, 0xcc, 0x00, 0x7b, 0xf5, 0x61, 0x32, 0x07, 0xf1, 0x01, 0x84, - 0x78, 0x8d, 0x32, 0x62, 0x41, 0x44, 0x28, 0x23, 0x61, 0xeb, 0x75, 0x23, 0xc3, 0x1c, 0xc3, 0xac, - 0xe9, 0x61, 0xd5, 0x51, 0xb2, 0x9a, 0x43, 0xc1, 0x95, 0x49, 0xb4, 0x09, 0x6b, 0x99, 0xf4, 0xf3, - 0xc4, 0x26, 0xec, 0x10, 0x3d, 0x2b, 0xe9, 0x76, 0x1e, 0xfc, 0x11, 0xab, 0xb8, 0xfc, 0x0b, 0x18, - 0xa7, 0x55, 0x8e, 0x92, 0x6e, 0xf7, 0xa1, 0x3a, 0x24, 0x91, 0x74, 0x87, 0x35, 0xac, 0x4f, 0x47, - 0x3b, 0x65, 0x78, 0x05, 0x95, 0xee, 0x27, 0x2f, 0xe6, 0x49, 0x96, 0xab, 0xde, 0xf0, 0x45, 0xc0, - 0x36, 0xa1, 0x43, 0x7c, 0x3a, 0x7a, 0xa8, 0xae, 0xf5, 0xb1, 0xed, 0x70, 0x09, 0xd1, 0x9e, 0x70, - 0x8f, 0x7d, 0x62, 0x4f, 0xb8, 0x5f, 0xcb, 0x2c, 0xd5, 0x0c, 0x2b, 0xb8, 0x95, 0x20, 0xb6, 0xd8, - 0x14, 0x6f, 0x10, 0x59, 0x36, 0x11, 0x48, 0x2c, 0xd5, 0x82, 0x0a, 0x66, 0x6e, 0x33, 0xd8, 0x4e, - 0x56, 0x24, 0x79, 0xf6, 0x53, 0x7c, 0xf7, 0xd9, 0xb2, 0xd3, 0x12, 0xc4, 0xdc, 0xe6, 0x27, 0x7d, - 0xae, 0x76, 0x81, 0x9f, 0x64, 0x4d, 0xe8, 0x7f, 0x10, 0x78, 0x6e, 0x82, 0xe8, 0x77, 0x65, 0x91, - 0xca, 0xd5, 0xcf, 0x46, 0xd1, 0x75, 0xfc, 0x58, 0x37, 0xcb, 0x72, 0xd2, 0xa4, 0x24, 0xc7, 0x90, - 0x42, 0x56, 0xf2, 0xf8, 0xd3, 0xf0, 0xb3, 0x42, 0x38, 0x71, 0xb2, 0x3e, 0x40, 0xcd, 0x3a, 0xaf, - 0x6d, 0x62, 0xc9, 0x44, 0xfe, 0x69, 0xa8, 0xd3, 0x1a, 0x2a, 0x35, 0x53, 0xee, 0x02, 0x47, 0xa3, - 0xd3, 0xe2, 0xc6, 0x16, 0xd8, 0x54, 0x94, 0x18, 0x9d, 0x61, 0x0d, 0xb3, 0xbb, 0x63, 0x71, 0xc7, - 0x50, 0xb3, 0x7c, 0x09, 0xe2, 0xfa, 0xdb, 0x63, 0xd2, 0x98, 0x45, 0x11, 0xbb, 0x3b, 0x34, 0x6d, - 0xd2, 0x8d, 0xae, 0xdb, 0xcd, 0x62, 0xb5, 0x87, 0xcf, 0xc8, 0x3d, 0x96, 0x04, 0x46, 0xa4, 0x1b, - 0x01, 0xdc, 0xda, 0xfd, 0xac, 0x58, 0x32, 0x4d, 0x93, 0x9a, 0x1f, 0x25, 0xab, 0x9c, 0x25, 0x53, - 0x31, 0xaf, 0xe3, 0xdd, 0xcf, 0x96, 0x19, 0xdb, 0x10, 0xb5, 0xfb, 0x49, 0xc1, 0x66, 0x65, 0xa7, - 0xfe, 0xe2, 0x95, 0xba, 0x5a, 0x78, 0x1b, 0xe5, 0x48, 0xa2, 0xbc, 0xf8, 0x5a, 0xe1, 0x9d, 0x30, - 0x64, 0x5e, 0x89, 0x92, 0x22, 0x91, 0x86, 0xdc, 0xf0, 0xe9, 0x38, 0x09, 0xc8, 0xcd, 0x00, 0x61, - 0x3e, 0x93, 0x20, 0x7f, 0x6f, 0xff, 0x68, 0x03, 0x57, 0x1f, 0xd1, 0x7d, 0xec, 0xd3, 0xb5, 0xa1, - 0xb1, 0xfd, 0x1d, 0xb2, 0xf5, 0x81, 0xb4, 0xf4, 0xfa, 0xfc, 0xe6, 0x7f, 0x7f, 0x7d, 0x6d, 0xf4, - 0xf3, 0xaf, 0xaf, 0x8d, 0xfe, 0xff, 0xeb, 0x6b, 0xa3, 0x9f, 0x7d, 0x73, 0xed, 0x9d, 0x9f, 0x7f, - 0x73, 0xed, 0x9d, 0xff, 0xfd, 0xe6, 0xda, 0x3b, 0x5f, 0xbd, 0xab, 0xfe, 0x74, 0xda, 0x9b, 0x5f, - 0x12, 0x7f, 0x00, 0xed, 0xd9, 0x2f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2e, 0xe4, 0x86, 0x5e, - 0x6d, 0x00, 0x00, + 0x4f, 0x1f, 0x02, 0x81, 0x40, 0x20, 0x10, 0x88, 0x13, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xcf, 0xc0, + 0xe3, 0x3d, 0x22, 0x9e, 0xd0, 0xee, 0x3f, 0x72, 0xaa, 0xcc, 0xac, 0xfc, 0x88, 0xca, 0xc8, 0x2a, + 0xef, 0xd3, 0x8c, 0x3a, 0x7e, 0x11, 0x91, 0x59, 0x99, 0x19, 0x19, 0xf9, 0x51, 0xe5, 0xe8, 0x7a, + 0xf9, 0x66, 0xa3, 0xac, 0x18, 0x67, 0xf5, 0x46, 0x0d, 0xd5, 0x32, 0x4b, 0xa1, 0xfd, 0x77, 0x2c, + 0x7e, 0x8e, 0xdf, 0x4d, 0x8a, 0x15, 0x5f, 0x95, 0xf0, 0xd1, 0x87, 0x86, 0x4c, 0xd9, 0x7c, 0x9e, + 0x14, 0xd3, 0x5a, 0x22, 0x1f, 0x7d, 0x60, 0x24, 0xb0, 0x84, 0x82, 0xab, 0xdf, 0x9f, 0xfe, 0xf7, + 0xff, 0x8d, 0xa2, 0xf7, 0xb6, 0xf2, 0x0c, 0x0a, 0xbe, 0xa5, 0x34, 0xe2, 0xaf, 0xa2, 0xef, 0x6e, + 0x96, 0xe5, 0x2e, 0xf0, 0x57, 0x50, 0xd5, 0x19, 0x2b, 0xe2, 0xdb, 0x63, 0xe5, 0x60, 0x7c, 0x5c, + 0xa6, 0xe3, 0xcd, 0xb2, 0x1c, 0x1b, 0xe1, 0xf8, 0x18, 0x7e, 0xb2, 0x80, 0x9a, 0x7f, 0x74, 0x27, + 0x0c, 0xd5, 0x25, 0x2b, 0x6a, 0x88, 0xcf, 0xa2, 0xdf, 0xd8, 0x2c, 0xcb, 0x09, 0xf0, 0x6d, 0x68, + 0x2a, 0x30, 0xe1, 0x09, 0x87, 0xf8, 0x7e, 0x47, 0xd5, 0x05, 0xb4, 0x8f, 0x07, 0xfd, 0xa0, 0xf2, + 0x73, 0x12, 0x7d, 0xa7, 0xf1, 0x73, 0xbe, 0xe0, 0x53, 0x76, 0x59, 0xc4, 0x37, 0xbb, 0x8a, 0x4a, + 0xa4, 0x6d, 0xdf, 0x0a, 0x21, 0xca, 0xea, 0xeb, 0xe8, 0x57, 0x5f, 0x27, 0x79, 0x0e, 0x7c, 0xab, + 0x82, 0xa6, 0xe0, 0xae, 0x8e, 0x14, 0x8d, 0xa5, 0x4c, 0xdb, 0xbd, 0x1d, 0x64, 0x94, 0xe1, 0xaf, + 0xa2, 0xef, 0x4a, 0xc9, 0x31, 0xa4, 0x6c, 0x09, 0x55, 0xec, 0xd5, 0x52, 0x42, 0xe2, 0x91, 0x77, + 0x20, 0x6c, 0x7b, 0x8b, 0x15, 0x4b, 0xa8, 0xb8, 0xdf, 0xb6, 0x12, 0x86, 0x6d, 0x1b, 0x48, 0xd9, + 0xfe, 0xbb, 0x51, 0xf4, 0xfd, 0xcd, 0x34, 0x65, 0x8b, 0x82, 0xef, 0xb3, 0x34, 0xc9, 0xf7, 0xb3, + 0xe2, 0xe2, 0x10, 0x2e, 0xb7, 0xce, 0x1b, 0xbe, 0x98, 0x41, 0xfc, 0xcc, 0x7d, 0xaa, 0x12, 0x1d, + 0x6b, 0x76, 0x6c, 0xc3, 0xda, 0xf7, 0x27, 0x57, 0x53, 0x52, 0x65, 0xf9, 0xa7, 0x51, 0x74, 0x0d, + 0x97, 0x65, 0xc2, 0xf2, 0x25, 0x98, 0xd2, 0x7c, 0xda, 0x63, 0xd8, 0xc5, 0x75, 0x79, 0x3e, 0xbb, + 0xaa, 0x9a, 0x2a, 0x51, 0x1e, 0xbd, 0x6f, 0x77, 0x97, 0x09, 0xd4, 0x62, 0x38, 0x3d, 0xa4, 0x7b, + 0x84, 0x42, 0xb4, 0xe7, 0x47, 0x43, 0x50, 0xe5, 0x2d, 0x8b, 0x62, 0xe5, 0x2d, 0x67, 0xb5, 0x76, + 0xf6, 0xc0, 0x6b, 0xc1, 0x22, 0xb4, 0xaf, 0x87, 0x03, 0x48, 0xe5, 0xea, 0x8f, 0xa3, 0x5f, 0x7b, + 0xcd, 0xaa, 0x8b, 0xba, 0x4c, 0x52, 0x50, 0x43, 0xe1, 0xae, 0xab, 0xdd, 0x4a, 0xf1, 0x68, 0xb8, + 0xd7, 0x87, 0x59, 0x9d, 0xb6, 0x15, 0xbe, 0x2c, 0x01, 0xc7, 0x20, 0xa3, 0xd8, 0x08, 0xa9, 0x4e, + 0x8b, 0x21, 0x65, 0xfb, 0x22, 0x8a, 0x8d, 0xed, 0x37, 0x7f, 0x02, 0x29, 0xdf, 0x9c, 0x4e, 0x71, + 0xab, 0x18, 0x5d, 0x41, 0x8c, 0x37, 0xa7, 0x53, 0xaa, 0x55, 0xfc, 0xa8, 0x72, 0x76, 0x19, 0x7d, + 0x80, 0x9c, 0xed, 0x67, 0xb5, 0x70, 0xb8, 0x1e, 0xb6, 0xa2, 0x30, 0xed, 0x74, 0x3c, 0x14, 0x57, + 0x8e, 0xff, 0x62, 0x14, 0x7d, 0xcf, 0xe3, 0xf9, 0x18, 0xe6, 0x6c, 0x09, 0xf1, 0x93, 0x7e, 0x6b, + 0x92, 0xd4, 0xfe, 0x3f, 0xbe, 0x82, 0x86, 0xa7, 0x9b, 0x4c, 0x20, 0x87, 0x94, 0x93, 0xdd, 0x44, + 0x8a, 0x7b, 0xbb, 0x89, 0xc6, 0xac, 0x11, 0xd6, 0x0a, 0x77, 0x81, 0x6f, 0x2d, 0xaa, 0x0a, 0x0a, + 0x4e, 0xb6, 0xa5, 0x41, 0x7a, 0xdb, 0xd2, 0x41, 0x3d, 0xf5, 0xd9, 0x05, 0xbe, 0x99, 0xe7, 0x64, + 0x7d, 0xa4, 0xb8, 0xb7, 0x3e, 0x1a, 0x53, 0x1e, 0xd2, 0xe8, 0xd7, 0xad, 0x27, 0xc6, 0xf7, 0x8a, + 0x33, 0x16, 0xd3, 0xcf, 0x42, 0xc8, 0xb5, 0x8f, 0xfb, 0xbd, 0x9c, 0xa7, 0x1a, 0x2f, 0xde, 0x96, + 0xac, 0xa2, 0x9b, 0x45, 0x8a, 0x7b, 0xab, 0xa1, 0x31, 0xe5, 0xe1, 0x8f, 0xa2, 0xf7, 0x54, 0x94, + 0x6c, 0xe7, 0xb3, 0x3b, 0xde, 0x10, 0x8a, 0x27, 0xb4, 0xbb, 0x3d, 0x94, 0x09, 0x0e, 0x4a, 0xa6, + 0x82, 0xcf, 0x6d, 0xaf, 0x1e, 0x0a, 0x3d, 0x77, 0xc2, 0x50, 0xc7, 0xf6, 0x36, 0xe4, 0x40, 0xda, + 0x96, 0xc2, 0x1e, 0xdb, 0x1a, 0x52, 0xb6, 0xab, 0xe8, 0xb7, 0xf4, 0x63, 0x69, 0xe6, 0x51, 0x21, + 0x6f, 0x82, 0xf4, 0x1a, 0x51, 0x6f, 0x1b, 0xd2, 0xbe, 0x1e, 0x0f, 0x83, 0x3b, 0xf5, 0x51, 0x23, + 0xd0, 0x5f, 0x1f, 0x34, 0xfe, 0xee, 0x84, 0x21, 0x65, 0xfb, 0xef, 0x47, 0xd1, 0x0f, 0x94, 0xec, + 0x45, 0x91, 0xbc, 0xc9, 0x41, 0x4c, 0x89, 0x87, 0xc0, 0x2f, 0x59, 0x75, 0x31, 0x59, 0x15, 0x29, + 0x31, 0xfd, 0xfb, 0xe1, 0x9e, 0xe9, 0x9f, 0x54, 0xb2, 0x32, 0x3e, 0x55, 0x51, 0xce, 0x4a, 0x9c, + 0xf1, 0xb5, 0x35, 0xe0, 0xac, 0xa4, 0x32, 0x3e, 0x17, 0xe9, 0x58, 0x3d, 0x68, 0xc2, 0xa6, 0xdf, + 0xea, 0x81, 0x1d, 0x27, 0x6f, 0x85, 0x10, 0x13, 0xb6, 0xda, 0x0e, 0xcc, 0x8a, 0xb3, 0x6c, 0x76, + 0x5a, 0x4e, 0x9b, 0x6e, 0xfc, 0xd0, 0xdf, 0x43, 0x2d, 0x84, 0x08, 0x5b, 0x04, 0xaa, 0xbc, 0xfd, + 0xa3, 0x49, 0x8c, 0xd4, 0x50, 0xda, 0xa9, 0xd8, 0x7c, 0x1f, 0x66, 0x49, 0xba, 0x52, 0xe3, 0xff, + 0x93, 0xd0, 0xc0, 0xc3, 0xb4, 0x2e, 0xc4, 0xa7, 0x57, 0xd4, 0x52, 0xe5, 0xf9, 0xcf, 0x51, 0x74, + 0xa7, 0xad, 0xfe, 0x79, 0x52, 0xcc, 0x40, 0xb5, 0xa7, 0x2c, 0xfd, 0x66, 0x31, 0x3d, 0x86, 0x9a, + 0x27, 0x15, 0x8f, 0xbf, 0xf0, 0x57, 0x32, 0xa4, 0xa3, 0xcb, 0xf6, 0xa3, 0x6f, 0xa5, 0x6b, 0x5a, + 0x7d, 0xd2, 0x04, 0x36, 0x15, 0x02, 0xdc, 0x56, 0x17, 0x12, 0x1c, 0x00, 0x6e, 0x85, 0x10, 0xd3, + 0xea, 0x42, 0xb0, 0x57, 0x2c, 0x33, 0x0e, 0xbb, 0x50, 0x40, 0xd5, 0x6d, 0x75, 0xa9, 0xea, 0x22, + 0x44, 0xab, 0x13, 0xa8, 0x09, 0x36, 0x8e, 0x37, 0x3d, 0x39, 0xae, 0x05, 0x8c, 0x74, 0xa6, 0xc7, + 0xc7, 0xc3, 0x60, 0xb3, 0xba, 0xb3, 0x7c, 0x1e, 0xc3, 0x92, 0x5d, 0xe0, 0xd5, 0x9d, 0x6d, 0x42, + 0x02, 0xc4, 0xea, 0xce, 0x0b, 0x9a, 0x19, 0xcc, 0xf2, 0xf3, 0x2a, 0x83, 0x4b, 0x34, 0x83, 0xd9, + 0xca, 0x8d, 0x98, 0x98, 0xc1, 0x3c, 0x98, 0xf2, 0x70, 0x18, 0xfd, 0x8a, 0x10, 0xfe, 0x01, 0xcb, + 0x8a, 0xf8, 0xba, 0x47, 0xa9, 0x11, 0x68, 0xab, 0x37, 0x68, 0x00, 0x95, 0xb8, 0xf9, 0x75, 0x2b, + 0x29, 0x52, 0xc8, 0xbd, 0x25, 0x36, 0xe2, 0x60, 0x89, 0x1d, 0xcc, 0xa4, 0x0e, 0x42, 0xd8, 0xc4, + 0xaf, 0xc9, 0x79, 0x52, 0x65, 0xc5, 0x2c, 0xf6, 0xe9, 0x5a, 0x72, 0x22, 0x75, 0xf0, 0x71, 0xa8, + 0x0b, 0x2b, 0xc5, 0xcd, 0xb2, 0xac, 0x9a, 0xb0, 0xe8, 0xeb, 0xc2, 0x2e, 0x12, 0xec, 0xc2, 0x1d, + 0xd4, 0xef, 0x6d, 0x1b, 0xd2, 0x3c, 0x2b, 0x82, 0xde, 0x14, 0x32, 0xc4, 0x9b, 0x41, 0x51, 0xe7, + 0xdd, 0x87, 0x64, 0x09, 0x6d, 0xcd, 0x7c, 0x4f, 0xc6, 0x06, 0x82, 0x9d, 0x17, 0x81, 0x66, 0x9d, + 0x26, 0xc4, 0x07, 0xc9, 0x05, 0x34, 0x0f, 0x18, 0x9a, 0x79, 0x2d, 0xf6, 0xe9, 0x3b, 0x04, 0xb1, + 0x4e, 0xf3, 0x93, 0xca, 0xd5, 0x22, 0xfa, 0x40, 0xc8, 0x8f, 0x92, 0x8a, 0x67, 0x69, 0x56, 0x26, + 0x45, 0x9b, 0xff, 0xfb, 0xc6, 0x75, 0x87, 0xd2, 0x2e, 0xd7, 0x07, 0xd2, 0xca, 0xed, 0xbf, 0x8f, + 0xa2, 0x9b, 0xd8, 0xef, 0x11, 0x54, 0xf3, 0x4c, 0x2c, 0x23, 0x6b, 0x19, 0x84, 0xe3, 0xcf, 0xc3, + 0x46, 0x3b, 0x0a, 0xba, 0x34, 0x3f, 0xbc, 0xba, 0xa2, 0x2a, 0xd8, 0x1f, 0x46, 0x91, 0x5c, 0xae, + 0x88, 0x25, 0xa5, 0x3b, 0x6a, 0xd5, 0x3a, 0xc6, 0x59, 0x4f, 0xde, 0x0c, 0x10, 0x66, 0xaa, 0x90, + 0xbf, 0x8b, 0x95, 0x72, 0xec, 0xd5, 0x10, 0x22, 0x62, 0xaa, 0x40, 0x08, 0x2e, 0xe8, 0xe4, 0x9c, + 0x5d, 0xfa, 0x0b, 0xda, 0x48, 0xc2, 0x05, 0x55, 0x84, 0xd9, 0xbb, 0x52, 0x05, 0xf5, 0xed, 0x5d, + 0xb5, 0xc5, 0x08, 0xed, 0x5d, 0x61, 0x46, 0x19, 0x66, 0xd1, 0x6f, 0xda, 0x86, 0x9f, 0x33, 0x76, + 0x31, 0x4f, 0xaa, 0x8b, 0xf8, 0x11, 0xad, 0xdc, 0x32, 0xda, 0xd1, 0xda, 0x20, 0xd6, 0x84, 0x05, + 0xdb, 0x61, 0x93, 0x68, 0x9c, 0x56, 0x39, 0x0a, 0x0b, 0x8e, 0x0d, 0x85, 0x10, 0x61, 0x81, 0x40, + 0x4d, 0xe4, 0xb6, 0xbd, 0x4d, 0x00, 0xaf, 0x96, 0x1c, 0xf5, 0x09, 0x50, 0xab, 0x25, 0x0f, 0x86, + 0xbb, 0xd0, 0x6e, 0x95, 0x94, 0xe7, 0xfe, 0x2e, 0x24, 0x44, 0xe1, 0x2e, 0xd4, 0x22, 0xb8, 0xbd, + 0x27, 0x90, 0x54, 0xe9, 0xb9, 0xbf, 0xbd, 0xa5, 0x2c, 0xdc, 0xde, 0x9a, 0xc1, 0xed, 0x2d, 0x05, + 0xaf, 0x33, 0x7e, 0x7e, 0x00, 0x3c, 0xf1, 0xb7, 0xb7, 0xcb, 0x84, 0xdb, 0xbb, 0xc3, 0x9a, 0x4c, + 0xc6, 0x76, 0x38, 0x59, 0xbc, 0xa9, 0xd3, 0x2a, 0x7b, 0x03, 0x71, 0xc0, 0x8a, 0x86, 0x88, 0x4c, + 0x86, 0x84, 0x4d, 0x90, 0x56, 0x3e, 0x5b, 0xd9, 0xde, 0xb4, 0x46, 0x41, 0xba, 0xb5, 0x61, 0x11, + 0x44, 0x90, 0xf6, 0x93, 0xb8, 0x7a, 0xbb, 0x15, 0x5b, 0x94, 0x75, 0x4f, 0xf5, 0x10, 0x14, 0xae, + 0x5e, 0x17, 0x56, 0x3e, 0xdf, 0x46, 0xbf, 0x6d, 0x3f, 0xd2, 0xd3, 0xa2, 0xd6, 0x5e, 0xd7, 0xe9, + 0xe7, 0x64, 0x61, 0xc4, 0xb6, 0x54, 0x00, 0x37, 0x69, 0x4a, 0xeb, 0x99, 0x6f, 0x03, 0x4f, 0xb2, + 0xbc, 0x8e, 0xef, 0xf9, 0x6d, 0xb4, 0x72, 0x22, 0x4d, 0xf1, 0x71, 0x78, 0xcc, 0x6e, 0x2f, 0xca, + 0x3c, 0x4b, 0xbb, 0xfb, 0x93, 0x4a, 0x57, 0x8b, 0xc3, 0x63, 0xd6, 0xc6, 0x70, 0x0c, 0x9a, 0x00, + 0x97, 0xff, 0x39, 0x59, 0x95, 0xe0, 0x8f, 0x41, 0x0e, 0x12, 0x8e, 0x41, 0x18, 0xc5, 0xf5, 0x99, + 0x00, 0xdf, 0x4f, 0x56, 0x6c, 0x41, 0xc4, 0x20, 0x2d, 0x0e, 0xd7, 0xc7, 0xc6, 0x4c, 0xa6, 0xa0, + 0x3d, 0xec, 0x15, 0x1c, 0xaa, 0x22, 0xc9, 0x77, 0xf2, 0x64, 0x56, 0xc7, 0xc4, 0xb8, 0x71, 0x29, + 0x22, 0x53, 0xa0, 0x69, 0xcf, 0x63, 0xdc, 0xab, 0x77, 0x92, 0x25, 0xab, 0x32, 0x4e, 0x3f, 0x46, + 0x83, 0xf4, 0x3e, 0x46, 0x07, 0xf5, 0x7a, 0xdb, 0xac, 0xd2, 0xf3, 0x6c, 0x09, 0xd3, 0x80, 0xb7, + 0x16, 0x19, 0xe0, 0xcd, 0x42, 0x3d, 0x8d, 0x36, 0x61, 0x8b, 0x2a, 0x05, 0xb2, 0xd1, 0xa4, 0xb8, + 0xb7, 0xd1, 0x34, 0xa6, 0x3c, 0xfc, 0xf5, 0x28, 0xfa, 0x1d, 0x29, 0xb5, 0x37, 0x0d, 0xb7, 0x93, + 0xfa, 0xfc, 0x0d, 0x4b, 0xaa, 0x69, 0xfc, 0xb1, 0xcf, 0x8e, 0x17, 0xd5, 0xae, 0x9f, 0x5e, 0x45, + 0x05, 0x3f, 0xd6, 0xfd, 0xac, 0xb6, 0x46, 0x9c, 0xf7, 0xb1, 0x3a, 0x48, 0xf8, 0xb1, 0x62, 0x14, + 0x07, 0x10, 0x21, 0x97, 0x0b, 0xf4, 0x7b, 0xa4, 0xbe, 0xbb, 0x4a, 0xbf, 0xdf, 0xcb, 0xe1, 0xf8, + 0xd8, 0x08, 0xdd, 0xde, 0xb2, 0x4e, 0xd9, 0xf0, 0xf7, 0x98, 0xf1, 0x50, 0x9c, 0xf4, 0xac, 0x47, + 0x45, 0xd8, 0x73, 0x67, 0x64, 0x8c, 0x87, 0xe2, 0x84, 0x67, 0x2b, 0xac, 0x85, 0x3c, 0x7b, 0x42, + 0xdb, 0x78, 0x28, 0x8e, 0x33, 0x0a, 0xc5, 0xb4, 0xf3, 0xc2, 0xa3, 0x80, 0x1d, 0x3c, 0x37, 0xac, + 0x0d, 0x62, 0x95, 0xc3, 0xbf, 0x1d, 0x45, 0xdf, 0x37, 0x1e, 0x0f, 0xd8, 0x34, 0x3b, 0x5b, 0x49, + 0xe8, 0x55, 0x92, 0x2f, 0xa0, 0x8e, 0x9f, 0x52, 0xd6, 0xba, 0xac, 0x2e, 0xc1, 0xb3, 0x2b, 0xe9, + 0xe0, 0xb1, 0xb3, 0x59, 0x96, 0xf9, 0xea, 0x04, 0xe6, 0x65, 0x4e, 0x8e, 0x1d, 0x07, 0x09, 0x8f, + 0x1d, 0x8c, 0xe2, 0x4c, 0xf3, 0x84, 0x35, 0x79, 0xac, 0x37, 0xd3, 0x14, 0xa2, 0x70, 0xa6, 0xd9, + 0x22, 0x38, 0x57, 0x3a, 0x61, 0x5b, 0x2c, 0xcf, 0x21, 0xe5, 0xdd, 0x83, 0x47, 0xad, 0x69, 0x88, + 0x70, 0xae, 0x84, 0x48, 0xb3, 0x46, 0x6f, 0xd7, 0x45, 0x49, 0x05, 0xcf, 0x57, 0xfb, 0x59, 0x71, + 0x11, 0xfb, 0xd3, 0x02, 0x03, 0x10, 0x6b, 0x74, 0x2f, 0x88, 0xd7, 0x5f, 0xa7, 0xc5, 0x94, 0xf9, + 0xd7, 0x5f, 0x8d, 0x24, 0xbc, 0xfe, 0x52, 0x04, 0x36, 0x79, 0x0c, 0x94, 0xc9, 0x46, 0x12, 0x36, + 0xa9, 0x08, 0x5f, 0x28, 0x54, 0x3b, 0xb9, 0x64, 0x28, 0x44, 0x7b, 0xb7, 0xf7, 0x7b, 0x39, 0xdc, + 0x43, 0xdb, 0x85, 0xd8, 0x0e, 0xf0, 0xf4, 0xdc, 0xdf, 0x43, 0x1d, 0x24, 0xdc, 0x43, 0x31, 0x8a, + 0xab, 0x74, 0xc2, 0xf4, 0x42, 0xf2, 0x9e, 0xbf, 0x7f, 0x74, 0x16, 0x91, 0xf7, 0x7b, 0x39, 0xbc, + 0x34, 0xda, 0x9b, 0x8b, 0x67, 0xe6, 0xed, 0xe4, 0x52, 0x16, 0x5e, 0x1a, 0x69, 0x06, 0x97, 0x5e, + 0x0a, 0x9a, 0xc7, 0xe9, 0x2f, 0xbd, 0x91, 0x87, 0x4b, 0xef, 0x70, 0xca, 0xc9, 0xbf, 0x8e, 0xa2, + 0xeb, 0xb6, 0x97, 0x43, 0xd6, 0x8c, 0x91, 0x57, 0x49, 0x9e, 0x4d, 0x13, 0x0e, 0x27, 0xec, 0x02, + 0x0a, 0xb4, 0xb7, 0xe2, 0x96, 0x56, 0xf2, 0x63, 0x47, 0x81, 0xd8, 0x5b, 0x19, 0xa4, 0x88, 0xfb, + 0x89, 0xa4, 0x4f, 0x6b, 0xd8, 0x4a, 0x6a, 0x22, 0x92, 0x39, 0x48, 0xb8, 0x9f, 0x60, 0x14, 0xe7, + 0xab, 0x52, 0xfe, 0xe2, 0x6d, 0x09, 0x55, 0x06, 0x45, 0x0a, 0xfe, 0x7c, 0x15, 0x53, 0xe1, 0x7c, + 0xd5, 0x43, 0x77, 0xb6, 0x1e, 0x74, 0x70, 0xea, 0xde, 0x1d, 0xc0, 0x44, 0xe0, 0xee, 0x00, 0x81, + 0xe2, 0x4a, 0x1a, 0xc0, 0xbb, 0x7d, 0xd7, 0xb1, 0x12, 0xdc, 0xbe, 0xa3, 0xe9, 0xce, 0x86, 0x8e, + 0x66, 0x26, 0xcd, 0x30, 0xe9, 0x29, 0xfa, 0xc4, 0x1e, 0x2e, 0x6b, 0x83, 0x58, 0xff, 0x0e, 0xd2, + 0x31, 0xe4, 0x89, 0x98, 0x42, 0x02, 0xdb, 0x34, 0x2d, 0x33, 0x64, 0x07, 0xc9, 0x62, 0x95, 0xc3, + 0xbf, 0x1c, 0x45, 0x1f, 0xf9, 0x3c, 0xbe, 0x2c, 0x85, 0xdf, 0x27, 0xfd, 0xb6, 0x24, 0x49, 0x5c, + 0x8e, 0x08, 0x6b, 0xa8, 0x32, 0xfc, 0x69, 0xf4, 0x61, 0x2b, 0x32, 0x77, 0x27, 0x54, 0x01, 0xdc, + 0x04, 0x4a, 0x97, 0x1f, 0x73, 0xda, 0xfd, 0xc6, 0x60, 0xde, 0xac, 0x4d, 0xdc, 0x72, 0xd5, 0x68, + 0x6d, 0xa2, 0x6d, 0x28, 0x31, 0xb1, 0x36, 0xf1, 0x60, 0x66, 0x57, 0xc3, 0xae, 0xde, 0xeb, 0x8c, + 0x9f, 0x8b, 0xdc, 0x07, 0xed, 0x6a, 0x38, 0x65, 0xd5, 0x10, 0xb1, 0xab, 0x41, 0xc2, 0x38, 0x3b, + 0x68, 0xc1, 0x66, 0x6c, 0xfa, 0xe2, 0xaa, 0x36, 0x64, 0x8f, 0xcc, 0x07, 0xfd, 0x20, 0xee, 0xaf, + 0xad, 0x58, 0x2d, 0x43, 0x1e, 0x85, 0x2c, 0xa0, 0xa5, 0xc8, 0xda, 0x20, 0x56, 0x39, 0xfc, 0xf3, + 0xe8, 0x7b, 0x9d, 0x8a, 0xed, 0x40, 0xc2, 0x17, 0x15, 0x4c, 0xe3, 0x8d, 0x9e, 0x72, 0xb7, 0xa0, + 0x76, 0xfd, 0x64, 0xb8, 0x42, 0x27, 0x5f, 0x6e, 0x39, 0xd9, 0xad, 0x74, 0x19, 0x9e, 0x86, 0x4c, + 0xba, 0x6c, 0x30, 0x5f, 0xa6, 0x75, 0x3a, 0x4b, 0x5e, 0xbb, 0x77, 0x6d, 0x2e, 0x93, 0x2c, 0x17, + 0xc7, 0x28, 0x1f, 0x87, 0x8c, 0x3a, 0x68, 0x70, 0xc9, 0x4b, 0xaa, 0x74, 0x22, 0xb3, 0x18, 0xe3, + 0xd6, 0x52, 0xe9, 0x31, 0x1d, 0x09, 0x3c, 0x2b, 0xa5, 0xf5, 0x81, 0xb4, 0x72, 0xcb, 0xdb, 0xad, + 0xc2, 0xe6, 0x67, 0xbb, 0x93, 0xfb, 0xbc, 0x2a, 0x55, 0x4f, 0x4f, 0x5f, 0x1f, 0x48, 0x2b, 0xaf, + 0x7f, 0x16, 0x7d, 0xd8, 0xf5, 0xaa, 0x26, 0xa2, 0x8d, 0x5e, 0x53, 0x68, 0x2e, 0x7a, 0x32, 0x5c, + 0xc1, 0x2c, 0x2f, 0xbe, 0xcc, 0x6a, 0xce, 0xaa, 0xd5, 0xe4, 0x9c, 0x5d, 0xb6, 0x77, 0x92, 0xdd, + 0xd1, 0xaa, 0x80, 0xb1, 0x45, 0x10, 0xcb, 0x0b, 0x3f, 0xd9, 0x71, 0x65, 0xee, 0x2e, 0xd7, 0x84, + 0x2b, 0x8b, 0xe8, 0x71, 0xe5, 0x92, 0x26, 0x56, 0xb5, 0xb5, 0x32, 0x17, 0xad, 0xef, 0xfb, 0x8b, + 0xda, 0xbd, 0x6c, 0xfd, 0xa0, 0x1f, 0x34, 0x19, 0x8b, 0x12, 0x6f, 0x67, 0x67, 0x67, 0xba, 0x4e, + 0xfe, 0x92, 0xda, 0x08, 0x91, 0xb1, 0x10, 0xa8, 0x49, 0x80, 0x77, 0xb2, 0x1c, 0xc4, 0x99, 0xdc, + 0xcb, 0xb3, 0xb3, 0x9c, 0x25, 0x53, 0x94, 0x00, 0x37, 0xe2, 0xb1, 0x2d, 0x27, 0x12, 0x60, 0x1f, + 0x67, 0xae, 0x34, 0x35, 0xd2, 0x63, 0x48, 0x59, 0x91, 0x66, 0x39, 0xbe, 0xa2, 0x25, 0x34, 0xb5, + 0x90, 0xb8, 0xd2, 0xd4, 0x81, 0xcc, 0xc4, 0xd8, 0x88, 0x9a, 0x61, 0xdf, 0x96, 0xff, 0x6e, 0x57, + 0xd1, 0x12, 0x13, 0x13, 0xa3, 0x07, 0x33, 0xeb, 0xc0, 0x46, 0x78, 0x5a, 0x0a, 0xe3, 0x37, 0xba, + 0x5a, 0x52, 0x42, 0xac, 0x03, 0x5d, 0xc2, 0xac, 0x67, 0x9a, 0xdf, 0xb7, 0xd9, 0x65, 0x21, 0x8c, + 0xde, 0xea, 0xaa, 0xb4, 0x32, 0x62, 0x3d, 0x83, 0x19, 0x65, 0xf8, 0xc7, 0xd1, 0x2f, 0x0b, 0xc3, + 0x15, 0x2b, 0xe3, 0x6b, 0x1e, 0x85, 0xca, 0xba, 0x4d, 0x75, 0x9d, 0x94, 0x9b, 0x4b, 0x81, 0xba, + 0x6f, 0x9c, 0xd6, 0xc9, 0x0c, 0xe2, 0x3b, 0x44, 0x8b, 0x0b, 0x29, 0x71, 0x29, 0xb0, 0x4b, 0xb9, + 0xbd, 0xe2, 0x90, 0x4d, 0x95, 0x75, 0x4f, 0x0d, 0xb5, 0x30, 0xd4, 0x2b, 0x6c, 0xc8, 0x24, 0x33, + 0x87, 0xc9, 0x32, 0x9b, 0xe9, 0x09, 0x47, 0xc6, 0xad, 0x1a, 0x25, 0x33, 0x86, 0x19, 0x5b, 0x10, + 0x91, 0xcc, 0x90, 0xb0, 0xf2, 0xf9, 0x2f, 0xa3, 0xe8, 0x86, 0x61, 0x76, 0xdb, 0x9d, 0xb3, 0xbd, + 0xe2, 0x8c, 0x35, 0xa9, 0xcf, 0x7e, 0x56, 0x5c, 0xd4, 0xf1, 0x67, 0x94, 0x49, 0x3f, 0xaf, 0x8b, + 0xf2, 0xf9, 0x95, 0xf5, 0x4c, 0xd6, 0xda, 0x6e, 0x2b, 0x99, 0xf3, 0x52, 0xa9, 0x81, 0xb2, 0x56, + 0xbd, 0xfb, 0x84, 0x39, 0x22, 0x6b, 0x0d, 0xf1, 0xa6, 0x89, 0xb5, 0xf3, 0x9c, 0x15, 0xb8, 0x89, + 0x8d, 0x85, 0x46, 0x48, 0x34, 0x71, 0x07, 0x32, 0xf1, 0xb8, 0x15, 0xc9, 0x1d, 0x90, 0xcd, 0x3c, + 0x47, 0xf1, 0x58, 0xab, 0x6a, 0x80, 0x88, 0xc7, 0x5e, 0x50, 0xf9, 0x39, 0x8e, 0xbe, 0xd3, 0x3c, + 0xd2, 0xa3, 0x0a, 0x96, 0x19, 0xe0, 0xa3, 0x7d, 0x4b, 0x42, 0x8c, 0x7f, 0x97, 0x30, 0x23, 0xeb, + 0xb4, 0xa8, 0xcb, 0x3c, 0xa9, 0xcf, 0xd5, 0x61, 0xaf, 0x5b, 0xe7, 0x56, 0x88, 0x8f, 0x7b, 0xef, + 0xf6, 0x50, 0x26, 0xa8, 0xb7, 0x32, 0x1d, 0x62, 0xee, 0xf9, 0x55, 0x3b, 0x61, 0xe6, 0x7e, 0x2f, + 0x67, 0x76, 0x9f, 0x77, 0x93, 0x3c, 0x87, 0x6a, 0xd5, 0xca, 0x0e, 0x92, 0x22, 0x3b, 0x83, 0x9a, + 0xa3, 0xdd, 0x67, 0x45, 0x8d, 0x31, 0x46, 0xec, 0x3e, 0x07, 0x70, 0x93, 0xcd, 0x23, 0xcf, 0x7b, + 0xc5, 0x14, 0xde, 0xa2, 0x6c, 0x1e, 0xdb, 0x11, 0x0c, 0x91, 0xcd, 0x53, 0xac, 0xd9, 0x85, 0x7d, + 0x9e, 0xb3, 0xf4, 0x42, 0x4d, 0x01, 0x6e, 0x03, 0x0b, 0x09, 0x9e, 0x03, 0x6e, 0x85, 0x10, 0x33, + 0x09, 0x08, 0xc1, 0x31, 0x94, 0x79, 0x92, 0xe2, 0xfb, 0x1d, 0x52, 0x47, 0xc9, 0x88, 0x49, 0x00, + 0x33, 0xa8, 0xb8, 0xea, 0xde, 0x88, 0xaf, 0xb8, 0xe8, 0xda, 0xc8, 0xad, 0x10, 0x62, 0xa6, 0x41, + 0x21, 0x98, 0x94, 0x79, 0xc6, 0xd1, 0x30, 0x90, 0x1a, 0x42, 0x42, 0x0c, 0x03, 0x97, 0x40, 0x26, + 0x0f, 0xa0, 0x9a, 0x81, 0xd7, 0xa4, 0x90, 0x04, 0x4d, 0xb6, 0x84, 0xb9, 0x06, 0x28, 0xeb, 0xce, + 0xca, 0x15, 0xba, 0x06, 0xa8, 0xaa, 0xc5, 0xca, 0x15, 0x71, 0x0d, 0xd0, 0x01, 0x50, 0x11, 0x8f, + 0x92, 0x9a, 0xfb, 0x8b, 0x28, 0x24, 0xc1, 0x22, 0xb6, 0x84, 0x99, 0xa3, 0x65, 0x11, 0x17, 0x1c, + 0xcd, 0xd1, 0xaa, 0x00, 0xd6, 0x69, 0xf0, 0x75, 0x52, 0x6e, 0x22, 0x89, 0x6c, 0x15, 0xe0, 0x3b, + 0x19, 0xe4, 0xd3, 0x1a, 0x45, 0x12, 0xf5, 0xdc, 0x5b, 0x29, 0x11, 0x49, 0xba, 0x14, 0xea, 0x4a, + 0x6a, 0xaf, 0xda, 0x57, 0x3b, 0xb4, 0x4d, 0x7d, 0x2b, 0x84, 0x98, 0xf8, 0xd4, 0x16, 0x7a, 0x2b, + 0xa9, 0xaa, 0xac, 0x99, 0xfc, 0xef, 0xf9, 0x0b, 0xd4, 0xca, 0x89, 0xf8, 0xe4, 0xe3, 0xd0, 0xf0, + 0x6a, 0x03, 0xb7, 0xaf, 0x60, 0x38, 0x74, 0xdf, 0x0e, 0x32, 0x26, 0xe3, 0x14, 0x12, 0xeb, 0x38, + 0xd3, 0xf7, 0x34, 0x3d, 0xa7, 0x99, 0xf7, 0xfa, 0x30, 0xeb, 0x9a, 0xbe, 0x76, 0x71, 0xc0, 0x96, + 0x70, 0xc2, 0x5e, 0xbc, 0xcd, 0x6a, 0x9e, 0x15, 0x33, 0x35, 0x73, 0x3f, 0x23, 0x2c, 0xf9, 0x60, + 0xe2, 0x9a, 0x7e, 0xaf, 0x92, 0x49, 0x20, 0x50, 0x59, 0x0e, 0xe1, 0xd2, 0x9b, 0x40, 0x60, 0x8b, + 0x9a, 0x23, 0x12, 0x88, 0x10, 0x6f, 0xf6, 0x51, 0xb4, 0x73, 0xf5, 0x2e, 0xe3, 0x09, 0x6b, 0x73, + 0x39, 0xca, 0x1a, 0x06, 0x89, 0xa5, 0x6c, 0x50, 0xc1, 0xac, 0x2f, 0xb5, 0x7f, 0x33, 0xc4, 0x1e, + 0x10, 0x76, 0xba, 0xc3, 0xec, 0xe1, 0x00, 0xd2, 0xe3, 0xca, 0x9c, 0xc9, 0x53, 0xae, 0xba, 0x47, + 0xf2, 0x0f, 0x07, 0x90, 0xd6, 0x9e, 0x8c, 0x5d, 0xad, 0xe7, 0x49, 0x7a, 0x31, 0xab, 0xd8, 0xa2, + 0x98, 0x6e, 0xb1, 0x9c, 0x55, 0x68, 0x4f, 0xc6, 0x29, 0x35, 0x42, 0x89, 0x3d, 0x99, 0x1e, 0x15, + 0x93, 0xc1, 0xd9, 0xa5, 0xd8, 0xcc, 0xb3, 0x19, 0x5e, 0x51, 0x3b, 0x86, 0x04, 0x40, 0x64, 0x70, + 0x5e, 0xd0, 0xd3, 0x89, 0xe4, 0x8a, 0x9b, 0x67, 0x69, 0x92, 0x4b, 0x7f, 0x1b, 0xb4, 0x19, 0x07, + 0xec, 0xed, 0x44, 0x1e, 0x05, 0x4f, 0x3d, 0x4f, 0x16, 0x55, 0xb1, 0x57, 0x70, 0x46, 0xd6, 0xb3, + 0x05, 0x7a, 0xeb, 0x69, 0x81, 0x28, 0xac, 0x9e, 0xc0, 0xdb, 0xa6, 0x34, 0xcd, 0x3f, 0xbe, 0xb0, + 0xda, 0xfc, 0x3e, 0x56, 0xf2, 0x50, 0x58, 0x45, 0x1c, 0xaa, 0x8c, 0x72, 0x22, 0x3b, 0x4c, 0x40, + 0xdb, 0xed, 0x26, 0x0f, 0xfa, 0x41, 0xbf, 0x9f, 0x09, 0x5f, 0xe5, 0x10, 0xf2, 0x23, 0x80, 0x21, + 0x7e, 0x5a, 0xd0, 0x6c, 0xb7, 0x38, 0xf5, 0x39, 0x87, 0xf4, 0xa2, 0x73, 0xc5, 0xc8, 0x2d, 0xa8, + 0x44, 0x88, 0xed, 0x16, 0x02, 0xf5, 0x37, 0xd1, 0x5e, 0xca, 0x8a, 0x50, 0x13, 0x35, 0xf2, 0x21, + 0x4d, 0xa4, 0x38, 0xb3, 0xf8, 0xd5, 0x52, 0xd5, 0x33, 0x65, 0x33, 0xad, 0x11, 0x16, 0x6c, 0x88, + 0x58, 0xfc, 0x92, 0xb0, 0xc9, 0xc9, 0xb1, 0xcf, 0x83, 0xee, 0x9d, 0xe2, 0x8e, 0x95, 0x03, 0xfa, + 0x4e, 0x31, 0xc5, 0xd2, 0x95, 0x94, 0x7d, 0xa4, 0xc7, 0x8a, 0xdb, 0x4f, 0x1e, 0x0f, 0x83, 0xcd, + 0x92, 0xc7, 0xf1, 0xb9, 0x95, 0x43, 0x52, 0x49, 0xaf, 0xeb, 0x01, 0x43, 0x06, 0x23, 0x96, 0x3c, + 0x01, 0x1c, 0x85, 0x30, 0xc7, 0xf3, 0x16, 0x2b, 0x38, 0x14, 0xdc, 0x17, 0xc2, 0x5c, 0x63, 0x0a, + 0x0c, 0x85, 0x30, 0x4a, 0x01, 0xf5, 0x5b, 0xb1, 0x1f, 0x04, 0xfc, 0x30, 0x99, 0x7b, 0x33, 0x36, + 0xb9, 0xd7, 0x23, 0xe5, 0xa1, 0x7e, 0x8b, 0x38, 0xeb, 0x90, 0xcf, 0xf6, 0x72, 0x92, 0x54, 0x33, + 0xbd, 0xbb, 0x31, 0x8d, 0x9f, 0xd0, 0x76, 0x5c, 0x92, 0x38, 0xe4, 0x0b, 0x6b, 0xa0, 0xb0, 0xb3, + 0x37, 0x4f, 0x66, 0xba, 0xa6, 0x9e, 0x1a, 0x08, 0x79, 0xa7, 0xaa, 0x0f, 0xfa, 0x41, 0xe4, 0xe7, + 0x55, 0x36, 0x05, 0x16, 0xf0, 0x23, 0xe4, 0x43, 0xfc, 0x60, 0x10, 0x65, 0x6f, 0x4d, 0xbd, 0xe5, + 0x8a, 0x6e, 0xb3, 0x98, 0xaa, 0x75, 0xec, 0x98, 0x78, 0x3c, 0x88, 0x0b, 0x65, 0x6f, 0x04, 0x8f, + 0xc6, 0x68, 0xbb, 0x41, 0x1b, 0x1a, 0xa3, 0x7a, 0xff, 0x75, 0xc8, 0x18, 0xf5, 0xc1, 0xca, 0xe7, + 0x4f, 0xd5, 0x18, 0xdd, 0x4e, 0x78, 0xd2, 0xe4, 0xed, 0xaf, 0x32, 0xb8, 0x54, 0x0b, 0x61, 0x4f, + 0x7d, 0x5b, 0x6a, 0x2c, 0x5e, 0x26, 0x43, 0xab, 0xe2, 0x8d, 0xc1, 0x7c, 0xc0, 0xb7, 0x5a, 0x21, + 0xf4, 0xfa, 0x46, 0x4b, 0x85, 0x8d, 0xc1, 0x7c, 0xc0, 0xb7, 0x7a, 0x4b, 0xb5, 0xd7, 0x37, 0x7a, + 0x55, 0x75, 0x63, 0x30, 0xaf, 0x7c, 0xff, 0x55, 0x3b, 0x70, 0x6d, 0xe7, 0x4d, 0x1e, 0x96, 0xf2, + 0x6c, 0x09, 0xbe, 0x74, 0xd2, 0xb5, 0xa7, 0xd1, 0x50, 0x3a, 0x49, 0xab, 0x58, 0x9f, 0x36, 0xf1, + 0x95, 0xe2, 0x88, 0xd5, 0x99, 0x38, 0xa4, 0x7f, 0x36, 0xc0, 0x68, 0x0b, 0x87, 0x16, 0x4d, 0x21, + 0x25, 0x73, 0xdc, 0xe8, 0xa0, 0xe6, 0x46, 0xf1, 0xe3, 0x80, 0xbd, 0xee, 0xc5, 0xe2, 0xf5, 0x81, + 0xb4, 0x39, 0xf8, 0x73, 0x18, 0xfb, 0xc4, 0x31, 0xd4, 0xaa, 0xde, 0x43, 0xc7, 0x27, 0xc3, 0x15, + 0x94, 0xfb, 0xbf, 0x69, 0xd7, 0x15, 0xd8, 0xbf, 0x1a, 0x04, 0x4f, 0x87, 0x58, 0x44, 0x03, 0xe1, + 0xd9, 0x95, 0x74, 0x54, 0x41, 0xfe, 0x63, 0x14, 0xdd, 0xf2, 0x16, 0xc4, 0x3d, 0x7b, 0xfe, 0xdd, + 0x21, 0xb6, 0xfd, 0x67, 0xd0, 0x5f, 0x7c, 0x1b, 0x55, 0x55, 0xba, 0x7f, 0x68, 0x97, 0xf7, 0xad, + 0x86, 0x78, 0xeb, 0xe3, 0x65, 0x35, 0x85, 0x4a, 0x8d, 0xd8, 0x50, 0xa7, 0x33, 0x30, 0x1e, 0xb7, + 0x9f, 0x5e, 0x51, 0xcb, 0xfa, 0x0c, 0x8f, 0x03, 0xab, 0x37, 0xee, 0xac, 0xf2, 0x84, 0x2c, 0x5b, + 0x34, 0x2e, 0xd0, 0x67, 0x57, 0x55, 0xa3, 0x46, 0xb2, 0x05, 0x8b, 0xb7, 0xfa, 0x9f, 0x0d, 0x34, + 0xec, 0xbc, 0xe7, 0xff, 0xc9, 0xd5, 0x94, 0x54, 0x59, 0xfe, 0x6b, 0x14, 0xdd, 0x75, 0x58, 0x73, + 0xda, 0x81, 0xf6, 0x64, 0x7e, 0x14, 0xb0, 0x4f, 0x29, 0xe9, 0xc2, 0xfd, 0xde, 0xb7, 0x53, 0x36, + 0xdf, 0xac, 0x71, 0x54, 0x76, 0xb2, 0x9c, 0x43, 0xd5, 0xfd, 0x66, 0x8d, 0x6b, 0x57, 0x52, 0x63, + 0xfa, 0x9b, 0x35, 0x01, 0xdc, 0xfa, 0x66, 0x8d, 0xc7, 0xb3, 0xf7, 0x9b, 0x35, 0x5e, 0x6b, 0xc1, + 0x6f, 0xd6, 0x84, 0x35, 0xa8, 0xc9, 0xa7, 0x2d, 0x82, 0xdc, 0x55, 0x1f, 0x64, 0xd1, 0xdd, 0x64, + 0x7f, 0x7a, 0x15, 0x15, 0x62, 0xfa, 0x95, 0x9c, 0xb8, 0x85, 0x37, 0xe0, 0x99, 0x3a, 0x37, 0xf1, + 0x36, 0x06, 0xf3, 0xca, 0xf7, 0x4f, 0xd4, 0xda, 0x4b, 0x4f, 0x36, 0xac, 0x12, 0xdf, 0x2b, 0x5a, + 0x0b, 0x4d, 0x1e, 0x8d, 0x05, 0xbb, 0xe5, 0x1f, 0x0f, 0x83, 0x89, 0xea, 0x36, 0x84, 0x6a, 0xf4, + 0x71, 0x9f, 0x21, 0xd4, 0xe4, 0x1b, 0x83, 0x79, 0x62, 0x92, 0x93, 0xbe, 0x65, 0x6b, 0x0f, 0x30, + 0xe6, 0xb6, 0xf5, 0x93, 0xe1, 0x0a, 0xca, 0xfd, 0x52, 0x25, 0xb5, 0xb6, 0x7b, 0xd1, 0xce, 0xeb, + 0x7d, 0xa6, 0x26, 0x4e, 0x33, 0x8f, 0x87, 0xe2, 0xa1, 0xf4, 0xc6, 0x9e, 0xe0, 0xfb, 0xd2, 0x1b, + 0xef, 0x24, 0xff, 0xc9, 0xd5, 0x94, 0x54, 0x59, 0xfe, 0x79, 0x14, 0x5d, 0x27, 0xcb, 0xa2, 0xfa, + 0xc1, 0x67, 0x43, 0x2d, 0xa3, 0xfe, 0xf0, 0xf9, 0x95, 0xf5, 0x54, 0xa1, 0xfe, 0x6d, 0x14, 0xdd, + 0x08, 0x14, 0x4a, 0x76, 0x90, 0x2b, 0x58, 0x77, 0x3b, 0xca, 0x0f, 0xaf, 0xae, 0x48, 0x4d, 0xf7, + 0x36, 0x3e, 0xe9, 0x7e, 0xcc, 0x25, 0x60, 0x7b, 0x42, 0x7f, 0xcc, 0xa5, 0x5f, 0x0b, 0x6f, 0x41, + 0x35, 0x49, 0x89, 0x5a, 0x19, 0xf9, 0xb6, 0xa0, 0x44, 0xce, 0x82, 0x56, 0x44, 0xf7, 0x7b, 0x39, + 0x9f, 0x93, 0x17, 0x6f, 0xcb, 0xa4, 0x98, 0xd2, 0x4e, 0xa4, 0xbc, 0xdf, 0x89, 0xe6, 0xf0, 0xd6, + 0x5d, 0x23, 0x3d, 0x66, 0xed, 0x32, 0xef, 0x21, 0xa5, 0xaf, 0x91, 0xe0, 0xd6, 0x5d, 0x07, 0x25, + 0xbc, 0xa9, 0x9c, 0x36, 0xe4, 0x0d, 0xa5, 0xb2, 0x8f, 0x86, 0xa0, 0x68, 0x01, 0xa1, 0xbd, 0xe9, + 0x13, 0x81, 0xc7, 0x21, 0x2b, 0x9d, 0x53, 0x81, 0xf5, 0x81, 0x34, 0xe1, 0x76, 0x02, 0xfc, 0x4b, + 0x48, 0xa6, 0x50, 0x05, 0xdd, 0x6a, 0x6a, 0x90, 0x5b, 0x9b, 0xf6, 0xb9, 0xdd, 0x62, 0xf9, 0x62, + 0x5e, 0xa8, 0xc6, 0x24, 0xdd, 0xda, 0x54, 0xbf, 0x5b, 0x44, 0xe3, 0x4d, 0x4b, 0xe3, 0x56, 0xa4, + 0x97, 0x8f, 0xc2, 0x66, 0x9c, 0xac, 0x72, 0x6d, 0x10, 0x4b, 0xd7, 0x53, 0x75, 0xa3, 0x9e, 0x7a, + 0xa2, 0x9e, 0xb4, 0x3e, 0x90, 0xc6, 0xbb, 0x87, 0x96, 0x5b, 0xdd, 0x9f, 0x36, 0x7a, 0x6c, 0x75, + 0xba, 0xd4, 0x93, 0xe1, 0x0a, 0x78, 0xaf, 0x56, 0xf5, 0xaa, 0x66, 0x5d, 0xb4, 0x93, 0xe5, 0x79, + 0xbc, 0x16, 0xe8, 0x26, 0x2d, 0x14, 0xdc, 0xab, 0xf5, 0xc0, 0x44, 0x4f, 0x6e, 0xf7, 0x36, 0x8b, + 0xb8, 0xcf, 0x8e, 0xa0, 0x06, 0xf5, 0x64, 0x9b, 0x46, 0xfb, 0x6d, 0xd6, 0xa3, 0xd6, 0xb5, 0x1d, + 0x87, 0x1f, 0x5c, 0xa7, 0xc2, 0x1b, 0x83, 0x79, 0x74, 0x19, 0x40, 0x50, 0x62, 0x66, 0xb9, 0x43, + 0x99, 0x70, 0x66, 0x92, 0xbb, 0x3d, 0x14, 0xda, 0xb3, 0x94, 0xc3, 0xe8, 0x75, 0x36, 0x9d, 0x01, + 0xf7, 0x9e, 0x63, 0xd9, 0x40, 0xf0, 0x1c, 0x0b, 0x81, 0xa8, 0xe9, 0xe4, 0xef, 0x7a, 0xb3, 0x76, + 0x6f, 0xea, 0x6b, 0x3a, 0xa5, 0x6c, 0x51, 0xa1, 0xa6, 0xf3, 0xd2, 0x28, 0x1a, 0x68, 0xb7, 0xea, + 0xc5, 0xfd, 0x47, 0x21, 0x33, 0xe8, 0xed, 0xfd, 0xb5, 0x41, 0x2c, 0x9a, 0x51, 0x8c, 0xc3, 0x6c, + 0x9e, 0x71, 0xdf, 0x8c, 0x62, 0xd9, 0x68, 0x90, 0xd0, 0x8c, 0xd2, 0x45, 0xa9, 0xea, 0x35, 0x39, + 0xc2, 0xde, 0x34, 0x5c, 0x3d, 0xc9, 0x0c, 0xab, 0x9e, 0x66, 0x3b, 0xc7, 0xae, 0x85, 0xee, 0x32, + 0xfc, 0x5c, 0x2d, 0x96, 0x3d, 0x7d, 0x5b, 0xbc, 0xd0, 0x89, 0xc1, 0x50, 0xd4, 0xa1, 0x14, 0xf0, + 0x71, 0x42, 0xc3, 0xb5, 0x27, 0xc3, 0x65, 0x09, 0x49, 0x95, 0x14, 0xa9, 0x77, 0x71, 0x2a, 0x0c, + 0x76, 0xc8, 0xd0, 0xe2, 0x94, 0xd4, 0x40, 0x87, 0xfa, 0xee, 0xab, 0x98, 0x9e, 0xa1, 0xa0, 0xdf, + 0x79, 0x74, 0xdf, 0xc4, 0x7c, 0x38, 0x80, 0xc4, 0x87, 0xfa, 0x2d, 0xa0, 0xb7, 0xe5, 0xa5, 0xd3, + 0x8f, 0x03, 0xa6, 0x5c, 0x34, 0xb4, 0x10, 0xa6, 0x55, 0x50, 0xa7, 0xd6, 0x09, 0x2e, 0xf0, 0x1f, + 0xc3, 0xca, 0xd7, 0xa9, 0x4d, 0x7e, 0x2a, 0x90, 0x50, 0xa7, 0xee, 0xa2, 0x28, 0xcf, 0xb4, 0xd7, + 0x41, 0xf7, 0x02, 0xfa, 0xf6, 0xd2, 0xe7, 0x7e, 0x2f, 0x87, 0x46, 0xce, 0x76, 0xb6, 0x74, 0x4e, + 0x31, 0x3c, 0x05, 0xdd, 0xce, 0x96, 0xfe, 0x43, 0x8c, 0xb5, 0x41, 0x2c, 0xbe, 0x30, 0x90, 0x70, + 0x78, 0xdb, 0x9e, 0xe4, 0x7b, 0x8a, 0x2b, 0xe4, 0x9d, 0xa3, 0xfc, 0x07, 0xfd, 0xa0, 0xb9, 0x9e, + 0x7b, 0x54, 0xb1, 0x14, 0xea, 0x5a, 0x7d, 0xe1, 0xce, 0xbd, 0xff, 0xa4, 0x64, 0x63, 0xf4, 0x7d, + 0xbb, 0x3b, 0x61, 0x48, 0xd9, 0xfe, 0x32, 0x7a, 0x77, 0x9f, 0xcd, 0x26, 0x50, 0x4c, 0xe3, 0x1f, + 0xb8, 0x17, 0x62, 0xd9, 0x6c, 0xdc, 0xfc, 0xac, 0xed, 0x5d, 0xa3, 0xc4, 0xe6, 0x4a, 0xdf, 0x36, + 0xbc, 0x59, 0xcc, 0x26, 0x3c, 0xe1, 0xe8, 0x4a, 0x9f, 0xf8, 0x7d, 0xdc, 0x08, 0x88, 0x2b, 0x7d, + 0x0e, 0x80, 0xec, 0x9d, 0x54, 0x00, 0x5e, 0x7b, 0x8d, 0x20, 0x68, 0x4f, 0x01, 0x66, 0xd6, 0xd5, + 0xf6, 0x9a, 0xc4, 0x16, 0x5f, 0xc1, 0x33, 0x3a, 0x42, 0x4a, 0xcc, 0xba, 0x5d, 0xca, 0x74, 0x06, + 0x59, 0x7d, 0xf1, 0x3d, 0x8f, 0xc5, 0x7c, 0x9e, 0x54, 0x2b, 0xd4, 0x19, 0x54, 0x2d, 0x2d, 0x80, + 0xe8, 0x0c, 0x5e, 0xd0, 0xf4, 0xf2, 0xf6, 0x31, 0xa7, 0x17, 0xbb, 0xac, 0x62, 0x0b, 0x9e, 0x15, + 0x80, 0xbf, 0xe9, 0xa0, 0x1f, 0xa8, 0xcd, 0x10, 0xbd, 0x9c, 0x62, 0x4d, 0x56, 0x28, 0x08, 0x79, + 0x3b, 0x50, 0x7c, 0x27, 0xb6, 0xe6, 0xac, 0xc2, 0xa7, 0x83, 0xd2, 0x0a, 0x86, 0x88, 0xac, 0x90, + 0x84, 0x51, 0xdb, 0x1f, 0x65, 0xc5, 0xcc, 0xdb, 0xf6, 0x47, 0xf6, 0x57, 0x16, 0x6f, 0xd0, 0x80, + 0x89, 0xef, 0xf2, 0xa1, 0xc9, 0xef, 0x26, 0xa9, 0x37, 0x33, 0xbd, 0x0f, 0xdd, 0x26, 0x88, 0xf8, + 0xee, 0x27, 0x91, 0xab, 0x97, 0x25, 0x14, 0x30, 0x6d, 0xef, 0xc0, 0xf9, 0x5c, 0x39, 0x44, 0xd0, + 0x15, 0x26, 0x4d, 0x54, 0x15, 0xf2, 0xe3, 0x45, 0x71, 0x54, 0xb1, 0xb3, 0x2c, 0x87, 0x0a, 0x45, + 0x55, 0xa9, 0x6e, 0xc9, 0x89, 0xa8, 0xea, 0xe3, 0xcc, 0x65, 0x0a, 0x21, 0x75, 0x3e, 0x76, 0x7c, + 0x52, 0x25, 0x29, 0xbe, 0x4c, 0x21, 0x6d, 0x74, 0x31, 0x62, 0x27, 0x2d, 0x80, 0x9b, 0x9e, 0x7e, + 0x00, 0xbc, 0xca, 0xd2, 0x7a, 0x02, 0xfc, 0x28, 0xa9, 0x92, 0x39, 0x70, 0xa8, 0x70, 0x4f, 0x57, + 0xc8, 0xd8, 0x61, 0x88, 0x9e, 0x4e, 0xb1, 0xca, 0xe1, 0xef, 0x47, 0xef, 0x37, 0x81, 0x1e, 0x0a, + 0xf5, 0x5d, 0xfe, 0x17, 0xe2, 0x0f, 0x7a, 0xc4, 0x1f, 0x68, 0x1b, 0x13, 0x5e, 0x41, 0x32, 0x6f, + 0x6d, 0xbf, 0xa7, 0x7f, 0x17, 0xe0, 0x93, 0x51, 0xd3, 0x20, 0x87, 0x8c, 0x67, 0x67, 0xcd, 0xba, + 0x4a, 0x9d, 0x62, 0xa1, 0x06, 0xb1, 0xc5, 0xe3, 0xc0, 0x67, 0x0a, 0x7c, 0x9c, 0x09, 0x34, 0xb6, + 0xf4, 0x18, 0xca, 0x1c, 0x07, 0x1a, 0x47, 0x5b, 0x00, 0x44, 0xa0, 0xf1, 0x82, 0xa6, 0x77, 0xd9, + 0xe2, 0x13, 0x08, 0x57, 0xe6, 0x04, 0x86, 0x55, 0xe6, 0xc4, 0x79, 0x47, 0x20, 0x8f, 0xde, 0x3f, + 0x80, 0xf9, 0x1b, 0xa8, 0xea, 0xf3, 0xac, 0xdc, 0x6d, 0x66, 0xd8, 0x84, 0x2f, 0xf0, 0x5b, 0x74, + 0x86, 0x18, 0x6b, 0x84, 0x48, 0x43, 0x08, 0xd4, 0x84, 0x32, 0x03, 0xec, 0xd5, 0x87, 0xc9, 0x1c, + 0xc4, 0x47, 0x17, 0xe2, 0x35, 0xca, 0x88, 0x05, 0x11, 0xa1, 0x8c, 0x84, 0xad, 0xd7, 0x8d, 0x0c, + 0x73, 0x0c, 0xb3, 0xa6, 0x87, 0x55, 0x47, 0xc9, 0x6a, 0x0e, 0x05, 0x57, 0x26, 0xd1, 0x26, 0xac, + 0x65, 0xd2, 0xcf, 0x13, 0x9b, 0xb0, 0x43, 0xf4, 0xac, 0xa4, 0xdb, 0x79, 0xf0, 0x47, 0xac, 0xe2, + 0xf2, 0xaf, 0x6e, 0x9c, 0x56, 0x39, 0x4a, 0xba, 0xdd, 0x87, 0xea, 0x90, 0x44, 0xd2, 0x1d, 0xd6, + 0xb0, 0x3e, 0x57, 0xed, 0x94, 0xe1, 0x15, 0x54, 0xba, 0x9f, 0xbc, 0x98, 0x27, 0x59, 0xae, 0x7a, + 0xc3, 0x17, 0x01, 0xdb, 0x84, 0x0e, 0xf1, 0xb9, 0xea, 0xa1, 0xba, 0xd6, 0x07, 0xbe, 0xc3, 0x25, + 0x44, 0x7b, 0xc2, 0x3d, 0xf6, 0x89, 0x3d, 0xe1, 0x7e, 0x2d, 0xb3, 0x54, 0x33, 0xac, 0xe0, 0x56, + 0x82, 0xd8, 0x62, 0x53, 0xbc, 0x41, 0x64, 0xd9, 0x44, 0x20, 0xb1, 0x54, 0x0b, 0x2a, 0x98, 0xb9, + 0xcd, 0x60, 0x3b, 0x59, 0x91, 0xe4, 0xd9, 0x4f, 0xf1, 0xdd, 0x67, 0xcb, 0x4e, 0x4b, 0x10, 0x73, + 0x9b, 0x9f, 0xf4, 0xb9, 0xda, 0x05, 0x7e, 0x92, 0x35, 0xa1, 0xff, 0x41, 0xe0, 0xb9, 0x09, 0xa2, + 0xdf, 0x95, 0x45, 0x2a, 0x57, 0x3f, 0x1b, 0x45, 0xd7, 0xf1, 0x63, 0xdd, 0x2c, 0xcb, 0x49, 0x93, + 0x92, 0x1c, 0x43, 0x0a, 0x59, 0xc9, 0xe3, 0x4f, 0xc3, 0xcf, 0x0a, 0xe1, 0xc4, 0xc9, 0xfa, 0x00, + 0x35, 0xeb, 0xbc, 0xb6, 0x89, 0x25, 0x13, 0xf9, 0xe7, 0xa8, 0x4e, 0x6b, 0xa8, 0xd4, 0x4c, 0xb9, + 0x0b, 0x1c, 0x8d, 0x4e, 0x8b, 0x1b, 0x5b, 0x60, 0x53, 0x51, 0x62, 0x74, 0x86, 0x35, 0xcc, 0xee, + 0x8e, 0xc5, 0x1d, 0x43, 0xcd, 0xf2, 0x25, 0x88, 0xeb, 0x6f, 0x8f, 0x49, 0x63, 0x16, 0x45, 0xec, + 0xee, 0xd0, 0xb4, 0x49, 0x37, 0xba, 0x6e, 0x37, 0x8b, 0xd5, 0x1e, 0x3e, 0x23, 0xf7, 0x58, 0x12, + 0x18, 0x91, 0x6e, 0x04, 0x70, 0x6b, 0xf7, 0xb3, 0x62, 0xc9, 0x34, 0x4d, 0x6a, 0x7e, 0x94, 0xac, + 0x72, 0x96, 0x4c, 0xc5, 0xbc, 0x8e, 0x77, 0x3f, 0x5b, 0x66, 0x6c, 0x43, 0xd4, 0xee, 0x27, 0x05, + 0x9b, 0x95, 0x9d, 0xfa, 0x2b, 0x5b, 0xea, 0x6a, 0xe1, 0x6d, 0x94, 0x23, 0x89, 0xf2, 0xe2, 0x6b, + 0x85, 0x77, 0xc2, 0x90, 0x79, 0x25, 0x4a, 0x8a, 0x44, 0x1a, 0x72, 0xc3, 0xa7, 0xe3, 0x24, 0x20, + 0x37, 0x03, 0x84, 0xf9, 0x4c, 0x82, 0xfc, 0xbd, 0xfd, 0x43, 0x11, 0x5c, 0x7d, 0xb8, 0xf7, 0xb1, + 0x4f, 0xd7, 0x86, 0xc6, 0xf6, 0xb7, 0xcf, 0xd6, 0x07, 0xd2, 0xd2, 0xeb, 0xf3, 0x9b, 0xff, 0xf3, + 0xf5, 0xb5, 0xd1, 0xcf, 0xbf, 0xbe, 0x36, 0xfa, 0xff, 0xaf, 0xaf, 0x8d, 0x7e, 0xf6, 0xcd, 0xb5, + 0x77, 0x7e, 0xfe, 0xcd, 0xb5, 0x77, 0xfe, 0xf7, 0x9b, 0x6b, 0xef, 0x7c, 0xf5, 0xae, 0xfa, 0x73, + 0x6d, 0x6f, 0x7e, 0x49, 0xfc, 0xd1, 0xb5, 0x67, 0xbf, 0x08, 0x00, 0x00, 0xff, 0xff, 0x95, 0x20, + 0x7a, 0x41, 0xd2, 0x6d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -464,6 +465,7 @@ type ClientCommandsClient interface { ObjectCreateRelationOption(ctx context.Context, in *pb.RpcObjectCreateRelationOptionRequest, opts ...grpc.CallOption) (*pb.RpcObjectCreateRelationOptionResponse, error) RelationListRemoveOption(ctx context.Context, in *pb.RpcRelationListRemoveOptionRequest, opts ...grpc.CallOption) (*pb.RpcRelationListRemoveOptionResponse, error) RelationOptions(ctx context.Context, in *pb.RpcRelationOptionsRequest, opts ...grpc.CallOption) (*pb.RpcRelationOptionsResponse, error) + RelationListWithValue(ctx context.Context, in *pb.RpcRelationListWithValueRequest, opts ...grpc.CallOption) (*pb.RpcRelationListWithValueResponse, error) // Object Relations // *** ObjectRelationAdd(ctx context.Context, in *pb.RpcObjectRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectRelationAddResponse, error) @@ -1535,6 +1537,15 @@ func (c *clientCommandsClient) RelationOptions(ctx context.Context, in *pb.RpcRe return out, nil } +func (c *clientCommandsClient) RelationListWithValue(ctx context.Context, in *pb.RpcRelationListWithValueRequest, opts ...grpc.CallOption) (*pb.RpcRelationListWithValueResponse, error) { + out := new(pb.RpcRelationListWithValueResponse) + err := c.cc.Invoke(ctx, "/anytype.ClientCommands/RelationListWithValue", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *clientCommandsClient) ObjectRelationAdd(ctx context.Context, in *pb.RpcObjectRelationAddRequest, opts ...grpc.CallOption) (*pb.RpcObjectRelationAddResponse, error) { out := new(pb.RpcObjectRelationAddResponse) err := c.cc.Invoke(ctx, "/anytype.ClientCommands/ObjectRelationAdd", in, out, opts...) @@ -3069,6 +3080,7 @@ type ClientCommandsServer interface { ObjectCreateRelationOption(context.Context, *pb.RpcObjectCreateRelationOptionRequest) *pb.RpcObjectCreateRelationOptionResponse RelationListRemoveOption(context.Context, *pb.RpcRelationListRemoveOptionRequest) *pb.RpcRelationListRemoveOptionResponse RelationOptions(context.Context, *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse + RelationListWithValue(context.Context, *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse // Object Relations // *** ObjectRelationAdd(context.Context, *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse @@ -3560,6 +3572,9 @@ func (*UnimplementedClientCommandsServer) RelationListRemoveOption(ctx context.C func (*UnimplementedClientCommandsServer) RelationOptions(ctx context.Context, req *pb.RpcRelationOptionsRequest) *pb.RpcRelationOptionsResponse { return nil } +func (*UnimplementedClientCommandsServer) RelationListWithValue(ctx context.Context, req *pb.RpcRelationListWithValueRequest) *pb.RpcRelationListWithValueResponse { + return nil +} func (*UnimplementedClientCommandsServer) ObjectRelationAdd(ctx context.Context, req *pb.RpcObjectRelationAddRequest) *pb.RpcObjectRelationAddResponse { return nil } @@ -5758,6 +5773,24 @@ func _ClientCommands_RelationOptions_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _ClientCommands_RelationListWithValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(pb.RpcRelationListWithValueRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClientCommandsServer).RelationListWithValue(ctx, in), nil + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/anytype.ClientCommands/RelationListWithValue", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClientCommandsServer).RelationListWithValue(ctx, req.(*pb.RpcRelationListWithValueRequest)), nil + } + return interceptor(ctx, in, info, handler) +} + func _ClientCommands_ObjectRelationAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(pb.RpcObjectRelationAddRequest) if err := dec(in); err != nil { @@ -8940,6 +8973,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{ MethodName: "RelationOptions", Handler: _ClientCommands_RelationOptions_Handler, }, + { + MethodName: "RelationListWithValue", + Handler: _ClientCommands_RelationListWithValue_Handler, + }, { MethodName: "ObjectRelationAdd", Handler: _ClientCommands_ObjectRelationAdd_Handler, diff --git a/pkg/lib/localstore/addr/addr.go b/pkg/lib/localstore/addr/addr.go index ca13197e2c..0c1e74b736 100644 --- a/pkg/lib/localstore/addr/addr.go +++ b/pkg/lib/localstore/addr/addr.go @@ -48,3 +48,10 @@ func ExtractVirtualSourceType(id string) (model.SmartBlockType, error) { func TimeToID(t time.Time) string { return DatePrefix + t.Format("2006-01-02") } + +func DateIDToDayStart(id string) (time.Time, error) { + if !strings.HasPrefix(id, DatePrefix) { + return time.Time{}, fmt.Errorf("invalid id: date prefix not found") + } + return time.Parse("2006-01-02", strings.TrimPrefix(id, DatePrefix)) +} From fe9c4cd0af1847ca461f52704f8f8535738113ab Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 6 Sep 2024 15:00:33 +0200 Subject: [PATCH 02/20] GO-3964 Add error check on id2sbtype --- core/block/relation.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/block/relation.go b/core/block/relation.go index 2b935ca971..570f647a14 100644 --- a/core/block/relation.go +++ b/core/block/relation.go @@ -123,7 +123,10 @@ func generateFiltersGetter(value *types.Value) (filtersGetter, error) { switch t := value.Kind.(type) { case *types.Value_StringValue: - sbt, _ := typeprovider.SmartblockTypeFromID(t.StringValue) + sbt, err := typeprovider.SmartblockTypeFromID(t.StringValue) + if err != nil { + log.Errorf("failed to determine smartblock type: %v", err) + } if sbt != coresb.SmartBlockTypeDate { return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { if !slices.Contains(stringFormats, rel.Format) { From 439c4e015622e812e2de7660b74fa448bdf9f88f Mon Sep 17 00:00:00 2001 From: kirillston Date: Tue, 10 Sep 2024 23:13:34 +0200 Subject: [PATCH 03/20] GO-3964 Add QueryAndProcess WIP --- core/block/relation.go | 193 +++++----------------- pkg/lib/localstore/objectstore/objects.go | 1 + pkg/lib/localstore/objectstore/queries.go | 38 +++++ 3 files changed, 84 insertions(+), 148 deletions(-) diff --git a/core/block/relation.go b/core/block/relation.go index 570f647a14..f926c473fe 100644 --- a/core/block/relation.go +++ b/core/block/relation.go @@ -13,7 +13,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/domain" - "github.com/anyproto/anytype-heart/core/relationutils" "github.com/anyproto/anytype-heart/pkg/lib/bundle" coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/database" @@ -69,37 +68,27 @@ func (s *Service) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId st } func (s *Service) ListRelationsWithValue(spaceId string, value *types.Value) (keys []string, counters []int64, err error) { - var ( - allRelations relationutils.Relations - getFilters func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) - countersByKeys = make(map[string]int64) - ) - - allRelations, err = s.objectStore.ListAllRelations(spaceId) - if err != nil { - return nil, nil, fmt.Errorf("failed to list all relations: %w", err) - } + countersByKeys := make(map[string]int64) + detailHandlesValue := generateFilter(value) + + err = s.objectStore.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }}}, func(details *types.Struct) { + for key, v := range details.Fields { + if detailHandlesValue(v) { + if counter, ok := countersByKeys[key]; ok { + countersByKeys[key] = counter + 1 + } else { + countersByKeys[key] = 1 + } + } + } + }) - getFilters, err = generateFiltersGetter(value) if err != nil { - return nil, nil, err - } - - for _, rel := range allRelations { - filters, err := getFilters(spaceId, rel.Relation) - if err != nil { - continue - } - records, err := s.objectStore.Query(database.Query{ - Filters: filters, - }) - if err != nil { - log.Errorf("failed to query objects: %v", err) - continue - } - if len(records) != 0 { - countersByKeys[rel.Key] = int64(len(records)) - } + return nil, nil, fmt.Errorf("failed to query objects: %w", err) } keys = maps.Keys(countersByKeys) @@ -112,132 +101,40 @@ func (s *Service) ListRelationsWithValue(spaceId string, value *types.Value) (ke return keys, counters, nil } -func generateFiltersGetter(value *types.Value) (filtersGetter, error) { - stringFormats := []model.RelationFormat{ - model.RelationFormat_longtext, - model.RelationFormat_shorttext, - model.RelationFormat_status, - model.RelationFormat_tag, - model.RelationFormat_object, +func generateFilter(value *types.Value) func(v *types.Value) bool { + equalFilter := func(v *types.Value) bool { + return v.Equal(value) } - switch t := value.Kind.(type) { - case *types.Value_StringValue: - sbt, err := typeprovider.SmartblockTypeFromID(t.StringValue) - if err != nil { - log.Errorf("failed to determine smartblock type: %v", err) - } - if sbt != coresb.SmartBlockTypeDate { - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - if !slices.Contains(stringFormats, rel.Format) { - return nil, fmt.Errorf("unsupported format %q", rel.Format) - } - return simpleFilters(spaceId, rel.Key, value), nil - }, nil - } - - start, err := addr.DateIDToDayStart(t.StringValue) - if err != nil { - return nil, fmt.Errorf("failed to convert date id to day start: %w", err) - } - end := start.Add(24 * time.Hour) - - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - switch rel.Format { - case model.RelationFormat_date: - return dateRangeFilters(spaceId, rel.Key, start, end), nil - case model.RelationFormat_longtext, - model.RelationFormat_shorttext, - model.RelationFormat_object: - return simpleFilters(spaceId, rel.Key, value), nil - } - return nil, fmt.Errorf("unsupported format %q", rel.Format) - }, nil - case *types.Value_NumberValue: - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - if rel.Format != model.RelationFormat_number { - return nil, fmt.Errorf("unsupported format %q", rel.Format) - } - return simpleFilters(spaceId, rel.Key, value), nil - }, nil - case *types.Value_BoolValue: - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - if rel.Format != model.RelationFormat_checkbox { - return nil, fmt.Errorf("unsupported format %q", rel.Format) - } - return simpleFilters(spaceId, rel.Key, value), nil - }, nil - case *types.Value_ListValue: - if pbtypes.GetStringListValue(value) != nil { - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - if !slices.Contains(stringFormats, rel.Format) { - return nil, fmt.Errorf("unsupported format %q", rel.Format) - } - return listFilters(spaceId, rel.Key, value), nil - }, nil - } - - if pbtypes.GetIntListValue(value) != nil { - return func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) { - if rel.Format != model.RelationFormat_number { - return nil, fmt.Errorf("unsupported format %q", rel.Format) - } - return listFilters(spaceId, rel.Key, value), nil - }, nil - } + stringValue := value.GetStringValue() + if stringValue == "" { + return equalFilter + } - return nil, fmt.Errorf("unsupported list value type: %T", t.ListValue.Values[0]) - default: - return nil, fmt.Errorf("unsupported value type: %T", value) + sbt, err := typeprovider.SmartblockTypeFromID(stringValue) + if err != nil { + log.Errorf("failed to determine smartblock type: %v", err) } -} -func simpleFilters(spaceId, key string, value *types.Value) []*model.BlockContentDataviewFilter { - return []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeySpaceId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(spaceId), - }, - { - RelationKey: key, - Condition: model.BlockContentDataviewFilter_Equal, - Value: value, - }, + if sbt != coresb.SmartBlockTypeDate { + return equalFilter } -} -func listFilters(spaceId, key string, value *types.Value) []*model.BlockContentDataviewFilter { - return []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeySpaceId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(spaceId), - }, - { - RelationKey: key, - Condition: model.BlockContentDataviewFilter_AllIn, - Value: value, - }, + start, err := addr.DateIDToDayStart(stringValue) + if err != nil { + log.Errorf("failed to convert date id to day start: %v", err) + return equalFilter } -} -func dateRangeFilters(spaceId, key string, start, end time.Time) []*model.BlockContentDataviewFilter { - return []*model.BlockContentDataviewFilter{ - { - RelationKey: bundle.RelationKeySpaceId.String(), - Condition: model.BlockContentDataviewFilter_Equal, - Value: pbtypes.String(spaceId), - }, - { - RelationKey: key, - Condition: model.BlockContentDataviewFilter_GreaterOrEqual, - Value: pbtypes.Int64(start.Unix()), - }, - { - RelationKey: key, - Condition: model.BlockContentDataviewFilter_Less, - Value: pbtypes.Int64(end.Unix()), - }, + end := start.Add(24 * time.Hour) + startTimestamp := start.Unix() + endTimestamp := end.Unix() + + return func(v *types.Value) bool { + numberValue := int64(v.GetNumberValue()) + if numberValue != 0 && numberValue >= startTimestamp && numberValue < endTimestamp { + return true + } + return equalFilter(v) } } diff --git a/pkg/lib/localstore/objectstore/objects.go b/pkg/lib/localstore/objectstore/objects.go index 5a02b08739..bde43dc43d 100644 --- a/pkg/lib/localstore/objectstore/objects.go +++ b/pkg/lib/localstore/objectstore/objects.go @@ -56,6 +56,7 @@ type ObjectStore interface { QueryByID(ids []string) (records []database.Record, err error) QueryByIDAndSubscribeForChanges(ids []string, subscription database.Subscription) (records []database.Record, close func(), err error) QueryObjectIDs(q database.Query) (ids []string, total int, err error) + QueryAndProcess(q database.Query, proc func(details *types.Struct)) error HasIDs(ids ...string) (exists []string, err error) GetByIDs(spaceID string, ids []string) ([]*model.ObjectInfo, error) diff --git a/pkg/lib/localstore/objectstore/queries.go b/pkg/lib/localstore/objectstore/queries.go index f314372821..d0ea0b42a4 100644 --- a/pkg/lib/localstore/objectstore/queries.go +++ b/pkg/lib/localstore/objectstore/queries.go @@ -504,3 +504,41 @@ func (s *dsObjectStore) QueryByIDAndSubscribeForChanges(ids []string, sub databa s.addSubscriptionIfNotExists(sub) return } + +func (s *dsObjectStore) QueryAndProcess(q database.Query, proc func(details *types.Struct)) error { + arena := s.arenaPool.Get() + defer s.arenaPool.Put(arena) + + filters, err := database.NewFilters(q, s, arena) + if err != nil { + return fmt.Errorf("new filters: %w", err) + } + + anystoreFilter := filters.FilterObj.AnystoreFilter() + query := s.objects.Find(anystoreFilter) + + iter, err := query.Iter(s.componentCtx) + if err != nil { + return fmt.Errorf("find: %w", err) + } + for iter.Next() { + doc, err := iter.Doc() + if err != nil { + return errors.Join(fmt.Errorf("get doc: %w", err), iter.Close()) + } + details, err := pbtypes.JsonToProto(doc.Value()) + if err != nil { + return errors.Join(fmt.Errorf("json to proto: %w", err), iter.Close()) + } + proc(details) + } + err = iter.Err() + if err != nil { + return errors.Join(fmt.Errorf("iterate: %w", err), iter.Close()) + } + err = iter.Close() + if err != nil { + return fmt.Errorf("close iterator: %w", err) + } + return nil +} From 2da1ad55d066f9d45d6ee4f6540e9b2bf537d74d Mon Sep 17 00:00:00 2001 From: kirillston Date: Wed, 11 Sep 2024 15:44:26 +0200 Subject: [PATCH 04/20] GO-3964 Fix tests --- core/block/relation.go | 4 +- .../mock_objectstore/mock_ObjectStore.go | 47 +++++++++++++ .../localstore/objectstore/queries_test.go | 70 +++++++++++++++++++ util/testMock/objectstore_mock.go | 14 ++++ 4 files changed, 132 insertions(+), 3 deletions(-) diff --git a/core/block/relation.go b/core/block/relation.go index f926c473fe..496db5980d 100644 --- a/core/block/relation.go +++ b/core/block/relation.go @@ -23,8 +23,6 @@ import ( "github.com/anyproto/anytype-heart/util/slice" ) -type filtersGetter func(spaceId string, rel *model.Relation) ([]*model.BlockContentDataviewFilter, error) - var ErrBundledTypeIsReadonly = fmt.Errorf("can't modify bundled object type") func (s *Service) ObjectTypeRelationAdd(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { @@ -132,7 +130,7 @@ func generateFilter(value *types.Value) func(v *types.Value) bool { return func(v *types.Value) bool { numberValue := int64(v.GetNumberValue()) - if numberValue != 0 && numberValue >= startTimestamp && numberValue < endTimestamp { + if numberValue >= startTimestamp && numberValue < endTimestamp { return true } return equalFilter(v) diff --git a/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go b/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go index 3f02477376..92822a5e2b 100644 --- a/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go +++ b/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go @@ -2272,6 +2272,53 @@ func (_c *MockObjectStore_Query_Call) RunAndReturn(run func(database.Query) ([]d return _c } +// QueryAndProcess provides a mock function with given fields: q, proc +func (_m *MockObjectStore) QueryAndProcess(q database.Query, proc func(*types.Struct)) error { + ret := _m.Called(q, proc) + + if len(ret) == 0 { + panic("no return value specified for QueryAndProcess") + } + + var r0 error + if rf, ok := ret.Get(0).(func(database.Query, func(*types.Struct)) error); ok { + r0 = rf(q, proc) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockObjectStore_QueryAndProcess_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryAndProcess' +type MockObjectStore_QueryAndProcess_Call struct { + *mock.Call +} + +// QueryAndProcess is a helper method to define mock.On call +// - q database.Query +// - proc func(*types.Struct) +func (_e *MockObjectStore_Expecter) QueryAndProcess(q interface{}, proc interface{}) *MockObjectStore_QueryAndProcess_Call { + return &MockObjectStore_QueryAndProcess_Call{Call: _e.mock.On("QueryAndProcess", q, proc)} +} + +func (_c *MockObjectStore_QueryAndProcess_Call) Run(run func(q database.Query, proc func(*types.Struct))) *MockObjectStore_QueryAndProcess_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(database.Query), args[1].(func(*types.Struct))) + }) + return _c +} + +func (_c *MockObjectStore_QueryAndProcess_Call) Return(_a0 error) *MockObjectStore_QueryAndProcess_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockObjectStore_QueryAndProcess_Call) RunAndReturn(run func(database.Query, func(*types.Struct)) error) *MockObjectStore_QueryAndProcess_Call { + _c.Call.Return(run) + return _c +} + // QueryByID provides a mock function with given fields: ids func (_m *MockObjectStore) QueryByID(ids []string) ([]database.Record, error) { ret := _m.Called(ids) diff --git a/pkg/lib/localstore/objectstore/queries_test.go b/pkg/lib/localstore/objectstore/queries_test.go index ece21cef12..92a41a9af9 100644 --- a/pkg/lib/localstore/objectstore/queries_test.go +++ b/pkg/lib/localstore/objectstore/queries_test.go @@ -1265,3 +1265,73 @@ func TestIndex(t *testing.T) { obj2, obj3, }, recs) } + +func TestDsObjectStore_QueryAndProcess(t *testing.T) { + const spaceId = "spaceId" + s := NewStoreFixture(t) + s.AddObjects(t, []TestObject{ + { + bundle.RelationKeyId: pbtypes.String("id1"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyName: pbtypes.String("first"), + }, + { + bundle.RelationKeyId: pbtypes.String("id2"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyName: pbtypes.String("favorite"), + bundle.RelationKeyIsFavorite: pbtypes.Bool(true), + }, + { + bundle.RelationKeyId: pbtypes.String("id3"), + bundle.RelationKeySpaceId: pbtypes.String(spaceId), + bundle.RelationKeyName: pbtypes.String("hi!"), + bundle.RelationKeyDescription: pbtypes.String("hi!"), + }, + }) + + t.Run("counter", func(t *testing.T) { + var counter = 0 + err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }}}, func(_ *types.Struct) { + counter++ + }) + + assert.NoError(t, err) + assert.Equal(t, 3, counter) + }) + + t.Run("favorites collector", func(t *testing.T) { + favs := make([]string, 0) + err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }}}, func(s *types.Struct) { + if pbtypes.GetBool(s, bundle.RelationKeyIsFavorite.String()) { + favs = append(favs, pbtypes.GetString(s, bundle.RelationKeyId.String())) + } + }) + + assert.NoError(t, err) + assert.Equal(t, []string{"id2"}, favs) + }) + + t.Run("name and description analyzer", func(t *testing.T) { + ids := make([]string, 0) + err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + RelationKey: bundle.RelationKeySpaceId.String(), + Condition: model.BlockContentDataviewFilter_Equal, + Value: pbtypes.String(spaceId), + }}}, func(s *types.Struct) { + if pbtypes.GetString(s, bundle.RelationKeyName.String()) == pbtypes.GetString(s, bundle.RelationKeyDescription.String()) { + ids = append(ids, pbtypes.GetString(s, bundle.RelationKeyId.String())) + } + }) + + assert.NoError(t, err) + assert.Equal(t, []string{"id3"}, ids) + }) +} diff --git a/util/testMock/objectstore_mock.go b/util/testMock/objectstore_mock.go index ad72600fe9..6f23e562d3 100644 --- a/util/testMock/objectstore_mock.go +++ b/util/testMock/objectstore_mock.go @@ -653,6 +653,20 @@ func (mr *MockObjectStoreMockRecorder) Query(arg0 any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockObjectStore)(nil).Query), arg0) } +// QueryAndProcess mocks base method. +func (m *MockObjectStore) QueryAndProcess(arg0 database.Query, arg1 func(*types.Struct)) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryAndProcess", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// QueryAndProcess indicates an expected call of QueryAndProcess. +func (mr *MockObjectStoreMockRecorder) QueryAndProcess(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryAndProcess", reflect.TypeOf((*MockObjectStore)(nil).QueryAndProcess), arg0, arg1) +} + // QueryByID mocks base method. func (m *MockObjectStore) QueryByID(arg0 []string) ([]database.Record, error) { m.ctrl.T.Helper() From 92999ad018727d1248c538d7283ee7efadce78b6 Mon Sep 17 00:00:00 2001 From: kirillston Date: Thu, 12 Sep 2024 17:46:43 +0200 Subject: [PATCH 05/20] GO-3964 Introduce details service --- .mockery.yaml | 9 +- core/anytype/bootstrap.go | 2 + core/application/account_create.go | 6 +- .../application/account_create_from_export.go | 8 +- core/block.go | 34 -- core/block/delete.go | 10 +- core/block/{ => details}/details_test.go | 2 +- core/block/{ => details}/relation_test.go | 4 +- .../{relation.go => details/relations.go} | 26 +- core/block/{details.go => details/service.go} | 91 +++++- core/block/details/set_details.go | 248 +++++++++++++++ .../mock_blockservice/mock_BlockService.go | 297 ------------------ .../common/objectcreator/objectcreator.go | 34 +- .../objectcreator/objectcreator_test.go | 8 +- core/block/import/importer.go | 4 +- core/block/service.go | 245 +-------------- core/details.go | 187 +++++++++++ core/files/fileobject/service.go | 9 +- core/files/fileobject/service_test.go | 3 +- core/object.go | 170 ---------- core/relations.go | 23 +- core/workspace.go | 6 +- pkg/lib/localstore/addr/addr.go | 7 - .../mock_objectstore/mock_ObjectStore.go | 94 +++--- pkg/lib/localstore/objectstore/objects.go | 2 +- pkg/lib/localstore/objectstore/queries.go | 2 +- .../localstore/objectstore/queries_test.go | 6 +- util/builtinobjects/builtinobjects.go | 10 +- util/testMock/objectstore_mock.go | 28 +- 29 files changed, 670 insertions(+), 905 deletions(-) rename core/block/{ => details}/details_test.go (99%) rename core/block/{ => details}/relation_test.go (98%) rename core/block/{relation.go => details/relations.go} (81%) rename core/block/{details.go => details/service.go} (50%) create mode 100644 core/block/details/set_details.go delete mode 100644 core/block/import/common/objectcreator/mock_blockservice/mock_BlockService.go create mode 100644 core/details.go diff --git a/.mockery.yaml b/.mockery.yaml index a4d63be781..891a66152c 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -66,10 +66,6 @@ packages: github.com/anyproto/anytype-heart/core/block/import/common/objectcreator: interfaces: Service: - BlockService: - config: - dir: "{{.InterfaceDir}}/mock_blockservice" - outpkg: "mock_blockservice" github.com/anyproto/anytype-heart/core/block/import/common/syncer: interfaces: BlockService: @@ -218,4 +214,7 @@ packages: SpaceIdGetter: NodeUsage: NetworkConfig: - Updater: \ No newline at end of file + Updater: + github.com/anyproto/anytype-heart/core/block/details: + interfaces: + Service: \ No newline at end of file diff --git a/core/anytype/bootstrap.go b/core/anytype/bootstrap.go index 9e9f3ea429..02b3c37d24 100644 --- a/core/anytype/bootstrap.go +++ b/core/anytype/bootstrap.go @@ -38,6 +38,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/bookmark" decorator "github.com/anyproto/anytype-heart/core/block/bookmark/bookmarkimporter" "github.com/anyproto/anytype-heart/core/block/collection" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/editor" "github.com/anyproto/anytype-heart/core/block/editor/converter" "github.com/anyproto/anytype-heart/core/block/export" @@ -265,6 +266,7 @@ func Bootstrap(a *app.App, components ...app.Component) { Register(core.New()). Register(core.NewTempDirService()). Register(treemanager.New()). + Register(details.New()). Register(block.New()). Register(indexer.New()). Register(detailsupdater.New()). diff --git a/core/application/account_create.go b/core/application/account_create.go index 2204d0cd85..bb61836dfe 100644 --- a/core/application/account_create.go +++ b/core/application/account_create.go @@ -13,6 +13,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" "github.com/anyproto/anytype-heart/core/block" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/domain/objectorigin" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -150,14 +151,15 @@ func (s *Service) setAccountAndProfileDetails(ctx context.Context, req *pb.RpcAc } accountObjects := spc.DerivedIDs() - if err := bs.SetDetails(nil, + ds := app.MustComponent[details.Service](s.app) + if err := ds.SetDetails(nil, accountObjects.Profile, profileDetails, ); err != nil { return errors.Join(ErrSetDetails, err) } - if err := bs.SetDetails(nil, + if err := ds.SetDetails(nil, accountObjects.Workspace, commonDetails, ); err != nil { diff --git a/core/application/account_create_from_export.go b/core/application/account_create_from_export.go index a33e1fc3b3..c30502ac2c 100644 --- a/core/application/account_create_from_export.go +++ b/core/application/account_create_from_export.go @@ -16,7 +16,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype" "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" - "github.com/anyproto/anytype-heart/core/block" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/metrics" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -160,7 +160,7 @@ func (s *Service) getBootstrapConfig(req *pb.RpcAccountRecoverFromLegacyExportRe func (s *Service) setDetails(profile *pb.Profile, icon int64) error { profileDetails, accountDetails := buildDetails(profile, icon) - bs := s.app.MustComponent(block.CName).(*block.Service) + ds := app.MustComponent[details.Service](s.app) spaceService := app.MustComponent[space.Service](s.app) spc, err := spaceService.GetPersonalSpace(context.Background()) @@ -169,13 +169,13 @@ func (s *Service) setDetails(profile *pb.Profile, icon int64) error { } accountObjects := spc.DerivedIDs() - if err := bs.SetDetails(nil, + if err := ds.SetDetails(nil, accountObjects.Profile, profileDetails, ); err != nil { return err } - if err := bs.SetDetails(nil, + if err := ds.SetDetails(nil, accountObjects.Workspace, accountDetails, ); err != nil { diff --git a/core/block.go b/core/block.go index 2f804fe822..17d9f9cd8d 100644 --- a/core/block.go +++ b/core/block.go @@ -416,40 +416,6 @@ func (mw *Middleware) ObjectListDelete(cctx context.Context, req *pb.RpcObjectLi return response(pb.RpcObjectListDeleteResponseError_NULL, nil) } -func (mw *Middleware) ObjectListSetIsArchived(cctx context.Context, req *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectListSetIsArchivedResponseErrorCode, err error) *pb.RpcObjectListSetIsArchivedResponse { - m := &pb.RpcObjectListSetIsArchivedResponse{Error: &pb.RpcObjectListSetIsArchivedResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetPagesIsArchived(ctx, *req) - }) - if err != nil { - return response(pb.RpcObjectListSetIsArchivedResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectListSetIsArchivedResponseError_NULL, nil) -} -func (mw *Middleware) ObjectListSetIsFavorite(cctx context.Context, req *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse { - response := func(code pb.RpcObjectListSetIsFavoriteResponseErrorCode, err error) *pb.RpcObjectListSetIsFavoriteResponse { - m := &pb.RpcObjectListSetIsFavoriteResponse{Error: &pb.RpcObjectListSetIsFavoriteResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetPagesIsFavorite(*req) - }) - if err != nil { - return response(pb.RpcObjectListSetIsFavoriteResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectListSetIsFavoriteResponseError_NULL, nil) -} - func (mw *Middleware) BlockReplace(cctx context.Context, req *pb.RpcBlockReplaceRequest) *pb.RpcBlockReplaceResponse { ctx := mw.newContext(cctx) response := func(code pb.RpcBlockReplaceResponseErrorCode, blockId string, err error) *pb.RpcBlockReplaceResponse { diff --git a/core/block/delete.go b/core/block/delete.go index 364db8b3b9..20cfda5cf4 100644 --- a/core/block/delete.go +++ b/core/block/delete.go @@ -128,16 +128,12 @@ func (s *Service) DeleteObject(objectId string) (err error) { } func (s *Service) OnDelete(id domain.FullID, workspaceRemove func() error) error { - var ( - isFavorite bool - ) - err := s.DoFullId(id, func(b smartblock.SmartBlock) error { b.ObjectCloseAllSessions() st := b.NewState() - isFavorite = pbtypes.GetBool(st.LocalDetails(), bundle.RelationKeyIsFavorite.String()) - if isFavorite { - _ = s.SetPageIsFavorite(pb.RpcObjectSetIsFavoriteRequest{IsFavorite: false, ContextId: id.ObjectID}) + isFavorite := pbtypes.GetBool(st.LocalDetails(), bundle.RelationKeyIsFavorite.String()) + if err := s.detailsService.SetIsFavorite(id.ObjectID, isFavorite); err != nil { + log.With("objectId", id).Errorf("failed to favorite object: %v", err) } b.SetIsDeleted() if workspaceRemove != nil { diff --git a/core/block/details_test.go b/core/block/details/details_test.go similarity index 99% rename from core/block/details_test.go rename to core/block/details/details_test.go index 01791fd859..530905be49 100644 --- a/core/block/details_test.go +++ b/core/block/details/details_test.go @@ -1,4 +1,4 @@ -package block +package details import ( "testing" diff --git a/core/block/relation_test.go b/core/block/details/relation_test.go similarity index 98% rename from core/block/relation_test.go rename to core/block/details/relation_test.go index dabead23bd..e2231b003c 100644 --- a/core/block/relation_test.go +++ b/core/block/details/relation_test.go @@ -1,4 +1,4 @@ -package block +package details import ( "testing" @@ -70,7 +70,7 @@ func TestService_ListRelationsWithValue(t *testing.T) { }, }) - bs := Service{objectStore: store} + bs := service{store: store} for _, tc := range []struct { name string diff --git a/core/block/relation.go b/core/block/details/relations.go similarity index 81% rename from core/block/relation.go rename to core/block/details/relations.go index 496db5980d..7995ecee47 100644 --- a/core/block/relation.go +++ b/core/block/details/relations.go @@ -1,14 +1,15 @@ -package block +package details import ( "context" "fmt" + "slices" "strings" "time" "github.com/gogo/protobuf/types" + "go.uber.org/zap" "golang.org/x/exp/maps" - "golang.org/x/exp/slices" "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" @@ -25,7 +26,7 @@ import ( var ErrBundledTypeIsReadonly = fmt.Errorf("can't modify bundled object type") -func (s *Service) ObjectTypeRelationAdd(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { +func (s *service) ObjectTypeAddRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { if strings.HasPrefix(objectTypeId, bundle.TypePrefix) { return ErrBundledTypeIsReadonly } @@ -46,7 +47,7 @@ func (s *Service) ObjectTypeRelationAdd(ctx context.Context, objectTypeId string }) } -func (s *Service) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { +func (s *service) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { if strings.HasPrefix(objectTypeId, bundle.TypePrefix) { return ErrBundledTypeIsReadonly } @@ -65,11 +66,11 @@ func (s *Service) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId st }) } -func (s *Service) ListRelationsWithValue(spaceId string, value *types.Value) (keys []string, counters []int64, err error) { +func (s *service) ListRelationsWithValue(spaceId string, value *types.Value) (keys []string, counters []int64, err error) { countersByKeys := make(map[string]int64) detailHandlesValue := generateFilter(value) - err = s.objectStore.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + err = s.store.QueryIterate(database.Query{Filters: []*model.BlockContentDataviewFilter{{ RelationKey: bundle.RelationKeySpaceId.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(spaceId), @@ -111,16 +112,16 @@ func generateFilter(value *types.Value) func(v *types.Value) bool { sbt, err := typeprovider.SmartblockTypeFromID(stringValue) if err != nil { - log.Errorf("failed to determine smartblock type: %v", err) + log.Error("failed to determine smartblock type", zap.Error(err)) } if sbt != coresb.SmartBlockTypeDate { return equalFilter } - start, err := addr.DateIDToDayStart(stringValue) + start, err := dateIDToDayStart(stringValue) if err != nil { - log.Errorf("failed to convert date id to day start: %v", err) + log.Error("failed to convert date id to day start", zap.Error(err)) return equalFilter } @@ -136,3 +137,10 @@ func generateFilter(value *types.Value) func(v *types.Value) bool { return equalFilter(v) } } + +func dateIDToDayStart(id string) (time.Time, error) { + if !strings.HasPrefix(id, addr.DatePrefix) { + return time.Time{}, fmt.Errorf("invalid id: date prefix not found") + } + return time.Parse("2006-01-02", strings.TrimPrefix(id, addr.DatePrefix)) +} diff --git a/core/block/details.go b/core/block/details/service.go similarity index 50% rename from core/block/details.go rename to core/block/details/service.go index 406fe155f5..5f28eae6b7 100644 --- a/core/block/details.go +++ b/core/block/details/service.go @@ -1,28 +1,105 @@ -package block +package details import ( + "context" "errors" + "fmt" "slices" + "github.com/anyproto/any-sync/app" + "github.com/anyproto/any-sync/app/logger" "github.com/gogo/protobuf/types" "github.com/samber/lo" + "go.uber.org/zap" "github.com/anyproto/anytype-heart/core/block/cache" "github.com/anyproto/anytype-heart/core/block/editor/basic" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock" + "github.com/anyproto/anytype-heart/core/block/object/idresolver" + "github.com/anyproto/anytype-heart/core/block/restriction" + "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/space" "github.com/anyproto/anytype-heart/util/pbtypes" "github.com/anyproto/anytype-heart/util/slice" ) -func (s *Service) SetDetails(ctx session.Context, objectId string, details []*model.Detail) (err error) { +const CName = "details.service" + +var log = logger.NewNamed(CName) + +type Service interface { + cache.ObjectGetterComponent + + SetDetails(ctx session.Context, objectId string, details []*model.Detail) error + SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) error + ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) error + ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesRequest) error + + ObjectTypeAddRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error + ObjectTypeRemoveRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error + + ListRelationsWithValue(spaceId string, value *types.Value) (keys []string, counters []int64, err error) + + SetSpaceInfo(spaceId string, details *types.Struct) error + SetSource(ctx session.Context, objectId string, source []string) error + SetWorkspaceDashboardId(ctx session.Context, workspaceId string, id string) (setId string, err error) + + SetIsFavorite(objectId string, isFavorite bool) error + SetIsArchived(objectId string, isArchived bool) error + SetListIsFavorite(objectIds []string, isFavorite bool) error + SetListIsArchived(objectIds []string, isArchived bool) error +} + +func New() Service { + return &service{} +} + +type service struct { + resolver idresolver.Resolver + spaceService space.Service + store objectstore.ObjectStore + restriction restriction.Service +} + +func (s *service) Init(a *app.App) error { + s.resolver = app.MustComponent[idresolver.Resolver](a) + s.spaceService = app.MustComponent[space.Service](a) + s.store = app.MustComponent[objectstore.ObjectStore](a) + s.restriction = app.MustComponent[restriction.Service](a) + return nil +} + +func (s *service) Name() string { + return CName +} + +func (s *service) GetObject(ctx context.Context, objectID string) (sb smartblock.SmartBlock, err error) { + spaceID, err := s.resolver.ResolveSpaceID(objectID) + if err != nil { + return nil, err + } + return s.GetObjectByFullID(ctx, domain.FullID{SpaceID: spaceID, ObjectID: objectID}) +} + +func (s *service) GetObjectByFullID(ctx context.Context, id domain.FullID) (sb smartblock.SmartBlock, err error) { + spc, err := s.spaceService.Get(ctx, id.SpaceID) + if err != nil { + return nil, fmt.Errorf("get space: %w", err) + } + return spc.GetObject(ctx, id.ObjectID) +} + +func (s *service) SetDetails(ctx session.Context, objectId string, details []*model.Detail) (err error) { return cache.Do(s, objectId, func(b basic.DetailsSettable) error { return b.SetDetails(ctx, details, true) }) } -func (s *Service) SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) (err error) { +func (s *service) SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) (err error) { var ( resultError error anySucceed bool @@ -36,7 +113,7 @@ func (s *Service) SetDetailsList(ctx session.Context, objectIds []string, detail } } if resultError != nil { - log.Warnf("SetDetailsList: %v", resultError) + log.Warn("SetDetailsList", zap.Error(resultError)) } if anySucceed { return nil @@ -45,13 +122,13 @@ func (s *Service) SetDetailsList(ctx session.Context, objectIds []string, detail } // ModifyDetails performs details get and update under the sb lock to make sure no modifications are done in the middle -func (s *Service) ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) (err error) { +func (s *service) ModifyDetails(objectId string, modifier func(current *types.Struct) (*types.Struct, error)) (err error) { return cache.Do(s, objectId, func(du basic.DetailsUpdatable) error { return du.UpdateDetails(modifier) }) } -func (s *Service) ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesRequest) (resultError error) { +func (s *service) ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesRequest) (resultError error) { var anySucceed bool for _, objectId := range req.ObjectIds { err := s.ModifyDetails(objectId, func(current *types.Struct) (*types.Struct, error) { @@ -73,7 +150,7 @@ func (s *Service) ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesReque } } if resultError != nil { - log.Warnf("ModifyDetailsList: %v", resultError) + log.Warn("ModifyDetailsList", zap.Error(resultError)) } if anySucceed { return nil diff --git a/core/block/details/set_details.go b/core/block/details/set_details.go new file mode 100644 index 0000000000..6f741fc97c --- /dev/null +++ b/core/block/details/set_details.go @@ -0,0 +1,248 @@ +package details + +import ( + "context" + "errors" + "fmt" + + "github.com/gogo/protobuf/types" + "github.com/hashicorp/go-multierror" + "go.uber.org/zap" + + "github.com/anyproto/anytype-heart/core/block/cache" + "github.com/anyproto/anytype-heart/core/block/editor" + "github.com/anyproto/anytype-heart/core/block/editor/collection" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock" + "github.com/anyproto/anytype-heart/core/block/simple" + "github.com/anyproto/anytype-heart/core/session" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/util/internalflag" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +var ErrUnexpectedBlockType = errors.New("unexpected block type") + +func (s *service) SetSpaceInfo(spaceId string, details *types.Struct) error { + ctx := context.TODO() + spc, err := s.spaceService.Get(ctx, spaceId) + if err != nil { + return err + } + workspaceId := spc.DerivedIDs().Workspace + + setDetails := make([]*model.Detail, 0, len(details.GetFields())) + for k, v := range details.GetFields() { + setDetails = append(setDetails, &model.Detail{ + Key: k, + Value: v, + }) + } + return s.SetDetails(nil, workspaceId, setDetails) +} + +func (s *service) SetSource(ctx session.Context, objectId string, source []string) error { + return cache.Do(s, objectId, func(sb smartblock.SmartBlock) error { + st := sb.NewStateCtx(ctx) + // nolint:errcheck + _ = st.Iterate(func(b simple.Block) (isContinue bool) { + if dv := b.Model().GetDataview(); dv != nil { + for _, view := range dv.Views { + view.DefaultTemplateId = "" + view.DefaultObjectTypeId = "" + } + st.Set(b) + return false + } + return true + }) + st.SetDetailAndBundledRelation(bundle.RelationKeySetOf, pbtypes.StringList(source)) + + flags := internalflag.NewFromState(st) + // set with source is no longer empty + flags.Remove(model.InternalFlag_editorDeleteEmpty) + flags.AddToState(st) + + return sb.Apply(st, smartblock.NoRestrictions, smartblock.KeepInternalFlags) + }) +} + +func (s *service) SetWorkspaceDashboardId(ctx session.Context, workspaceId string, id string) (setId string, err error) { + err = cache.Do(s, workspaceId, func(ws *editor.Workspaces) error { + if ws.Type() != coresb.SmartBlockTypeWorkspace { + return ErrUnexpectedBlockType + } + if err = ws.SetDetails(ctx, []*model.Detail{ + { + Key: bundle.RelationKeySpaceDashboardId.String(), + Value: pbtypes.String(id), + }, + }, false); err != nil { + return err + } + return nil + }) + return id, err +} + +func (s *service) SetIsFavorite(objectId string, isFavorite bool) error { + spaceID, err := s.resolver.ResolveSpaceID(objectId) + if err != nil { + return fmt.Errorf("resolve spaceID: %w", err) + } + spc, err := s.spaceService.Get(context.Background(), spaceID) + if err != nil { + return fmt.Errorf("get space: %w", err) + } + return s.objectLinksCollectionModify(spc.DerivedIDs().Home, objectId, isFavorite) +} + +func (s *service) SetIsArchived(objectId string, isArchived bool) error { + spaceID, err := s.resolver.ResolveSpaceID(objectId) + if err != nil { + return fmt.Errorf("resolve spaceID: %w", err) + } + spc, err := s.spaceService.Get(context.Background(), spaceID) + if err != nil { + return fmt.Errorf("get space: %w", err) + } + if err := s.checkArchivedRestriction(isArchived, spaceID, objectId); err != nil { + return err + } + return s.objectLinksCollectionModify(spc.DerivedIDs().Archive, objectId, isArchived) +} + +func (s *service) SetListIsFavorite(objectIds []string, isFavorite bool) error { + ids, err := s.store.HasIDs(objectIds...) + if err != nil { + return err + } + var ( + anySucceed bool + resultError error + ) + for _, id := range ids { + err := s.SetIsFavorite(id, isFavorite) + if err != nil { + log.Error("failed to favorite object", zap.String("objectId", id), zap.Error(err)) + resultError = errors.Join(resultError, err) + } else { + anySucceed = true + } + } + if resultError != nil { + log.Warn("failed to set objects as favorite", zap.Error(resultError)) + } + if anySucceed { + return nil + } + return resultError +} + +func (s *service) SetListIsArchived(objectIds []string, isArchived bool) error { + objectIDsPerSpace, err := s.partitionObjectIDsBySpaceID(objectIds) + if err != nil { + return fmt.Errorf("partition object ids by spaces: %w", err) + } + + var ( + multiErr multierror.Error + anySucceed bool + ) + for spaceID, objectIDs := range objectIDsPerSpace { + err = s.setIsArchivedForObjects(spaceID, objectIDs, isArchived) + if err != nil { + log.Error("failed to set isArchived to objects", zap.String("spaceId", spaceID), + zap.Strings("objectIDs", objectIDs), zap.Bool("isArchived", isArchived), zap.Error(err)) + multiErr.Errors = append(multiErr.Errors, err) + } else { + anySucceed = true + } + } + if anySucceed { + return nil + } + return multiErr.ErrorOrNil() +} + +func (s *service) checkArchivedRestriction(isArchived bool, spaceID string, objectId string) error { + if !isArchived { + return nil + } + return cache.Do(s, objectId, func(sb smartblock.SmartBlock) error { + return s.restriction.CheckRestrictions(sb, model.Restrictions_Delete) + }) +} + +func (s *service) objectLinksCollectionModify(collectionId string, objectId string, value bool) error { + return cache.Do(s, collectionId, func(b smartblock.SmartBlock) error { + coll, ok := b.(collection.Collection) + if !ok { + return fmt.Errorf("unsupported sb block type: %T", b) + } + if value { + return coll.AddObject(objectId) + } else { + return coll.RemoveObject(objectId) + } + }) +} + +func (s *service) partitionObjectIDsBySpaceID(objectIDs []string) (map[string][]string, error) { + res := map[string][]string{} + for _, objectID := range objectIDs { + spaceID, err := s.resolver.ResolveSpaceID(objectID) + if err != nil { + return nil, fmt.Errorf("resolve spaceID: %w", err) + } + res[spaceID] = append(res[spaceID], objectID) + } + return res, nil +} + +func (s *service) setIsArchivedForObjects(spaceID string, objectIDs []string, isArchived bool) error { + spc, err := s.spaceService.Get(context.Background(), spaceID) + if err != nil { + return fmt.Errorf("get space: %w", err) + } + return cache.Do(s, spc.DerivedIDs().Archive, func(b smartblock.SmartBlock) error { + archive, ok := b.(collection.Collection) + if !ok { + return fmt.Errorf("unexpected archive block type: %T", b) + } + + var multiErr multierror.Error + var anySucceed bool + ids, err := s.store.HasIDs(objectIDs...) + if err != nil { + return err + } + for _, id := range ids { + var err error + if restrErr := s.checkArchivedRestriction(isArchived, spaceID, id); restrErr != nil { + err = restrErr + } else { + if isArchived { + err = archive.AddObject(id) + } else { + err = archive.RemoveObject(id) + } + } + if err != nil { + log.Error("failed to set isArchived", zap.String("objectId", id), zap.Bool("isArchived", isArchived), zap.Error(err)) + multiErr.Errors = append(multiErr.Errors, err) + continue + } + anySucceed = true + } + + if err := multiErr.ErrorOrNil(); err != nil { + log.Warn("failed to archive", zap.Error(err)) + } + if anySucceed { + return nil + } + return multiErr.ErrorOrNil() + }) +} diff --git a/core/block/import/common/objectcreator/mock_blockservice/mock_BlockService.go b/core/block/import/common/objectcreator/mock_blockservice/mock_BlockService.go deleted file mode 100644 index d3cdff8290..0000000000 --- a/core/block/import/common/objectcreator/mock_blockservice/mock_BlockService.go +++ /dev/null @@ -1,297 +0,0 @@ -// Code generated by mockery. DO NOT EDIT. - -package mock_blockservice - -import ( - context "context" - - domain "github.com/anyproto/anytype-heart/core/domain" - mock "github.com/stretchr/testify/mock" - - pb "github.com/anyproto/anytype-heart/pb" - - smartblock "github.com/anyproto/anytype-heart/core/block/editor/smartblock" -) - -// MockBlockService is an autogenerated mock type for the BlockService type -type MockBlockService struct { - mock.Mock -} - -type MockBlockService_Expecter struct { - mock *mock.Mock -} - -func (_m *MockBlockService) EXPECT() *MockBlockService_Expecter { - return &MockBlockService_Expecter{mock: &_m.Mock} -} - -// DeleteObject provides a mock function with given fields: objectId -func (_m *MockBlockService) DeleteObject(objectId string) error { - ret := _m.Called(objectId) - - if len(ret) == 0 { - panic("no return value specified for DeleteObject") - } - - var r0 error - if rf, ok := ret.Get(0).(func(string) error); ok { - r0 = rf(objectId) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBlockService_DeleteObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteObject' -type MockBlockService_DeleteObject_Call struct { - *mock.Call -} - -// DeleteObject is a helper method to define mock.On call -// - objectId string -func (_e *MockBlockService_Expecter) DeleteObject(objectId interface{}) *MockBlockService_DeleteObject_Call { - return &MockBlockService_DeleteObject_Call{Call: _e.mock.On("DeleteObject", objectId)} -} - -func (_c *MockBlockService_DeleteObject_Call) Run(run func(objectId string)) *MockBlockService_DeleteObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(string)) - }) - return _c -} - -func (_c *MockBlockService_DeleteObject_Call) Return(err error) *MockBlockService_DeleteObject_Call { - _c.Call.Return(err) - return _c -} - -func (_c *MockBlockService_DeleteObject_Call) RunAndReturn(run func(string) error) *MockBlockService_DeleteObject_Call { - _c.Call.Return(run) - return _c -} - -// GetObject provides a mock function with given fields: ctx, objectID -func (_m *MockBlockService) GetObject(ctx context.Context, objectID string) (smartblock.SmartBlock, error) { - ret := _m.Called(ctx, objectID) - - if len(ret) == 0 { - panic("no return value specified for GetObject") - } - - var r0 smartblock.SmartBlock - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string) (smartblock.SmartBlock, error)); ok { - return rf(ctx, objectID) - } - if rf, ok := ret.Get(0).(func(context.Context, string) smartblock.SmartBlock); ok { - r0 = rf(ctx, objectID) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(smartblock.SmartBlock) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { - r1 = rf(ctx, objectID) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockBlockService_GetObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObject' -type MockBlockService_GetObject_Call struct { - *mock.Call -} - -// GetObject is a helper method to define mock.On call -// - ctx context.Context -// - objectID string -func (_e *MockBlockService_Expecter) GetObject(ctx interface{}, objectID interface{}) *MockBlockService_GetObject_Call { - return &MockBlockService_GetObject_Call{Call: _e.mock.On("GetObject", ctx, objectID)} -} - -func (_c *MockBlockService_GetObject_Call) Run(run func(ctx context.Context, objectID string)) *MockBlockService_GetObject_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string)) - }) - return _c -} - -func (_c *MockBlockService_GetObject_Call) Return(sb smartblock.SmartBlock, err error) *MockBlockService_GetObject_Call { - _c.Call.Return(sb, err) - return _c -} - -func (_c *MockBlockService_GetObject_Call) RunAndReturn(run func(context.Context, string) (smartblock.SmartBlock, error)) *MockBlockService_GetObject_Call { - _c.Call.Return(run) - return _c -} - -// GetObjectByFullID provides a mock function with given fields: ctx, id -func (_m *MockBlockService) GetObjectByFullID(ctx context.Context, id domain.FullID) (smartblock.SmartBlock, error) { - ret := _m.Called(ctx, id) - - if len(ret) == 0 { - panic("no return value specified for GetObjectByFullID") - } - - var r0 smartblock.SmartBlock - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) (smartblock.SmartBlock, error)); ok { - return rf(ctx, id) - } - if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) smartblock.SmartBlock); ok { - r0 = rf(ctx, id) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(smartblock.SmartBlock) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, domain.FullID) error); ok { - r1 = rf(ctx, id) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// MockBlockService_GetObjectByFullID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObjectByFullID' -type MockBlockService_GetObjectByFullID_Call struct { - *mock.Call -} - -// GetObjectByFullID is a helper method to define mock.On call -// - ctx context.Context -// - id domain.FullID -func (_e *MockBlockService_Expecter) GetObjectByFullID(ctx interface{}, id interface{}) *MockBlockService_GetObjectByFullID_Call { - return &MockBlockService_GetObjectByFullID_Call{Call: _e.mock.On("GetObjectByFullID", ctx, id)} -} - -func (_c *MockBlockService_GetObjectByFullID_Call) Run(run func(ctx context.Context, id domain.FullID)) *MockBlockService_GetObjectByFullID_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(domain.FullID)) - }) - return _c -} - -func (_c *MockBlockService_GetObjectByFullID_Call) Return(sb smartblock.SmartBlock, err error) *MockBlockService_GetObjectByFullID_Call { - _c.Call.Return(sb, err) - return _c -} - -func (_c *MockBlockService_GetObjectByFullID_Call) RunAndReturn(run func(context.Context, domain.FullID) (smartblock.SmartBlock, error)) *MockBlockService_GetObjectByFullID_Call { - _c.Call.Return(run) - return _c -} - -// SetPageIsArchived provides a mock function with given fields: req -func (_m *MockBlockService) SetPageIsArchived(req pb.RpcObjectSetIsArchivedRequest) error { - ret := _m.Called(req) - - if len(ret) == 0 { - panic("no return value specified for SetPageIsArchived") - } - - var r0 error - if rf, ok := ret.Get(0).(func(pb.RpcObjectSetIsArchivedRequest) error); ok { - r0 = rf(req) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBlockService_SetPageIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPageIsArchived' -type MockBlockService_SetPageIsArchived_Call struct { - *mock.Call -} - -// SetPageIsArchived is a helper method to define mock.On call -// - req pb.RpcObjectSetIsArchivedRequest -func (_e *MockBlockService_Expecter) SetPageIsArchived(req interface{}) *MockBlockService_SetPageIsArchived_Call { - return &MockBlockService_SetPageIsArchived_Call{Call: _e.mock.On("SetPageIsArchived", req)} -} - -func (_c *MockBlockService_SetPageIsArchived_Call) Run(run func(req pb.RpcObjectSetIsArchivedRequest)) *MockBlockService_SetPageIsArchived_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(pb.RpcObjectSetIsArchivedRequest)) - }) - return _c -} - -func (_c *MockBlockService_SetPageIsArchived_Call) Return(err error) *MockBlockService_SetPageIsArchived_Call { - _c.Call.Return(err) - return _c -} - -func (_c *MockBlockService_SetPageIsArchived_Call) RunAndReturn(run func(pb.RpcObjectSetIsArchivedRequest) error) *MockBlockService_SetPageIsArchived_Call { - _c.Call.Return(run) - return _c -} - -// SetPageIsFavorite provides a mock function with given fields: req -func (_m *MockBlockService) SetPageIsFavorite(req pb.RpcObjectSetIsFavoriteRequest) error { - ret := _m.Called(req) - - if len(ret) == 0 { - panic("no return value specified for SetPageIsFavorite") - } - - var r0 error - if rf, ok := ret.Get(0).(func(pb.RpcObjectSetIsFavoriteRequest) error); ok { - r0 = rf(req) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockBlockService_SetPageIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetPageIsFavorite' -type MockBlockService_SetPageIsFavorite_Call struct { - *mock.Call -} - -// SetPageIsFavorite is a helper method to define mock.On call -// - req pb.RpcObjectSetIsFavoriteRequest -func (_e *MockBlockService_Expecter) SetPageIsFavorite(req interface{}) *MockBlockService_SetPageIsFavorite_Call { - return &MockBlockService_SetPageIsFavorite_Call{Call: _e.mock.On("SetPageIsFavorite", req)} -} - -func (_c *MockBlockService_SetPageIsFavorite_Call) Run(run func(req pb.RpcObjectSetIsFavoriteRequest)) *MockBlockService_SetPageIsFavorite_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(pb.RpcObjectSetIsFavoriteRequest)) - }) - return _c -} - -func (_c *MockBlockService_SetPageIsFavorite_Call) Return(err error) *MockBlockService_SetPageIsFavorite_Call { - _c.Call.Return(err) - return _c -} - -func (_c *MockBlockService_SetPageIsFavorite_Call) RunAndReturn(run func(pb.RpcObjectSetIsFavoriteRequest) error) *MockBlockService_SetPageIsFavorite_Call { - _c.Call.Return(run) - return _c -} - -// NewMockBlockService creates a new instance of MockBlockService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockBlockService(t interface { - mock.TestingT - Cleanup(func()) -}) *MockBlockService { - mock := &MockBlockService{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/block/import/common/objectcreator/objectcreator.go b/core/block/import/common/objectcreator/objectcreator.go index 4cf5fb9131..32b6100ef2 100644 --- a/core/block/import/common/objectcreator/objectcreator.go +++ b/core/block/import/common/objectcreator/objectcreator.go @@ -11,6 +11,7 @@ import ( "go.uber.org/zap" "github.com/anyproto/anytype-heart/core/block/cache" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/editor/basic" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/block/editor/state" @@ -24,7 +25,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/simple" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/domain/objectorigin" - "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" @@ -43,37 +43,37 @@ type Service interface { Create(dataObject *DataObject, sn *common.Snapshot) (*types.Struct, string, error) } -type BlockService interface { - GetObject(ctx context.Context, objectID string) (sb smartblock.SmartBlock, err error) - GetObjectByFullID(ctx context.Context, id domain.FullID) (sb smartblock.SmartBlock, err error) - SetPageIsFavorite(req pb.RpcObjectSetIsFavoriteRequest) (err error) - SetPageIsArchived(req pb.RpcObjectSetIsArchivedRequest) (err error) +type ObjectDeleter interface { + cache.ObjectGetterComponent DeleteObject(objectId string) (err error) } type ObjectCreator struct { - service BlockService + detailsService details.Service spaceService space.Service objectStore objectstore.ObjectStore relationSyncer *syncer.FileRelationSyncer syncFactory *syncer.Factory objectCreator objectcreator.Service + objectDeleter ObjectDeleter } -func New(service BlockService, +func New(detailsService details.Service, syncFactory *syncer.Factory, objectStore objectstore.ObjectStore, relationSyncer *syncer.FileRelationSyncer, spaceService space.Service, objectCreator objectcreator.Service, + objectDeleter ObjectDeleter, ) Service { return &ObjectCreator{ - service: service, + detailsService: detailsService, syncFactory: syncFactory, objectStore: objectStore, relationSyncer: relationSyncer, spaceService: spaceService, objectCreator: objectCreator, + objectDeleter: objectDeleter, } } @@ -313,7 +313,7 @@ func (oc *ObjectCreator) deleteFile(hash string) { log.With("file", hash).Errorf("failed to get inbound links for file: %s", err) } if len(inboundLinks) == 0 { - err = oc.service.DeleteObject(hash) + err = oc.objectDeleter.DeleteObject(hash) if err != nil { log.With("file", hash).Errorf("failed to delete file: %s", err) } @@ -352,7 +352,7 @@ func (oc *ObjectCreator) setSpaceDashboardID(spaceID string, st *state.State) { log.Errorf("failed to get space: %v", err) return } - err = cache.Do(oc.service, spc.DerivedIDs().Workspace, func(ws basic.CommonOperations) error { + err = cache.Do(oc.detailsService, spc.DerivedIDs().Workspace, func(ws basic.CommonOperations) error { if err := ws.SetDetails(nil, details, false); err != nil { return err } @@ -366,7 +366,7 @@ func (oc *ObjectCreator) setSpaceDashboardID(spaceID string, st *state.State) { func (oc *ObjectCreator) resetState(newID string, st *state.State) *types.Struct { var respDetails *types.Struct - err := cache.Do(oc.service, newID, func(b smartblock.SmartBlock) error { + err := cache.Do(oc.detailsService, newID, func(b smartblock.SmartBlock) error { err := history.ResetToVersion(b, st) if err != nil { log.With(zap.String("object id", newID)).Errorf("failed to set state %s: %s", newID, err) @@ -391,7 +391,7 @@ func (oc *ObjectCreator) resetState(newID string, st *state.State) *types.Struct func (oc *ObjectCreator) setFavorite(snapshot *model.SmartBlockSnapshotBase, newID string) { isFavorite := pbtypes.GetBool(snapshot.Details, bundle.RelationKeyIsFavorite.String()) if isFavorite { - err := oc.service.SetPageIsFavorite(pb.RpcObjectSetIsFavoriteRequest{ContextId: newID, IsFavorite: true}) + err := oc.detailsService.SetIsFavorite(newID, true) if err != nil { log.With(zap.String("object id", newID)).Errorf("failed to set isFavorite when importing object: %s", err) } @@ -401,7 +401,7 @@ func (oc *ObjectCreator) setFavorite(snapshot *model.SmartBlockSnapshotBase, new func (oc *ObjectCreator) setArchived(snapshot *model.SmartBlockSnapshotBase, newID string) { isArchive := pbtypes.GetBool(snapshot.Details, bundle.RelationKeyIsArchived.String()) if isArchive { - err := oc.service.SetPageIsArchived(pb.RpcObjectSetIsArchivedRequest{ContextId: newID, IsArchived: true}) + err := oc.detailsService.SetIsArchived(newID, true) if err != nil { log.With(zap.String("object id", newID)). Errorf("failed to set isFavorite when importing object %s: %s", newID, err) @@ -412,7 +412,7 @@ func (oc *ObjectCreator) setArchived(snapshot *model.SmartBlockSnapshotBase, new func (oc *ObjectCreator) syncFilesAndLinks(newIdsSet map[string]struct{}, id domain.FullID, origin objectorigin.ObjectOrigin) error { tasks := make([]func() error, 0) // todo: rewrite it in order not to create state with URLs inside links - err := cache.Do(oc.service, id.ObjectID, func(b smartblock.SmartBlock) error { + err := cache.Do(oc.detailsService, id.ObjectID, func(b smartblock.SmartBlock) error { st := b.NewState() return st.Iterate(func(bl simple.Block) (isContinue bool) { s := oc.syncFactory.GetSyncer(bl) @@ -446,7 +446,7 @@ func (oc *ObjectCreator) syncFilesAndLinks(newIdsSet map[string]struct{}, id dom } func (oc *ObjectCreator) updateLinksInCollections(st *state.State, oldIDtoNew map[string]string, isNewCollection bool) { - err := cache.Do(oc.service, st.RootId(), func(b smartblock.SmartBlock) error { + err := cache.Do(oc.detailsService, st.RootId(), func(b smartblock.SmartBlock) error { originalState := b.NewState() var existedObjects []string if !isNewCollection { @@ -472,7 +472,7 @@ func (oc *ObjectCreator) mergeCollections(existedObjects []string, st *state.Sta } func (oc *ObjectCreator) updateWidgetObject(st *state.State) (*types.Struct, string, error) { - err := cache.DoState(oc.service, st.RootId(), func(oldState *state.State, sb smartblock.SmartBlock) error { + err := cache.DoState(oc.detailsService, st.RootId(), func(oldState *state.State, sb smartblock.SmartBlock) error { blocks := st.Blocks() blocksMap := make(map[string]*model.Block, len(blocks)) existingWidgetsTargetIDs, err := oc.getExistingWidgetsTargetIDs(oldState) diff --git a/core/block/import/common/objectcreator/objectcreator_test.go b/core/block/import/common/objectcreator/objectcreator_test.go index 482d7bd5aa..7c6f111112 100644 --- a/core/block/import/common/objectcreator/objectcreator_test.go +++ b/core/block/import/common/objectcreator/objectcreator_test.go @@ -7,10 +7,10 @@ import ( "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" + "github.com/anyproto/anytype-heart/core/block/details/mock_details" "github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/import/common" - "github.com/anyproto/anytype-heart/core/block/import/common/objectcreator/mock_blockservice" "github.com/anyproto/anytype-heart/core/block/object/objectcreator" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/domain/objectorigin" @@ -27,12 +27,12 @@ func TestObjectCreator_Create(t *testing.T) { t.Run("participant object - don't update it", func(t *testing.T) { // given spaceID := "spaceId" - blockService := mock_blockservice.NewMockBlockService(t) + detailsService := mock_details.NewMockService(t) mockService := mock_space.NewMockService(t) mockSpace := mock_clientspace.NewMockSpace(t) mockSpace.EXPECT().IsReadOnly().Return(true) mockService.EXPECT().Get(context.Background(), spaceID).Return(mockSpace, nil) - service := New(blockService, nil, nil, nil, mockService, objectcreator.NewCreator()) + service := New(detailsService, nil, nil, nil, mockService, objectcreator.NewCreator(), nil) importedSpaceId := "importedSpaceID" identity := "identity" @@ -73,7 +73,7 @@ func TestObjectCreator_Create(t *testing.T) { err := testParticipant.Apply(st) assert.Nil(t, err) - blockService.EXPECT().GetObject(context.Background(), participantId).Return(testParticipant, nil) + detailsService.EXPECT().GetObject(context.Background(), participantId).Return(testParticipant, nil) // when create, id, err := service.Create(dataObject, sn) diff --git a/core/block/import/importer.go b/core/block/import/importer.go index 7fba17ee54..5a2d70c509 100644 --- a/core/block/import/importer.go +++ b/core/block/import/importer.go @@ -17,6 +17,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/import/common" creator "github.com/anyproto/anytype-heart/core/block/import/common/objectcreator" "github.com/anyproto/anytype-heart/core/block/import/common/objectid" @@ -104,7 +105,8 @@ func (i *Import) Init(a *app.App) (err error) { factory := syncer.New(syncer.NewFileSyncer(i.s, fileObjectService), syncer.NewBookmarkSyncer(i.s), syncer.NewIconSyncer(i.s, fileObjectService)) relationSyncer := syncer.NewFileRelationSyncer(i.s, fileObjectService) objectCreator := app.MustComponent[objectcreator.Service](a) - i.oc = creator.New(i.s, factory, store, relationSyncer, spaceService, objectCreator) + detailsService := app.MustComponent[details.Service](a) + i.oc = creator.New(detailsService, factory, store, relationSyncer, spaceService, objectCreator, i.s) i.fileSync = app.MustComponent[filesync.FileSync](a) i.notificationService = app.MustComponent[notifications.Notifications](a) i.eventSender = app.MustComponent[event.Sender](a) diff --git a/core/block/service.go b/core/block/service.go index b4b012d415..96c6088af9 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -17,7 +17,7 @@ import ( bookmarksvc "github.com/anyproto/anytype-heart/core/block/bookmark" "github.com/anyproto/anytype-heart/core/block/cache" - "github.com/anyproto/anytype-heart/core/block/editor" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/editor/basic" "github.com/anyproto/anytype-heart/core/block/editor/collection" "github.com/anyproto/anytype-heart/core/block/editor/file" @@ -28,7 +28,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/object/objectcreator" "github.com/anyproto/anytype-heart/core/block/process" "github.com/anyproto/anytype-heart/core/block/restriction" - "github.com/anyproto/anytype-heart/core/block/simple" "github.com/anyproto/anytype-heart/core/block/simple/bookmark" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/domain/objectorigin" @@ -42,7 +41,6 @@ import ( "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/core" - coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/pkg/lib/logging" @@ -59,14 +57,9 @@ import ( _ "github.com/anyproto/anytype-heart/core/block/simple/widget" ) -const ( - CName = "block-service" -) +const CName = "block-service" -var ( - ErrUnexpectedBlockType = errors.New("unexpected block type") - ErrUnknownObjectType = fmt.Errorf("unknown object type") -) +var ErrUnknownObjectType = fmt.Errorf("unknown object type") var log = logging.Logger("anytype-mw-service") @@ -99,7 +92,6 @@ type Service struct { syncStatus syncstatus.Service eventSender event.Sender process process.Service - app *app.App objectStore objectstore.ObjectStore restriction restriction.Service bookmark bookmarksvc.Service @@ -110,6 +102,7 @@ type Service struct { tempDirProvider core.TempDirProvider builtinObjectService builtinObjects fileObjectService fileobject.Service + detailsService details.Service fileService files.Service fileUploaderService fileuploader.Service @@ -154,7 +147,7 @@ func (s *Service) Init(a *app.App) (err error) { s.tempDirProvider = app.MustComponent[core.TempDirProvider](a) s.builtinObjectService = app.MustComponent[builtinObjects](a) - s.app = a + s.detailsService = app.MustComponent[details.Service](a) return } @@ -336,235 +329,10 @@ func (s *Service) GetAllWorkspaces(req *pb.RpcWorkspaceGetAllRequest) ([]string, panic("should be removed") } -func (s *Service) SetSpaceInfo(req *pb.RpcWorkspaceSetInfoRequest) error { - ctx := context.TODO() - spc, err := s.spaceService.Get(ctx, req.SpaceId) - if err != nil { - return err - } - workspaceId := spc.DerivedIDs().Workspace - - setDetails := make([]*model.Detail, 0, len(req.Details.GetFields())) - for k, v := range req.Details.GetFields() { - setDetails = append(setDetails, &model.Detail{ - Key: k, - Value: v, - }) - } - return s.SetDetails(nil, workspaceId, setDetails) -} - func (s *Service) ObjectShareByLink(req *pb.RpcObjectShareByLinkRequest) (link string, err error) { panic("should be removed") } -func (s *Service) SetPagesIsArchived(ctx session.Context, req pb.RpcObjectListSetIsArchivedRequest) error { - objectIDsPerSpace, err := s.partitionObjectIDsBySpaceID(req.ObjectIds) - if err != nil { - return fmt.Errorf("partition object ids by spaces: %w", err) - } - - var ( - multiErr multierror.Error - anySucceed bool - ) - for spaceID, objectIDs := range objectIDsPerSpace { - err = s.setIsArchivedForObjects(spaceID, objectIDs, req.IsArchived) - if err != nil { - log.With("spaceID", spaceID, "objectIDs", objectIDs).Errorf("failed to set isArchived=%t objects in space: %s", req.IsArchived, err) - multiErr.Errors = append(multiErr.Errors, err) - } else { - anySucceed = true - } - } - if anySucceed { - return nil - } - return multiErr.ErrorOrNil() -} - -func (s *Service) setIsArchivedForObjects(spaceID string, objectIDs []string, isArchived bool) error { - spc, err := s.spaceService.Get(context.Background(), spaceID) - if err != nil { - return fmt.Errorf("get space: %w", err) - } - return cache.Do(s, spc.DerivedIDs().Archive, func(b smartblock.SmartBlock) error { - archive, ok := b.(collection.Collection) - if !ok { - return fmt.Errorf("unexpected archive block type: %T", b) - } - - var multiErr multierror.Error - var anySucceed bool - ids, err := s.objectStore.HasIDs(objectIDs...) - if err != nil { - return err - } - for _, id := range ids { - var err error - if restrErr := s.checkArchivedRestriction(isArchived, spaceID, id); restrErr != nil { - err = restrErr - } else { - if isArchived { - err = archive.AddObject(id) - } else { - err = archive.RemoveObject(id) - } - } - if err != nil { - log.With("objectID", id).Errorf("failed to set isArchived=%t for object: %s", isArchived, err) - multiErr.Errors = append(multiErr.Errors, err) - continue - } - anySucceed = true - } - - if err := multiErr.ErrorOrNil(); err != nil { - log.Warnf("failed to archive: %s", err) - } - if anySucceed { - return nil - } - return multiErr.ErrorOrNil() - }) -} - -func (s *Service) partitionObjectIDsBySpaceID(objectIDs []string) (map[string][]string, error) { - res := map[string][]string{} - for _, objectID := range objectIDs { - spaceID, err := s.resolver.ResolveSpaceID(objectID) - if err != nil { - return nil, fmt.Errorf("resolve spaceID: %w", err) - } - res[spaceID] = append(res[spaceID], objectID) - } - return res, nil -} - -func (s *Service) SetPagesIsFavorite(req pb.RpcObjectListSetIsFavoriteRequest) error { - ids, err := s.objectStore.HasIDs(req.ObjectIds...) - if err != nil { - return err - } - var ( - anySucceed bool - resultError error - ) - for _, id := range ids { - err := s.SetPageIsFavorite(pb.RpcObjectSetIsFavoriteRequest{ - ContextId: id, - IsFavorite: req.IsFavorite, - }) - if err != nil { - log.Errorf("failed to favorite object %s: %s", id, err) - resultError = errors.Join(resultError, err) - } else { - anySucceed = true - } - } - if resultError != nil { - log.Warnf("failed to set objects as favorite: %s", resultError) - } - if anySucceed { - return nil - } - return resultError -} - -func (s *Service) objectLinksCollectionModify(collectionId string, objectId string, value bool) error { - return cache.Do(s, collectionId, func(b smartblock.SmartBlock) error { - coll, ok := b.(collection.Collection) - if !ok { - return fmt.Errorf("unsupported sb block type: %T", b) - } - if value { - return coll.AddObject(objectId) - } else { - return coll.RemoveObject(objectId) - } - }) -} - -func (s *Service) SetPageIsFavorite(req pb.RpcObjectSetIsFavoriteRequest) (err error) { - spaceID, err := s.resolver.ResolveSpaceID(req.ContextId) - if err != nil { - return fmt.Errorf("resolve spaceID: %w", err) - } - spc, err := s.spaceService.Get(context.Background(), spaceID) - if err != nil { - return fmt.Errorf("get space: %w", err) - } - return s.objectLinksCollectionModify(spc.DerivedIDs().Home, req.ContextId, req.IsFavorite) -} - -func (s *Service) SetPageIsArchived(req pb.RpcObjectSetIsArchivedRequest) (err error) { - spaceID, err := s.resolver.ResolveSpaceID(req.ContextId) - if err != nil { - return fmt.Errorf("resolve spaceID: %w", err) - } - spc, err := s.spaceService.Get(context.Background(), spaceID) - if err != nil { - return fmt.Errorf("get space: %w", err) - } - if err := s.checkArchivedRestriction(req.IsArchived, spaceID, req.ContextId); err != nil { - return err - } - return s.objectLinksCollectionModify(spc.DerivedIDs().Archive, req.ContextId, req.IsArchived) -} - -func (s *Service) SetSource(ctx session.Context, req pb.RpcObjectSetSourceRequest) (err error) { - return cache.Do(s, req.ContextId, func(sb smartblock.SmartBlock) error { - st := sb.NewStateCtx(ctx) - // nolint:errcheck - _ = st.Iterate(func(b simple.Block) (isContinue bool) { - if dv := b.Model().GetDataview(); dv != nil { - for _, view := range dv.Views { - view.DefaultTemplateId = "" - view.DefaultObjectTypeId = "" - } - st.Set(b) - return false - } - return true - }) - st.SetDetailAndBundledRelation(bundle.RelationKeySetOf, pbtypes.StringList(req.Source)) - - flags := internalflag.NewFromState(st) - // set with source is no longer empty - flags.Remove(model.InternalFlag_editorDeleteEmpty) - flags.AddToState(st) - - return sb.Apply(st, smartblock.NoRestrictions, smartblock.KeepInternalFlags) - }) -} - -func (s *Service) SetWorkspaceDashboardId(ctx session.Context, workspaceId string, id string) (setId string, err error) { - err = cache.Do(s, workspaceId, func(ws *editor.Workspaces) error { - if ws.Type() != coresb.SmartBlockTypeWorkspace { - return ErrUnexpectedBlockType - } - if err = ws.SetDetails(ctx, []*model.Detail{ - { - Key: bundle.RelationKeySpaceDashboardId.String(), - Value: pbtypes.String(id), - }, - }, false); err != nil { - return err - } - return nil - }) - return id, err -} - -func (s *Service) checkArchivedRestriction(isArchived bool, spaceID string, objectId string) error { - if !isArchived { - return nil - } - return cache.Do(s, objectId, func(sb smartblock.SmartBlock) error { - return s.restriction.CheckRestrictions(sb, model.Restrictions_Delete) - }) -} - func (s *Service) DeleteArchivedObjects(objectIDs []string) error { var ( resultError error @@ -749,8 +517,7 @@ func (s *Service) ObjectToBookmark(ctx context.Context, id string, url string) ( return } - oStore := s.app.MustComponent(objectstore.CName).(objectstore.ObjectStore) - res, err := oStore.GetWithLinksInfoByID(spaceID, id) + res, err := s.objectStore.GetWithLinksInfoByID(spaceID, id) if err != nil { return } diff --git a/core/details.go b/core/details.go new file mode 100644 index 0000000000..1f72ca0485 --- /dev/null +++ b/core/details.go @@ -0,0 +1,187 @@ +package core + +import ( + "context" + + "github.com/gogo/protobuf/types" + + "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/util/internalflag" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +func (mw *Middleware) ObjectSetDetails(cctx context.Context, req *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse { + ctx := mw.newContext(cctx) + response := func(code pb.RpcObjectSetDetailsResponseErrorCode, err error) *pb.RpcObjectSetDetailsResponse { + m := &pb.RpcObjectSetDetailsResponse{Error: &pb.RpcObjectSetDetailsResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } else { + m.Event = mw.getResponseEvent(ctx) + } + return m + } + err := getService[details.Service](mw).SetDetails(ctx, req.ContextId, req.GetDetails()) + if err != nil { + return response(pb.RpcObjectSetDetailsResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectSetDetailsResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectListSetDetails(cctx context.Context, req *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse { + ctx := mw.newContext(cctx) + response := func(code pb.RpcObjectListSetDetailsResponseErrorCode, err error) *pb.RpcObjectListSetDetailsResponse { + m := &pb.RpcObjectListSetDetailsResponse{Error: &pb.RpcObjectListSetDetailsResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } else { + m.Event = mw.getResponseEvent(ctx) + } + return m + } + + err := getService[details.Service](mw).SetDetailsList(ctx, req.ObjectIds, req.Details) + if err != nil { + return response(pb.RpcObjectListSetDetailsResponseError_UNKNOWN_ERROR, err) + } + + return response(pb.RpcObjectListSetDetailsResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectSetInternalFlags(cctx context.Context, req *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse { + ctx := mw.newContext(cctx) + response := func(code pb.RpcObjectSetInternalFlagsResponseErrorCode, err error) *pb.RpcObjectSetInternalFlagsResponse { + m := &pb.RpcObjectSetInternalFlagsResponse{Error: &pb.RpcObjectSetInternalFlagsResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } else { + m.Event = mw.getResponseEvent(ctx) + } + return m + } + ds := getService[details.Service](mw) + err := ds.ModifyDetails(req.ContextId, func(current *types.Struct) (*types.Struct, error) { + d := pbtypes.CopyStruct(current, false) + return internalflag.PutToDetails(d, req.InternalFlags), nil + }) + if err != nil { + return response(pb.RpcObjectSetInternalFlagsResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectSetInternalFlagsResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectListModifyDetailValues(_ context.Context, req *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse { + response := func(code pb.RpcObjectListModifyDetailValuesResponseErrorCode, err error) *pb.RpcObjectListModifyDetailValuesResponse { + m := &pb.RpcObjectListModifyDetailValuesResponse{Error: &pb.RpcObjectListModifyDetailValuesResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } + return m + } + err := getService[details.Service](mw).ModifyDetailsList(req) + if err != nil { + return response(pb.RpcObjectListModifyDetailValuesResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectListModifyDetailValuesResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectSetSource(cctx context.Context, + req *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { + ctx := mw.newContext(cctx) + response := func(code pb.RpcObjectSetSourceResponseErrorCode, err error) *pb.RpcObjectSetSourceResponse { + m := &pb.RpcObjectSetSourceResponse{Error: &pb.RpcObjectSetSourceResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } else { + m.Event = mw.getResponseEvent(ctx) + } + return m + } + err := getService[details.Service](mw).SetSource(ctx, req.ContextId, req.Source) + if err != nil { + return response(pb.RpcObjectSetSourceResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectSetSourceResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectWorkspaceSetDashboard(cctx context.Context, req *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse { + ctx := mw.newContext(cctx) + response := func(setId string, err error) *pb.RpcObjectWorkspaceSetDashboardResponse { + resp := &pb.RpcObjectWorkspaceSetDashboardResponse{ + ObjectId: setId, + Error: &pb.RpcObjectWorkspaceSetDashboardResponseError{ + Code: pb.RpcObjectWorkspaceSetDashboardResponseError_NULL, + }, + } + if err != nil { + resp.Error.Code = pb.RpcObjectWorkspaceSetDashboardResponseError_UNKNOWN_ERROR + resp.Error.Description = getErrorDescription(err) + } else { + resp.Event = mw.getResponseEvent(ctx) + } + return resp + } + setId, err := getService[details.Service](mw).SetWorkspaceDashboardId(ctx, req.ContextId, req.ObjectId) + return response(setId, err) +} + +func (mw *Middleware) ObjectSetIsFavorite(_ context.Context, req *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse { + response := func(code pb.RpcObjectSetIsFavoriteResponseErrorCode, err error) *pb.RpcObjectSetIsFavoriteResponse { + m := &pb.RpcObjectSetIsFavoriteResponse{Error: &pb.RpcObjectSetIsFavoriteResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } + return m + } + err := getService[details.Service](mw).SetIsFavorite(req.ContextId, req.IsFavorite) + if err != nil { + return response(pb.RpcObjectSetIsFavoriteResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectSetIsFavoriteResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectSetIsArchived(_ context.Context, req *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse { + response := func(code pb.RpcObjectSetIsArchivedResponseErrorCode, err error) *pb.RpcObjectSetIsArchivedResponse { + m := &pb.RpcObjectSetIsArchivedResponse{Error: &pb.RpcObjectSetIsArchivedResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } + return m + } + err := getService[details.Service](mw).SetIsArchived(req.ContextId, req.IsArchived) + if err != nil { + return response(pb.RpcObjectSetIsArchivedResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectSetIsArchivedResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectListSetIsArchived(_ context.Context, req *pb.RpcObjectListSetIsArchivedRequest) *pb.RpcObjectListSetIsArchivedResponse { + response := func(code pb.RpcObjectListSetIsArchivedResponseErrorCode, err error) *pb.RpcObjectListSetIsArchivedResponse { + m := &pb.RpcObjectListSetIsArchivedResponse{Error: &pb.RpcObjectListSetIsArchivedResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } + return m + } + err := getService[details.Service](mw).SetListIsArchived(req.ObjectIds, req.IsArchived) + if err != nil { + return response(pb.RpcObjectListSetIsArchivedResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectListSetIsArchivedResponseError_NULL, nil) +} + +func (mw *Middleware) ObjectListSetIsFavorite(_ context.Context, req *pb.RpcObjectListSetIsFavoriteRequest) *pb.RpcObjectListSetIsFavoriteResponse { + response := func(code pb.RpcObjectListSetIsFavoriteResponseErrorCode, err error) *pb.RpcObjectListSetIsFavoriteResponse { + m := &pb.RpcObjectListSetIsFavoriteResponse{Error: &pb.RpcObjectListSetIsFavoriteResponseError{Code: code}} + if err != nil { + m.Error.Description = getErrorDescription(err) + } + return m + } + err := getService[details.Service](mw).SetListIsFavorite(req.ObjectIds, req.IsFavorite) + if err != nil { + return response(pb.RpcObjectListSetIsFavoriteResponseError_UNKNOWN_ERROR, err) + } + return response(pb.RpcObjectListSetIsFavoriteResponseError_NULL, nil) +} diff --git a/core/files/fileobject/service.go b/core/files/fileobject/service.go index 978986a221..9e82dc0b00 100644 --- a/core/files/fileobject/service.go +++ b/core/files/fileobject/service.go @@ -24,7 +24,6 @@ import ( "github.com/anyproto/anytype-heart/core/files" "github.com/anyproto/anytype-heart/core/files/fileoffloader" "github.com/anyproto/anytype-heart/core/filestorage/filesync" - "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/core/syncstatus/filesyncstatus" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -166,7 +165,7 @@ func (s *service) Run(_ context.Context) error { } type objectArchiver interface { - SetPagesIsArchived(ctx session.Context, req pb.RpcObjectListSetIsArchivedRequest) error + SetListIsArchived(objectIds []string, isArchived bool) error } func (s *service) deleteMigratedFilesInNonPersonalSpaces(ctx context.Context) error { @@ -196,11 +195,7 @@ func (s *service) deleteMigratedFilesInNonPersonalSpaces(ctx context.Context) er return err } if len(objectIds) > 0 { - err = s.objectArchiver.SetPagesIsArchived(nil, pb.RpcObjectListSetIsArchivedRequest{ - ObjectIds: objectIds, - IsArchived: true, - }) - if err != nil { + if err = s.objectArchiver.SetListIsArchived(objectIds, true); err != nil { return err } } diff --git a/core/files/fileobject/service_test.go b/core/files/fileobject/service_test.go index 8d22ca751e..c8dc3350b5 100644 --- a/core/files/fileobject/service_test.go +++ b/core/files/fileobject/service_test.go @@ -29,7 +29,6 @@ import ( "github.com/anyproto/anytype-heart/core/filestorage" "github.com/anyproto/anytype-heart/core/filestorage/filesync" "github.com/anyproto/anytype-heart/core/filestorage/rpcstore" - "github.com/anyproto/anytype-heart/core/session" wallet2 "github.com/anyproto/anytype-heart/core/wallet" "github.com/anyproto/anytype-heart/core/wallet/mock_wallet" "github.com/anyproto/anytype-heart/pb" @@ -71,7 +70,7 @@ func (c *dummyConfig) Name() string { type dummyObjectArchiver struct{} -func (a *dummyObjectArchiver) SetPagesIsArchived(ctx session.Context, req pb.RpcObjectListSetIsArchivedRequest) error { +func (a *dummyObjectArchiver) SetListIsArchived(_ []string, _ bool) error { return nil } diff --git a/core/object.go b/core/object.go index 39489a7c33..16e1e3e604 100644 --- a/core/object.go +++ b/core/object.go @@ -28,30 +28,9 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/space" "github.com/anyproto/anytype-heart/util/builtinobjects" - "github.com/anyproto/anytype-heart/util/internalflag" "github.com/anyproto/anytype-heart/util/pbtypes" ) -func (mw *Middleware) ObjectSetDetails(cctx context.Context, req *pb.RpcObjectSetDetailsRequest) *pb.RpcObjectSetDetailsResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectSetDetailsResponseErrorCode, err error) *pb.RpcObjectSetDetailsResponse { - m := &pb.RpcObjectSetDetailsResponse{Error: &pb.RpcObjectSetDetailsResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } else { - m.Event = mw.getResponseEvent(ctx) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetDetails(ctx, req.ContextId, req.GetDetails()) - }) - if err != nil { - return response(pb.RpcObjectSetDetailsResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectSetDetailsResponseError_NULL, nil) -} - func (mw *Middleware) ObjectDuplicate(cctx context.Context, req *pb.RpcObjectDuplicateRequest) *pb.RpcObjectDuplicateResponse { response := func(templateId string, err error) *pb.RpcObjectDuplicateResponse { m := &pb.RpcObjectDuplicateResponse{ @@ -621,44 +600,6 @@ func (mw *Middleware) ObjectListSetObjectType(cctx context.Context, req *pb.RpcO return response(pb.RpcObjectListSetObjectTypeResponseError_NULL, nil) } -func (mw *Middleware) ObjectListSetDetails(cctx context.Context, req *pb.RpcObjectListSetDetailsRequest) *pb.RpcObjectListSetDetailsResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectListSetDetailsResponseErrorCode, err error) *pb.RpcObjectListSetDetailsResponse { - m := &pb.RpcObjectListSetDetailsResponse{Error: &pb.RpcObjectListSetDetailsResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } else { - m.Event = mw.getResponseEvent(ctx) - } - return m - } - - if err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetDetailsList(ctx, req.ObjectIds, req.Details) - }); err != nil { - return response(pb.RpcObjectListSetDetailsResponseError_UNKNOWN_ERROR, err) - } - - return response(pb.RpcObjectListSetDetailsResponseError_NULL, nil) -} - -func (mw *Middleware) ObjectListModifyDetailValues(_ context.Context, req *pb.RpcObjectListModifyDetailValuesRequest) *pb.RpcObjectListModifyDetailValuesResponse { - response := func(code pb.RpcObjectListModifyDetailValuesResponseErrorCode, err error) *pb.RpcObjectListModifyDetailValuesResponse { - m := &pb.RpcObjectListModifyDetailValuesResponse{Error: &pb.RpcObjectListModifyDetailValuesResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.ModifyDetailsList(req) - }) - if err != nil { - return response(pb.RpcObjectListModifyDetailValuesResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectListModifyDetailValuesResponseError_NULL, nil) -} - func (mw *Middleware) ObjectSetLayout(cctx context.Context, req *pb.RpcObjectSetLayoutRequest) *pb.RpcObjectSetLayoutResponse { ctx := mw.newContext(cctx) response := func(code pb.RpcObjectSetLayoutResponseErrorCode, err error) *pb.RpcObjectSetLayoutResponse { @@ -679,94 +620,6 @@ func (mw *Middleware) ObjectSetLayout(cctx context.Context, req *pb.RpcObjectSet return response(pb.RpcObjectSetLayoutResponseError_NULL, nil) } -func (mw *Middleware) ObjectSetIsArchived(cctx context.Context, req *pb.RpcObjectSetIsArchivedRequest) *pb.RpcObjectSetIsArchivedResponse { - response := func(code pb.RpcObjectSetIsArchivedResponseErrorCode, err error) *pb.RpcObjectSetIsArchivedResponse { - m := &pb.RpcObjectSetIsArchivedResponse{Error: &pb.RpcObjectSetIsArchivedResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetPageIsArchived(*req) - }) - if err != nil { - return response(pb.RpcObjectSetIsArchivedResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectSetIsArchivedResponseError_NULL, nil) -} - -func (mw *Middleware) ObjectSetSource(cctx context.Context, - req *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectSetSourceResponseErrorCode, err error) *pb.RpcObjectSetSourceResponse { - m := &pb.RpcObjectSetSourceResponse{Error: &pb.RpcObjectSetSourceResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } else { - m.Event = mw.getResponseEvent(ctx) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetSource(ctx, *req) - }) - if err != nil { - return response(pb.RpcObjectSetSourceResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectSetSourceResponseError_NULL, nil) -} - -func (mw *Middleware) ObjectWorkspaceSetDashboard(cctx context.Context, req *pb.RpcObjectWorkspaceSetDashboardRequest) *pb.RpcObjectWorkspaceSetDashboardResponse { - ctx := mw.newContext(cctx) - response := func(setId string, err error) *pb.RpcObjectWorkspaceSetDashboardResponse { - resp := &pb.RpcObjectWorkspaceSetDashboardResponse{ - ObjectId: setId, - Error: &pb.RpcObjectWorkspaceSetDashboardResponseError{ - Code: pb.RpcObjectWorkspaceSetDashboardResponseError_NULL, - }, - } - if err != nil { - resp.Error.Code = pb.RpcObjectWorkspaceSetDashboardResponseError_UNKNOWN_ERROR - resp.Error.Description = getErrorDescription(err) - } else { - resp.Event = mw.getResponseEvent(ctx) - } - return resp - } - var ( - setId string - err error - ) - err = mw.doBlockService(func(bs *block.Service) error { - if setId, err = bs.SetWorkspaceDashboardId(ctx, req.ContextId, req.ObjectId); err != nil { - return err - } - return nil - }) - return response(setId, err) -} - -func (mw *Middleware) ObjectSetIsFavorite(cctx context.Context, req *pb.RpcObjectSetIsFavoriteRequest) *pb.RpcObjectSetIsFavoriteResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectSetIsFavoriteResponseErrorCode, err error) *pb.RpcObjectSetIsFavoriteResponse { - m := &pb.RpcObjectSetIsFavoriteResponse{Error: &pb.RpcObjectSetIsFavoriteResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } else { - m.Event = mw.getResponseEvent(ctx) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetPageIsFavorite(*req) - }) - if err != nil { - return response(pb.RpcObjectSetIsFavoriteResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectSetIsFavoriteResponseError_NULL, nil) -} - func (mw *Middleware) ObjectRelationAddFeatured(cctx context.Context, req *pb.RpcObjectRelationAddFeaturedRequest) *pb.RpcObjectRelationAddFeaturedResponse { ctx := mw.newContext(cctx) response := func(code pb.RpcObjectRelationAddFeaturedResponseErrorCode, err error) *pb.RpcObjectRelationAddFeaturedResponse { @@ -867,29 +720,6 @@ func (mw *Middleware) ObjectToBookmark(cctx context.Context, req *pb.RpcObjectTo return response(pb.RpcObjectToBookmarkResponseError_NULL, id, nil) } -func (mw *Middleware) ObjectSetInternalFlags(cctx context.Context, req *pb.RpcObjectSetInternalFlagsRequest) *pb.RpcObjectSetInternalFlagsResponse { - ctx := mw.newContext(cctx) - response := func(code pb.RpcObjectSetInternalFlagsResponseErrorCode, err error) *pb.RpcObjectSetInternalFlagsResponse { - m := &pb.RpcObjectSetInternalFlagsResponse{Error: &pb.RpcObjectSetInternalFlagsResponseError{Code: code}} - if err != nil { - m.Error.Description = getErrorDescription(err) - } else { - m.Event = mw.getResponseEvent(ctx) - } - return m - } - err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.ModifyDetails(req.ContextId, func(current *types.Struct) (*types.Struct, error) { - d := pbtypes.CopyStruct(current, false) - return internalflag.PutToDetails(d, req.InternalFlags), nil - }) - }) - if err != nil { - return response(pb.RpcObjectSetInternalFlagsResponseError_UNKNOWN_ERROR, err) - } - return response(pb.RpcObjectSetInternalFlagsResponseError_NULL, nil) -} - func (mw *Middleware) ObjectImport(cctx context.Context, req *pb.RpcObjectImportRequest) *pb.RpcObjectImportResponse { response := func(code pb.RpcObjectImportResponseErrorCode, err error) *pb.RpcObjectImportResponse { m := &pb.RpcObjectImportResponse{ diff --git a/core/relations.go b/core/relations.go index 7200b91056..686c2ed0f9 100644 --- a/core/relations.go +++ b/core/relations.go @@ -5,20 +5,21 @@ import ( "errors" "github.com/anyproto/anytype-heart/core/block" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" ) func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse { - blockService := getService[*block.Service](mw) + detailsService := getService[details.Service](mw) keys := make([]domain.RelationKey, 0, len(req.RelationKeys)) for _, relKey := range req.RelationKeys { keys = append(keys, domain.RelationKey(relKey)) } - err := blockService.ObjectTypeRelationAdd(cctx, req.ObjectTypeUrl, keys) + err := detailsService.ObjectTypeAddRelations(cctx, req.ObjectTypeUrl, keys) code := mapErrorCode(err, - errToCode(block.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationAddResponseError_READONLY_OBJECT_TYPE), + errToCode(details.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationAddResponseError_READONLY_OBJECT_TYPE), ) return &pb.RpcObjectTypeRelationAddResponse{ Error: &pb.RpcObjectTypeRelationAddResponseError{ @@ -29,15 +30,15 @@ func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObj } func (mw *Middleware) ObjectTypeRelationRemove(cctx context.Context, req *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse { - blockService := getService[*block.Service](mw) + detailsService := getService[details.Service](mw) keys := make([]domain.RelationKey, 0, len(req.RelationKeys)) for _, relKey := range req.RelationKeys { keys = append(keys, domain.RelationKey(relKey)) } - err := blockService.ObjectTypeRemoveRelations(cctx, req.ObjectTypeUrl, keys) + err := detailsService.ObjectTypeRemoveRelations(cctx, req.ObjectTypeUrl, keys) code := mapErrorCode(err, - errToCode(block.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationRemoveResponseError_READONLY_OBJECT_TYPE), + errToCode(details.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationRemoveResponseError_READONLY_OBJECT_TYPE), ) return &pb.RpcObjectTypeRelationRemoveResponse{ Error: &pb.RpcObjectTypeRelationRemoveResponseError{ @@ -97,14 +98,6 @@ func (mw *Middleware) RelationListWithValue(_ context.Context, req *pb.RpcRelati return m } - var ( - keys []string - counters []int64 - ) - - err := mw.doBlockService(func(bs *block.Service) (err error) { - keys, counters, err = bs.ListRelationsWithValue(req.SpaceId, req.Value) - return - }) + keys, counters, err := getService[details.Service](mw).ListRelationsWithValue(req.SpaceId, req.Value) return response(keys, counters, err) } diff --git a/core/workspace.go b/core/workspace.go index 80220191cb..57f8326f36 100644 --- a/core/workspace.go +++ b/core/workspace.go @@ -8,6 +8,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/cache" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/editor" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -74,10 +75,7 @@ func (mw *Middleware) WorkspaceSetInfo(cctx context.Context, req *pb.RpcWorkspac return m } - err := mw.doBlockService(func(bs *block.Service) (err error) { - err = bs.SetSpaceInfo(req) - return - }) + err := getService[details.Service](mw).SetSpaceInfo(req.SpaceId, req.Details) if err != nil { return response(pb.RpcWorkspaceSetInfoResponseError_UNKNOWN_ERROR, err) } diff --git a/pkg/lib/localstore/addr/addr.go b/pkg/lib/localstore/addr/addr.go index 0c1e74b736..ca13197e2c 100644 --- a/pkg/lib/localstore/addr/addr.go +++ b/pkg/lib/localstore/addr/addr.go @@ -48,10 +48,3 @@ func ExtractVirtualSourceType(id string) (model.SmartBlockType, error) { func TimeToID(t time.Time) string { return DatePrefix + t.Format("2006-01-02") } - -func DateIDToDayStart(id string) (time.Time, error) { - if !strings.HasPrefix(id, DatePrefix) { - return time.Time{}, fmt.Errorf("invalid id: date prefix not found") - } - return time.Parse("2006-01-02", strings.TrimPrefix(id, DatePrefix)) -} diff --git a/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go b/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go index 92822a5e2b..308fbb3125 100644 --- a/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go +++ b/pkg/lib/localstore/objectstore/mock_objectstore/mock_ObjectStore.go @@ -2272,53 +2272,6 @@ func (_c *MockObjectStore_Query_Call) RunAndReturn(run func(database.Query) ([]d return _c } -// QueryAndProcess provides a mock function with given fields: q, proc -func (_m *MockObjectStore) QueryAndProcess(q database.Query, proc func(*types.Struct)) error { - ret := _m.Called(q, proc) - - if len(ret) == 0 { - panic("no return value specified for QueryAndProcess") - } - - var r0 error - if rf, ok := ret.Get(0).(func(database.Query, func(*types.Struct)) error); ok { - r0 = rf(q, proc) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// MockObjectStore_QueryAndProcess_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryAndProcess' -type MockObjectStore_QueryAndProcess_Call struct { - *mock.Call -} - -// QueryAndProcess is a helper method to define mock.On call -// - q database.Query -// - proc func(*types.Struct) -func (_e *MockObjectStore_Expecter) QueryAndProcess(q interface{}, proc interface{}) *MockObjectStore_QueryAndProcess_Call { - return &MockObjectStore_QueryAndProcess_Call{Call: _e.mock.On("QueryAndProcess", q, proc)} -} - -func (_c *MockObjectStore_QueryAndProcess_Call) Run(run func(q database.Query, proc func(*types.Struct))) *MockObjectStore_QueryAndProcess_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(database.Query), args[1].(func(*types.Struct))) - }) - return _c -} - -func (_c *MockObjectStore_QueryAndProcess_Call) Return(_a0 error) *MockObjectStore_QueryAndProcess_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *MockObjectStore_QueryAndProcess_Call) RunAndReturn(run func(database.Query, func(*types.Struct)) error) *MockObjectStore_QueryAndProcess_Call { - _c.Call.Return(run) - return _c -} - // QueryByID provides a mock function with given fields: ids func (_m *MockObjectStore) QueryByID(ids []string) ([]database.Record, error) { ret := _m.Called(ids) @@ -2445,6 +2398,53 @@ func (_c *MockObjectStore_QueryByIDAndSubscribeForChanges_Call) RunAndReturn(run return _c } +// QueryIterate provides a mock function with given fields: q, proc +func (_m *MockObjectStore) QueryIterate(q database.Query, proc func(*types.Struct)) error { + ret := _m.Called(q, proc) + + if len(ret) == 0 { + panic("no return value specified for QueryIterate") + } + + var r0 error + if rf, ok := ret.Get(0).(func(database.Query, func(*types.Struct)) error); ok { + r0 = rf(q, proc) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockObjectStore_QueryIterate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryIterate' +type MockObjectStore_QueryIterate_Call struct { + *mock.Call +} + +// QueryIterate is a helper method to define mock.On call +// - q database.Query +// - proc func(*types.Struct) +func (_e *MockObjectStore_Expecter) QueryIterate(q interface{}, proc interface{}) *MockObjectStore_QueryIterate_Call { + return &MockObjectStore_QueryIterate_Call{Call: _e.mock.On("QueryIterate", q, proc)} +} + +func (_c *MockObjectStore_QueryIterate_Call) Run(run func(q database.Query, proc func(*types.Struct))) *MockObjectStore_QueryIterate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(database.Query), args[1].(func(*types.Struct))) + }) + return _c +} + +func (_c *MockObjectStore_QueryIterate_Call) Return(_a0 error) *MockObjectStore_QueryIterate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockObjectStore_QueryIterate_Call) RunAndReturn(run func(database.Query, func(*types.Struct)) error) *MockObjectStore_QueryIterate_Call { + _c.Call.Return(run) + return _c +} + // QueryObjectIDs provides a mock function with given fields: q func (_m *MockObjectStore) QueryObjectIDs(q database.Query) ([]string, int, error) { ret := _m.Called(q) diff --git a/pkg/lib/localstore/objectstore/objects.go b/pkg/lib/localstore/objectstore/objects.go index bde43dc43d..708b05ce5a 100644 --- a/pkg/lib/localstore/objectstore/objects.go +++ b/pkg/lib/localstore/objectstore/objects.go @@ -56,7 +56,7 @@ type ObjectStore interface { QueryByID(ids []string) (records []database.Record, err error) QueryByIDAndSubscribeForChanges(ids []string, subscription database.Subscription) (records []database.Record, close func(), err error) QueryObjectIDs(q database.Query) (ids []string, total int, err error) - QueryAndProcess(q database.Query, proc func(details *types.Struct)) error + QueryIterate(q database.Query, proc func(details *types.Struct)) error HasIDs(ids ...string) (exists []string, err error) GetByIDs(spaceID string, ids []string) ([]*model.ObjectInfo, error) diff --git a/pkg/lib/localstore/objectstore/queries.go b/pkg/lib/localstore/objectstore/queries.go index d0ea0b42a4..47171d23a0 100644 --- a/pkg/lib/localstore/objectstore/queries.go +++ b/pkg/lib/localstore/objectstore/queries.go @@ -505,7 +505,7 @@ func (s *dsObjectStore) QueryByIDAndSubscribeForChanges(ids []string, sub databa return } -func (s *dsObjectStore) QueryAndProcess(q database.Query, proc func(details *types.Struct)) error { +func (s *dsObjectStore) QueryIterate(q database.Query, proc func(details *types.Struct)) error { arena := s.arenaPool.Get() defer s.arenaPool.Put(arena) diff --git a/pkg/lib/localstore/objectstore/queries_test.go b/pkg/lib/localstore/objectstore/queries_test.go index 92a41a9af9..575a9809fe 100644 --- a/pkg/lib/localstore/objectstore/queries_test.go +++ b/pkg/lib/localstore/objectstore/queries_test.go @@ -1291,7 +1291,7 @@ func TestDsObjectStore_QueryAndProcess(t *testing.T) { t.Run("counter", func(t *testing.T) { var counter = 0 - err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + err := s.QueryIterate(database.Query{Filters: []*model.BlockContentDataviewFilter{{ RelationKey: bundle.RelationKeySpaceId.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(spaceId), @@ -1305,7 +1305,7 @@ func TestDsObjectStore_QueryAndProcess(t *testing.T) { t.Run("favorites collector", func(t *testing.T) { favs := make([]string, 0) - err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + err := s.QueryIterate(database.Query{Filters: []*model.BlockContentDataviewFilter{{ RelationKey: bundle.RelationKeySpaceId.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(spaceId), @@ -1321,7 +1321,7 @@ func TestDsObjectStore_QueryAndProcess(t *testing.T) { t.Run("name and description analyzer", func(t *testing.T) { ids := make([]string, 0) - err := s.QueryAndProcess(database.Query{Filters: []*model.BlockContentDataviewFilter{{ + err := s.QueryIterate(database.Query{Filters: []*model.BlockContentDataviewFilter{{ RelationKey: bundle.RelationKeySpaceId.String(), Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(spaceId), diff --git a/util/builtinobjects/builtinobjects.go b/util/builtinobjects/builtinobjects.go index 31fd9b060d..bbda327cff 100644 --- a/util/builtinobjects/builtinobjects.go +++ b/util/builtinobjects/builtinobjects.go @@ -17,8 +17,8 @@ import ( "github.com/anyproto/any-sync/app" "github.com/miolini/datacounter" - "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/cache" + "github.com/anyproto/anytype-heart/core/block/details" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/editor/widget" importer "github.com/anyproto/anytype-heart/core/block/import" @@ -146,7 +146,7 @@ type BuiltinObjects interface { } type builtinObjects struct { - blockService *block.Service + detailsService details.Service importer importer.Importer store objectstore.ObjectStore tempDirService core.TempDirProvider @@ -160,7 +160,7 @@ func New() BuiltinObjects { } func (b *builtinObjects) Init(a *app.App) (err error) { - b.blockService = a.MustComponent(block.CName).(*block.Service) + b.detailsService = app.MustComponent[details.Service](a) b.importer = a.MustComponent(importer.CName).(importer.Importer) b.store = app.MustComponent[objectstore.ObjectStore](a) b.tempDirService = app.MustComponent[core.TempDirProvider](a) @@ -392,7 +392,7 @@ func (b *builtinObjects) getOldHomePageId(zipReader *zip.Reader) (id string, err } func (b *builtinObjects) setHomePageIdToWorkspace(spc clientspace.Space, id string) { - if err := b.blockService.SetDetails(nil, + if err := b.detailsService.SetDetails(nil, spc.DerivedIDs().Workspace, []*model.Detail{ { @@ -414,7 +414,7 @@ func (b *builtinObjects) createWidgets(ctx session.Context, spaceId string, useC widgetObjectID := spc.DerivedIDs().Widgets - if err = cache.DoStateCtx(b.blockService, ctx, widgetObjectID, func(s *state.State, w widget.Widget) error { + if err = cache.DoStateCtx(b.detailsService, ctx, widgetObjectID, func(s *state.State, w widget.Widget) error { for _, param := range widgetParams[useCase] { objectID := param.objectID if param.isObjectIDChanged { diff --git a/util/testMock/objectstore_mock.go b/util/testMock/objectstore_mock.go index 6f23e562d3..1032052c13 100644 --- a/util/testMock/objectstore_mock.go +++ b/util/testMock/objectstore_mock.go @@ -653,20 +653,6 @@ func (mr *MockObjectStoreMockRecorder) Query(arg0 any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockObjectStore)(nil).Query), arg0) } -// QueryAndProcess mocks base method. -func (m *MockObjectStore) QueryAndProcess(arg0 database.Query, arg1 func(*types.Struct)) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "QueryAndProcess", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 -} - -// QueryAndProcess indicates an expected call of QueryAndProcess. -func (mr *MockObjectStoreMockRecorder) QueryAndProcess(arg0, arg1 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryAndProcess", reflect.TypeOf((*MockObjectStore)(nil).QueryAndProcess), arg0, arg1) -} - // QueryByID mocks base method. func (m *MockObjectStore) QueryByID(arg0 []string) ([]database.Record, error) { m.ctrl.T.Helper() @@ -698,6 +684,20 @@ func (mr *MockObjectStoreMockRecorder) QueryByIDAndSubscribeForChanges(arg0, arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryByIDAndSubscribeForChanges", reflect.TypeOf((*MockObjectStore)(nil).QueryByIDAndSubscribeForChanges), arg0, arg1) } +// QueryIterate mocks base method. +func (m *MockObjectStore) QueryIterate(arg0 database.Query, arg1 func(*types.Struct)) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryIterate", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// QueryIterate indicates an expected call of QueryIterate. +func (mr *MockObjectStoreMockRecorder) QueryIterate(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryIterate", reflect.TypeOf((*MockObjectStore)(nil).QueryIterate), arg0, arg1) +} + // QueryObjectIDs mocks base method. func (m *MockObjectStore) QueryObjectIDs(arg0 database.Query) ([]string, int, error) { m.ctrl.T.Helper() From bdfdbdb35a9b7e1cbbf705fa781e76e9e3d7161a Mon Sep 17 00:00:00 2001 From: kirillston Date: Thu, 12 Sep 2024 18:15:00 +0200 Subject: [PATCH 06/20] GO-3964 Add mock --- .../details/mock_details/mock_Service.go | 1001 +++++++++++++++++ 1 file changed, 1001 insertions(+) create mode 100644 core/block/details/mock_details/mock_Service.go diff --git a/core/block/details/mock_details/mock_Service.go b/core/block/details/mock_details/mock_Service.go new file mode 100644 index 0000000000..56fd4fe2ee --- /dev/null +++ b/core/block/details/mock_details/mock_Service.go @@ -0,0 +1,1001 @@ +// Code generated by mockery. DO NOT EDIT. + +package mock_details + +import ( + context "context" + + app "github.com/anyproto/any-sync/app" + + domain "github.com/anyproto/anytype-heart/core/domain" + + mock "github.com/stretchr/testify/mock" + + model "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + + pb "github.com/anyproto/anytype-heart/pb" + + session "github.com/anyproto/anytype-heart/core/session" + + smartblock "github.com/anyproto/anytype-heart/core/block/editor/smartblock" + + types "github.com/gogo/protobuf/types" +) + +// MockService is an autogenerated mock type for the Service type +type MockService struct { + mock.Mock +} + +type MockService_Expecter struct { + mock *mock.Mock +} + +func (_m *MockService) EXPECT() *MockService_Expecter { + return &MockService_Expecter{mock: &_m.Mock} +} + +// GetObject provides a mock function with given fields: ctx, objectID +func (_m *MockService) GetObject(ctx context.Context, objectID string) (smartblock.SmartBlock, error) { + ret := _m.Called(ctx, objectID) + + if len(ret) == 0 { + panic("no return value specified for GetObject") + } + + var r0 smartblock.SmartBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (smartblock.SmartBlock, error)); ok { + return rf(ctx, objectID) + } + if rf, ok := ret.Get(0).(func(context.Context, string) smartblock.SmartBlock); ok { + r0 = rf(ctx, objectID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(smartblock.SmartBlock) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, objectID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockService_GetObject_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObject' +type MockService_GetObject_Call struct { + *mock.Call +} + +// GetObject is a helper method to define mock.On call +// - ctx context.Context +// - objectID string +func (_e *MockService_Expecter) GetObject(ctx interface{}, objectID interface{}) *MockService_GetObject_Call { + return &MockService_GetObject_Call{Call: _e.mock.On("GetObject", ctx, objectID)} +} + +func (_c *MockService_GetObject_Call) Run(run func(ctx context.Context, objectID string)) *MockService_GetObject_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *MockService_GetObject_Call) Return(sb smartblock.SmartBlock, err error) *MockService_GetObject_Call { + _c.Call.Return(sb, err) + return _c +} + +func (_c *MockService_GetObject_Call) RunAndReturn(run func(context.Context, string) (smartblock.SmartBlock, error)) *MockService_GetObject_Call { + _c.Call.Return(run) + return _c +} + +// GetObjectByFullID provides a mock function with given fields: ctx, id +func (_m *MockService) GetObjectByFullID(ctx context.Context, id domain.FullID) (smartblock.SmartBlock, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for GetObjectByFullID") + } + + var r0 smartblock.SmartBlock + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) (smartblock.SmartBlock, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, domain.FullID) smartblock.SmartBlock); ok { + r0 = rf(ctx, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(smartblock.SmartBlock) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, domain.FullID) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockService_GetObjectByFullID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetObjectByFullID' +type MockService_GetObjectByFullID_Call struct { + *mock.Call +} + +// GetObjectByFullID is a helper method to define mock.On call +// - ctx context.Context +// - id domain.FullID +func (_e *MockService_Expecter) GetObjectByFullID(ctx interface{}, id interface{}) *MockService_GetObjectByFullID_Call { + return &MockService_GetObjectByFullID_Call{Call: _e.mock.On("GetObjectByFullID", ctx, id)} +} + +func (_c *MockService_GetObjectByFullID_Call) Run(run func(ctx context.Context, id domain.FullID)) *MockService_GetObjectByFullID_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(domain.FullID)) + }) + return _c +} + +func (_c *MockService_GetObjectByFullID_Call) Return(sb smartblock.SmartBlock, err error) *MockService_GetObjectByFullID_Call { + _c.Call.Return(sb, err) + return _c +} + +func (_c *MockService_GetObjectByFullID_Call) RunAndReturn(run func(context.Context, domain.FullID) (smartblock.SmartBlock, error)) *MockService_GetObjectByFullID_Call { + _c.Call.Return(run) + return _c +} + +// Init provides a mock function with given fields: a +func (_m *MockService) Init(a *app.App) error { + ret := _m.Called(a) + + if len(ret) == 0 { + panic("no return value specified for Init") + } + + var r0 error + if rf, ok := ret.Get(0).(func(*app.App) error); ok { + r0 = rf(a) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init' +type MockService_Init_Call struct { + *mock.Call +} + +// Init is a helper method to define mock.On call +// - a *app.App +func (_e *MockService_Expecter) Init(a interface{}) *MockService_Init_Call { + return &MockService_Init_Call{Call: _e.mock.On("Init", a)} +} + +func (_c *MockService_Init_Call) Run(run func(a *app.App)) *MockService_Init_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*app.App)) + }) + return _c +} + +func (_c *MockService_Init_Call) Return(err error) *MockService_Init_Call { + _c.Call.Return(err) + return _c +} + +func (_c *MockService_Init_Call) RunAndReturn(run func(*app.App) error) *MockService_Init_Call { + _c.Call.Return(run) + return _c +} + +// ListRelationsWithValue provides a mock function with given fields: spaceId, value +func (_m *MockService) ListRelationsWithValue(spaceId string, value *types.Value) ([]string, []int64, error) { + ret := _m.Called(spaceId, value) + + if len(ret) == 0 { + panic("no return value specified for ListRelationsWithValue") + } + + var r0 []string + var r1 []int64 + var r2 error + if rf, ok := ret.Get(0).(func(string, *types.Value) ([]string, []int64, error)); ok { + return rf(spaceId, value) + } + if rf, ok := ret.Get(0).(func(string, *types.Value) []string); ok { + r0 = rf(spaceId, value) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + if rf, ok := ret.Get(1).(func(string, *types.Value) []int64); ok { + r1 = rf(spaceId, value) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]int64) + } + } + + if rf, ok := ret.Get(2).(func(string, *types.Value) error); ok { + r2 = rf(spaceId, value) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// MockService_ListRelationsWithValue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ListRelationsWithValue' +type MockService_ListRelationsWithValue_Call struct { + *mock.Call +} + +// ListRelationsWithValue is a helper method to define mock.On call +// - spaceId string +// - value *types.Value +func (_e *MockService_Expecter) ListRelationsWithValue(spaceId interface{}, value interface{}) *MockService_ListRelationsWithValue_Call { + return &MockService_ListRelationsWithValue_Call{Call: _e.mock.On("ListRelationsWithValue", spaceId, value)} +} + +func (_c *MockService_ListRelationsWithValue_Call) Run(run func(spaceId string, value *types.Value)) *MockService_ListRelationsWithValue_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(*types.Value)) + }) + return _c +} + +func (_c *MockService_ListRelationsWithValue_Call) Return(keys []string, counters []int64, err error) *MockService_ListRelationsWithValue_Call { + _c.Call.Return(keys, counters, err) + return _c +} + +func (_c *MockService_ListRelationsWithValue_Call) RunAndReturn(run func(string, *types.Value) ([]string, []int64, error)) *MockService_ListRelationsWithValue_Call { + _c.Call.Return(run) + return _c +} + +// ModifyDetails provides a mock function with given fields: objectId, modifier +func (_m *MockService) ModifyDetails(objectId string, modifier func(*types.Struct) (*types.Struct, error)) error { + ret := _m.Called(objectId, modifier) + + if len(ret) == 0 { + panic("no return value specified for ModifyDetails") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, func(*types.Struct) (*types.Struct, error)) error); ok { + r0 = rf(objectId, modifier) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_ModifyDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ModifyDetails' +type MockService_ModifyDetails_Call struct { + *mock.Call +} + +// ModifyDetails is a helper method to define mock.On call +// - objectId string +// - modifier func(*types.Struct)(*types.Struct , error) +func (_e *MockService_Expecter) ModifyDetails(objectId interface{}, modifier interface{}) *MockService_ModifyDetails_Call { + return &MockService_ModifyDetails_Call{Call: _e.mock.On("ModifyDetails", objectId, modifier)} +} + +func (_c *MockService_ModifyDetails_Call) Run(run func(objectId string, modifier func(*types.Struct) (*types.Struct, error))) *MockService_ModifyDetails_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(func(*types.Struct) (*types.Struct, error))) + }) + return _c +} + +func (_c *MockService_ModifyDetails_Call) Return(_a0 error) *MockService_ModifyDetails_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_ModifyDetails_Call) RunAndReturn(run func(string, func(*types.Struct) (*types.Struct, error)) error) *MockService_ModifyDetails_Call { + _c.Call.Return(run) + return _c +} + +// ModifyDetailsList provides a mock function with given fields: req +func (_m *MockService) ModifyDetailsList(req *pb.RpcObjectListModifyDetailValuesRequest) error { + ret := _m.Called(req) + + if len(ret) == 0 { + panic("no return value specified for ModifyDetailsList") + } + + var r0 error + if rf, ok := ret.Get(0).(func(*pb.RpcObjectListModifyDetailValuesRequest) error); ok { + r0 = rf(req) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_ModifyDetailsList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ModifyDetailsList' +type MockService_ModifyDetailsList_Call struct { + *mock.Call +} + +// ModifyDetailsList is a helper method to define mock.On call +// - req *pb.RpcObjectListModifyDetailValuesRequest +func (_e *MockService_Expecter) ModifyDetailsList(req interface{}) *MockService_ModifyDetailsList_Call { + return &MockService_ModifyDetailsList_Call{Call: _e.mock.On("ModifyDetailsList", req)} +} + +func (_c *MockService_ModifyDetailsList_Call) Run(run func(req *pb.RpcObjectListModifyDetailValuesRequest)) *MockService_ModifyDetailsList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*pb.RpcObjectListModifyDetailValuesRequest)) + }) + return _c +} + +func (_c *MockService_ModifyDetailsList_Call) Return(_a0 error) *MockService_ModifyDetailsList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_ModifyDetailsList_Call) RunAndReturn(run func(*pb.RpcObjectListModifyDetailValuesRequest) error) *MockService_ModifyDetailsList_Call { + _c.Call.Return(run) + return _c +} + +// Name provides a mock function with given fields: +func (_m *MockService) Name() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Name") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// MockService_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' +type MockService_Name_Call struct { + *mock.Call +} + +// Name is a helper method to define mock.On call +func (_e *MockService_Expecter) Name() *MockService_Name_Call { + return &MockService_Name_Call{Call: _e.mock.On("Name")} +} + +func (_c *MockService_Name_Call) Run(run func()) *MockService_Name_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *MockService_Name_Call) Return(name string) *MockService_Name_Call { + _c.Call.Return(name) + return _c +} + +func (_c *MockService_Name_Call) RunAndReturn(run func() string) *MockService_Name_Call { + _c.Call.Return(run) + return _c +} + +// ObjectTypeAddRelations provides a mock function with given fields: ctx, objectTypeId, relationKeys +func (_m *MockService) ObjectTypeAddRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { + ret := _m.Called(ctx, objectTypeId, relationKeys) + + if len(ret) == 0 { + panic("no return value specified for ObjectTypeAddRelations") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, []domain.RelationKey) error); ok { + r0 = rf(ctx, objectTypeId, relationKeys) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_ObjectTypeAddRelations_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeAddRelations' +type MockService_ObjectTypeAddRelations_Call struct { + *mock.Call +} + +// ObjectTypeAddRelations is a helper method to define mock.On call +// - ctx context.Context +// - objectTypeId string +// - relationKeys []domain.RelationKey +func (_e *MockService_Expecter) ObjectTypeAddRelations(ctx interface{}, objectTypeId interface{}, relationKeys interface{}) *MockService_ObjectTypeAddRelations_Call { + return &MockService_ObjectTypeAddRelations_Call{Call: _e.mock.On("ObjectTypeAddRelations", ctx, objectTypeId, relationKeys)} +} + +func (_c *MockService_ObjectTypeAddRelations_Call) Run(run func(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey)) *MockService_ObjectTypeAddRelations_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].([]domain.RelationKey)) + }) + return _c +} + +func (_c *MockService_ObjectTypeAddRelations_Call) Return(_a0 error) *MockService_ObjectTypeAddRelations_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_ObjectTypeAddRelations_Call) RunAndReturn(run func(context.Context, string, []domain.RelationKey) error) *MockService_ObjectTypeAddRelations_Call { + _c.Call.Return(run) + return _c +} + +// ObjectTypeRemoveRelations provides a mock function with given fields: ctx, objectTypeId, relationKeys +func (_m *MockService) ObjectTypeRemoveRelations(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey) error { + ret := _m.Called(ctx, objectTypeId, relationKeys) + + if len(ret) == 0 { + panic("no return value specified for ObjectTypeRemoveRelations") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, []domain.RelationKey) error); ok { + r0 = rf(ctx, objectTypeId, relationKeys) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_ObjectTypeRemoveRelations_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ObjectTypeRemoveRelations' +type MockService_ObjectTypeRemoveRelations_Call struct { + *mock.Call +} + +// ObjectTypeRemoveRelations is a helper method to define mock.On call +// - ctx context.Context +// - objectTypeId string +// - relationKeys []domain.RelationKey +func (_e *MockService_Expecter) ObjectTypeRemoveRelations(ctx interface{}, objectTypeId interface{}, relationKeys interface{}) *MockService_ObjectTypeRemoveRelations_Call { + return &MockService_ObjectTypeRemoveRelations_Call{Call: _e.mock.On("ObjectTypeRemoveRelations", ctx, objectTypeId, relationKeys)} +} + +func (_c *MockService_ObjectTypeRemoveRelations_Call) Run(run func(ctx context.Context, objectTypeId string, relationKeys []domain.RelationKey)) *MockService_ObjectTypeRemoveRelations_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].([]domain.RelationKey)) + }) + return _c +} + +func (_c *MockService_ObjectTypeRemoveRelations_Call) Return(_a0 error) *MockService_ObjectTypeRemoveRelations_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_ObjectTypeRemoveRelations_Call) RunAndReturn(run func(context.Context, string, []domain.RelationKey) error) *MockService_ObjectTypeRemoveRelations_Call { + _c.Call.Return(run) + return _c +} + +// SetDetails provides a mock function with given fields: ctx, objectId, _a2 +func (_m *MockService) SetDetails(ctx session.Context, objectId string, _a2 []*model.Detail) error { + ret := _m.Called(ctx, objectId, _a2) + + if len(ret) == 0 { + panic("no return value specified for SetDetails") + } + + var r0 error + if rf, ok := ret.Get(0).(func(session.Context, string, []*model.Detail) error); ok { + r0 = rf(ctx, objectId, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetDetails_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDetails' +type MockService_SetDetails_Call struct { + *mock.Call +} + +// SetDetails is a helper method to define mock.On call +// - ctx session.Context +// - objectId string +// - _a2 []*model.Detail +func (_e *MockService_Expecter) SetDetails(ctx interface{}, objectId interface{}, _a2 interface{}) *MockService_SetDetails_Call { + return &MockService_SetDetails_Call{Call: _e.mock.On("SetDetails", ctx, objectId, _a2)} +} + +func (_c *MockService_SetDetails_Call) Run(run func(ctx session.Context, objectId string, _a2 []*model.Detail)) *MockService_SetDetails_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(session.Context), args[1].(string), args[2].([]*model.Detail)) + }) + return _c +} + +func (_c *MockService_SetDetails_Call) Return(_a0 error) *MockService_SetDetails_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetDetails_Call) RunAndReturn(run func(session.Context, string, []*model.Detail) error) *MockService_SetDetails_Call { + _c.Call.Return(run) + return _c +} + +// SetDetailsAndUpdateLastUsed provides a mock function with given fields: ctx, objectId, _a2 +func (_m *MockService) SetDetailsAndUpdateLastUsed(ctx session.Context, objectId string, _a2 []*model.Detail) error { + ret := _m.Called(ctx, objectId, _a2) + + if len(ret) == 0 { + panic("no return value specified for SetDetailsAndUpdateLastUsed") + } + + var r0 error + if rf, ok := ret.Get(0).(func(session.Context, string, []*model.Detail) error); ok { + r0 = rf(ctx, objectId, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetDetailsAndUpdateLastUsed_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDetailsAndUpdateLastUsed' +type MockService_SetDetailsAndUpdateLastUsed_Call struct { + *mock.Call +} + +// SetDetailsAndUpdateLastUsed is a helper method to define mock.On call +// - ctx session.Context +// - objectId string +// - _a2 []*model.Detail +func (_e *MockService_Expecter) SetDetailsAndUpdateLastUsed(ctx interface{}, objectId interface{}, _a2 interface{}) *MockService_SetDetailsAndUpdateLastUsed_Call { + return &MockService_SetDetailsAndUpdateLastUsed_Call{Call: _e.mock.On("SetDetailsAndUpdateLastUsed", ctx, objectId, _a2)} +} + +func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) Run(run func(ctx session.Context, objectId string, _a2 []*model.Detail)) *MockService_SetDetailsAndUpdateLastUsed_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(session.Context), args[1].(string), args[2].([]*model.Detail)) + }) + return _c +} + +func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) Return(_a0 error) *MockService_SetDetailsAndUpdateLastUsed_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) RunAndReturn(run func(session.Context, string, []*model.Detail) error) *MockService_SetDetailsAndUpdateLastUsed_Call { + _c.Call.Return(run) + return _c +} + +// SetDetailsList provides a mock function with given fields: ctx, objectIds, _a2 +func (_m *MockService) SetDetailsList(ctx session.Context, objectIds []string, _a2 []*model.Detail) error { + ret := _m.Called(ctx, objectIds, _a2) + + if len(ret) == 0 { + panic("no return value specified for SetDetailsList") + } + + var r0 error + if rf, ok := ret.Get(0).(func(session.Context, []string, []*model.Detail) error); ok { + r0 = rf(ctx, objectIds, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetDetailsList_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetDetailsList' +type MockService_SetDetailsList_Call struct { + *mock.Call +} + +// SetDetailsList is a helper method to define mock.On call +// - ctx session.Context +// - objectIds []string +// - _a2 []*model.Detail +func (_e *MockService_Expecter) SetDetailsList(ctx interface{}, objectIds interface{}, _a2 interface{}) *MockService_SetDetailsList_Call { + return &MockService_SetDetailsList_Call{Call: _e.mock.On("SetDetailsList", ctx, objectIds, _a2)} +} + +func (_c *MockService_SetDetailsList_Call) Run(run func(ctx session.Context, objectIds []string, _a2 []*model.Detail)) *MockService_SetDetailsList_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(session.Context), args[1].([]string), args[2].([]*model.Detail)) + }) + return _c +} + +func (_c *MockService_SetDetailsList_Call) Return(_a0 error) *MockService_SetDetailsList_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetDetailsList_Call) RunAndReturn(run func(session.Context, []string, []*model.Detail) error) *MockService_SetDetailsList_Call { + _c.Call.Return(run) + return _c +} + +// SetIsArchived provides a mock function with given fields: objectId, isArchived +func (_m *MockService) SetIsArchived(objectId string, isArchived bool) error { + ret := _m.Called(objectId, isArchived) + + if len(ret) == 0 { + panic("no return value specified for SetIsArchived") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, bool) error); ok { + r0 = rf(objectId, isArchived) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetIsArchived' +type MockService_SetIsArchived_Call struct { + *mock.Call +} + +// SetIsArchived is a helper method to define mock.On call +// - objectId string +// - isArchived bool +func (_e *MockService_Expecter) SetIsArchived(objectId interface{}, isArchived interface{}) *MockService_SetIsArchived_Call { + return &MockService_SetIsArchived_Call{Call: _e.mock.On("SetIsArchived", objectId, isArchived)} +} + +func (_c *MockService_SetIsArchived_Call) Run(run func(objectId string, isArchived bool)) *MockService_SetIsArchived_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(bool)) + }) + return _c +} + +func (_c *MockService_SetIsArchived_Call) Return(_a0 error) *MockService_SetIsArchived_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetIsArchived_Call) RunAndReturn(run func(string, bool) error) *MockService_SetIsArchived_Call { + _c.Call.Return(run) + return _c +} + +// SetIsFavorite provides a mock function with given fields: objectId, isFavorite +func (_m *MockService) SetIsFavorite(objectId string, isFavorite bool) error { + ret := _m.Called(objectId, isFavorite) + + if len(ret) == 0 { + panic("no return value specified for SetIsFavorite") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, bool) error); ok { + r0 = rf(objectId, isFavorite) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetIsFavorite' +type MockService_SetIsFavorite_Call struct { + *mock.Call +} + +// SetIsFavorite is a helper method to define mock.On call +// - objectId string +// - isFavorite bool +func (_e *MockService_Expecter) SetIsFavorite(objectId interface{}, isFavorite interface{}) *MockService_SetIsFavorite_Call { + return &MockService_SetIsFavorite_Call{Call: _e.mock.On("SetIsFavorite", objectId, isFavorite)} +} + +func (_c *MockService_SetIsFavorite_Call) Run(run func(objectId string, isFavorite bool)) *MockService_SetIsFavorite_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(bool)) + }) + return _c +} + +func (_c *MockService_SetIsFavorite_Call) Return(_a0 error) *MockService_SetIsFavorite_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetIsFavorite_Call) RunAndReturn(run func(string, bool) error) *MockService_SetIsFavorite_Call { + _c.Call.Return(run) + return _c +} + +// SetListIsArchived provides a mock function with given fields: objectIds, isArchived +func (_m *MockService) SetListIsArchived(objectIds []string, isArchived bool) error { + ret := _m.Called(objectIds, isArchived) + + if len(ret) == 0 { + panic("no return value specified for SetListIsArchived") + } + + var r0 error + if rf, ok := ret.Get(0).(func([]string, bool) error); ok { + r0 = rf(objectIds, isArchived) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetListIsArchived_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetListIsArchived' +type MockService_SetListIsArchived_Call struct { + *mock.Call +} + +// SetListIsArchived is a helper method to define mock.On call +// - objectIds []string +// - isArchived bool +func (_e *MockService_Expecter) SetListIsArchived(objectIds interface{}, isArchived interface{}) *MockService_SetListIsArchived_Call { + return &MockService_SetListIsArchived_Call{Call: _e.mock.On("SetListIsArchived", objectIds, isArchived)} +} + +func (_c *MockService_SetListIsArchived_Call) Run(run func(objectIds []string, isArchived bool)) *MockService_SetListIsArchived_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]string), args[1].(bool)) + }) + return _c +} + +func (_c *MockService_SetListIsArchived_Call) Return(_a0 error) *MockService_SetListIsArchived_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetListIsArchived_Call) RunAndReturn(run func([]string, bool) error) *MockService_SetListIsArchived_Call { + _c.Call.Return(run) + return _c +} + +// SetListIsFavorite provides a mock function with given fields: objectIds, isFavorite +func (_m *MockService) SetListIsFavorite(objectIds []string, isFavorite bool) error { + ret := _m.Called(objectIds, isFavorite) + + if len(ret) == 0 { + panic("no return value specified for SetListIsFavorite") + } + + var r0 error + if rf, ok := ret.Get(0).(func([]string, bool) error); ok { + r0 = rf(objectIds, isFavorite) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetListIsFavorite_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetListIsFavorite' +type MockService_SetListIsFavorite_Call struct { + *mock.Call +} + +// SetListIsFavorite is a helper method to define mock.On call +// - objectIds []string +// - isFavorite bool +func (_e *MockService_Expecter) SetListIsFavorite(objectIds interface{}, isFavorite interface{}) *MockService_SetListIsFavorite_Call { + return &MockService_SetListIsFavorite_Call{Call: _e.mock.On("SetListIsFavorite", objectIds, isFavorite)} +} + +func (_c *MockService_SetListIsFavorite_Call) Run(run func(objectIds []string, isFavorite bool)) *MockService_SetListIsFavorite_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]string), args[1].(bool)) + }) + return _c +} + +func (_c *MockService_SetListIsFavorite_Call) Return(_a0 error) *MockService_SetListIsFavorite_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetListIsFavorite_Call) RunAndReturn(run func([]string, bool) error) *MockService_SetListIsFavorite_Call { + _c.Call.Return(run) + return _c +} + +// SetSource provides a mock function with given fields: ctx, objectId, source +func (_m *MockService) SetSource(ctx session.Context, objectId string, source []string) error { + ret := _m.Called(ctx, objectId, source) + + if len(ret) == 0 { + panic("no return value specified for SetSource") + } + + var r0 error + if rf, ok := ret.Get(0).(func(session.Context, string, []string) error); ok { + r0 = rf(ctx, objectId, source) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetSource_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetSource' +type MockService_SetSource_Call struct { + *mock.Call +} + +// SetSource is a helper method to define mock.On call +// - ctx session.Context +// - objectId string +// - source []string +func (_e *MockService_Expecter) SetSource(ctx interface{}, objectId interface{}, source interface{}) *MockService_SetSource_Call { + return &MockService_SetSource_Call{Call: _e.mock.On("SetSource", ctx, objectId, source)} +} + +func (_c *MockService_SetSource_Call) Run(run func(ctx session.Context, objectId string, source []string)) *MockService_SetSource_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(session.Context), args[1].(string), args[2].([]string)) + }) + return _c +} + +func (_c *MockService_SetSource_Call) Return(_a0 error) *MockService_SetSource_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetSource_Call) RunAndReturn(run func(session.Context, string, []string) error) *MockService_SetSource_Call { + _c.Call.Return(run) + return _c +} + +// SetSpaceInfo provides a mock function with given fields: spaceId, _a1 +func (_m *MockService) SetSpaceInfo(spaceId string, _a1 *types.Struct) error { + ret := _m.Called(spaceId, _a1) + + if len(ret) == 0 { + panic("no return value specified for SetSpaceInfo") + } + + var r0 error + if rf, ok := ret.Get(0).(func(string, *types.Struct) error); ok { + r0 = rf(spaceId, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// MockService_SetSpaceInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetSpaceInfo' +type MockService_SetSpaceInfo_Call struct { + *mock.Call +} + +// SetSpaceInfo is a helper method to define mock.On call +// - spaceId string +// - _a1 *types.Struct +func (_e *MockService_Expecter) SetSpaceInfo(spaceId interface{}, _a1 interface{}) *MockService_SetSpaceInfo_Call { + return &MockService_SetSpaceInfo_Call{Call: _e.mock.On("SetSpaceInfo", spaceId, _a1)} +} + +func (_c *MockService_SetSpaceInfo_Call) Run(run func(spaceId string, _a1 *types.Struct)) *MockService_SetSpaceInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(*types.Struct)) + }) + return _c +} + +func (_c *MockService_SetSpaceInfo_Call) Return(_a0 error) *MockService_SetSpaceInfo_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockService_SetSpaceInfo_Call) RunAndReturn(run func(string, *types.Struct) error) *MockService_SetSpaceInfo_Call { + _c.Call.Return(run) + return _c +} + +// SetWorkspaceDashboardId provides a mock function with given fields: ctx, workspaceId, id +func (_m *MockService) SetWorkspaceDashboardId(ctx session.Context, workspaceId string, id string) (string, error) { + ret := _m.Called(ctx, workspaceId, id) + + if len(ret) == 0 { + panic("no return value specified for SetWorkspaceDashboardId") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(session.Context, string, string) (string, error)); ok { + return rf(ctx, workspaceId, id) + } + if rf, ok := ret.Get(0).(func(session.Context, string, string) string); ok { + r0 = rf(ctx, workspaceId, id) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(session.Context, string, string) error); ok { + r1 = rf(ctx, workspaceId, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MockService_SetWorkspaceDashboardId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetWorkspaceDashboardId' +type MockService_SetWorkspaceDashboardId_Call struct { + *mock.Call +} + +// SetWorkspaceDashboardId is a helper method to define mock.On call +// - ctx session.Context +// - workspaceId string +// - id string +func (_e *MockService_Expecter) SetWorkspaceDashboardId(ctx interface{}, workspaceId interface{}, id interface{}) *MockService_SetWorkspaceDashboardId_Call { + return &MockService_SetWorkspaceDashboardId_Call{Call: _e.mock.On("SetWorkspaceDashboardId", ctx, workspaceId, id)} +} + +func (_c *MockService_SetWorkspaceDashboardId_Call) Run(run func(ctx session.Context, workspaceId string, id string)) *MockService_SetWorkspaceDashboardId_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(session.Context), args[1].(string), args[2].(string)) + }) + return _c +} + +func (_c *MockService_SetWorkspaceDashboardId_Call) Return(setId string, err error) *MockService_SetWorkspaceDashboardId_Call { + _c.Call.Return(setId, err) + return _c +} + +func (_c *MockService_SetWorkspaceDashboardId_Call) RunAndReturn(run func(session.Context, string, string) (string, error)) *MockService_SetWorkspaceDashboardId_Call { + _c.Call.Return(run) + return _c +} + +// NewMockService creates a new instance of MockService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockService(t interface { + mock.TestingT + Cleanup(func()) +}) *MockService { + mock := &MockService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From 2f05dc086f1df225c916949a494385ab504e3893 Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 13 Sep 2024 14:51:48 +0200 Subject: [PATCH 07/20] GO-4025 Modify default rel lists for dataview --- core/block/collection/service.go | 2 +- core/block/editor/converter/layout.go | 2 +- core/block/editor/dataview/dataview.go | 117 ++----------- core/block/editor/template/collection.go | 157 +++++++++++++----- core/block/editor/template/collection_test.go | 99 +++++++++++ core/block/import/notion/api/block/link.go | 2 +- core/block/service.go | 27 --- core/object.go | 6 +- pkg/lib/database/schema.go | 11 -- pkg/lib/database/schema_by_realtion_test.go | 74 --------- pkg/lib/database/schema_by_relation.go | 31 ---- pkg/lib/database/schema_by_type.go | 22 --- pkg/lib/database/schema_by_type_test.go | 43 ----- pkg/lib/database/schema_empty.go | 20 --- 14 files changed, 236 insertions(+), 377 deletions(-) create mode 100644 core/block/editor/template/collection_test.go delete mode 100644 pkg/lib/database/schema.go delete mode 100644 pkg/lib/database/schema_by_realtion_test.go delete mode 100644 pkg/lib/database/schema_by_relation.go delete mode 100644 pkg/lib/database/schema_by_type.go delete mode 100644 pkg/lib/database/schema_by_type_test.go delete mode 100644 pkg/lib/database/schema_empty.go diff --git a/core/block/collection/service.go b/core/block/collection/service.go index a20530326b..1f557af071 100644 --- a/core/block/collection/service.go +++ b/core/block/collection/service.go @@ -192,7 +192,7 @@ func (s *Service) CreateCollection(details *types.Struct, flags []*model.Interna tmpls := []template.StateTransformer{} - blockContent := template.MakeCollectionDataviewContent() + blockContent := template.MakeDataviewContent(true, nil, nil) tmpls = append(tmpls, template.WithDataview(blockContent, false), ) diff --git a/core/block/editor/converter/layout.go b/core/block/editor/converter/layout.go index ad10315faf..ccf2db36ba 100644 --- a/core/block/editor/converter/layout.go +++ b/core/block/editor/converter/layout.go @@ -220,7 +220,7 @@ func (c *layoutConverter) fromNoteToCollection(st *state.State) error { } func (c *layoutConverter) fromAnyToCollection(st *state.State) error { - blockContent := template.MakeCollectionDataviewContent() + blockContent := template.MakeDataviewContent(true, nil, nil) template.InitTemplate(st, template.WithDataview(blockContent, false)) return nil } diff --git a/core/block/editor/dataview/dataview.go b/core/block/editor/dataview/dataview.go index 601f48fc06..cbd1201da9 100644 --- a/core/block/editor/dataview/dataview.go +++ b/core/block/editor/dataview/dataview.go @@ -6,7 +6,6 @@ import ( "fmt" anystore "github.com/anyproto/any-store" - "github.com/globalsign/mgo/bson" "github.com/google/uuid" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" @@ -19,7 +18,6 @@ import ( "github.com/anyproto/anytype-heart/core/session" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/database" "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/pkg/lib/logging" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -293,22 +291,12 @@ func (d *sdataview) CreateView(ctx session.Context, id string, if len(view.Sorts) == 0 { // todo: set depends on the view type - view.Sorts = defaultLastModifiedDateSort() + view.Sorts = template.DefaultLastModifiedDateSort() } tb.AddView(view) return &view, d.Apply(s) } -func defaultLastModifiedDateSort() []*model.BlockContentDataviewSort { - return []*model.BlockContentDataviewSort{ - { - Id: bson.NewObjectId().Hex(), - RelationKey: bundle.RelationKeyLastModifiedDate.String(), - Type: model.BlockContentDataviewSort_Desc, - }, - } -} - func (d *sdataview) UpdateViewGroupOrder(ctx session.Context, blockId string, order *model.BlockContentDataviewGroupOrder) error { st := d.NewStateCtx(ctx) dvBlock, err := getDataviewBlock(st, blockId) @@ -347,33 +335,6 @@ func (d *sdataview) DataviewMoveObjectsInView(ctx session.Context, req *pb.RpcBl return d.Apply(st) } -func SchemaBySources(sources []string, objectStore objectstore.ObjectStore) (database.Schema, error) { - // Empty schema - if len(sources) == 0 { - return database.NewEmptySchema(), nil - } - - // Try object type - objectType, err := objectStore.GetObjectType(sources[0]) - if err == nil { - sch := database.NewByType(objectType) - return sch, nil - } - - // Finally, try relations - relations := make([]*model.RelationLink, 0, len(sources)) - for _, relId := range sources { - rel, err := objectStore.GetRelationByID(relId) - if err != nil { - return nil, fmt.Errorf("failed to get relation %s: %w", relId, err) - } - - relations = append(relations, (&relationutils.Relation{Relation: rel}).RelationLink()) - } - sch := database.NewByRelations(relations) - return sch, nil -} - func (d *sdataview) listRestrictedSources(ctx context.Context) ([]string, error) { keys := []domain.TypeKey{ bundle.TypeKeyFile, @@ -471,71 +432,27 @@ func getDataviewBlock(s *state.State, id string) (dataview.Block, error) { return nil, fmt.Errorf("not a dataview block") } -func BlockBySource(objectStore objectstore.ObjectStore, source []string) (*model.BlockContentOfDataview, error) { - schema, err := SchemaBySources(source, objectStore) - if err != nil { - return nil, fmt.Errorf("get schema by sources: %w", err) +func BlockBySource(objectStore objectstore.ObjectStore, sources []string) (*model.BlockContentOfDataview, error) { + // Empty schema + if len(sources) == 0 { + return template.MakeDataviewContent(false, nil, nil), nil } - var ( - relations []*model.RelationLink - viewRelations []*model.BlockContentDataviewRelation - ) - - for _, rel := range schema.RequiredRelations() { - relations = append(relations, &model.RelationLink{ - Format: rel.Format, - Key: rel.Key, - }) - viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: true}) + // Try object type + objectType, err := objectStore.GetObjectType(sources[0]) + if err == nil { + return template.MakeDataviewContent(false, objectType, nil), nil } - for _, rel := range schema.ListRelations() { - // other relations should be added with - if pbtypes.HasRelationLink(relations, rel.Key) { - continue + // Finally, try relations + relations := make([]*model.RelationLink, 0, len(sources)) + for _, relId := range sources { + rel, err := objectStore.GetRelationByID(relId) + if err != nil { + return nil, fmt.Errorf("failed to get relation %s: %w", relId, err) } - relations = append(relations, &model.RelationLink{ - Format: rel.Format, - Key: rel.Key, - }) - viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: false}) - } - - schemaRelations := schema.ListRelations() - if !pbtypes.HasRelationLink(schemaRelations, bundle.RelationKeyName.String()) { - schemaRelations = append([]*model.RelationLink{bundle.MustGetRelationLink(bundle.RelationKeyName)}, schemaRelations...) + relations = append(relations, (&relationutils.Relation{Relation: rel}).RelationLink()) } - - for _, relKey := range template.DefaultDataviewRelations { - if pbtypes.HasRelationLink(relations, relKey.String()) { - continue - } - rel := bundle.MustGetRelation(relKey) - if rel.Hidden { - continue - } - relations = append(relations, &model.RelationLink{ - Format: rel.Format, - Key: rel.Key, - }) - viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: false}) - } - - return &model.BlockContentOfDataview{ - Dataview: &model.BlockContentDataview{ - RelationLinks: relations, - Views: []*model.BlockContentDataviewView{ - { - Id: bson.NewObjectId().Hex(), - Type: model.BlockContentDataviewView_Table, - Name: "All", - Sorts: defaultLastModifiedDateSort(), - Filters: nil, - Relations: viewRelations, - }, - }, - }, - }, nil + return template.MakeDataviewContent(false, objectType, relations), nil } diff --git a/core/block/editor/template/collection.go b/core/block/editor/template/collection.go index a9e4ebe5e5..02acae0116 100644 --- a/core/block/editor/template/collection.go +++ b/core/block/editor/template/collection.go @@ -1,6 +1,8 @@ package template import ( + "slices" + "github.com/globalsign/mgo/bson" "github.com/anyproto/anytype-heart/core/domain" @@ -9,68 +11,137 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -func MakeCollectionDataviewContent() *model.BlockContentOfDataview { - relations := []*model.RelationLink{ - { - Format: model.RelationFormat_shorttext, - Key: bundle.RelationKeyName.String(), - }, +const ( + CollectionStoreKey = "objects" + defaultViewName = "All" +) + +var ( + defaultDataviewRelations = []domain.RelationKey{ + bundle.RelationKeyName, + bundle.RelationKeyCreatedDate, + bundle.RelationKeyCreator, + bundle.RelationKeyLastModifiedDate, + bundle.RelationKeyLastModifiedBy, + bundle.RelationKeyLastOpenedDate, + bundle.RelationKeyBacklinks, } - viewRelations := []*model.BlockContentDataviewRelation{ - { - Key: bundle.RelationKeyName.String(), - IsVisible: true, - }, + + defaultCollectionRelations = []domain.RelationKey{ + bundle.RelationKeyName, + bundle.RelationKeyType, + bundle.RelationKeyCreatedDate, + bundle.RelationKeyCreator, + bundle.RelationKeyLastModifiedDate, + bundle.RelationKeyLastModifiedBy, + bundle.RelationKeyLastOpenedDate, + bundle.RelationKeyBacklinks, + bundle.RelationKeyTag, + bundle.RelationKeyDescription, } - for _, relKey := range DefaultDataviewRelations { - if pbtypes.HasRelationLink(relations, relKey.String()) { - continue + + defaultVisibleRelations = []domain.RelationKey{ + bundle.RelationKeyName, + bundle.RelationKeyType, + } +) + +func MakeDataviewContent(isCollection bool, ot *model.ObjectType, relLinks []*model.RelationLink) *model.BlockContentOfDataview { + var ( + defaultRelations = defaultCollectionRelations + visibleRelations = defaultVisibleRelations + sorts = DefaultLastModifiedDateSort() + ) + + if isCollection { + sorts = defaultNameSort() + } else if relLinks != nil { + for _, relLink := range relLinks { + visibleRelations = append(visibleRelations, domain.RelationKey(relLink.Key)) } - rel := bundle.MustGetRelation(relKey) - relations = append(relations, &model.RelationLink{ - Format: rel.Format, - Key: rel.Key, - }) - viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{Key: rel.Key, IsVisible: false}) + } else if ot != nil { + defaultRelations = defaultDataviewRelations + relLinks = ot.RelationLinks + } else { + defaultRelations = defaultDataviewRelations } - blockContent := &model.BlockContentOfDataview{ + relationLinks, viewRelations := generateRelationLists(defaultRelations, relLinks, visibleRelations) + + return &model.BlockContentOfDataview{ Dataview: &model.BlockContentDataview{ - IsCollection: true, - RelationLinks: relations, + IsCollection: isCollection, + RelationLinks: relationLinks, Views: []*model.BlockContentDataviewView{ { - Id: bson.NewObjectId().Hex(), - Type: model.BlockContentDataviewView_Table, - Name: "All", - Sorts: []*model.BlockContentDataviewSort{ - { - RelationKey: "name", - Type: model.BlockContentDataviewSort_Asc, - }, - }, + Id: bson.NewObjectId().Hex(), + Type: model.BlockContentDataviewView_Table, + Name: defaultViewName, + Sorts: sorts, Filters: nil, Relations: viewRelations, }, }, }, } - return blockContent } -var DefaultDataviewRelations = make([]domain.RelationKey, 0, len(bundle.RequiredInternalRelations)) +func generateRelationLists( + defaultRelations []domain.RelationKey, + additionalRelations []*model.RelationLink, + visibleRelations []domain.RelationKey, +) ( + relationLinks []*model.RelationLink, + viewRelations []*model.BlockContentDataviewRelation, +) { + isVisible := func(key domain.RelationKey) bool { + return slices.Contains(visibleRelations, key) + } + + for _, relKey := range defaultRelations { + rel := bundle.MustGetRelation(relKey) + relationLinks = append(relationLinks, &model.RelationLink{ + Format: rel.Format, + Key: rel.Key, + }) + viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{ + Key: rel.Key, + IsVisible: isVisible(relKey), + }) + } -func init() { - // fill DefaultDataviewRelations - // deprecated: we should remove this after we merge relations as objects - for _, rel := range bundle.RequiredInternalRelations { - if bundle.MustGetRelation(rel).Hidden { + for _, relLink := range additionalRelations { + if pbtypes.HasRelationLink(relationLinks, relLink.Key) { continue } - DefaultDataviewRelations = append(DefaultDataviewRelations, rel) + relationLinks = append(relationLinks, &model.RelationLink{ + Format: relLink.Format, + Key: relLink.Key, + }) + viewRelations = append(viewRelations, &model.BlockContentDataviewRelation{ + Key: relLink.Key, + IsVisible: isVisible(domain.RelationKey(relLink.Key)), + }) } - DefaultDataviewRelations = append(DefaultDataviewRelations, bundle.RelationKeyDone) - DefaultDataviewRelations = append(DefaultDataviewRelations, bundle.RelationKeyTag) + return relationLinks, viewRelations } -const CollectionStoreKey = "objects" +func DefaultLastModifiedDateSort() []*model.BlockContentDataviewSort { + return []*model.BlockContentDataviewSort{ + { + Id: bson.NewObjectId().Hex(), + RelationKey: bundle.RelationKeyLastModifiedDate.String(), + Type: model.BlockContentDataviewSort_Desc, + }, + } +} + +func defaultNameSort() []*model.BlockContentDataviewSort { + return []*model.BlockContentDataviewSort{ + { + Id: bson.NewObjectId().Hex(), + RelationKey: bundle.RelationKeyName.String(), + Type: model.BlockContentDataviewSort_Asc, + }, + } +} diff --git a/core/block/editor/template/collection_test.go b/core/block/editor/template/collection_test.go new file mode 100644 index 0000000000..8d267c0fd6 --- /dev/null +++ b/core/block/editor/template/collection_test.go @@ -0,0 +1,99 @@ +package template + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "golang.org/x/exp/slices" + + "github.com/anyproto/anytype-heart/core/domain" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" +) + +func assertDataviewBlock( + t *testing.T, + block *model.BlockContentOfDataview, + isCollection bool, + expectedRelations []domain.RelationKey, + isVisible func(key domain.RelationKey) bool, +) { + assert.Equal(t, isCollection, block.Dataview.IsCollection) + assert.Len(t, block.Dataview.RelationLinks, len(expectedRelations)) + for i, link := range block.Dataview.RelationLinks { + assert.Equal(t, expectedRelations[i], domain.RelationKey(link.Key)) + } + assert.Len(t, block.Dataview.Views, 1) + assert.Len(t, block.Dataview.Views[0].Relations, len(expectedRelations)) + for i, relation := range block.Dataview.Views[0].Relations { + assert.Equal(t, expectedRelations[i], domain.RelationKey(relation.Key)) + assert.Equal(t, isVisible(domain.RelationKey(relation.Key)), relation.IsVisible) + } +} + +func TestMakeDataviewContent(t *testing.T) { + for _, tc := range []struct { + name string + isCollection bool + ot *model.ObjectType + relLinks []*model.RelationLink + expectedRelations []domain.RelationKey + isVisible func(key domain.RelationKey) bool + }{ + { + name: "collection", + isCollection: true, + expectedRelations: defaultCollectionRelations, + isVisible: func(key domain.RelationKey) bool { + return slices.Contains(defaultVisibleRelations, key) + }, + }, + { + name: "set by object type", + ot: &model.ObjectType{ + RelationLinks: []*model.RelationLink{ + {Key: bundle.RelationKeyTasks.String()}, + {Key: bundle.RelationKeyLinkedProjects.String()}, + {Key: bundle.RelationKeyAssignee.String()}, + }, + }, + expectedRelations: append(defaultDataviewRelations, []domain.RelationKey{ + bundle.RelationKeyTasks, + bundle.RelationKeyLinkedProjects, + bundle.RelationKeyAssignee, + }...), + isVisible: func(key domain.RelationKey) bool { + return slices.Contains(defaultVisibleRelations, key) + }, + }, + { + name: "set by relation", + relLinks: []*model.RelationLink{ + {Key: bundle.RelationKeyAddedDate.String()}, + {Key: bundle.RelationKeyLastUsedDate.String()}, + }, + expectedRelations: append(defaultCollectionRelations, []domain.RelationKey{ + bundle.RelationKeyAddedDate, + bundle.RelationKeyLastUsedDate, + }...), + isVisible: func(key domain.RelationKey) bool { + return slices.Contains(append(defaultVisibleRelations, []domain.RelationKey{ + bundle.RelationKeyAddedDate, + bundle.RelationKeyLastUsedDate, + }...), key) + }, + }, + { + name: "empty", + expectedRelations: defaultDataviewRelations, + isVisible: func(key domain.RelationKey) bool { + return slices.Contains(defaultVisibleRelations, key) + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + block := MakeDataviewContent(tc.isCollection, tc.ot, tc.relLinks) + assertDataviewBlock(t, block, tc.isCollection, tc.expectedRelations, tc.isVisible) + }) + } +} diff --git a/core/block/import/notion/api/block/link.go b/core/block/import/notion/api/block/link.go index f0d9e9e240..53d2c77a20 100644 --- a/core/block/import/notion/api/block/link.go +++ b/core/block/import/notion/api/block/link.go @@ -202,7 +202,7 @@ func (c *ChildDatabase) GetBlock(importContext *api.NotionImportContext, pageID, id := bson.NewObjectId().Hex() if err != nil || targetBlockID == "" { - block := template.MakeCollectionDataviewContent() + block := template.MakeDataviewContent(true, nil, nil) block.Dataview.TargetObjectId = targetBlockID return &model.Block{ Id: id, diff --git a/core/block/service.go b/core/block/service.go index b4b012d415..1e70cdfa7b 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -28,7 +28,6 @@ import ( "github.com/anyproto/anytype-heart/core/block/object/objectcreator" "github.com/anyproto/anytype-heart/core/block/process" "github.com/anyproto/anytype-heart/core/block/restriction" - "github.com/anyproto/anytype-heart/core/block/simple" "github.com/anyproto/anytype-heart/core/block/simple/bookmark" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/core/domain/objectorigin" @@ -512,32 +511,6 @@ func (s *Service) SetPageIsArchived(req pb.RpcObjectSetIsArchivedRequest) (err e return s.objectLinksCollectionModify(spc.DerivedIDs().Archive, req.ContextId, req.IsArchived) } -func (s *Service) SetSource(ctx session.Context, req pb.RpcObjectSetSourceRequest) (err error) { - return cache.Do(s, req.ContextId, func(sb smartblock.SmartBlock) error { - st := sb.NewStateCtx(ctx) - // nolint:errcheck - _ = st.Iterate(func(b simple.Block) (isContinue bool) { - if dv := b.Model().GetDataview(); dv != nil { - for _, view := range dv.Views { - view.DefaultTemplateId = "" - view.DefaultObjectTypeId = "" - } - st.Set(b) - return false - } - return true - }) - st.SetDetailAndBundledRelation(bundle.RelationKeySetOf, pbtypes.StringList(req.Source)) - - flags := internalflag.NewFromState(st) - // set with source is no longer empty - flags.Remove(model.InternalFlag_editorDeleteEmpty) - flags.AddToState(st) - - return sb.Apply(st, smartblock.NoRestrictions, smartblock.KeepInternalFlags) - }) -} - func (s *Service) SetWorkspaceDashboardId(ctx session.Context, workspaceId string, id string) (setId string, err error) { err = cache.Do(s, workspaceId, func(ws *editor.Workspaces) error { if ws.Type() != coresb.SmartBlockTypeWorkspace { diff --git a/core/object.go b/core/object.go index 2b140069ae..dc5185b11f 100644 --- a/core/object.go +++ b/core/object.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/go-multierror" "github.com/anyproto/anytype-heart/core/block" + "github.com/anyproto/anytype-heart/core/block/editor/template" importer "github.com/anyproto/anytype-heart/core/block/import" "github.com/anyproto/anytype-heart/core/block/import/common" "github.com/anyproto/anytype-heart/core/block/object/objectgraph" @@ -696,8 +697,7 @@ func (mw *Middleware) ObjectSetIsArchived(cctx context.Context, req *pb.RpcObjec return response(pb.RpcObjectSetIsArchivedResponseError_NULL, nil) } -func (mw *Middleware) ObjectSetSource(cctx context.Context, - req *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { +func (mw *Middleware) ObjectSetSource(cctx context.Context, req *pb.RpcObjectSetSourceRequest) *pb.RpcObjectSetSourceResponse { ctx := mw.newContext(cctx) response := func(code pb.RpcObjectSetSourceResponseErrorCode, err error) *pb.RpcObjectSetSourceResponse { m := &pb.RpcObjectSetSourceResponse{Error: &pb.RpcObjectSetSourceResponseError{Code: code}} @@ -709,7 +709,7 @@ func (mw *Middleware) ObjectSetSource(cctx context.Context, return m } err := mw.doBlockService(func(bs *block.Service) (err error) { - return bs.SetSource(ctx, *req) + return bs.SetDataviewSource(ctx, req.ContextId, template.DataviewBlockId, req.Source) }) if err != nil { return response(pb.RpcObjectSetSourceResponseError_UNKNOWN_ERROR, err) diff --git a/pkg/lib/database/schema.go b/pkg/lib/database/schema.go deleted file mode 100644 index 57ee9aae50..0000000000 --- a/pkg/lib/database/schema.go +++ /dev/null @@ -1,11 +0,0 @@ -package database - -import ( - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -// Schema used to subset compatible objects by some common relations -type Schema interface { - ListRelations() []*model.RelationLink - RequiredRelations() []*model.RelationLink -} diff --git a/pkg/lib/database/schema_by_realtion_test.go b/pkg/lib/database/schema_by_realtion_test.go deleted file mode 100644 index f4742e32d8..0000000000 --- a/pkg/lib/database/schema_by_realtion_test.go +++ /dev/null @@ -1,74 +0,0 @@ -package database - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -func TestSchemaByRelations_ListRelations(t *testing.T) { - // Given - common := []*model.RelationLink{ - { - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - { - Key: bundle.RelationKeyDueDate.String(), - Format: model.RelationFormat_date, - }, - } - sch := NewByRelations(common) - - // When - got := sch.ListRelations() - - // Then - want := []*model.RelationLink{ - { - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - { - Key: bundle.RelationKeyDueDate.String(), - Format: model.RelationFormat_date, - }, - } - assert.ElementsMatch(t, want, got) -} - -func TestSchemaByRelations_RequiredRelations(t *testing.T) { - t.Run("hardcoded relations are added", func(t *testing.T) { - // Given - common := []*model.RelationLink{ - { - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - } - sch := NewByRelations(common) - - // When - got := sch.RequiredRelations() - - // Then - want := []*model.RelationLink{ - { - Key: bundle.RelationKeyName.String(), - Format: model.RelationFormat_shorttext, - }, - { - Key: bundle.RelationKeyType.String(), - Format: model.RelationFormat_object, - }, - { - Key: bundle.RelationKeyAssignee.String(), - Format: model.RelationFormat_object, - }, - } - assert.ElementsMatch(t, want, got) - }) -} diff --git a/pkg/lib/database/schema_by_relation.go b/pkg/lib/database/schema_by_relation.go deleted file mode 100644 index a4ebd6f270..0000000000 --- a/pkg/lib/database/schema_by_relation.go +++ /dev/null @@ -1,31 +0,0 @@ -package database - -import ( - "github.com/samber/lo" - - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -type schemaByRelations struct { - CommonRelations []*model.RelationLink -} - -func NewByRelations(commonRelations []*model.RelationLink) Schema { - return &schemaByRelations{CommonRelations: commonRelations} -} - -func (sch *schemaByRelations) RequiredRelations() []*model.RelationLink { - required := []*model.RelationLink{ - bundle.MustGetRelationLink(bundle.RelationKeyName), - bundle.MustGetRelationLink(bundle.RelationKeyType), - } - required = append(required, sch.CommonRelations...) - return lo.UniqBy(required, func(rel *model.RelationLink) string { - return rel.Key - }) -} - -func (sch *schemaByRelations) ListRelations() []*model.RelationLink { - return sch.CommonRelations -} diff --git a/pkg/lib/database/schema_by_type.go b/pkg/lib/database/schema_by_type.go deleted file mode 100644 index fef3abfdb9..0000000000 --- a/pkg/lib/database/schema_by_type.go +++ /dev/null @@ -1,22 +0,0 @@ -package database - -import ( - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -type schemaByType struct { - ObjType *model.ObjectType -} - -func NewByType(objType *model.ObjectType) Schema { - return &schemaByType{ObjType: objType} -} - -func (sch *schemaByType) ListRelations() []*model.RelationLink { - return sch.ObjType.RelationLinks -} - -func (sch *schemaByType) RequiredRelations() []*model.RelationLink { - return []*model.RelationLink{bundle.MustGetRelationLink(bundle.RelationKeyName)} -} diff --git a/pkg/lib/database/schema_by_type_test.go b/pkg/lib/database/schema_by_type_test.go deleted file mode 100644 index d04c552b59..0000000000 --- a/pkg/lib/database/schema_by_type_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package database - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -func givenSchemaByType() Schema { - objType := bundle.MustGetType(bundle.TypeKeyProject) - return NewByType(objType) -} - -func TestSchemaByType_RequiredRelations(t *testing.T) { - // Given - sch := givenSchemaByType() - - // When - got := sch.RequiredRelations() - - // Then - want := []*model.RelationLink{ - // Relation links from type are ignored - bundle.MustGetRelationLink(bundle.RelationKeyName), - } - assert.ElementsMatch(t, want, got) -} - -func TestSchemaByType_ListRelations(t *testing.T) { - // Given - sch := givenSchemaByType() - - // When - got := sch.ListRelations() - - // Then - want := bundle.MustGetType(bundle.TypeKeyProject).RelationLinks - - assert.ElementsMatch(t, want, got) -} diff --git a/pkg/lib/database/schema_empty.go b/pkg/lib/database/schema_empty.go deleted file mode 100644 index 3528561b4a..0000000000 --- a/pkg/lib/database/schema_empty.go +++ /dev/null @@ -1,20 +0,0 @@ -package database - -import ( - "github.com/anyproto/anytype-heart/pkg/lib/bundle" - "github.com/anyproto/anytype-heart/pkg/lib/pb/model" -) - -type emptySchema struct{} - -func NewEmptySchema() Schema { - return &emptySchema{} -} - -func (sch *emptySchema) RequiredRelations() []*model.RelationLink { - return []*model.RelationLink{bundle.MustGetRelationLink(bundle.RelationKeyName)} -} - -func (sch *emptySchema) ListRelations() []*model.RelationLink { - return nil -} From 2c7139d6aa2ec3c266e4cd7fe4c26c6220d3a766 Mon Sep 17 00:00:00 2001 From: kirillston Date: Tue, 17 Sep 2024 15:48:03 +0200 Subject: [PATCH 08/20] GO-3964 Add tests on service --- .../{relation_test.go => relations_test.go} | 95 ++- core/block/details/service_test.go | 567 ++++++++++++++++++ core/block/details/set_details.go | 6 +- .../editor/smartblock/smarttest/smarttest.go | 46 ++ 4 files changed, 709 insertions(+), 5 deletions(-) rename core/block/details/{relation_test.go => relations_test.go} (58%) create mode 100644 core/block/details/service_test.go diff --git a/core/block/details/relation_test.go b/core/block/details/relations_test.go similarity index 58% rename from core/block/details/relation_test.go rename to core/block/details/relations_test.go index e2231b003c..84538f85ed 100644 --- a/core/block/details/relation_test.go +++ b/core/block/details/relations_test.go @@ -1,12 +1,17 @@ package details import ( + "context" "testing" "time" "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest" + "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pkg/lib/bundle" "github.com/anyproto/anytype-heart/pkg/lib/localstore/addr" @@ -15,8 +20,6 @@ import ( "github.com/anyproto/anytype-heart/util/pbtypes" ) -const spaceId = "spaceId" - func relationObject(key domain.RelationKey, format model.RelationFormat) objectstore.TestObject { return objectstore.TestObject{ bundle.RelationKeyId: pbtypes.String(key.URL()), @@ -117,3 +120,91 @@ func TestService_ListRelationsWithValue(t *testing.T) { }) } } + +func TestService_ObjectTypeAddRelations(t *testing.T) { + t.Run("add recommended relations", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(bundle.TypeKeyTask.URL()) + sb.SetSpace(fx.space) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, bundle.TypeKeyTask.URL(), objectId) + return sb, nil + }) + fx.space.EXPECT().GetRelationIdByKey(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, key domain.RelationKey) (string, error) { + return key.URL(), nil + }) + + // when + err := fx.ObjectTypeAddRelations(nil, bundle.TypeKeyTask.URL(), []domain.RelationKey{ + bundle.RelationKeyAssignee, bundle.RelationKeyDone, + }) + + // then + assert.NoError(t, err) + assert.Equal(t, []string{bundle.RelationKeyAssignee.URL(), bundle.RelationKeyDone.URL()}, + pbtypes.GetStringList(sb.Details(), bundle.RelationKeyRecommendedRelations.String())) + }) + + t.Run("editing of bundled types is prohibited", func(t *testing.T) { + // given + fx := newFixture(t) + + // when + err := fx.ObjectTypeAddRelations(nil, bundle.TypeKeyTask.BundledURL(), []domain.RelationKey{ + bundle.RelationKeyAssignee, bundle.RelationKeyDone, + }) + + // then + assert.Error(t, err) + assert.ErrorIs(t, ErrBundledTypeIsReadonly, err) + }) +} + +func TestService_ObjectTypeRemoveRelations(t *testing.T) { + t.Run("remove recommended relations", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(bundle.TypeKeyTask.URL()) + sb.SetSpace(fx.space) + sb.Doc.(*state.State).SetDetails(&types.Struct{Fields: map[string]*types.Value{ + bundle.RelationKeyRecommendedRelations.String(): pbtypes.StringList([]string{ + bundle.RelationKeyAssignee.URL(), + bundle.RelationKeyIsFavorite.URL(), + bundle.RelationKeyDone.URL(), + bundle.RelationKeyLinkedProjects.URL(), + }), + }}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, bundle.TypeKeyTask.URL(), objectId) + return sb, nil + }) + fx.space.EXPECT().GetRelationIdByKey(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, key domain.RelationKey) (string, error) { + return key.URL(), nil + }) + + // when + err := fx.ObjectTypeRemoveRelations(nil, bundle.TypeKeyTask.URL(), []domain.RelationKey{ + bundle.RelationKeyAssignee, bundle.RelationKeyDone, + }) + + // then + assert.NoError(t, err) + assert.Equal(t, []string{bundle.RelationKeyIsFavorite.URL(), bundle.RelationKeyLinkedProjects.URL()}, + pbtypes.GetStringList(sb.Details(), bundle.RelationKeyRecommendedRelations.String())) + }) + + t.Run("editing of bundled types is prohibited", func(t *testing.T) { + // given + fx := newFixture(t) + + // when + err := fx.ObjectTypeRemoveRelations(nil, bundle.TypeKeyTask.BundledURL(), []domain.RelationKey{ + bundle.RelationKeyAssignee, bundle.RelationKeyDone, + }) + + // then + assert.Error(t, err) + assert.ErrorIs(t, ErrBundledTypeIsReadonly, err) + }) +} diff --git a/core/block/details/service_test.go b/core/block/details/service_test.go new file mode 100644 index 0000000000..5cf88f5123 --- /dev/null +++ b/core/block/details/service_test.go @@ -0,0 +1,567 @@ +package details + +import ( + "context" + "fmt" + "testing" + + "github.com/gogo/protobuf/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/anyproto/anytype-heart/core/block/editor" + "github.com/anyproto/anytype-heart/core/block/editor/basic" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock" + "github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest" + "github.com/anyproto/anytype-heart/core/block/object/idresolver/mock_idresolver" + "github.com/anyproto/anytype-heart/core/block/restriction" + "github.com/anyproto/anytype-heart/core/block/restriction/mock_restriction" + "github.com/anyproto/anytype-heart/core/block/simple" + "github.com/anyproto/anytype-heart/pb" + "github.com/anyproto/anytype-heart/pkg/lib/bundle" + coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock" + "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" + "github.com/anyproto/anytype-heart/pkg/lib/pb/model" + "github.com/anyproto/anytype-heart/pkg/lib/threads" + "github.com/anyproto/anytype-heart/space/clientspace/mock_clientspace" + "github.com/anyproto/anytype-heart/space/mock_space" + "github.com/anyproto/anytype-heart/util/pbtypes" +) + +const spaceId = "spaceId" + +type fixture struct { + Service + resolver *mock_idresolver.MockResolver + spaceService *mock_space.MockService + store *objectstore.StoreFixture + restriction *mock_restriction.MockService + space *mock_clientspace.MockSpace +} + +func newFixture(t *testing.T) *fixture { + resolver := mock_idresolver.NewMockResolver(t) + spaceService := mock_space.NewMockService(t) + store := objectstore.NewStoreFixture(t) + restriction := mock_restriction.NewMockService(t) + + spc := mock_clientspace.NewMockSpace(t) + resolver.EXPECT().ResolveSpaceID(mock.Anything).Return(spaceId, nil).Maybe() + spaceService.EXPECT().Get(mock.Anything, mock.Anything).Return(spc, nil).Maybe() + + s := &service{ + resolver: resolver, + spaceService: spaceService, + store: store, + restriction: restriction, + } + + return &fixture{ + s, + resolver, + spaceService, + store, + restriction, + spc, + } +} + +func TestService_SetDetailsList(t *testing.T) { + details := []*model.Detail{ + {Key: bundle.RelationKeyAssignee.String(), Value: pbtypes.String("Mark Twain")}, + {Key: bundle.RelationKeyDone.String(), Value: pbtypes.Bool(true)}, + {Key: bundle.RelationKeyLinkedProjects.String(), Value: pbtypes.StringList([]string{"important", "urgent"})}, + } + + t.Run("lastUsed is updated once", func(t *testing.T) { + // given + fx := newFixture(t) + objects := map[string]*smarttest.SmartTest{ + "obj1": smarttest.New("obj1"), + "obj2": smarttest.New("obj2"), + "obj3": smarttest.New("obj3"), + } + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + object, ok := objects[objectId] + require.True(t, ok) + return object, nil + }) + + // when + err := fx.SetDetailsList(nil, []string{"obj1", "obj2", "obj3"}, details) + + // then + assert.NoError(t, err) + require.Len(t, objects["obj1"].Results.LastUsedUpdates, 3) + assert.Equal(t, []string{ + bundle.RelationKeyAssignee.String(), + bundle.RelationKeyDone.String(), + bundle.RelationKeyLinkedProjects.String(), + }, objects["obj1"].Results.LastUsedUpdates) + + // lastUsed should be updated only during the work under 1st object + assert.Len(t, objects["obj2"].Results.LastUsedUpdates, 0) + assert.Len(t, objects["obj3"].Results.LastUsedUpdates, 0) + + assert.Equal(t, "Mark Twain", pbtypes.GetString(objects["obj1"].NewState().Details(), bundle.RelationKeyAssignee.String())) + assert.True(t, pbtypes.GetBool(objects["obj2"].NewState().Details(), bundle.RelationKeyDone.String())) + assert.Equal(t, []string{"important", "urgent"}, pbtypes.GetStringList(objects["obj3"].NewState().Details(), bundle.RelationKeyLinkedProjects.String())) + }) + + t.Run("some updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId != "obj2" { + return nil, fmt.Errorf("failed to find object") + } + return smarttest.New(objectId), nil + }) + + // when + err := fx.SetDetailsList(nil, []string{"obj1", "obj2", "obj3"}, details) + + // then + assert.NoError(t, err) + }) + + t.Run("all updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, _ string) (smartblock.SmartBlock, error) { + return nil, fmt.Errorf("failed to find object") + }) + + // when + err := fx.SetDetailsList(nil, []string{"obj1", "obj2", "obj3"}, details) + + // then + assert.Error(t, err) + }) +} + +func TestService_ModifyDetailsList(t *testing.T) { + ops := []*pb.RpcObjectListModifyDetailValuesRequestOperation{ + {RelationKey: bundle.RelationKeyName.String(), Set: pbtypes.String("My favorite page")}, + {RelationKey: bundle.RelationKeyLinks.String(), Add: pbtypes.String("some link")}, + {RelationKey: bundle.RelationKeyDone.String(), Set: pbtypes.Bool(true)}, + } + + t.Run("lastUsed is updated once", func(t *testing.T) { + fx := newFixture(t) + objects := map[string]*smarttest.SmartTest{ + "obj1": smarttest.New("obj1"), + "obj2": smarttest.New("obj2"), + "obj3": smarttest.New("obj3"), + } + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + object, ok := objects[objectId] + require.True(t, ok) + return object, nil + }) + + // when + err := fx.ModifyDetailsList(&pb.RpcObjectListModifyDetailValuesRequest{ + ObjectIds: []string{"obj1", "obj2", "obj3"}, + Operations: ops, + }) + + // then + assert.NoError(t, err) + require.Len(t, objects["obj1"].Results.LastUsedUpdates, 3) + + // lastUsed should be updated only during the work under 1st object + assert.Len(t, objects["obj2"].Results.LastUsedUpdates, 0) + assert.Len(t, objects["obj3"].Results.LastUsedUpdates, 0) + }) + + t.Run("some updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId != "obj2" { + return nil, fmt.Errorf("failed to find object") + } + return smarttest.New(objectId), nil + }) + + // when + err := fx.ModifyDetailsList(&pb.RpcObjectListModifyDetailValuesRequest{ + ObjectIds: []string{"obj1", "obj2", "obj3"}, + Operations: ops, + }) + + // then + assert.NoError(t, err) + }) + + t.Run("all updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, _ string) (smartblock.SmartBlock, error) { + return nil, fmt.Errorf("failed to find object") + }) + + // when + err := fx.ModifyDetailsList(&pb.RpcObjectListModifyDetailValuesRequest{ + ObjectIds: []string{"obj1", "obj2", "obj3"}, + Operations: ops, + }) + + // then + assert.Error(t, err) + }) +} + +func TestService_SetSpaceInfo(t *testing.T) { + var ( + wsObjectId = "workspace" + details = &types.Struct{Fields: map[string]*types.Value{ + bundle.RelationKeyName.String(): pbtypes.String("My space"), + bundle.RelationKeyIconOption.String(): pbtypes.Int64(5), + bundle.RelationKeyIconImage.String(): pbtypes.String("kitten.jpg"), + }} + ) + + t.Run("no error", func(t *testing.T) { + // given + fx := newFixture(t) + ws := smarttest.New(wsObjectId) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: wsObjectId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, wsObjectId, objectId) + return ws, nil + }) + + // when + err := fx.SetSpaceInfo(spaceId, details) + + // then + assert.NoError(t, err) + assert.Equal(t, "My space", pbtypes.GetString(ws.NewState().Details(), bundle.RelationKeyName.String())) + assert.Equal(t, int64(5), pbtypes.GetInt64(ws.NewState().Details(), bundle.RelationKeyIconOption.String())) + assert.Equal(t, "kitten.jpg", pbtypes.GetString(ws.NewState().Details(), bundle.RelationKeyIconImage.String())) + }) + + t.Run("error on details setting", func(t *testing.T) { + // given + fx := newFixture(t) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Workspace: wsObjectId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, wsObjectId, objectId) + return nil, fmt.Errorf("failed to get object") + }) + + // when + err := fx.SetSpaceInfo(spaceId, details) + + // then + assert.Error(t, err) + }) +} + +func TestService_SetWorkspaceDashboardId(t *testing.T) { + var ( + wsObjectId = "workspace" + dashboardId = "homepage" + ) + + t.Run("no error", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(wsObjectId) + sb.SetType(coresb.SmartBlockTypeWorkspace) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, wsObjectId, objectId) + ws := &editor.Workspaces{ + SmartBlock: sb, + AllOperations: basic.NewBasic(sb, fx.store, nil, nil, nil), + } + return ws, nil + }) + + // when + setId, err := fx.SetWorkspaceDashboardId(nil, wsObjectId, dashboardId) + + // then + assert.NoError(t, err) + assert.Equal(t, dashboardId, setId) + assert.Equal(t, dashboardId, pbtypes.GetString(sb.NewState().Details(), bundle.RelationKeySpaceDashboardId.String())) + }) + + t.Run("error if wrong smartblock type", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(wsObjectId) + sb.SetType(coresb.SmartBlockTypePage) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + assert.Equal(t, wsObjectId, objectId) + ws := &editor.Workspaces{ + SmartBlock: sb, + AllOperations: basic.NewBasic(sb, fx.store, nil, nil, nil), + } + return ws, nil + }) + + // when + _, err := fx.SetWorkspaceDashboardId(nil, wsObjectId, dashboardId) + + // then + assert.Error(t, err) + assert.ErrorIs(t, ErrUnexpectedBlockType, err) + }) +} + +func TestService_SetListIsFavorite(t *testing.T) { + var ( + objects = []objectstore.TestObject{ + {bundle.RelationKeyId: pbtypes.String("obj1"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + {bundle.RelationKeyId: pbtypes.String("obj2"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + {bundle.RelationKeyId: pbtypes.String("obj3"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + } + homeId = "home" + ) + + t.Run("no error on favoriting", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(homeId) + sb.AddBlock(simple.New(&model.Block{Id: homeId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + require.Equal(t, homeId, objectId) + return editor.NewDashboard(sb, fx.store, nil), nil + }) + + // when + err := fx.SetListIsFavorite([]string{"obj1", "obj2", "obj3"}, true) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 4) + }) + + t.Run("no error on unfavoriting", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(homeId) + sb.AddBlock(simple.New(&model.Block{Id: homeId, ChildrenIds: []string{"obj1", "obj2", "obj3"}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj1", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj1"}}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj2", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj2"}}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj3", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj3"}}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + require.Equal(t, homeId, objectId) + return editor.NewDashboard(sb, fx.store, nil), nil + }) + + // when + err := fx.SetListIsFavorite([]string{"obj3", "obj1"}, false) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 2) + }) + + t.Run("some updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(homeId) + sb.AddBlock(simple.New(&model.Block{Id: homeId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId}) + flag := false + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + require.Equal(t, homeId, objectId) + if flag { + return nil, fmt.Errorf("unexpected error") + } + flag = true + return editor.NewDashboard(sb, fx.store, nil), nil + }) + + // when + err := fx.SetListIsFavorite([]string{"obj3", "obj1"}, true) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 2) + }) + + t.Run("all updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Home: homeId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + require.Equal(t, homeId, objectId) + return nil, fmt.Errorf("unexpected error") + }) + + // when + err := fx.SetListIsFavorite([]string{"obj3", "obj1"}, true) + + // then + assert.Error(t, err) + }) +} + +func TestService_SetIsArchived(t *testing.T) { + var ( + objects = []objectstore.TestObject{ + {bundle.RelationKeyId: pbtypes.String("obj1"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + } + binId = "bin" + ) + + t.Run("no error on moving to bin", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(binId) + sb.AddBlock(simple.New(&model.Block{Id: binId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Archive: binId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId == binId { + return editor.NewArchive(sb, fx.store), nil + } + return smarttest.New(objectId), nil + }) + fx.restriction.EXPECT().CheckRestrictions(mock.Anything, mock.Anything).Return(nil) + + // when + err := fx.SetIsArchived("obj1", true) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 2) + }) + + t.Run("cannot move to bin an object with restriction", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(binId) + sb.AddBlock(simple.New(&model.Block{Id: binId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId == binId { + return editor.NewArchive(sb, fx.store), nil + } + return smarttest.New(objectId), nil + }) + fx.restriction.EXPECT().CheckRestrictions(mock.Anything, mock.Anything).Return(restriction.ErrRestricted) + + // when + err := fx.SetIsArchived("obj1", true) + + // then + assert.Error(t, err) + assert.ErrorIs(t, err, restriction.ErrRestricted) + }) +} + +func TestService_SetListIsArchived(t *testing.T) { + var ( + objects = []objectstore.TestObject{ + {bundle.RelationKeyId: pbtypes.String("obj1"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + {bundle.RelationKeyId: pbtypes.String("obj2"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + {bundle.RelationKeyId: pbtypes.String("obj3"), bundle.RelationKeySpaceId: pbtypes.String(spaceId)}, + } + binId = "bin" + ) + + t.Run("no error on moving to bin", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(binId) + sb.AddBlock(simple.New(&model.Block{Id: binId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Archive: binId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId == binId { + return editor.NewArchive(sb, fx.store), nil + } + return smarttest.New(objectId), nil + }) + fx.restriction.EXPECT().CheckRestrictions(mock.Anything, mock.Anything).Return(nil) + + // when + err := fx.SetListIsArchived([]string{"obj1", "obj2", "obj3"}, true) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 4) + }) + + t.Run("no error on moving from bin", func(t *testing.T) { + // given + fx := newFixture(t) + + sb := smarttest.New(binId) + sb.AddBlock(simple.New(&model.Block{Id: binId, ChildrenIds: []string{"obj1", "obj2", "obj3"}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj1", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj1"}}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj2", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj2"}}})) + sb.AddBlock(simple.New(&model.Block{Id: "obj3", Content: &model.BlockContentOfLink{Link: &model.BlockContentLink{TargetBlockId: "obj3"}}})) + + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Archive: binId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId == binId { + return editor.NewArchive(sb, fx.store), nil + } + return smarttest.New(objectId), nil + }) + + // when + err := fx.SetListIsArchived([]string{"obj1", "obj2", "obj3"}, false) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 1) + }) + + t.Run("some updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + sb := smarttest.New(binId) + sb.AddBlock(simple.New(&model.Block{Id: binId, ChildrenIds: []string{}})) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Archive: binId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + if objectId == binId { + return editor.NewArchive(sb, fx.store), nil + } + if objectId == "obj2" { + return nil, fmt.Errorf("failed to get object") + } + return smarttest.New(objectId), nil + }) + fx.restriction.EXPECT().CheckRestrictions(mock.Anything, mock.Anything).Return(nil) + + // when + err := fx.SetListIsArchived([]string{"obj1", "obj2", "obj3"}, true) + + // then + assert.NoError(t, err) + assert.Len(t, sb.Blocks(), 3) + }) + + t.Run("all updates failed", func(t *testing.T) { + // given + fx := newFixture(t) + fx.store.AddObjects(t, objects) + fx.space.EXPECT().DerivedIDs().Return(threads.DerivedSmartblockIds{Archive: binId}) + fx.space.EXPECT().GetObject(mock.Anything, mock.Anything).RunAndReturn(func(_ context.Context, objectId string) (smartblock.SmartBlock, error) { + return nil, fmt.Errorf("failed to get object") + }) + + // when + err := fx.SetListIsArchived([]string{"obj1", "obj2", "obj3"}, true) + + // then + assert.Error(t, err) + }) +} diff --git a/core/block/details/set_details.go b/core/block/details/set_details.go index 6f741fc97c..3db06b3f96 100644 --- a/core/block/details/set_details.go +++ b/core/block/details/set_details.go @@ -107,7 +107,7 @@ func (s *service) SetIsArchived(objectId string, isArchived bool) error { if err != nil { return fmt.Errorf("get space: %w", err) } - if err := s.checkArchivedRestriction(isArchived, spaceID, objectId); err != nil { + if err := s.checkArchivedRestriction(isArchived, objectId); err != nil { return err } return s.objectLinksCollectionModify(spc.DerivedIDs().Archive, objectId, isArchived) @@ -166,7 +166,7 @@ func (s *service) SetListIsArchived(objectIds []string, isArchived bool) error { return multiErr.ErrorOrNil() } -func (s *service) checkArchivedRestriction(isArchived bool, spaceID string, objectId string) error { +func (s *service) checkArchivedRestriction(isArchived bool, objectId string) error { if !isArchived { return nil } @@ -220,7 +220,7 @@ func (s *service) setIsArchivedForObjects(spaceID string, objectIDs []string, is } for _, id := range ids { var err error - if restrErr := s.checkArchivedRestriction(isArchived, spaceID, id); restrErr != nil { + if restrErr := s.checkArchivedRestriction(isArchived, id); restrErr != nil { err = restrErr } else { if isArchived { diff --git a/core/block/editor/smartblock/smarttest/smarttest.go b/core/block/editor/smartblock/smarttest/smarttest.go index 8fbad36ce5..d1caf97d6a 100644 --- a/core/block/editor/smartblock/smarttest/smarttest.go +++ b/core/block/editor/smartblock/smarttest/smarttest.go @@ -25,6 +25,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/localstore/objectstore" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" "github.com/anyproto/anytype-heart/pkg/lib/threads" + "github.com/anyproto/anytype-heart/util/pbtypes" "github.com/anyproto/anytype-heart/util/testMock" ) @@ -268,6 +269,49 @@ func (st *SmartTest) SetDetails(ctx session.Context, details []*model.Detail, sh return } +func (st *SmartTest) SetDetailsAndUpdateLastUsed(ctx session.Context, details []*model.Detail, showEvent bool) (err error) { + for _, detail := range details { + st.Results.LastUsedUpdates = append(st.Results.LastUsedUpdates, detail.Key) + } + return st.SetDetails(ctx, details, showEvent) +} + +func (st *SmartTest) UpdateDetails(update func(current *types.Struct) (*types.Struct, error)) (err error) { + details := st.Doc.(*state.State).CombinedDetails() + if details == nil || details.Fields == nil { + details = &types.Struct{Fields: map[string]*types.Value{}} + } + newDetails, err := update(details) + if err != nil { + return err + } + st.Doc.(*state.State).SetDetails(newDetails) + return nil +} + +func (st *SmartTest) UpdateDetailsAndLastUsed(update func(current *types.Struct) (*types.Struct, error)) (err error) { + details := st.Doc.(*state.State).CombinedDetails() + if details == nil || details.Fields == nil { + details = &types.Struct{Fields: map[string]*types.Value{}} + } + oldDetails := pbtypes.CopyStruct(details, true) + + newDetails, err := update(details) + if err != nil { + return err + } + + diff := pbtypes.StructDiff(oldDetails, newDetails) + if diff == nil || diff.Fields == nil { + return nil + } + + for key := range diff.Fields { + st.Results.LastUsedUpdates = append(st.Results.LastUsedUpdates, key) + } + return nil +} + func (st *SmartTest) Init(ctx *smartblock.InitContext) (err error) { if ctx.State == nil { ctx.State = st.NewState() @@ -408,4 +452,6 @@ func (st *SmartTest) Update(ctx session.Context, apply func(b simple.Block) erro type Results struct { Events [][]simple.EventMessage Applies [][]*model.Block + + LastUsedUpdates []string } From 2c5715e10fd8ab50554c69cc39ebce61c7c61323 Mon Sep 17 00:00:00 2001 From: kirillston Date: Tue, 17 Sep 2024 16:03:00 +0200 Subject: [PATCH 09/20] GO-3964 Rename package --- .mockery.yaml | 2 +- core/anytype/bootstrap.go | 4 +- core/application/account_create.go | 4 +- .../application/account_create_from_export.go | 4 +- .../details_test.go | 2 +- .../mock_detailservice}/mock_Service.go | 66 +++++++++---------- .../{details => detailservice}/relations.go | 2 +- .../relations_test.go | 2 +- .../{details => detailservice}/service.go | 2 +- .../service_test.go | 2 +- .../{details => detailservice}/set_details.go | 2 +- .../common/objectcreator/objectcreator.go | 6 +- .../objectcreator/objectcreator_test.go | 4 +- core/block/import/importer.go | 4 +- core/block/service.go | 6 +- core/details.go | 22 +++---- core/relations.go | 12 ++-- core/workspace.go | 4 +- util/builtinobjects/builtinobjects.go | 6 +- 19 files changed, 78 insertions(+), 78 deletions(-) rename core/block/{details => detailservice}/details_test.go (99%) rename core/block/{details/mock_details => detailservice/mock_detailservice}/mock_Service.go (95%) rename core/block/{details => detailservice}/relations.go (99%) rename core/block/{details => detailservice}/relations_test.go (99%) rename core/block/{details => detailservice}/service.go (99%) rename core/block/{details => detailservice}/service_test.go (99%) rename core/block/{details => detailservice}/set_details.go (99%) diff --git a/.mockery.yaml b/.mockery.yaml index 891a66152c..d7757014ea 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -215,6 +215,6 @@ packages: NodeUsage: NetworkConfig: Updater: - github.com/anyproto/anytype-heart/core/block/details: + github.com/anyproto/anytype-heart/core/block/detailservice: interfaces: Service: \ No newline at end of file diff --git a/core/anytype/bootstrap.go b/core/anytype/bootstrap.go index 6d46f1e932..f2c14c6db1 100644 --- a/core/anytype/bootstrap.go +++ b/core/anytype/bootstrap.go @@ -38,7 +38,7 @@ import ( "github.com/anyproto/anytype-heart/core/block/bookmark" decorator "github.com/anyproto/anytype-heart/core/block/bookmark/bookmarkimporter" "github.com/anyproto/anytype-heart/core/block/collection" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/editor" "github.com/anyproto/anytype-heart/core/block/editor/converter" "github.com/anyproto/anytype-heart/core/block/editor/lastused" @@ -267,7 +267,7 @@ func Bootstrap(a *app.App, components ...app.Component) { Register(core.New()). Register(core.NewTempDirService()). Register(treemanager.New()). - Register(details.New()). + Register(detailservice.New()). Register(block.New()). Register(indexer.New()). Register(detailsupdater.New()). diff --git a/core/application/account_create.go b/core/application/account_create.go index bb61836dfe..53c63b19b1 100644 --- a/core/application/account_create.go +++ b/core/application/account_create.go @@ -13,7 +13,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" "github.com/anyproto/anytype-heart/core/block" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/domain/objectorigin" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -151,7 +151,7 @@ func (s *Service) setAccountAndProfileDetails(ctx context.Context, req *pb.RpcAc } accountObjects := spc.DerivedIDs() - ds := app.MustComponent[details.Service](s.app) + ds := app.MustComponent[detailservice.Service](s.app) if err := ds.SetDetails(nil, accountObjects.Profile, profileDetails, diff --git a/core/application/account_create_from_export.go b/core/application/account_create_from_export.go index c30502ac2c..b08c5513f1 100644 --- a/core/application/account_create_from_export.go +++ b/core/application/account_create_from_export.go @@ -16,7 +16,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype" "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/anytype/config" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/metrics" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/bundle" @@ -160,7 +160,7 @@ func (s *Service) getBootstrapConfig(req *pb.RpcAccountRecoverFromLegacyExportRe func (s *Service) setDetails(profile *pb.Profile, icon int64) error { profileDetails, accountDetails := buildDetails(profile, icon) - ds := app.MustComponent[details.Service](s.app) + ds := app.MustComponent[detailservice.Service](s.app) spaceService := app.MustComponent[space.Service](s.app) spc, err := spaceService.GetPersonalSpace(context.Background()) diff --git a/core/block/details/details_test.go b/core/block/detailservice/details_test.go similarity index 99% rename from core/block/details/details_test.go rename to core/block/detailservice/details_test.go index 530905be49..453e30d753 100644 --- a/core/block/details/details_test.go +++ b/core/block/detailservice/details_test.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "testing" diff --git a/core/block/details/mock_details/mock_Service.go b/core/block/detailservice/mock_detailservice/mock_Service.go similarity index 95% rename from core/block/details/mock_details/mock_Service.go rename to core/block/detailservice/mock_detailservice/mock_Service.go index 56fd4fe2ee..3ff60d154d 100644 --- a/core/block/details/mock_details/mock_Service.go +++ b/core/block/detailservice/mock_detailservice/mock_Service.go @@ -1,6 +1,6 @@ // Code generated by mockery. DO NOT EDIT. -package mock_details +package mock_detailservice import ( context "context" @@ -501,9 +501,9 @@ func (_c *MockService_ObjectTypeRemoveRelations_Call) RunAndReturn(run func(cont return _c } -// SetDetails provides a mock function with given fields: ctx, objectId, _a2 -func (_m *MockService) SetDetails(ctx session.Context, objectId string, _a2 []*model.Detail) error { - ret := _m.Called(ctx, objectId, _a2) +// SetDetails provides a mock function with given fields: ctx, objectId, details +func (_m *MockService) SetDetails(ctx session.Context, objectId string, details []*model.Detail) error { + ret := _m.Called(ctx, objectId, details) if len(ret) == 0 { panic("no return value specified for SetDetails") @@ -511,7 +511,7 @@ func (_m *MockService) SetDetails(ctx session.Context, objectId string, _a2 []*m var r0 error if rf, ok := ret.Get(0).(func(session.Context, string, []*model.Detail) error); ok { - r0 = rf(ctx, objectId, _a2) + r0 = rf(ctx, objectId, details) } else { r0 = ret.Error(0) } @@ -527,12 +527,12 @@ type MockService_SetDetails_Call struct { // SetDetails is a helper method to define mock.On call // - ctx session.Context // - objectId string -// - _a2 []*model.Detail -func (_e *MockService_Expecter) SetDetails(ctx interface{}, objectId interface{}, _a2 interface{}) *MockService_SetDetails_Call { - return &MockService_SetDetails_Call{Call: _e.mock.On("SetDetails", ctx, objectId, _a2)} +// - details []*model.Detail +func (_e *MockService_Expecter) SetDetails(ctx interface{}, objectId interface{}, details interface{}) *MockService_SetDetails_Call { + return &MockService_SetDetails_Call{Call: _e.mock.On("SetDetails", ctx, objectId, details)} } -func (_c *MockService_SetDetails_Call) Run(run func(ctx session.Context, objectId string, _a2 []*model.Detail)) *MockService_SetDetails_Call { +func (_c *MockService_SetDetails_Call) Run(run func(ctx session.Context, objectId string, details []*model.Detail)) *MockService_SetDetails_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(session.Context), args[1].(string), args[2].([]*model.Detail)) }) @@ -549,9 +549,9 @@ func (_c *MockService_SetDetails_Call) RunAndReturn(run func(session.Context, st return _c } -// SetDetailsAndUpdateLastUsed provides a mock function with given fields: ctx, objectId, _a2 -func (_m *MockService) SetDetailsAndUpdateLastUsed(ctx session.Context, objectId string, _a2 []*model.Detail) error { - ret := _m.Called(ctx, objectId, _a2) +// SetDetailsAndUpdateLastUsed provides a mock function with given fields: ctx, objectId, details +func (_m *MockService) SetDetailsAndUpdateLastUsed(ctx session.Context, objectId string, details []*model.Detail) error { + ret := _m.Called(ctx, objectId, details) if len(ret) == 0 { panic("no return value specified for SetDetailsAndUpdateLastUsed") @@ -559,7 +559,7 @@ func (_m *MockService) SetDetailsAndUpdateLastUsed(ctx session.Context, objectId var r0 error if rf, ok := ret.Get(0).(func(session.Context, string, []*model.Detail) error); ok { - r0 = rf(ctx, objectId, _a2) + r0 = rf(ctx, objectId, details) } else { r0 = ret.Error(0) } @@ -575,12 +575,12 @@ type MockService_SetDetailsAndUpdateLastUsed_Call struct { // SetDetailsAndUpdateLastUsed is a helper method to define mock.On call // - ctx session.Context // - objectId string -// - _a2 []*model.Detail -func (_e *MockService_Expecter) SetDetailsAndUpdateLastUsed(ctx interface{}, objectId interface{}, _a2 interface{}) *MockService_SetDetailsAndUpdateLastUsed_Call { - return &MockService_SetDetailsAndUpdateLastUsed_Call{Call: _e.mock.On("SetDetailsAndUpdateLastUsed", ctx, objectId, _a2)} +// - details []*model.Detail +func (_e *MockService_Expecter) SetDetailsAndUpdateLastUsed(ctx interface{}, objectId interface{}, details interface{}) *MockService_SetDetailsAndUpdateLastUsed_Call { + return &MockService_SetDetailsAndUpdateLastUsed_Call{Call: _e.mock.On("SetDetailsAndUpdateLastUsed", ctx, objectId, details)} } -func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) Run(run func(ctx session.Context, objectId string, _a2 []*model.Detail)) *MockService_SetDetailsAndUpdateLastUsed_Call { +func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) Run(run func(ctx session.Context, objectId string, details []*model.Detail)) *MockService_SetDetailsAndUpdateLastUsed_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(session.Context), args[1].(string), args[2].([]*model.Detail)) }) @@ -597,9 +597,9 @@ func (_c *MockService_SetDetailsAndUpdateLastUsed_Call) RunAndReturn(run func(se return _c } -// SetDetailsList provides a mock function with given fields: ctx, objectIds, _a2 -func (_m *MockService) SetDetailsList(ctx session.Context, objectIds []string, _a2 []*model.Detail) error { - ret := _m.Called(ctx, objectIds, _a2) +// SetDetailsList provides a mock function with given fields: ctx, objectIds, details +func (_m *MockService) SetDetailsList(ctx session.Context, objectIds []string, details []*model.Detail) error { + ret := _m.Called(ctx, objectIds, details) if len(ret) == 0 { panic("no return value specified for SetDetailsList") @@ -607,7 +607,7 @@ func (_m *MockService) SetDetailsList(ctx session.Context, objectIds []string, _ var r0 error if rf, ok := ret.Get(0).(func(session.Context, []string, []*model.Detail) error); ok { - r0 = rf(ctx, objectIds, _a2) + r0 = rf(ctx, objectIds, details) } else { r0 = ret.Error(0) } @@ -623,12 +623,12 @@ type MockService_SetDetailsList_Call struct { // SetDetailsList is a helper method to define mock.On call // - ctx session.Context // - objectIds []string -// - _a2 []*model.Detail -func (_e *MockService_Expecter) SetDetailsList(ctx interface{}, objectIds interface{}, _a2 interface{}) *MockService_SetDetailsList_Call { - return &MockService_SetDetailsList_Call{Call: _e.mock.On("SetDetailsList", ctx, objectIds, _a2)} +// - details []*model.Detail +func (_e *MockService_Expecter) SetDetailsList(ctx interface{}, objectIds interface{}, details interface{}) *MockService_SetDetailsList_Call { + return &MockService_SetDetailsList_Call{Call: _e.mock.On("SetDetailsList", ctx, objectIds, details)} } -func (_c *MockService_SetDetailsList_Call) Run(run func(ctx session.Context, objectIds []string, _a2 []*model.Detail)) *MockService_SetDetailsList_Call { +func (_c *MockService_SetDetailsList_Call) Run(run func(ctx session.Context, objectIds []string, details []*model.Detail)) *MockService_SetDetailsList_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(session.Context), args[1].([]string), args[2].([]*model.Detail)) }) @@ -881,9 +881,9 @@ func (_c *MockService_SetSource_Call) RunAndReturn(run func(session.Context, str return _c } -// SetSpaceInfo provides a mock function with given fields: spaceId, _a1 -func (_m *MockService) SetSpaceInfo(spaceId string, _a1 *types.Struct) error { - ret := _m.Called(spaceId, _a1) +// SetSpaceInfo provides a mock function with given fields: spaceId, details +func (_m *MockService) SetSpaceInfo(spaceId string, details *types.Struct) error { + ret := _m.Called(spaceId, details) if len(ret) == 0 { panic("no return value specified for SetSpaceInfo") @@ -891,7 +891,7 @@ func (_m *MockService) SetSpaceInfo(spaceId string, _a1 *types.Struct) error { var r0 error if rf, ok := ret.Get(0).(func(string, *types.Struct) error); ok { - r0 = rf(spaceId, _a1) + r0 = rf(spaceId, details) } else { r0 = ret.Error(0) } @@ -906,12 +906,12 @@ type MockService_SetSpaceInfo_Call struct { // SetSpaceInfo is a helper method to define mock.On call // - spaceId string -// - _a1 *types.Struct -func (_e *MockService_Expecter) SetSpaceInfo(spaceId interface{}, _a1 interface{}) *MockService_SetSpaceInfo_Call { - return &MockService_SetSpaceInfo_Call{Call: _e.mock.On("SetSpaceInfo", spaceId, _a1)} +// - details *types.Struct +func (_e *MockService_Expecter) SetSpaceInfo(spaceId interface{}, details interface{}) *MockService_SetSpaceInfo_Call { + return &MockService_SetSpaceInfo_Call{Call: _e.mock.On("SetSpaceInfo", spaceId, details)} } -func (_c *MockService_SetSpaceInfo_Call) Run(run func(spaceId string, _a1 *types.Struct)) *MockService_SetSpaceInfo_Call { +func (_c *MockService_SetSpaceInfo_Call) Run(run func(spaceId string, details *types.Struct)) *MockService_SetSpaceInfo_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(string), args[1].(*types.Struct)) }) diff --git a/core/block/details/relations.go b/core/block/detailservice/relations.go similarity index 99% rename from core/block/details/relations.go rename to core/block/detailservice/relations.go index 7995ecee47..8cdb153717 100644 --- a/core/block/details/relations.go +++ b/core/block/detailservice/relations.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "context" diff --git a/core/block/details/relations_test.go b/core/block/detailservice/relations_test.go similarity index 99% rename from core/block/details/relations_test.go rename to core/block/detailservice/relations_test.go index 84538f85ed..5db0772436 100644 --- a/core/block/details/relations_test.go +++ b/core/block/detailservice/relations_test.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "context" diff --git a/core/block/details/service.go b/core/block/detailservice/service.go similarity index 99% rename from core/block/details/service.go rename to core/block/detailservice/service.go index 8b46dffb7d..c871b3398b 100644 --- a/core/block/details/service.go +++ b/core/block/detailservice/service.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "context" diff --git a/core/block/details/service_test.go b/core/block/detailservice/service_test.go similarity index 99% rename from core/block/details/service_test.go rename to core/block/detailservice/service_test.go index 5cf88f5123..9b1fab0b6e 100644 --- a/core/block/details/service_test.go +++ b/core/block/detailservice/service_test.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "context" diff --git a/core/block/details/set_details.go b/core/block/detailservice/set_details.go similarity index 99% rename from core/block/details/set_details.go rename to core/block/detailservice/set_details.go index 3db06b3f96..9263f7ec82 100644 --- a/core/block/details/set_details.go +++ b/core/block/detailservice/set_details.go @@ -1,4 +1,4 @@ -package details +package detailservice import ( "context" diff --git a/core/block/import/common/objectcreator/objectcreator.go b/core/block/import/common/objectcreator/objectcreator.go index 32b6100ef2..65d91d3afa 100644 --- a/core/block/import/common/objectcreator/objectcreator.go +++ b/core/block/import/common/objectcreator/objectcreator.go @@ -11,7 +11,7 @@ import ( "go.uber.org/zap" "github.com/anyproto/anytype-heart/core/block/cache" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/editor/basic" "github.com/anyproto/anytype-heart/core/block/editor/smartblock" "github.com/anyproto/anytype-heart/core/block/editor/state" @@ -49,7 +49,7 @@ type ObjectDeleter interface { } type ObjectCreator struct { - detailsService details.Service + detailsService detailservice.Service spaceService space.Service objectStore objectstore.ObjectStore relationSyncer *syncer.FileRelationSyncer @@ -58,7 +58,7 @@ type ObjectCreator struct { objectDeleter ObjectDeleter } -func New(detailsService details.Service, +func New(detailsService detailservice.Service, syncFactory *syncer.Factory, objectStore objectstore.ObjectStore, relationSyncer *syncer.FileRelationSyncer, diff --git a/core/block/import/common/objectcreator/objectcreator_test.go b/core/block/import/common/objectcreator/objectcreator_test.go index 7c6f111112..486b66597a 100644 --- a/core/block/import/common/objectcreator/objectcreator_test.go +++ b/core/block/import/common/objectcreator/objectcreator_test.go @@ -7,7 +7,7 @@ import ( "github.com/gogo/protobuf/types" "github.com/stretchr/testify/assert" - "github.com/anyproto/anytype-heart/core/block/details/mock_details" + "github.com/anyproto/anytype-heart/core/block/detailservice/mock_detailservice" "github.com/anyproto/anytype-heart/core/block/editor/smartblock/smarttest" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/import/common" @@ -27,7 +27,7 @@ func TestObjectCreator_Create(t *testing.T) { t.Run("participant object - don't update it", func(t *testing.T) { // given spaceID := "spaceId" - detailsService := mock_details.NewMockService(t) + detailsService := mock_detailservice.NewMockService(t) mockService := mock_space.NewMockService(t) mockSpace := mock_clientspace.NewMockSpace(t) mockSpace.EXPECT().IsReadOnly().Return(true) diff --git a/core/block/import/importer.go b/core/block/import/importer.go index 5a2d70c509..8a4e789bbf 100644 --- a/core/block/import/importer.go +++ b/core/block/import/importer.go @@ -17,7 +17,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/collection" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/import/common" creator "github.com/anyproto/anytype-heart/core/block/import/common/objectcreator" "github.com/anyproto/anytype-heart/core/block/import/common/objectid" @@ -105,7 +105,7 @@ func (i *Import) Init(a *app.App) (err error) { factory := syncer.New(syncer.NewFileSyncer(i.s, fileObjectService), syncer.NewBookmarkSyncer(i.s), syncer.NewIconSyncer(i.s, fileObjectService)) relationSyncer := syncer.NewFileRelationSyncer(i.s, fileObjectService) objectCreator := app.MustComponent[objectcreator.Service](a) - detailsService := app.MustComponent[details.Service](a) + detailsService := app.MustComponent[detailservice.Service](a) i.oc = creator.New(detailsService, factory, store, relationSyncer, spaceService, objectCreator, i.s) i.fileSync = app.MustComponent[filesync.FileSync](a) i.notificationService = app.MustComponent[notifications.Notifications](a) diff --git a/core/block/service.go b/core/block/service.go index 96c6088af9..550a9af1a1 100644 --- a/core/block/service.go +++ b/core/block/service.go @@ -17,7 +17,7 @@ import ( bookmarksvc "github.com/anyproto/anytype-heart/core/block/bookmark" "github.com/anyproto/anytype-heart/core/block/cache" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/editor/basic" "github.com/anyproto/anytype-heart/core/block/editor/collection" "github.com/anyproto/anytype-heart/core/block/editor/file" @@ -102,7 +102,7 @@ type Service struct { tempDirProvider core.TempDirProvider builtinObjectService builtinObjects fileObjectService fileobject.Service - detailsService details.Service + detailsService detailservice.Service fileService files.Service fileUploaderService fileuploader.Service @@ -147,7 +147,7 @@ func (s *Service) Init(a *app.App) (err error) { s.tempDirProvider = app.MustComponent[core.TempDirProvider](a) s.builtinObjectService = app.MustComponent[builtinObjects](a) - s.detailsService = app.MustComponent[details.Service](a) + s.detailsService = app.MustComponent[detailservice.Service](a) return } diff --git a/core/details.go b/core/details.go index 0511d65c21..c8af250d9c 100644 --- a/core/details.go +++ b/core/details.go @@ -5,7 +5,7 @@ import ( "github.com/gogo/protobuf/types" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/util/internalflag" "github.com/anyproto/anytype-heart/util/pbtypes" @@ -22,7 +22,7 @@ func (mw *Middleware) ObjectSetDetails(cctx context.Context, req *pb.RpcObjectSe } return m } - err := getService[details.Service](mw).SetDetailsAndUpdateLastUsed(ctx, req.ContextId, req.GetDetails()) + err := getService[detailservice.Service](mw).SetDetailsAndUpdateLastUsed(ctx, req.ContextId, req.GetDetails()) if err != nil { return response(pb.RpcObjectSetDetailsResponseError_UNKNOWN_ERROR, err) } @@ -41,7 +41,7 @@ func (mw *Middleware) ObjectListSetDetails(cctx context.Context, req *pb.RpcObje return m } - err := getService[details.Service](mw).SetDetailsList(ctx, req.ObjectIds, req.Details) + err := getService[detailservice.Service](mw).SetDetailsList(ctx, req.ObjectIds, req.Details) if err != nil { return response(pb.RpcObjectListSetDetailsResponseError_UNKNOWN_ERROR, err) } @@ -60,7 +60,7 @@ func (mw *Middleware) ObjectSetInternalFlags(cctx context.Context, req *pb.RpcOb } return m } - ds := getService[details.Service](mw) + ds := getService[detailservice.Service](mw) err := ds.ModifyDetails(req.ContextId, func(current *types.Struct) (*types.Struct, error) { d := pbtypes.CopyStruct(current, false) return internalflag.PutToDetails(d, req.InternalFlags), nil @@ -79,7 +79,7 @@ func (mw *Middleware) ObjectListModifyDetailValues(_ context.Context, req *pb.Rp } return m } - err := getService[details.Service](mw).ModifyDetailsList(req) + err := getService[detailservice.Service](mw).ModifyDetailsList(req) if err != nil { return response(pb.RpcObjectListModifyDetailValuesResponseError_UNKNOWN_ERROR, err) } @@ -98,7 +98,7 @@ func (mw *Middleware) ObjectSetSource(cctx context.Context, } return m } - err := getService[details.Service](mw).SetSource(ctx, req.ContextId, req.Source) + err := getService[detailservice.Service](mw).SetSource(ctx, req.ContextId, req.Source) if err != nil { return response(pb.RpcObjectSetSourceResponseError_UNKNOWN_ERROR, err) } @@ -122,7 +122,7 @@ func (mw *Middleware) ObjectWorkspaceSetDashboard(cctx context.Context, req *pb. } return resp } - setId, err := getService[details.Service](mw).SetWorkspaceDashboardId(ctx, req.ContextId, req.ObjectId) + setId, err := getService[detailservice.Service](mw).SetWorkspaceDashboardId(ctx, req.ContextId, req.ObjectId) return response(setId, err) } @@ -134,7 +134,7 @@ func (mw *Middleware) ObjectSetIsFavorite(_ context.Context, req *pb.RpcObjectSe } return m } - err := getService[details.Service](mw).SetIsFavorite(req.ContextId, req.IsFavorite) + err := getService[detailservice.Service](mw).SetIsFavorite(req.ContextId, req.IsFavorite) if err != nil { return response(pb.RpcObjectSetIsFavoriteResponseError_UNKNOWN_ERROR, err) } @@ -149,7 +149,7 @@ func (mw *Middleware) ObjectSetIsArchived(_ context.Context, req *pb.RpcObjectSe } return m } - err := getService[details.Service](mw).SetIsArchived(req.ContextId, req.IsArchived) + err := getService[detailservice.Service](mw).SetIsArchived(req.ContextId, req.IsArchived) if err != nil { return response(pb.RpcObjectSetIsArchivedResponseError_UNKNOWN_ERROR, err) } @@ -164,7 +164,7 @@ func (mw *Middleware) ObjectListSetIsArchived(_ context.Context, req *pb.RpcObje } return m } - err := getService[details.Service](mw).SetListIsArchived(req.ObjectIds, req.IsArchived) + err := getService[detailservice.Service](mw).SetListIsArchived(req.ObjectIds, req.IsArchived) if err != nil { return response(pb.RpcObjectListSetIsArchivedResponseError_UNKNOWN_ERROR, err) } @@ -179,7 +179,7 @@ func (mw *Middleware) ObjectListSetIsFavorite(_ context.Context, req *pb.RpcObje } return m } - err := getService[details.Service](mw).SetListIsFavorite(req.ObjectIds, req.IsFavorite) + err := getService[detailservice.Service](mw).SetListIsFavorite(req.ObjectIds, req.IsFavorite) if err != nil { return response(pb.RpcObjectListSetIsFavoriteResponseError_UNKNOWN_ERROR, err) } diff --git a/core/relations.go b/core/relations.go index 686c2ed0f9..453eddab61 100644 --- a/core/relations.go +++ b/core/relations.go @@ -5,13 +5,13 @@ import ( "errors" "github.com/anyproto/anytype-heart/core/block" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/domain" "github.com/anyproto/anytype-heart/pb" ) func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObjectTypeRelationAddRequest) *pb.RpcObjectTypeRelationAddResponse { - detailsService := getService[details.Service](mw) + detailsService := getService[detailservice.Service](mw) keys := make([]domain.RelationKey, 0, len(req.RelationKeys)) for _, relKey := range req.RelationKeys { keys = append(keys, domain.RelationKey(relKey)) @@ -19,7 +19,7 @@ func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObj err := detailsService.ObjectTypeAddRelations(cctx, req.ObjectTypeUrl, keys) code := mapErrorCode(err, - errToCode(details.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationAddResponseError_READONLY_OBJECT_TYPE), + errToCode(detailservice.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationAddResponseError_READONLY_OBJECT_TYPE), ) return &pb.RpcObjectTypeRelationAddResponse{ Error: &pb.RpcObjectTypeRelationAddResponseError{ @@ -30,7 +30,7 @@ func (mw *Middleware) ObjectTypeRelationAdd(cctx context.Context, req *pb.RpcObj } func (mw *Middleware) ObjectTypeRelationRemove(cctx context.Context, req *pb.RpcObjectTypeRelationRemoveRequest) *pb.RpcObjectTypeRelationRemoveResponse { - detailsService := getService[details.Service](mw) + detailsService := getService[detailservice.Service](mw) keys := make([]domain.RelationKey, 0, len(req.RelationKeys)) for _, relKey := range req.RelationKeys { keys = append(keys, domain.RelationKey(relKey)) @@ -38,7 +38,7 @@ func (mw *Middleware) ObjectTypeRelationRemove(cctx context.Context, req *pb.Rpc err := detailsService.ObjectTypeRemoveRelations(cctx, req.ObjectTypeUrl, keys) code := mapErrorCode(err, - errToCode(details.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationRemoveResponseError_READONLY_OBJECT_TYPE), + errToCode(detailservice.ErrBundledTypeIsReadonly, pb.RpcObjectTypeRelationRemoveResponseError_READONLY_OBJECT_TYPE), ) return &pb.RpcObjectTypeRelationRemoveResponse{ Error: &pb.RpcObjectTypeRelationRemoveResponseError{ @@ -98,6 +98,6 @@ func (mw *Middleware) RelationListWithValue(_ context.Context, req *pb.RpcRelati return m } - keys, counters, err := getService[details.Service](mw).ListRelationsWithValue(req.SpaceId, req.Value) + keys, counters, err := getService[detailservice.Service](mw).ListRelationsWithValue(req.SpaceId, req.Value) return response(keys, counters, err) } diff --git a/core/workspace.go b/core/workspace.go index 57f8326f36..0775e8f676 100644 --- a/core/workspace.go +++ b/core/workspace.go @@ -8,7 +8,7 @@ import ( "github.com/anyproto/anytype-heart/core/anytype/account" "github.com/anyproto/anytype-heart/core/block" "github.com/anyproto/anytype-heart/core/block/cache" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/editor" "github.com/anyproto/anytype-heart/pb" "github.com/anyproto/anytype-heart/pkg/lib/pb/model" @@ -75,7 +75,7 @@ func (mw *Middleware) WorkspaceSetInfo(cctx context.Context, req *pb.RpcWorkspac return m } - err := getService[details.Service](mw).SetSpaceInfo(req.SpaceId, req.Details) + err := getService[detailservice.Service](mw).SetSpaceInfo(req.SpaceId, req.Details) if err != nil { return response(pb.RpcWorkspaceSetInfoResponseError_UNKNOWN_ERROR, err) } diff --git a/util/builtinobjects/builtinobjects.go b/util/builtinobjects/builtinobjects.go index bbda327cff..9b3127778d 100644 --- a/util/builtinobjects/builtinobjects.go +++ b/util/builtinobjects/builtinobjects.go @@ -18,7 +18,7 @@ import ( "github.com/miolini/datacounter" "github.com/anyproto/anytype-heart/core/block/cache" - "github.com/anyproto/anytype-heart/core/block/details" + "github.com/anyproto/anytype-heart/core/block/detailservice" "github.com/anyproto/anytype-heart/core/block/editor/state" "github.com/anyproto/anytype-heart/core/block/editor/widget" importer "github.com/anyproto/anytype-heart/core/block/import" @@ -146,7 +146,7 @@ type BuiltinObjects interface { } type builtinObjects struct { - detailsService details.Service + detailsService detailservice.Service importer importer.Importer store objectstore.ObjectStore tempDirService core.TempDirProvider @@ -160,7 +160,7 @@ func New() BuiltinObjects { } func (b *builtinObjects) Init(a *app.App) (err error) { - b.detailsService = app.MustComponent[details.Service](a) + b.detailsService = app.MustComponent[detailservice.Service](a) b.importer = a.MustComponent(importer.CName).(importer.Importer) b.store = app.MustComponent[objectstore.ObjectStore](a) b.tempDirService = app.MustComponent[core.TempDirProvider](a) From 7c20c75e38def709dcdefc33ed23fecac3e03365 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 04:33:32 +0000 Subject: [PATCH 10/20] Bump github.com/anyproto/any-store from 0.0.5 to 0.0.6 Bumps [github.com/anyproto/any-store](https://github.com/anyproto/any-store) from 0.0.5 to 0.0.6. - [Commits](https://github.com/anyproto/any-store/compare/v0.0.5...v0.0.6) --- updated-dependencies: - dependency-name: github.com/anyproto/any-store dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ff8d958652..12c1af7642 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/PuerkitoBio/goquery v1.9.2 github.com/VividCortex/ewma v1.2.0 github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786 - github.com/anyproto/any-store v0.0.5 + github.com/anyproto/any-store v0.0.6 github.com/anyproto/any-sync v0.4.30 github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438 github.com/anyproto/tantivy-go v0.1.0 diff --git a/go.sum b/go.sum index feb9464529..93f4c04c51 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,8 @@ github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxB github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= -github.com/anyproto/any-store v0.0.5 h1:ToUbPNkGJcuYOpS2IWlbuxZadvsOOKLeLfKe8DeO3Hc= -github.com/anyproto/any-store v0.0.5/go.mod h1:MA3sSqRXIp0h9bC2LnMuDGVEFGB3BkI/UuWNCleGHMs= +github.com/anyproto/any-store v0.0.6 h1:FOBtNL6osrlzBu4wmiFqKZOa8pkL5Ena2LfVser8nig= +github.com/anyproto/any-store v0.0.6/go.mod h1:MA3sSqRXIp0h9bC2LnMuDGVEFGB3BkI/UuWNCleGHMs= github.com/anyproto/any-sync v0.4.30 h1:2nnoVQF9WiBIw8pzwuOubwqf7a+xvZPDkXHmykTPi0k= github.com/anyproto/any-sync v0.4.30/go.mod h1:YjwTdTRL6b6GuutJNboJJ1M5D/kkdeSf9qF5xP6wG7Y= github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc= From 95a9ead5f72b96ccf52cd38b424e1497de69aa7e Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 20 Sep 2024 13:47:28 +0200 Subject: [PATCH 11/20] GO-4102 Unhide Done and Template --- core/block/editor/template/collection.go | 1 - pkg/lib/bundle/relation.gen.go | 4 ++-- pkg/lib/bundle/relations.json | 5 +++-- pkg/lib/bundle/types.gen.go | 4 ++-- pkg/lib/bundle/types.json | 5 +++-- .../migration/systemobjectreviser/systemobjectreviser.go | 1 + 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/block/editor/template/collection.go b/core/block/editor/template/collection.go index a9e4ebe5e5..23bb2b846e 100644 --- a/core/block/editor/template/collection.go +++ b/core/block/editor/template/collection.go @@ -69,7 +69,6 @@ func init() { } DefaultDataviewRelations = append(DefaultDataviewRelations, rel) } - DefaultDataviewRelations = append(DefaultDataviewRelations, bundle.RelationKeyDone) DefaultDataviewRelations = append(DefaultDataviewRelations, bundle.RelationKeyTag) } diff --git a/pkg/lib/bundle/relation.gen.go b/pkg/lib/bundle/relation.gen.go index f0bded2679..d0b2a2c392 100644 --- a/pkg/lib/bundle/relation.gen.go +++ b/pkg/lib/bundle/relation.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const RelationChecksum = "68778695c5d49dd1ffbab91e13bd9769d80fd89de3a77902cec1c5066e5495a8" +const RelationChecksum = "a8068f8bee7828cfa88a4cf262a8276bf2cbf1eadc9934dd52c5c06be2d02bbd" const ( RelationKeyTag domain.RelationKey = "tag" RelationKeyCamera domain.RelationKey = "camera" @@ -459,13 +459,13 @@ var ( DataSource: model.Relation_details, Description: "Done checkbox used to render action layout. ", Format: model.RelationFormat_checkbox, - Hidden: true, Id: "_brdone", Key: "done", MaxCount: 1, Name: "Done", ReadOnly: false, ReadOnlyRelation: true, + Revision: 1, Scope: model.Relation_type, }, RelationKeyDueDate: { diff --git a/pkg/lib/bundle/relations.json b/pkg/lib/bundle/relations.json index b721389810..1e066dff50 100644 --- a/pkg/lib/bundle/relations.json +++ b/pkg/lib/bundle/relations.json @@ -91,12 +91,13 @@ { "description": "Done checkbox used to render action layout. ", "format": "checkbox", - "hidden": true, + "hidden": false, "key": "done", "maxCount": 1, "name": "Done", "readonly": false, - "source": "details" + "source": "details", + "revision": 1 }, { "description": "Artist URL", diff --git a/pkg/lib/bundle/types.gen.go b/pkg/lib/bundle/types.gen.go index d52b8ab6cc..c40521d69e 100644 --- a/pkg/lib/bundle/types.gen.go +++ b/pkg/lib/bundle/types.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const TypeChecksum = "8b79add6b322acbcee123ad178c1aee523a2d9b9f219c391903530b29e554a1e" +const TypeChecksum = "0ccb069416aeaebca02358d1cf986a72322333e92ab36428f706cd2dc0f55db5" const ( TypePrefix = "_ot" ) @@ -337,11 +337,11 @@ var ( TypeKeyTemplate: { Description: "Sample object that has already some details in place and used to create objects from", - Hidden: true, Layout: model.ObjectType_basic, Name: "Template", Readonly: true, RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTargetObjectType), MustGetRelationLink(RelationKeyTemplateIsBundled)}, + Revision: 1, Types: []model.SmartBlockType{model.SmartBlockType_Template}, Url: TypePrefix + "template", }, diff --git a/pkg/lib/bundle/types.json b/pkg/lib/bundle/types.json index 8184ae50a7..eb1a6a9c6d 100644 --- a/pkg/lib/bundle/types.json +++ b/pkg/lib/bundle/types.json @@ -269,13 +269,14 @@ "Template" ], "emoji": "", - "hidden": true, + "hidden": false, "layout": "basic", "relations": [ "targetObjectType", "templateIsBundled" ], - "description": "Sample object that has already some details in place and used to create objects from" + "description": "Sample object that has already some details in place and used to create objects from", + "revision": 1 }, { "id": "set", diff --git a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go index 7da55be02e..262ae92ae2 100644 --- a/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go +++ b/space/internal/components/migration/systemobjectreviser/systemobjectreviser.go @@ -149,6 +149,7 @@ func buildDiffDetails(origin, current *types.Struct) (details []*model.Detail) { bundle.RelationKeyIsReadonly.String(), bundle.RelationKeyIsHidden.String(), bundle.RelationKeyRevision.String(), bundle.RelationKeyRelationReadonlyValue.String(), bundle.RelationKeyRelationMaxCount.String(), bundle.RelationKeyTargetObjectType.String(), + bundle.RelationKeyIconEmoji.String(), }) for key, value := range diff.Fields { From 69c5102e9bc9a5a666037f5ab6d1d8ea96cc0ade Mon Sep 17 00:00:00 2001 From: kirillston Date: Fri, 20 Sep 2024 16:35:21 +0200 Subject: [PATCH 12/20] GO-4102 Add emoji for Template --- pkg/lib/bundle/types.gen.go | 3 ++- pkg/lib/bundle/types.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/lib/bundle/types.gen.go b/pkg/lib/bundle/types.gen.go index c40521d69e..d54f956540 100644 --- a/pkg/lib/bundle/types.gen.go +++ b/pkg/lib/bundle/types.gen.go @@ -9,7 +9,7 @@ import ( "github.com/anyproto/anytype-heart/pkg/lib/pb/model" ) -const TypeChecksum = "0ccb069416aeaebca02358d1cf986a72322333e92ab36428f706cd2dc0f55db5" +const TypeChecksum = "a475473f827167d93b818920569ea0f2c758761ef24d6a6bcb8da6b009f01904" const ( TypePrefix = "_ot" ) @@ -337,6 +337,7 @@ var ( TypeKeyTemplate: { Description: "Sample object that has already some details in place and used to create objects from", + IconEmoji: "🧩", Layout: model.ObjectType_basic, Name: "Template", Readonly: true, diff --git a/pkg/lib/bundle/types.json b/pkg/lib/bundle/types.json index eb1a6a9c6d..e654caf0b2 100644 --- a/pkg/lib/bundle/types.json +++ b/pkg/lib/bundle/types.json @@ -268,7 +268,7 @@ "types": [ "Template" ], - "emoji": "", + "emoji": "\uD83E\uDDE9", "hidden": false, "layout": "basic", "relations": [ From 0085aeddba2b1536fca82b24e11ec72268cccbd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 04:57:32 +0000 Subject: [PATCH 13/20] Bump google.golang.org/grpc from 1.66.2 to 1.67.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.66.2 to 1.67.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.66.2...v1.67.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index ff8d958652..7e62aaaf7b 100644 --- a/go.mod +++ b/go.mod @@ -99,7 +99,7 @@ require ( golang.org/x/net v0.29.0 golang.org/x/oauth2 v0.23.0 golang.org/x/text v0.18.0 - google.golang.org/grpc v1.66.2 + google.golang.org/grpc v1.67.0 gopkg.in/Graylog2/go-gelf.v2 v2.0.0-20180125164251-1832d8546a9f gopkg.in/yaml.v3 v3.0.1 storj.io/drpc v0.0.34 @@ -155,7 +155,7 @@ require ( github.com/dsoprea/go-photoshop-info-format v0.0.0-20200609050348-3db9b63b202c // indirect github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-errors/errors v1.4.2 // indirect @@ -170,7 +170,7 @@ require ( github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 // indirect - github.com/golang/glog v1.2.1 // indirect + github.com/golang/glog v1.2.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-querystring v1.1.0 // indirect @@ -267,8 +267,8 @@ require ( golang.org/x/term v0.24.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.24.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index feb9464529..58fa3d4d0f 100644 --- a/go.sum +++ b/go.sum @@ -311,8 +311,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/ethereum/go-ethereum v1.13.15 h1:U7sSGYGo4SPjP6iNIifNoyIAiNjrmQkz6EwQG+/EZWo= github.com/ethereum/go-ethereum v1.13.15/go.mod h1:TN8ZiHrdJwSe8Cb6x+p0hs5CxhJZPbqB7hHkaUXcmIU= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -415,8 +415,8 @@ github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgR github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1925,10 +1925,10 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117 h1:+rdxYoE3E5htTEWIe15GlN6IfvbURM//Jt0mmkmm6ZU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1953,8 +1953,8 @@ google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= -google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= +google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From bcd46bea1dc36143e9b4b2a11d30631431b89930 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:06:10 +0000 Subject: [PATCH 14/20] Bump github.com/klauspost/compress from 1.17.9 to 1.17.10 Bumps [github.com/klauspost/compress](https://github.com/klauspost/compress) from 1.17.9 to 1.17.10. - [Release notes](https://github.com/klauspost/compress/releases) - [Changelog](https://github.com/klauspost/compress/blob/master/.goreleaser.yml) - [Commits](https://github.com/klauspost/compress/compare/v1.17.9...v1.17.10) --- updated-dependencies: - dependency-name: github.com/klauspost/compress dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ff8d958652..54dbb42420 100644 --- a/go.mod +++ b/go.mod @@ -57,7 +57,7 @@ require ( github.com/joho/godotenv v1.5.1 github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e github.com/kelseyhightower/envconfig v1.4.0 - github.com/klauspost/compress v1.17.9 + github.com/klauspost/compress v1.17.10 github.com/libp2p/go-libp2p v0.35.1 github.com/libp2p/zeroconf/v2 v2.2.0 github.com/logrusorgru/aurora v2.0.3+incompatible diff --git a/go.sum b/go.sum index feb9464529..774b4dff70 100644 --- a/go.sum +++ b/go.sum @@ -757,8 +757,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= +github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= From 415a00cc09737bd455aaba92ebea0fe3bebda278 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 05:06:23 +0000 Subject: [PATCH 15/20] Bump github.com/huandu/skiplist from 1.2.0 to 1.2.1 Bumps [github.com/huandu/skiplist](https://github.com/huandu/skiplist) from 1.2.0 to 1.2.1. - [Release notes](https://github.com/huandu/skiplist/releases) - [Commits](https://github.com/huandu/skiplist/compare/v1.2.0...v1.2.1) --- updated-dependencies: - dependency-name: github.com/huandu/skiplist dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ff8d958652..18b00adc6e 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/h2non/filetype v1.1.3 github.com/hashicorp/go-multierror v1.1.1 github.com/hbagdi/go-unsplash v0.0.0-20230414214043-474fc02c9119 - github.com/huandu/skiplist v1.2.0 + github.com/huandu/skiplist v1.2.1 github.com/improbable-eng/grpc-web v0.15.0 github.com/ipfs/boxo v0.13.1 github.com/ipfs/go-block-format v0.2.0 diff --git a/go.sum b/go.sum index feb9464529..6ada31dc5e 100644 --- a/go.sum +++ b/go.sum @@ -574,8 +574,8 @@ github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huandu/skiplist v1.2.1 h1:dTi93MgjwErA/8idWTzIw4Y1kZsMWx35fmI2c8Rij7w= +github.com/huandu/skiplist v1.2.1/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= From 1d0afa3e2e7edea5f90c073585b61809d1b44423 Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Sun, 22 Sep 2024 22:18:54 +0200 Subject: [PATCH 16/20] GO-3980 Fix tantivy crash on linuxes --- .github/workflows/build.yml | 162 +++++------------------------------- Makefile | 2 +- tantivity_sha256.txt | 22 ++--- 3 files changed, 32 insertions(+), 154 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6b9a27367a..8223fe60ea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -51,24 +51,15 @@ jobs: echo GOPATH=$(go env GOPATH) >> $GITHUB_ENV echo GOBIN=$(go env GOPATH)/bin >> $GITHUB_ENV echo $(go env GOPATH)/bin >> $GITHUB_PATH - - name: Install patched gox - run: | - mkdir -p "$GOPATH/src/github.com/mitchellh" - cd "$GOPATH/src/github.com/mitchellh" - git clone https://github.com/aslakhellesoy/gox - cd gox - git fetch - git checkout db6184738b77fbd5089e5fa1112177f391c91b24 - go install github.com/mitchellh/gox - if: github.event.inputs.run-on-runner != 'ARM64' && github.event_name != 'schedule' - name: Install brew and node deps run: | curl https://raw.githubusercontent.com/Homebrew/homebrew-core/31b24d65a7210ea0a5689d5ad00dd8d1bf5211db/Formula/protobuf.rb --output protobuf.rb curl https://raw.githubusercontent.com/Homebrew/homebrew-core/d600b1f7119f6e6a4e97fb83233b313b0468b7e4/Formula/s/swift-protobuf.rb --output swift-protobuf.rb HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install ./protobuf.rb HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install --ignore-dependencies ./swift-protobuf.rb - HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install mingw-w64 - HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install grpcurl + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install mingw-w64 + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew install grpcurl + HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_CLEANUP=1 brew tap messense/macos-cross-toolchains && brew install x86_64-unknown-linux-musl npm i -g node-gyp if: github.event.inputs.run-on-runner != 'ARM64' && github.event_name != 'schedule' - name: Checkout @@ -116,18 +107,18 @@ jobs: make setup-go make setup-gomobile which gomobile - - name: Cross-compile library mac/win + - name: Cross-compile library mac/win/linux run: | make download-tantivy-all echo $FLAGS mkdir -p .release echo $SDKROOT - gox -cgo -ldflags="$FLAGS" -osarch="darwin/amd64" --tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -output="{{.OS}}-{{.Arch}}" github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="darwin" GOARCH="amd64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver export SDKROOT=$(xcrun --sdk macosx --show-sdk-path) echo $SDKROOT - gox -cgo -ldflags="$FLAGS" -osarch="darwin/arm64" --tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -output="{{.OS}}-{{.Arch}}" github.com/anyproto/anytype-heart/cmd/grpcserver - make protos-server - CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" gox -cgo -ldflags="$FLAGS -linkmode external -extldflags=-static" -osarch="windows/amd64" --tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -output="{{.OS}}-{{.Arch}}" github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="darwin" GOARCH="arm64" CGO_ENABLED="1" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -ldflags="$FLAGS" -o darwin-arm64 github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags=-static" -o windows-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver + GOOS="linux" GOARCH="amd64" CGO_ENABLED="1" CC="x86_64-linux-musl-gcc" go build -tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector noheic" -ldflags="$FLAGS -linkmode external -extldflags=-static" -o linux-amd64 github.com/anyproto/anytype-heart/cmd/grpcserver ls -lha . - name: run perf tests run: | @@ -199,6 +190,17 @@ jobs: mv js_${VERSION}_${OSARCH}.tar.gz .release/ done if: github.event_name == 'push' + - name: Pack server unix + run: | + declare -a arr=("linux-amd64") + for i in "${arr[@]}" + do + OSARCH=${i%.*} + cp ./${i}* ./grpc-server + tar -czf js_${VERSION}_${OSARCH}.tar.gz grpc-server protobuf json + mv js_${VERSION}_${OSARCH}.tar.gz .release/ + done + if: github.event_name == 'push' - name: Make swift protos run: | mkdir -p .release @@ -271,128 +273,4 @@ jobs: fail_on_unmatched_files: true files: '.release/*' env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - build_linux: - if: github.event_name == 'push' - runs-on: ubuntu-22.04 - steps: - - name: Install Go - uses: actions/setup-go@v1 - with: - go-version: 1.22 - - name: Setup GO - run: | - echo GOPATH=$(go env GOPATH) >> $GITHUB_ENV - echo GOBIN=$(go env GOPATH)/bin >> $GITHUB_ENV - echo $(go env GOPATH)/bin >> $GITHUB_PATH - - - name: Setup license repositor - uses: actions/checkout@master - with: - repository: anyproto/open - ref: refs/heads/main - path: ./open - - - name: Check licenses - run: | - cd open - python3 tools/generate.py --platform golang - cd .. - sudo gem install license_finder - license_finder inherited_decisions add open/decisions.yml - license_finder --enabled-package-managers gomodules - - - name: Install patched gox - run: | - rm -rf $GOPATH/src/github.com/mitchellh - mkdir -p $GOPATH/src/github.com/mitchellh - cd $GOPATH/src/github.com/mitchellh - git clone https://github.com/aslakhellesoy/gox - cd gox - git fetch - git checkout db6184738b77fbd5089e5fa1112177f391c91b24 - go install github.com/mitchellh/gox - - name: Apt install and node deps - run: | - sudo apt update - sudo apt install -y protobuf-compiler libprotoc-dev - curl -O https://pub-c60a000d68b544109df4fe5837762101.r2.dev/linux-compiler-musl-x86.zip - unzip linux-compiler-musl-x86.zip -d $HOME - npm i -g node-gyp - - name: Checkout - uses: actions/checkout@v3 - - uses: actions/cache@v3 - with: - path: | - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go-${{ matrix.go-version }}- - - name: Set env vars - env: - UNSPLASH_KEY: ${{ secrets.UNSPLASH_KEY }} - INHOUSE_KEY: ${{ secrets.INHOUSE_KEY }} - run: | - GIT_SUMMARY=$(git describe --tags --always) - echo GOPRIVATE=github.com/anyproto >> $GITHUB_ENV - echo "FLAGS=-X github.com/anyproto/anytype-heart/util/vcs.GitSummary=${GIT_SUMMARY} -X github.com/anyproto/anytype-heart/metrics.DefaultInHouseKey=${INHOUSE_KEY} -X github.com/anyproto/anytype-heart/util/unsplash.DefaultToken=${UNSPLASH_KEY}" >> $GITHUB_ENV - echo VERSION=${GITHUB_REF##*/} >> $GITHUB_ENV - git config --global url."https://${{ secrets.ANYTYPE_PAT }}@github.com/".insteadOf "https://github.com/" - - name: Go mod download - run: | - go mod download - - name: install protoc - run: | - HAS_SYSTEM_PROTOBUF=false make setup-protoc - - name: setup go - run: | - make setup-go - - name: Cross-compile library for linux amd64/arm64 - run: | - make download-tantivy-all - echo $FLAGS - mkdir -p .release - CXX=$HOME/linux-compiler-musl-x86/bin/x86_64-linux-musl-g++ CC=$HOME/linux-compiler-musl-x86/bin/x86_64-linux-musl-gcc gox -cgo -osarch="linux/amd64" -ldflags="$FLAGS -linkmode external -extldflags=-static" --tags="envproduction nographviz nowatchdog nosigar nomutexdeadlockdetector" -output="{{.OS}}-{{.Arch}}" github.com/anyproto/anytype-heart/cmd/grpcserver - make protos-server - - name: Make JS protos - run: | - make protos-js - mv dist/js/pb protobuf - mkdir -p protobuf/protos - cp pb/protos/*.proto ./protobuf/protos - cp pb/protos/service/*.proto ./protobuf/protos - cp pkg/lib/pb/model/protos/*.proto ./protobuf/protos - - name: Add system relations - run: | - mkdir -p json/ - cp pkg/lib/bundle/systemRelations.json ./json - cp pkg/lib/bundle/systemTypes.json ./json - cp pkg/lib/bundle/internalRelations.json ./json - cp pkg/lib/bundle/internalTypes.json ./json - - name: Upload protobuf artifact for linux build - uses: actions/upload-artifact@v4 - with: - name: libs - path: | - protobuf - if-no-files-found: error - retention-days: 1 - - name: Pack server unix - run: | - declare -a arr=("linux-amd64") - for i in "${arr[@]}" - do - OSARCH=${i%.*} - cp ./${i}* ./grpc-server - tar -czf js_${VERSION}_${OSARCH}.tar.gz grpc-server protobuf json - mv js_${VERSION}_${OSARCH}.tar.gz .release/ - done - - name: Release - if: github.event_name == 'push' - uses: softprops/action-gh-release@v1 - with: - prerelease: ${{ contains(github.ref, '-rc') }} - fail_on_unmatched_files: true - files: '.release/*' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/Makefile b/Makefile index cf84d0f5b5..d253e4d40c 100644 --- a/Makefile +++ b/Makefile @@ -339,7 +339,7 @@ endif ### Tantivy Section REPO := anyproto/tantivy-go -VERSION := v0.1.0 +VERSION := v0.1.1 OUTPUT_DIR := deps/libs SHA_FILE = tantivity_sha256.txt diff --git a/tantivity_sha256.txt b/tantivity_sha256.txt index e7ab01e6f0..6aced83d8b 100644 --- a/tantivity_sha256.txt +++ b/tantivity_sha256.txt @@ -1,11 +1,11 @@ -7a472fd61b7c32b1aecc130a0d65a0b1e36f404c97144b2dc993c7bfe628ea6b deps/libs/android-386.tar.gz -7c3902588b98d6c4951124b8ded78b956448483a057c03e7ef85cb05182a7afd deps/libs/android-amd64.tar.gz -f12a6a9b2904a67a7cec36863a65dc128b8efd9c6968db29bb7904ca79040381 deps/libs/android-arm.tar.gz -d15a085afb2887a839697080101772525b614667924c5df98aa212ae3d72a825 deps/libs/android-arm64.tar.gz -dc6eca09d7946dbf0b0fd7615be555edfc6d6f1be9a47dd757d90626a6d05c09 deps/libs/darwin-amd64.tar.gz -216a751320edb4e5e737ebeb7eb3181fbdab71f2ec4d441621ce723056a5bc03 deps/libs/darwin-arm64.tar.gz -87d629216a127eb29064cb3d1dca63ef360d1920330bfcbecf0ca78e35f37756 deps/libs/ios-amd64.tar.gz -4a82c10a149f84073af08f2cf85dce680fd3301fc7cd19279227dddd60effbcc deps/libs/ios-arm64.tar.gz -b55ecde8d30fd38ab12ffe2d51415b2c7a74ff5af7b61cd35c401345a33a482d deps/libs/ios-arm64-sim.tar.gz -a514c9e61dd8e6fea7c5236cf359ffd14bc2fd5db52fc1ca8b0e3df10a00cbcd deps/libs/linux-amd64-musl.tar.gz -3bbab5b3a28cab4306b3ced4dd0c60f06a85e01592367ccf910f3a59c7db674b deps/libs/windows-amd64.tar.gz +03ed207923dd1f17882dd7b521669a17c2fa70199ed19a5ce87e93c23e627d95 deps/libs/android-386.tar.gz +0f9cc0190fa412dae498f790ff0629b9c5d3f4531095a9b2b756d295d483b173 deps/libs/android-amd64.tar.gz +8da9dd9060d02811c774f913d1b165f354d045b1237ff05aa5daab841a096481 deps/libs/android-arm.tar.gz +9b6c9973af588d984b214619fdc56dfc463b622bc933cd95fd0278e6f23bf63c deps/libs/android-arm64.tar.gz +eb3354937db4ec79a3586b06e0db0e474b5fdeb54fd4cf0b0b8f15f7167112aa deps/libs/darwin-amd64.tar.gz +abc15c4db91dc854461b3bc0665ab5221aa63694263c322d2833170ada279e7a deps/libs/darwin-arm64.tar.gz +1d93858fe723b24eda7c1ebaf2f5e191513125dc97a89282ae5c607bd4245c1b deps/libs/ios-amd64.tar.gz +4c5256eee402fa7d73c9db5d407ff76227cf144caca0504a4c051db18af67dc0 deps/libs/ios-arm64.tar.gz +7984768b08c8873b959b180d21aeccb4b4641d89f5980673c64ec5fa833a48e1 deps/libs/ios-arm64-sim.tar.gz +727643dab7d31ce3b08de4b9d85265a6dd9939e7323e6310457d0a8355791dcc deps/libs/linux-amd64-musl.tar.gz +628f3d449505f560a60885e46c40f16a6fa63d3ce98133e7ddce05176bbd3444 deps/libs/windows-amd64.tar.gz From 9543f89dac96efb4304b63cea652ef040eba9091 Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Tue, 24 Sep 2024 17:44:29 +0200 Subject: [PATCH 17/20] GO-3980 Fix tantivy crash on linuxes --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a950ca8f49..3b89ec6f5d 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/anyproto/any-store v0.0.6 github.com/anyproto/any-sync v0.4.30 github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438 - github.com/anyproto/tantivy-go v0.1.0 + github.com/anyproto/tantivy-go v0.1.1 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/avast/retry-go/v4 v4.6.0 github.com/blevesearch/bleve/v2 v2.3.10 diff --git a/go.sum b/go.sum index 8197801443..feffc78a68 100644 --- a/go.sum +++ b/go.sum @@ -109,8 +109,8 @@ github.com/anyproto/protobuf v1.3.3-0.20240201225420-6e325cf0ac38 h1:80jke82/c+b github.com/anyproto/protobuf v1.3.3-0.20240201225420-6e325cf0ac38/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/anyproto/ristretto v0.1.2-0.20240221153107-2b23839cc50c h1:GicoaTUyB2mtCIl3YMrO0OzysqRT5GA4vuvDsqEkhSM= github.com/anyproto/ristretto v0.1.2-0.20240221153107-2b23839cc50c/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/anyproto/tantivy-go v0.1.0 h1:5SuItuJnYAEK9U6cfxPnwFUXGboURIwF4JAp7s46rII= -github.com/anyproto/tantivy-go v0.1.0/go.mod h1:Pl0zaeEX7dkVDTDKROzlLlGCVjbZHjyPrZloFuVEASc= +github.com/anyproto/tantivy-go v0.1.1 h1:IdeZca63wV7/C+wMpkntImdh/mkkEddQJTShGEVxGe0= +github.com/anyproto/tantivy-go v0.1.1/go.mod h1:Pl0zaeEX7dkVDTDKROzlLlGCVjbZHjyPrZloFuVEASc= github.com/anyproto/zeroconf/v2 v2.2.1-0.20240228113933-f90a5cc4439d h1:5bj7nX/AS8sxGpTIrapE7PC4oPlhkHMwMqXlJbUHBlg= github.com/anyproto/zeroconf/v2 v2.2.1-0.20240228113933-f90a5cc4439d/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= From 75f83643195d1b7ac268b68efc5fcbfafd2dbc20 Mon Sep 17 00:00:00 2001 From: kirillston Date: Tue, 24 Sep 2024 20:39:50 +0200 Subject: [PATCH 18/20] GO-3964 Fix comments --- core/block/detailservice/relations.go | 4 +- core/block/detailservice/set_details.go | 85 ++++++++++--------- pkg/lib/localstore/objectstore/queries.go | 32 ++++--- .../localstore/objectstore/queries_test.go | 6 +- 4 files changed, 69 insertions(+), 58 deletions(-) diff --git a/core/block/detailservice/relations.go b/core/block/detailservice/relations.go index 8cdb153717..af0181e938 100644 --- a/core/block/detailservice/relations.go +++ b/core/block/detailservice/relations.go @@ -75,8 +75,8 @@ func (s *service) ListRelationsWithValue(spaceId string, value *types.Value) (ke Condition: model.BlockContentDataviewFilter_Equal, Value: pbtypes.String(spaceId), }}}, func(details *types.Struct) { - for key, v := range details.Fields { - if detailHandlesValue(v) { + for key, valueToCheck := range details.Fields { + if detailHandlesValue(valueToCheck) { if counter, ok := countersByKeys[key]; ok { countersByKeys[key] = counter + 1 } else { diff --git a/core/block/detailservice/set_details.go b/core/block/detailservice/set_details.go index 9263f7ec82..1c346689ba 100644 --- a/core/block/detailservice/set_details.go +++ b/core/block/detailservice/set_details.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/gogo/protobuf/types" - "github.com/hashicorp/go-multierror" "go.uber.org/zap" "github.com/anyproto/anytype-heart/core/block/cache" @@ -141,29 +140,29 @@ func (s *service) SetListIsFavorite(objectIds []string, isFavorite bool) error { } func (s *service) SetListIsArchived(objectIds []string, isArchived bool) error { - objectIDsPerSpace, err := s.partitionObjectIDsBySpaceID(objectIds) + objectIdsPerSpace, err := s.partitionObjectIdsBySpaceId(objectIds) if err != nil { return fmt.Errorf("partition object ids by spaces: %w", err) } var ( - multiErr multierror.Error + resultErr error anySucceed bool ) - for spaceID, objectIDs := range objectIDsPerSpace { - err = s.setIsArchivedForObjects(spaceID, objectIDs, isArchived) + for spaceId, objectIdsOfThisSpace := range objectIdsPerSpace { + err = s.setIsArchivedForObjects(spaceId, objectIdsOfThisSpace, isArchived) if err != nil { - log.Error("failed to set isArchived to objects", zap.String("spaceId", spaceID), - zap.Strings("objectIDs", objectIDs), zap.Bool("isArchived", isArchived), zap.Error(err)) - multiErr.Errors = append(multiErr.Errors, err) - } else { - anySucceed = true + log.Error("failed to set isArchived to objects", zap.String("spaceId", spaceId), + zap.Strings("objectIds", objectIdsOfThisSpace), zap.Bool("isArchived", isArchived), zap.Error(err)) + resultErr = errors.Join(resultErr, err) + continue } + anySucceed = true } if anySucceed { return nil } - return multiErr.ErrorOrNil() + return resultErr } func (s *service) checkArchivedRestriction(isArchived bool, objectId string) error { @@ -189,20 +188,20 @@ func (s *service) objectLinksCollectionModify(collectionId string, objectId stri }) } -func (s *service) partitionObjectIDsBySpaceID(objectIDs []string) (map[string][]string, error) { - res := map[string][]string{} - for _, objectID := range objectIDs { - spaceID, err := s.resolver.ResolveSpaceID(objectID) +func (s *service) partitionObjectIdsBySpaceId(objectIds []string) (map[string][]string, error) { + res := make(map[string][]string, len(objectIds)) + for _, objectId := range objectIds { + spaceId, err := s.resolver.ResolveSpaceID(objectId) if err != nil { - return nil, fmt.Errorf("resolve spaceID: %w", err) + return nil, fmt.Errorf("resolve spaceId: %w", err) } - res[spaceID] = append(res[spaceID], objectID) + res[spaceId] = append(res[spaceId], objectId) } return res, nil } -func (s *service) setIsArchivedForObjects(spaceID string, objectIDs []string, isArchived bool) error { - spc, err := s.spaceService.Get(context.Background(), spaceID) +func (s *service) setIsArchivedForObjects(spaceId string, objectIds []string, isArchived bool) error { + spc, err := s.spaceService.Get(context.Background(), spaceId) if err != nil { return fmt.Errorf("get space: %w", err) } @@ -212,37 +211,39 @@ func (s *service) setIsArchivedForObjects(spaceID string, objectIDs []string, is return fmt.Errorf("unexpected archive block type: %T", b) } - var multiErr multierror.Error - var anySucceed bool - ids, err := s.store.HasIDs(objectIDs...) + ids, err := s.store.HasIDs(objectIds...) if err != nil { return err } - for _, id := range ids { - var err error - if restrErr := s.checkArchivedRestriction(isArchived, id); restrErr != nil { - err = restrErr - } else { - if isArchived { - err = archive.AddObject(id) - } else { - err = archive.RemoveObject(id) - } - } - if err != nil { - log.Error("failed to set isArchived", zap.String("objectId", id), zap.Bool("isArchived", isArchived), zap.Error(err)) - multiErr.Errors = append(multiErr.Errors, err) - continue - } - anySucceed = true - } + anySucceed, err := s.modifyArchiveLinks(archive, isArchived, ids...) - if err := multiErr.ErrorOrNil(); err != nil { + if err != nil { log.Warn("failed to archive", zap.Error(err)) } if anySucceed { return nil } - return multiErr.ErrorOrNil() + return err }) } + +func (s *service) modifyArchiveLinks( + coll collection.Collection, value bool, ids ...string, +) (anySucceed bool, resultErr error) { + for _, id := range ids { + err := s.checkArchivedRestriction(value, id) + if err == nil { + if value { + err = coll.AddObject(id) + } else { + err = coll.RemoveObject(id) + } + } + if err != nil { + resultErr = errors.Join(resultErr, err) + continue + } + anySucceed = true + } + return +} diff --git a/pkg/lib/localstore/objectstore/queries.go b/pkg/lib/localstore/objectstore/queries.go index 47171d23a0..a2089ba4be 100644 --- a/pkg/lib/localstore/objectstore/queries.go +++ b/pkg/lib/localstore/objectstore/queries.go @@ -8,6 +8,7 @@ import ( "strings" "time" + anystore "github.com/anyproto/any-store" "github.com/blevesearch/bleve/v2/search" "github.com/gogo/protobuf/types" "github.com/samber/lo" @@ -505,7 +506,7 @@ func (s *dsObjectStore) QueryByIDAndSubscribeForChanges(ids []string, sub databa return } -func (s *dsObjectStore) QueryIterate(q database.Query, proc func(details *types.Struct)) error { +func (s *dsObjectStore) QueryIterate(q database.Query, proc func(details *types.Struct)) (err error) { arena := s.arenaPool.Get() defer s.arenaPool.Put(arena) @@ -521,24 +522,33 @@ func (s *dsObjectStore) QueryIterate(q database.Query, proc func(details *types. if err != nil { return fmt.Errorf("find: %w", err) } + + defer func() { + if iterCloseErr := iter.Close(); iterCloseErr != nil { + err = errors.Join(iterCloseErr, err) + } + }() + for iter.Next() { - doc, err := iter.Doc() + var doc anystore.Doc + doc, err = iter.Doc() if err != nil { - return errors.Join(fmt.Errorf("get doc: %w", err), iter.Close()) + err = fmt.Errorf("get doc: %w", err) + return } - details, err := pbtypes.JsonToProto(doc.Value()) + + var details *types.Struct + details, err = pbtypes.JsonToProto(doc.Value()) if err != nil { - return errors.Join(fmt.Errorf("json to proto: %w", err), iter.Close()) + err = fmt.Errorf("json to proto: %w", err) + return } proc(details) } err = iter.Err() if err != nil { - return errors.Join(fmt.Errorf("iterate: %w", err), iter.Close()) - } - err = iter.Close() - if err != nil { - return fmt.Errorf("close iterator: %w", err) + err = fmt.Errorf("iterate: %w", err) + return } - return nil + return } diff --git a/pkg/lib/localstore/objectstore/queries_test.go b/pkg/lib/localstore/objectstore/queries_test.go index 575a9809fe..08c1482d00 100644 --- a/pkg/lib/localstore/objectstore/queries_test.go +++ b/pkg/lib/localstore/objectstore/queries_test.go @@ -1,7 +1,7 @@ package objectstore import ( - context2 "context" + "context" "fmt" "sort" "strconv" @@ -1104,7 +1104,7 @@ func TestQueryByIdAndSubscribeForChanges(t *testing.T) { assertRecordsEqual(t, []TestObject{obj1, obj3}, recs) t.Run("update details called, but there are no changes", func(t *testing.T) { - err = s.UpdateObjectDetails(context2.Background(), "id1", makeDetails(obj1)) + err = s.UpdateObjectDetails(context.Background(), "id1", makeDetails(obj1)) require.NoError(t, err) select { @@ -1116,7 +1116,7 @@ func TestQueryByIdAndSubscribeForChanges(t *testing.T) { t.Run("update details order", func(t *testing.T) { for i := 1; i <= 1000; i++ { - err = s.UpdateObjectDetails(context2.Background(), "id1", makeDetails(makeObjectWithName("id1", fmt.Sprintf("%d", i)))) + err = s.UpdateObjectDetails(context.Background(), "id1", makeDetails(makeObjectWithName("id1", fmt.Sprintf("%d", i)))) require.NoError(t, err) } From b1d7177488ffa6b7b64187b29e7b8e4de13bcdaa Mon Sep 17 00:00:00 2001 From: kirillston Date: Tue, 24 Sep 2024 22:01:59 +0200 Subject: [PATCH 19/20] GO-3964 Exclude unused import --- core/object.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/object.go b/core/object.go index 96ba3a5ed2..16e1e3e604 100644 --- a/core/object.go +++ b/core/object.go @@ -14,7 +14,6 @@ import ( "github.com/hashicorp/go-multierror" "github.com/anyproto/anytype-heart/core/block" - "github.com/anyproto/anytype-heart/core/block/editor/template" importer "github.com/anyproto/anytype-heart/core/block/import" "github.com/anyproto/anytype-heart/core/block/import/common" "github.com/anyproto/anytype-heart/core/block/object/objectgraph" From 3a7c9ddfcd6e41ff0a7db4ceeb63fb04d060e728 Mon Sep 17 00:00:00 2001 From: Mikhail Iudin Date: Wed, 25 Sep 2024 13:53:31 +0200 Subject: [PATCH 20/20] GO-4143 Add android tmp hook --- .../spacecore/storage/sqlitestorage/service.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/space/spacecore/storage/sqlitestorage/service.go b/space/spacecore/storage/sqlitestorage/service.go index fed45cd037..50cffbc822 100644 --- a/space/spacecore/storage/sqlitestorage/service.go +++ b/space/spacecore/storage/sqlitestorage/service.go @@ -106,6 +106,12 @@ func (s *storageService) Run(ctx context.Context) (err error) { sql.Register(driverName, &sqlite3.SQLiteDriver{ ConnectHook: func(conn *sqlite3.SQLiteConn) error { + if s.dbTempPath != "" { + _, err := conn.Exec("PRAGMA temp_store_directory = '"+s.dbTempPath+"';", nil) + if err != nil { + return err + } + } conn.RegisterUpdateHook(func(op int, db string, table string, rowid int64) { s.lastWrite.Store(time.Now()) }) @@ -126,12 +132,6 @@ func (s *storageService) Run(ctx context.Context) (err error) { return } s.writeDb.SetMaxOpenConns(1) - if s.dbTempPath != "" { - if _, err = s.writeDb.Exec("PRAGMA temp_store_directory = '" + s.dbTempPath + "';"); err != nil { - log.Error("write:: failed to set temp store directory", zap.Error(err)) - return - } - } if _, err = s.writeDb.Exec(sqlCreateTables); err != nil { log.With(zap.String("db", "spacestore_sqlite"), zap.String("type", "createtable"), zap.Error(err)).Error("failed to open db") @@ -142,12 +142,6 @@ func (s *storageService) Run(ctx context.Context) (err error) { log.With(zap.String("db", "spacestore_sqlite"), zap.String("type", "read"), zap.Error(err)).Error("failed to open db") return } - if s.dbTempPath != "" { - if _, err = s.readDb.Exec("PRAGMA temp_store_directory = '" + s.dbTempPath + "';"); err != nil { - log.Error("read:: failed to set temp store directory", zap.Error(err)) - return - } - } s.readDb.SetMaxOpenConns(10) if err = initStmts(s); err != nil {