1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00

Merge branch 'main' of ssh://github.com/anyproto/anytype-heart into fix-ristretto-32bit-main

This commit is contained in:
Roman Khafizianov 2024-03-05 12:23:34 +01:00
commit 6f9128496f
No known key found for this signature in database
GPG key ID: F07A7D55A2684852
142 changed files with 9721 additions and 2946 deletions

1
.gitattributes vendored
View file

@ -1,2 +1,3 @@
lib/lib.so filter=lfs diff=lfs merge=lfs -text
dist/lib.so filter=lfs diff=lfs merge=lfs -text
tests/integration/testdata/import/** linguist-generated=true

View file

@ -80,6 +80,7 @@ test-deps:
@go build -o deps github.com/vektra/mockery/v2
@go generate ./...
@$(DEPS_PATH)/mockery --disable-version-string
@go run ./cmd/testcase generate-json-helpers
clear-test-deps:
@echo 'Removing test mocks...'

View file

@ -25,281 +25,283 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 4378 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x1c, 0xc9,
0x56, 0xc0, 0x77, 0x5e, 0x58, 0xe8, 0xcb, 0x5d, 0x60, 0x2e, 0x2c, 0x7b, 0xc3, 0xbd, 0xce, 0x6e,
0x36, 0xb1, 0x93, 0x38, 0x1e, 0x67, 0x93, 0xdd, 0xec, 0xe5, 0x5e, 0x24, 0xe4, 0xd8, 0xb1, 0xd7,
0xdc, 0xc4, 0x31, 0x9e, 0x49, 0x22, 0xad, 0x84, 0x44, 0xbb, 0xa7, 0x32, 0x6e, 0xdc, 0xd3, 0xd5,
0xb7, 0xbb, 0x66, 0xec, 0x01, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0xe2, 0xeb, 0x85, 0x07, 0x24,
0x1e, 0xf8, 0x3f, 0x78, 0xe3, 0x71, 0x1f, 0x79, 0x44, 0xbb, 0xff, 0xc8, 0x55, 0x57, 0x9d, 0xae,
0x8f, 0xd3, 0x75, 0xaa, 0x7b, 0xf6, 0x69, 0x57, 0x3e, 0xbf, 0xf3, 0x51, 0x5d, 0xa7, 0xaa, 0x4e,
0x55, 0xf5, 0x74, 0xa2, 0x9b, 0xc5, 0xf9, 0x6e, 0x51, 0x72, 0xc1, 0xab, 0xdd, 0x8a, 0x95, 0xcb,
0x34, 0x61, 0xcd, 0x7f, 0x47, 0xf2, 0xcf, 0xc3, 0x77, 0xe3, 0x7c, 0x25, 0x56, 0x05, 0xbb, 0xf1,
0x81, 0x21, 0x13, 0x3e, 0x9f, 0xc7, 0xf9, 0xb4, 0x52, 0xc8, 0x8d, 0xf7, 0x8d, 0x84, 0x2d, 0x59,
0x2e, 0xe0, 0xef, 0x8f, 0xfe, 0xfb, 0x7f, 0x06, 0xd1, 0x7b, 0xfb, 0x59, 0xca, 0x72, 0xb1, 0x0f,
0x1a, 0xc3, 0x2f, 0xa3, 0xef, 0xee, 0x15, 0xc5, 0x11, 0x13, 0xaf, 0x59, 0x59, 0xa5, 0x3c, 0x1f,
0x7e, 0x3c, 0x02, 0x07, 0xa3, 0xb3, 0x22, 0x19, 0xed, 0x15, 0xc5, 0xc8, 0x08, 0x47, 0x67, 0xec,
0x67, 0x0b, 0x56, 0x89, 0x1b, 0xb7, 0xc3, 0x50, 0x55, 0xf0, 0xbc, 0x62, 0xc3, 0xb7, 0xd1, 0xaf,
0xed, 0x15, 0xc5, 0x98, 0x89, 0x03, 0x56, 0x37, 0x60, 0x2c, 0x62, 0xc1, 0x86, 0x5b, 0x2d, 0x55,
0x17, 0xd0, 0x3e, 0xee, 0x76, 0x83, 0xe0, 0x67, 0x12, 0x7d, 0xa7, 0xf6, 0x73, 0xb1, 0x10, 0x53,
0x7e, 0x95, 0x0f, 0x3f, 0x6a, 0x2b, 0x82, 0x48, 0xdb, 0xbe, 0x15, 0x42, 0xc0, 0xea, 0x9b, 0xe8,
0x97, 0xdf, 0xc4, 0x59, 0xc6, 0xc4, 0x7e, 0xc9, 0xea, 0xc0, 0x5d, 0x1d, 0x25, 0x1a, 0x29, 0x99,
0xb6, 0xfb, 0x71, 0x90, 0x01, 0xc3, 0x5f, 0x46, 0xdf, 0x55, 0x92, 0x33, 0x96, 0xf0, 0x25, 0x2b,
0x87, 0x5e, 0x2d, 0x10, 0x12, 0x8f, 0xbc, 0x05, 0x61, 0xdb, 0xfb, 0x3c, 0x5f, 0xb2, 0x52, 0xf8,
0x6d, 0x83, 0x30, 0x6c, 0xdb, 0x40, 0x60, 0xfb, 0x6f, 0x07, 0xd1, 0x0f, 0xf6, 0x92, 0x84, 0x2f,
0x72, 0xf1, 0x9c, 0x27, 0x71, 0xf6, 0x3c, 0xcd, 0x2f, 0x4f, 0xd8, 0xd5, 0xfe, 0x45, 0xcd, 0xe7,
0x33, 0x36, 0x7c, 0xec, 0x3e, 0x55, 0x85, 0x8e, 0x34, 0x3b, 0xb2, 0x61, 0xed, 0xfb, 0xd3, 0xf5,
0x94, 0x20, 0x96, 0x7f, 0x1c, 0x44, 0x1b, 0x38, 0x96, 0x31, 0xcf, 0x96, 0xcc, 0x44, 0xf3, 0x59,
0x87, 0x61, 0x17, 0xd7, 0xf1, 0x3c, 0x59, 0x57, 0x0d, 0x22, 0xca, 0xa2, 0xef, 0xd9, 0xe9, 0x32,
0x66, 0x95, 0x1c, 0x4e, 0xf7, 0xe8, 0x8c, 0x00, 0x44, 0x7b, 0xbe, 0xdf, 0x07, 0x05, 0x6f, 0x69,
0x34, 0x04, 0x6f, 0x19, 0xaf, 0xb4, 0xb3, 0xbb, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0xdd, 0xeb, 0x41,
0x82, 0xab, 0x3f, 0x8c, 0x7e, 0xe5, 0x0d, 0x2f, 0x2f, 0xab, 0x22, 0x4e, 0x18, 0x0c, 0x85, 0x3b,
0xae, 0x76, 0x23, 0xc5, 0xa3, 0x61, 0xb3, 0x0b, 0xb3, 0x92, 0xb6, 0x11, 0xbe, 0x2c, 0x18, 0x9e,
0x83, 0x8c, 0x62, 0x2d, 0xa4, 0x92, 0x16, 0x43, 0x60, 0xfb, 0x32, 0x1a, 0x1a, 0xdb, 0xe7, 0x7f,
0xc4, 0x12, 0xb1, 0x37, 0x9d, 0xe2, 0x5e, 0x31, 0xba, 0x92, 0x18, 0xed, 0x4d, 0xa7, 0x54, 0xaf,
0xf8, 0x51, 0x70, 0x76, 0x15, 0xbd, 0x8f, 0x9c, 0x3d, 0x4f, 0x2b, 0xe9, 0x70, 0x27, 0x6c, 0x05,
0x30, 0xed, 0x74, 0xd4, 0x17, 0x07, 0xc7, 0x7f, 0x3e, 0x88, 0xbe, 0xef, 0xf1, 0x7c, 0xc6, 0xe6,
0x7c, 0xc9, 0x86, 0x0f, 0xbb, 0xad, 0x29, 0x52, 0xfb, 0xff, 0x64, 0x0d, 0x0d, 0x4f, 0x9a, 0x8c,
0x59, 0xc6, 0x12, 0x41, 0xa6, 0x89, 0x12, 0x77, 0xa6, 0x89, 0xc6, 0xac, 0x11, 0xd6, 0x08, 0x8f,
0x98, 0xd8, 0x5f, 0x94, 0x25, 0xcb, 0x05, 0xd9, 0x97, 0x06, 0xe9, 0xec, 0x4b, 0x07, 0xf5, 0xb4,
0xe7, 0x88, 0x89, 0xbd, 0x2c, 0x23, 0xdb, 0xa3, 0xc4, 0x9d, 0xed, 0xd1, 0x18, 0x78, 0x48, 0xa2,
0x5f, 0xb5, 0x9e, 0x98, 0x38, 0xce, 0xdf, 0xf2, 0x21, 0xfd, 0x2c, 0xa4, 0x5c, 0xfb, 0xd8, 0xea,
0xe4, 0x3c, 0xcd, 0x78, 0x76, 0x5d, 0xf0, 0x92, 0xee, 0x16, 0x25, 0xee, 0x6c, 0x86, 0xc6, 0xc0,
0xc3, 0x1f, 0x44, 0xef, 0xc1, 0x2c, 0xd9, 0xac, 0x67, 0xb7, 0xbd, 0x53, 0x28, 0x5e, 0xd0, 0xee,
0x74, 0x50, 0x66, 0x72, 0x00, 0x19, 0x4c, 0x3e, 0x1f, 0x7b, 0xf5, 0xd0, 0xd4, 0x73, 0x3b, 0x0c,
0xb5, 0x6c, 0x1f, 0xb0, 0x8c, 0x91, 0xb6, 0x95, 0xb0, 0xc3, 0xb6, 0x86, 0xc0, 0x76, 0x19, 0xfd,
0x86, 0x7e, 0x2c, 0xf5, 0x3a, 0x2a, 0xe5, 0xf5, 0x24, 0xbd, 0x4d, 0xb4, 0xdb, 0x86, 0xb4, 0xaf,
0x07, 0xfd, 0xe0, 0x56, 0x7b, 0x60, 0x04, 0xfa, 0xdb, 0x83, 0xc6, 0xdf, 0xed, 0x30, 0x04, 0xb6,
0xff, 0x6e, 0x10, 0xfd, 0x10, 0x64, 0xcf, 0xf2, 0xf8, 0x3c, 0x63, 0x72, 0x49, 0x3c, 0x61, 0xe2,
0x8a, 0x97, 0x97, 0xe3, 0x55, 0x9e, 0x10, 0xcb, 0xbf, 0x1f, 0xee, 0x58, 0xfe, 0x49, 0x25, 0xab,
0xe2, 0x83, 0x86, 0x0a, 0x5e, 0xe0, 0x8a, 0xaf, 0x69, 0x81, 0xe0, 0x05, 0x55, 0xf1, 0xb9, 0x48,
0xcb, 0xea, 0x8b, 0x7a, 0xda, 0xf4, 0x5b, 0x7d, 0x61, 0xcf, 0x93, 0xb7, 0x42, 0x88, 0x99, 0xb6,
0x9a, 0x04, 0xe6, 0xf9, 0xdb, 0x74, 0xf6, 0xaa, 0x98, 0xd6, 0x69, 0x7c, 0xcf, 0x9f, 0xa1, 0x16,
0x42, 0x4c, 0x5b, 0x04, 0x0a, 0xde, 0xfe, 0xc1, 0x14, 0x46, 0x30, 0x94, 0x0e, 0x4b, 0x3e, 0x7f,
0xce, 0x66, 0x71, 0xb2, 0x82, 0xf1, 0xff, 0x69, 0x68, 0xe0, 0x61, 0x5a, 0x07, 0xf1, 0xd9, 0x9a,
0x5a, 0x10, 0xcf, 0x7f, 0x0e, 0xa2, 0xdb, 0x4d, 0xf3, 0x2f, 0xe2, 0x7c, 0xc6, 0xa0, 0x3f, 0x55,
0xf4, 0x7b, 0xf9, 0xf4, 0x8c, 0x55, 0x22, 0x2e, 0xc5, 0xf0, 0xc7, 0xfe, 0x46, 0x86, 0x74, 0x74,
0x6c, 0x3f, 0xf9, 0x56, 0xba, 0xa6, 0xd7, 0xc7, 0xf5, 0xc4, 0x06, 0x53, 0x80, 0xdb, 0xeb, 0x52,
0x82, 0x27, 0x80, 0x5b, 0x21, 0xc4, 0xf4, 0xba, 0x14, 0x1c, 0xe7, 0xcb, 0x54, 0xb0, 0x23, 0x96,
0xb3, 0xb2, 0xdd, 0xeb, 0x4a, 0xd5, 0x45, 0x88, 0x5e, 0x27, 0x50, 0x33, 0xd9, 0x38, 0xde, 0xf4,
0xe2, 0xb8, 0x1d, 0x30, 0xd2, 0x5a, 0x1e, 0x1f, 0xf4, 0x83, 0xcd, 0xee, 0xce, 0xf2, 0x79, 0xc6,
0x96, 0xfc, 0x12, 0xef, 0xee, 0x6c, 0x13, 0x0a, 0x20, 0x76, 0x77, 0x5e, 0xd0, 0xac, 0x60, 0x96,
0x9f, 0xd7, 0x29, 0xbb, 0x42, 0x2b, 0x98, 0xad, 0x5c, 0x8b, 0x89, 0x15, 0xcc, 0x83, 0x81, 0x87,
0x93, 0xe8, 0x97, 0xa4, 0xf0, 0xf7, 0x78, 0x9a, 0x0f, 0x6f, 0x7a, 0x94, 0x6a, 0x81, 0xb6, 0xfa,
0x21, 0x0d, 0xa0, 0x88, 0xeb, 0xbf, 0xee, 0xc7, 0x79, 0xc2, 0x32, 0x6f, 0xc4, 0x46, 0x1c, 0x8c,
0xd8, 0xc1, 0x50, 0xc4, 0xcf, 0xae, 0x53, 0xe1, 0x8d, 0xb8, 0x16, 0x04, 0x23, 0x06, 0x00, 0x65,
0x2b, 0x68, 0xec, 0x15, 0x45, 0x59, 0xcf, 0x80, 0xbe, 0x6c, 0x75, 0x91, 0x60, 0xb6, 0xb6, 0x50,
0xbf, 0xb7, 0x03, 0x96, 0x64, 0x69, 0x1e, 0xf4, 0x06, 0x48, 0x1f, 0x6f, 0x06, 0x05, 0x6f, 0x8b,
0xe8, 0x7d, 0x09, 0x9c, 0xc6, 0xa5, 0x48, 0x93, 0xb4, 0x88, 0xf3, 0xa6, 0x2e, 0xf6, 0xe5, 0x7b,
0x8b, 0xd2, 0x3e, 0x77, 0x7a, 0xd2, 0xe0, 0xf6, 0xdf, 0x07, 0xd1, 0x47, 0xd8, 0xef, 0x29, 0x2b,
0xe7, 0xa9, 0xdc, 0x5e, 0x55, 0x6a, 0x72, 0x1a, 0x7e, 0x1e, 0x36, 0xda, 0x52, 0xd0, 0xd1, 0xfc,
0x68, 0x7d, 0x45, 0x08, 0xec, 0xf7, 0xa3, 0x48, 0x95, 0xf1, 0x72, 0xab, 0xe5, 0xe6, 0x06, 0xd4,
0xf7, 0xce, 0x3e, 0xeb, 0xa3, 0x00, 0x61, 0xa6, 0x50, 0xf5, 0x77, 0xb9, 0x83, 0x1c, 0x7a, 0x35,
0xa4, 0x88, 0x98, 0x42, 0x11, 0x82, 0x03, 0x1d, 0x5f, 0xf0, 0x2b, 0x7f, 0xa0, 0xb5, 0x24, 0x1c,
0x28, 0x10, 0xe6, 0x4c, 0x07, 0x02, 0xf5, 0x9d, 0xe9, 0x34, 0x61, 0x84, 0xce, 0x74, 0x30, 0x03,
0x86, 0x79, 0xf4, 0xeb, 0xb6, 0xe1, 0xa7, 0x9c, 0x5f, 0xce, 0xe3, 0xf2, 0x72, 0x78, 0x9f, 0x56,
0x6e, 0x18, 0xed, 0x68, 0xbb, 0x17, 0x6b, 0xc6, 0x90, 0xed, 0xb0, 0x5e, 0x80, 0x5f, 0x95, 0x19,
0x1a, 0x43, 0x8e, 0x0d, 0x40, 0x88, 0x31, 0x44, 0xa0, 0x66, 0x46, 0xb3, 0xbd, 0x8d, 0x19, 0xde,
0x45, 0x38, 0xea, 0x63, 0x46, 0xed, 0x22, 0x3c, 0x18, 0x4e, 0xa1, 0xa3, 0x32, 0x2e, 0x2e, 0xfc,
0x29, 0x24, 0x45, 0xe1, 0x14, 0x6a, 0x10, 0xdc, 0xdf, 0x63, 0x16, 0x97, 0xc9, 0x85, 0xbf, 0xbf,
0x95, 0x2c, 0xdc, 0xdf, 0x9a, 0x31, 0x0b, 0xae, 0x6d, 0x78, 0xbc, 0x38, 0xaf, 0x92, 0x32, 0x3d,
0x67, 0xc3, 0x6d, 0x5a, 0x5b, 0x43, 0xc4, 0x82, 0x4b, 0xc2, 0xe6, 0xcc, 0x07, 0x7c, 0x36, 0xb2,
0xe3, 0x69, 0x85, 0xce, 0x7c, 0x1a, 0x1b, 0x16, 0x41, 0x9c, 0xf9, 0xf8, 0x49, 0xdc, 0xbc, 0xa3,
0x92, 0x2f, 0x8a, 0xaa, 0xa3, 0x79, 0x08, 0x0a, 0x37, 0xaf, 0x0d, 0x83, 0xcf, 0xeb, 0xe8, 0x37,
0xed, 0x47, 0xfa, 0x2a, 0xaf, 0xb4, 0xd7, 0x1d, 0xfa, 0x39, 0x59, 0x18, 0x71, 0x7a, 0x12, 0xc0,
0xcd, 0x46, 0xbc, 0xf1, 0x2c, 0x0e, 0x98, 0x88, 0xd3, 0xac, 0x1a, 0x6e, 0xfa, 0x6d, 0x34, 0x72,
0x62, 0x23, 0xee, 0xe3, 0xf0, 0x10, 0x3a, 0x58, 0x14, 0x59, 0x9a, 0xb4, 0x8f, 0xd1, 0x40, 0x57,
0x8b, 0xc3, 0x43, 0xc8, 0xc6, 0xf0, 0x94, 0x30, 0x66, 0x42, 0xfd, 0xcf, 0x64, 0x55, 0x30, 0xff,
0x94, 0xe0, 0x20, 0xe1, 0x29, 0x01, 0xa3, 0xb8, 0x3d, 0x63, 0x26, 0x9e, 0xc7, 0x2b, 0xbe, 0x20,
0xa6, 0x04, 0x2d, 0x0e, 0xb7, 0xc7, 0xc6, 0xcc, 0xc2, 0xad, 0x3d, 0x1c, 0xe7, 0x82, 0x95, 0x79,
0x9c, 0x1d, 0x66, 0xf1, 0xac, 0x1a, 0x12, 0xe3, 0xc6, 0xa5, 0x88, 0x85, 0x9b, 0xa6, 0x3d, 0x8f,
0xf1, 0xb8, 0x3a, 0x8c, 0x97, 0xbc, 0x4c, 0x05, 0xfd, 0x18, 0x0d, 0xd2, 0xf9, 0x18, 0x1d, 0xd4,
0xeb, 0x6d, 0xaf, 0x4c, 0x2e, 0xd2, 0x25, 0x9b, 0x06, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x16, 0xea,
0xe9, 0xb4, 0x31, 0x5f, 0x94, 0x09, 0x23, 0x3b, 0x4d, 0x89, 0x3b, 0x3b, 0x4d, 0x63, 0xe0, 0xe1,
0xaf, 0x06, 0xd1, 0x6f, 0x29, 0xa9, 0x7d, 0xb6, 0x75, 0x10, 0x57, 0x17, 0xe7, 0x3c, 0x2e, 0xa7,
0xc3, 0x4f, 0x7c, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0x68, 0x1d, 0x15, 0xfc, 0x58, 0x9f, 0xa7, 0x95,
0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3, 0x78, 0x02, 0x91, 0x72, 0xb5, 0x8f,
0xdc, 0x24, 0xf5, 0xdd, 0xcd, 0xe4, 0x56, 0x27, 0x87, 0xe7, 0xc7, 0x5a, 0xe8, 0x66, 0xcb, 0x0e,
0x65, 0xc3, 0x9f, 0x31, 0xa3, 0xbe, 0x38, 0xe9, 0x59, 0x8f, 0x8a, 0xb0, 0xe7, 0xd6, 0xc8, 0x18,
0xf5, 0xc5, 0x09, 0xcf, 0xd6, 0xb4, 0x16, 0xf2, 0xec, 0x99, 0xda, 0x46, 0x7d, 0x71, 0x9c, 0x40,
0x7b, 0x45, 0x91, 0xad, 0x26, 0x6c, 0x5e, 0x64, 0x64, 0x02, 0x39, 0x48, 0x38, 0x81, 0x30, 0x8a,
0xab, 0x9f, 0x09, 0xaf, 0x6b, 0x2b, 0x6f, 0xf5, 0x23, 0x45, 0xe1, 0xea, 0xa7, 0x41, 0x70, 0xc1,
0x30, 0xe1, 0xfb, 0x3c, 0xcb, 0x58, 0x22, 0xda, 0x97, 0x44, 0x5a, 0xd3, 0x10, 0xe1, 0x82, 0x01,
0x91, 0xe6, 0x30, 0xa0, 0xa9, 0xd5, 0xe3, 0x92, 0x3d, 0x5d, 0x3d, 0x4f, 0xf3, 0xcb, 0xa1, 0x7f,
0x6d, 0x34, 0x00, 0x71, 0x18, 0xe0, 0x05, 0xf1, 0x9e, 0xe0, 0x55, 0x3e, 0xe5, 0xfe, 0x3d, 0x41,
0x2d, 0x09, 0xef, 0x09, 0x80, 0xc0, 0x26, 0xcf, 0x18, 0x65, 0xb2, 0x96, 0x84, 0x4d, 0x02, 0xe1,
0x9b, 0x0f, 0xe0, 0xd4, 0x8d, 0x9c, 0x0f, 0xd0, 0x39, 0xdb, 0x56, 0x27, 0x87, 0x33, 0xb4, 0xd9,
0x1c, 0x1c, 0x32, 0x91, 0x5c, 0xf8, 0x33, 0xd4, 0x41, 0xc2, 0x19, 0x8a, 0x51, 0xdc, 0xa4, 0x09,
0xd7, 0x9b, 0x9b, 0x4d, 0x7f, 0x7e, 0xb4, 0x36, 0x36, 0x5b, 0x9d, 0x1c, 0x2e, 0xd7, 0x8f, 0xe7,
0xf2, 0x99, 0x79, 0x93, 0x5c, 0xc9, 0xc2, 0xe5, 0xba, 0x66, 0x70, 0xf4, 0x4a, 0x50, 0x3f, 0x4e,
0x7f, 0xf4, 0x46, 0x1e, 0x8e, 0xde, 0xe1, 0xc0, 0xc9, 0xbf, 0x0e, 0xa2, 0x9b, 0xb6, 0x97, 0x13,
0x5e, 0x8f, 0x91, 0xd7, 0x71, 0x96, 0x4e, 0x63, 0xc1, 0x26, 0xfc, 0x92, 0xe5, 0x68, 0xbf, 0xef,
0x46, 0xab, 0xf8, 0x91, 0xa3, 0x40, 0xec, 0xf7, 0x7b, 0x29, 0xe2, 0x3c, 0x51, 0xf4, 0xab, 0x8a,
0xed, 0xc7, 0x15, 0x31, 0x93, 0x39, 0x48, 0x38, 0x4f, 0x30, 0x8a, 0x8b, 0x36, 0x25, 0x7f, 0x76,
0x5d, 0xb0, 0x32, 0x65, 0x79, 0xc2, 0xfc, 0x45, 0x1b, 0xa6, 0xc2, 0x45, 0x9b, 0x87, 0x6e, 0x6d,
0x87, 0xf5, 0xe4, 0xd4, 0xbe, 0xe7, 0xc5, 0x44, 0xe0, 0x9e, 0x97, 0x40, 0x71, 0x23, 0x0d, 0xe0,
0x3d, 0x52, 0x6a, 0x59, 0x09, 0x1e, 0x29, 0xd1, 0x74, 0xeb, 0x90, 0x41, 0x33, 0xe3, 0x7a, 0x98,
0x74, 0x84, 0x3e, 0xb6, 0x87, 0xcb, 0x76, 0x2f, 0xd6, 0x7f, 0xaa, 0x71, 0xc6, 0xb2, 0x58, 0x2e,
0x21, 0x81, 0xa3, 0x83, 0x86, 0xe9, 0x73, 0xaa, 0x61, 0xb1, 0xe0, 0xf0, 0x2f, 0x06, 0xd1, 0x0d,
0x9f, 0xc7, 0x97, 0x85, 0xf4, 0xfb, 0xb0, 0xdb, 0x96, 0x22, 0x89, 0x8b, 0xec, 0xb0, 0x06, 0xc4,
0xf0, 0x27, 0xd1, 0x07, 0x8d, 0xc8, 0xdc, 0x73, 0x43, 0x00, 0x6e, 0x15, 0xa1, 0xe3, 0xc7, 0x9c,
0x76, 0xbf, 0xdb, 0x9b, 0x37, 0x05, 0xba, 0x1b, 0x57, 0x85, 0x0a, 0x74, 0x6d, 0x03, 0xc4, 0x44,
0x81, 0xee, 0xc1, 0xf0, 0x4a, 0xdd, 0x20, 0xf5, 0x38, 0xf1, 0xcd, 0x71, 0xda, 0x84, 0x3d, 0x4a,
0xee, 0x76, 0x83, 0x38, 0x77, 0x1a, 0x31, 0xd4, 0xc5, 0xf7, 0x43, 0x16, 0x50, 0x6d, 0xbc, 0xdd,
0x8b, 0x05, 0x87, 0x7f, 0x16, 0x7d, 0xbf, 0xd5, 0xb0, 0x43, 0x16, 0x8b, 0x45, 0xc9, 0xa6, 0xc3,
0xdd, 0x8e, 0xb8, 0x1b, 0x50, 0xbb, 0x7e, 0xd8, 0x5f, 0x01, 0xfc, 0xff, 0xcd, 0x20, 0xfa, 0x81,
0xcb, 0xa9, 0x2e, 0xd6, 0x31, 0x3c, 0x0a, 0x99, 0x74, 0x59, 0x1d, 0xc6, 0xe3, 0xb5, 0x74, 0x5a,
0x7b, 0x30, 0x3b, 0x91, 0xf7, 0x96, 0x71, 0x9a, 0xc5, 0xe7, 0x19, 0xf3, 0xee, 0xc1, 0x9c, 0xdc,
0xd4, 0x68, 0x70, 0x0f, 0x46, 0xaa, 0xb4, 0x66, 0x49, 0x39, 0xde, 0xac, 0xda, 0xfd, 0x01, 0x3d,
0x2a, 0x3d, 0xa5, 0xfb, 0x4e, 0x4f, 0x1a, 0xdc, 0x8a, 0xe6, 0xec, 0xaa, 0xfe, 0xb3, 0x9d, 0xe4,
0x3e, 0xaf, 0xa0, 0xea, 0xc9, 0xf4, 0x9d, 0x9e, 0x34, 0x78, 0xfd, 0xd3, 0xe8, 0x83, 0xb6, 0x57,
0x58, 0x14, 0x76, 0x3b, 0x4d, 0xa1, 0x75, 0xe1, 0x61, 0x7f, 0x05, 0x53, 0xea, 0x7f, 0x91, 0x56,
0x82, 0x97, 0xab, 0xf1, 0x05, 0xbf, 0x6a, 0xde, 0xe5, 0x74, 0x47, 0x2b, 0x00, 0x23, 0x8b, 0x20,
0x4a, 0x7d, 0x3f, 0xd9, 0x72, 0x65, 0xde, 0xf9, 0xac, 0x08, 0x57, 0x16, 0xd1, 0xe1, 0xca, 0x25,
0xcd, 0x5c, 0xd5, 0xb4, 0xca, 0xbc, 0xa0, 0xba, 0xe5, 0x0f, 0xb5, 0xfd, 0x92, 0xea, 0xdd, 0x6e,
0xd0, 0x6c, 0xbf, 0x0e, 0xd3, 0x8c, 0xbd, 0x7c, 0xfb, 0x36, 0xe3, 0xf1, 0x14, 0x6d, 0xbf, 0x6a,
0xc9, 0x08, 0x44, 0xc4, 0xf6, 0x0b, 0x21, 0xa6, 0xe8, 0xac, 0x05, 0xf2, 0x6e, 0xa6, 0x31, 0xbd,
0xd9, 0xd6, 0xb3, 0xe5, 0x44, 0xd1, 0xe9, 0xe3, 0xcc, 0x82, 0x51, 0x4b, 0xeb, 0x21, 0xd8, 0xf8,
0xb8, 0xd3, 0xd6, 0xb5, 0xc4, 0xc4, 0x82, 0xe1, 0xc1, 0xcc, 0xfe, 0xa8, 0x16, 0xbe, 0x2a, 0xa4,
0xf1, 0x0f, 0xdb, 0x5a, 0x4a, 0x42, 0xec, 0x8f, 0x5c, 0xc2, 0xd4, 0xf9, 0xf5, 0xdf, 0x0f, 0xf8,
0x55, 0x2e, 0x8d, 0x7a, 0x9e, 0x66, 0x23, 0x23, 0xea, 0x7c, 0xcc, 0x80, 0xe1, 0x9f, 0x46, 0xbf,
0x28, 0x0d, 0x97, 0xbc, 0x18, 0x6e, 0x78, 0x14, 0x4a, 0xeb, 0x8d, 0x90, 0x9b, 0xa4, 0xdc, 0xbc,
0xd8, 0xa4, 0xfb, 0xef, 0x55, 0x15, 0xcf, 0x18, 0x7a, 0xb1, 0xc9, 0xf4, 0x8a, 0x94, 0x12, 0x2f,
0x36, 0xb5, 0x29, 0xf3, 0xb2, 0x4e, 0x2d, 0x3b, 0xe1, 0x53, 0xb0, 0xee, 0x69, 0xa1, 0x16, 0x12,
0x2f, 0xeb, 0xb4, 0x20, 0x73, 0x7e, 0x7f, 0x12, 0x2f, 0xd3, 0x99, 0x9e, 0xfc, 0xd5, 0x1c, 0x52,
0xa1, 0xf3, 0x7b, 0xc3, 0x8c, 0x2c, 0x88, 0x38, 0xbf, 0x27, 0x61, 0xf0, 0xf9, 0x2f, 0x83, 0xe8,
0x43, 0xc3, 0x1c, 0x35, 0xc7, 0x2a, 0xc7, 0xf9, 0x5b, 0xfe, 0x26, 0x15, 0x17, 0xf5, 0x3e, 0xbe,
0x1a, 0x3e, 0xa1, 0x4c, 0xfa, 0x79, 0x1d, 0xca, 0xe7, 0x6b, 0xeb, 0x99, 0x6a, 0xae, 0x39, 0x6e,
0x31, 0x77, 0x5b, 0x4a, 0x03, 0x55, 0x73, 0xfa, 0x54, 0x06, 0x73, 0x44, 0x35, 0x17, 0xe2, 0x4d,
0x17, 0x6b, 0xe7, 0x19, 0xcf, 0x71, 0x17, 0x1b, 0x0b, 0xb5, 0x90, 0xe8, 0xe2, 0x16, 0x64, 0xe6,
0xc6, 0x46, 0xa4, 0x4e, 0x06, 0xf6, 0xb2, 0x0c, 0xcd, 0x8d, 0x5a, 0x55, 0x03, 0xc4, 0xdc, 0xe8,
0x05, 0xc1, 0xcf, 0x59, 0xf4, 0x9d, 0xfa, 0x91, 0x9e, 0x96, 0x6c, 0x99, 0x32, 0x7c, 0x0d, 0x6b,
0x49, 0x88, 0xf1, 0xef, 0x12, 0x66, 0x64, 0xbd, 0xca, 0xab, 0x22, 0x8b, 0xab, 0x0b, 0xb8, 0x98,
0x73, 0xdb, 0xdc, 0x08, 0xf1, 0xd5, 0xdc, 0x9d, 0x0e, 0xca, 0x4c, 0xbc, 0x8d, 0x4c, 0x4f, 0x31,
0x9b, 0x7e, 0xd5, 0xd6, 0x34, 0xb3, 0xd5, 0xc9, 0x99, 0xa3, 0xc9, 0xa3, 0x38, 0xcb, 0x58, 0xb9,
0x6a, 0x64, 0x2f, 0xe2, 0x3c, 0x7d, 0xcb, 0x2a, 0x81, 0x8e, 0x26, 0x81, 0x1a, 0x61, 0x8c, 0x38,
0x9a, 0x0c, 0xe0, 0xa6, 0xb2, 0x46, 0x9e, 0x8f, 0xf3, 0x29, 0xbb, 0x46, 0x95, 0x35, 0xb6, 0x23,
0x19, 0xa2, 0xb2, 0xa6, 0x58, 0xb3, 0x3c, 0x3e, 0xcd, 0x78, 0x72, 0x09, 0x4b, 0x80, 0xdb, 0xc1,
0x52, 0x82, 0xd7, 0x80, 0x5b, 0x21, 0xc4, 0x2c, 0x02, 0x52, 0x70, 0xc6, 0x8a, 0x2c, 0x4e, 0xf0,
0x5d, 0xbc, 0xd2, 0x01, 0x19, 0xb1, 0x08, 0x60, 0x06, 0x85, 0x0b, 0x77, 0xfc, 0xbe, 0x70, 0xd1,
0x15, 0xff, 0xad, 0x10, 0x62, 0x96, 0x41, 0x29, 0x18, 0x17, 0x59, 0x2a, 0xd0, 0x30, 0x50, 0x1a,
0x52, 0x42, 0x0c, 0x03, 0x97, 0x40, 0x26, 0x5f, 0xb0, 0x72, 0xc6, 0xbc, 0x26, 0xa5, 0x24, 0x68,
0xb2, 0x21, 0xcc, 0x8b, 0x41, 0xaa, 0xed, 0xbc, 0x58, 0xa1, 0x17, 0x83, 0xa0, 0x59, 0xbc, 0x58,
0x11, 0x2f, 0x06, 0x39, 0x00, 0x0a, 0xf1, 0x34, 0xae, 0x84, 0x3f, 0x44, 0x29, 0x09, 0x86, 0xd8,
0x10, 0x66, 0x8d, 0x56, 0x21, 0x2e, 0x04, 0x5a, 0xa3, 0x21, 0x00, 0xeb, 0xaa, 0xf0, 0x26, 0x29,
0x37, 0x33, 0x89, 0xea, 0x15, 0x26, 0x0e, 0x53, 0x96, 0x4d, 0x2b, 0x34, 0x93, 0xc0, 0x73, 0x6f,
0xa4, 0xc4, 0x4c, 0xd2, 0xa6, 0x50, 0x2a, 0xc1, 0x19, 0xae, 0xaf, 0x75, 0xe8, 0xf8, 0xf6, 0x56,
0x08, 0x31, 0xf3, 0x53, 0x13, 0xf4, 0x7e, 0x5c, 0x96, 0x69, 0xbd, 0xf8, 0x6f, 0xfa, 0x03, 0x6a,
0xe4, 0xc4, 0xfc, 0xe4, 0xe3, 0xd0, 0xf0, 0x6a, 0x26, 0x6e, 0x5f, 0x60, 0x78, 0xea, 0xfe, 0x38,
0xc8, 0x98, 0x8a, 0x53, 0x4a, 0xac, 0xbb, 0x2e, 0xdf, 0xd3, 0xf4, 0x5c, 0x75, 0x6d, 0x76, 0x61,
0xd6, 0xab, 0xc6, 0xda, 0xc5, 0x0b, 0xbe, 0x64, 0x13, 0xfe, 0xec, 0x3a, 0xad, 0x44, 0x9a, 0xcf,
0x60, 0xe5, 0x7e, 0x4c, 0x58, 0xf2, 0xc1, 0xc4, 0xab, 0xc6, 0x9d, 0x4a, 0xa6, 0x80, 0x40, 0xb1,
0x9c, 0xb0, 0x2b, 0x6f, 0x01, 0x81, 0x2d, 0x6a, 0x8e, 0x28, 0x20, 0x42, 0xbc, 0x39, 0xd3, 0xd0,
0xce, 0xe1, 0xf7, 0x58, 0x13, 0xde, 0xd4, 0x72, 0x94, 0x35, 0x0c, 0x12, 0xdb, 0xca, 0xa0, 0x82,
0xd9, 0xeb, 0x69, 0xff, 0x66, 0x88, 0xdd, 0x25, 0xec, 0xb4, 0x87, 0xd9, 0xbd, 0x1e, 0xa4, 0xc7,
0x95, 0xb9, 0xb0, 0xa5, 0x5c, 0xb5, 0xef, 0x6b, 0xef, 0xf5, 0x20, 0xad, 0xf3, 0x11, 0xbb, 0x59,
0x4f, 0xe3, 0xe4, 0x72, 0x56, 0xf2, 0x45, 0x3e, 0xdd, 0xe7, 0x19, 0x2f, 0xd1, 0xf9, 0x88, 0x13,
0x35, 0x42, 0x89, 0xf3, 0x91, 0x0e, 0x15, 0x53, 0xc1, 0xd9, 0x51, 0xec, 0x65, 0xe9, 0x0c, 0xef,
0x6e, 0x1d, 0x43, 0x12, 0x20, 0x2a, 0x38, 0x2f, 0xe8, 0x49, 0x22, 0xb5, 0xfb, 0x15, 0x69, 0x12,
0x67, 0xca, 0xdf, 0x2e, 0x6d, 0xc6, 0x01, 0x3b, 0x93, 0xc8, 0xa3, 0xe0, 0x69, 0xe7, 0x64, 0x51,
0xe6, 0xc7, 0xb9, 0xe0, 0x64, 0x3b, 0x1b, 0xa0, 0xb3, 0x9d, 0x16, 0x88, 0xa6, 0xd5, 0x09, 0xbb,
0xae, 0xa3, 0xa9, 0xff, 0xe3, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0x40, 0x1e, 0x9a, 0x56, 0x11, 0x87,
0x1a, 0x03, 0x4e, 0x54, 0xc2, 0x04, 0xb4, 0xdd, 0x34, 0xb9, 0xdb, 0x0d, 0xfa, 0xfd, 0x8c, 0xc5,
0x2a, 0x63, 0x21, 0x3f, 0x12, 0xe8, 0xe3, 0xa7, 0x01, 0xcd, 0xc5, 0x89, 0xd3, 0x9e, 0x0b, 0x96,
0x5c, 0xb6, 0xde, 0x3f, 0x71, 0x03, 0x55, 0x08, 0x71, 0x71, 0x42, 0xa0, 0xfe, 0x2e, 0x3a, 0x4e,
0x78, 0x1e, 0xea, 0xa2, 0x5a, 0xde, 0xa7, 0x8b, 0x80, 0x33, 0x9b, 0x5f, 0x2d, 0x85, 0xcc, 0x54,
0xdd, 0xb4, 0x4d, 0x58, 0xb0, 0x21, 0x62, 0xf3, 0x4b, 0xc2, 0xa6, 0x26, 0xc7, 0x3e, 0x5f, 0xb4,
0xdf, 0xff, 0x6c, 0x59, 0x79, 0x41, 0xbf, 0xff, 0x49, 0xb1, 0x74, 0x23, 0x55, 0x8e, 0x74, 0x58,
0x71, 0xf3, 0xe4, 0x41, 0x3f, 0xd8, 0x6c, 0x79, 0x1c, 0x9f, 0xfb, 0x19, 0x8b, 0x4b, 0xe5, 0x75,
0x27, 0x60, 0xc8, 0x60, 0xc4, 0x96, 0x27, 0x80, 0xa3, 0x29, 0xcc, 0xf1, 0xbc, 0xcf, 0x73, 0xc1,
0x72, 0xe1, 0x9b, 0xc2, 0x5c, 0x63, 0x00, 0x86, 0xa6, 0x30, 0x4a, 0x01, 0xe5, 0xad, 0x3c, 0x0f,
0x62, 0xe2, 0x24, 0x9e, 0x7b, 0x2b, 0x36, 0x75, 0xd6, 0xa3, 0xe4, 0xa1, 0xbc, 0x45, 0x1c, 0x1a,
0xf2, 0xc7, 0xf3, 0x78, 0xa6, 0xbd, 0x78, 0xb4, 0xa5, 0xbc, 0xe5, 0xe6, 0x6e, 0x37, 0x88, 0xfc,
0xbc, 0x4e, 0xa7, 0x8c, 0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x18, 0x44, 0x95, 0x53, 0xdd, 0x5a,
0xb5, 0x9b, 0xda, 0xcb, 0xa7, 0xb0, 0x87, 0x1c, 0x11, 0x0f, 0x05, 0x71, 0xa1, 0xca, 0x89, 0xe0,
0xd1, 0xf8, 0x68, 0x0e, 0x47, 0x43, 0xe3, 0x43, 0x9f, 0x7d, 0xf6, 0x19, 0x1f, 0x3e, 0x18, 0x7c,
0xfe, 0x31, 0x8c, 0x8f, 0x83, 0x58, 0xc4, 0x75, 0xcd, 0xfc, 0x3a, 0x65, 0x57, 0xb0, 0x09, 0xf5,
0xb4, 0xb7, 0xa1, 0x46, 0xf2, 0xc7, 0x28, 0x68, 0x47, 0xba, 0xdb, 0x9b, 0x0f, 0xf8, 0x86, 0xea,
0xbc, 0xd3, 0x37, 0x2a, 0xd3, 0x77, 0x7b, 0xf3, 0x01, 0xdf, 0xf0, 0x2b, 0xb7, 0x4e, 0xdf, 0xe8,
0xa7, 0x6e, 0xbb, 0xbd, 0x79, 0xf0, 0xfd, 0x97, 0x83, 0xe8, 0x46, 0xcb, 0x79, 0x5d, 0x03, 0x25,
0x22, 0x5d, 0x32, 0x5f, 0x29, 0xe7, 0xda, 0xd3, 0x68, 0xa8, 0x94, 0xa3, 0x55, 0xac, 0x4f, 0x23,
0xf8, 0xa2, 0x38, 0xe5, 0x55, 0x2a, 0x2f, 0x8e, 0x1f, 0xf7, 0x30, 0xda, 0xc0, 0xa1, 0x0d, 0x4b,
0x48, 0xc9, 0x5c, 0xbb, 0x39, 0xa8, 0x79, 0xd5, 0xf3, 0x41, 0xc0, 0x5e, 0xfb, 0x8d, 0xcf, 0x9d,
0x9e, 0xb4, 0xb9, 0x00, 0x73, 0x18, 0xfb, 0xe6, 0x2d, 0xd4, 0xab, 0xde, 0xcb, 0xb7, 0x87, 0xfd,
0x15, 0xc0, 0xfd, 0x5f, 0x37, 0x35, 0x3d, 0xf6, 0x0f, 0x83, 0xe0, 0x51, 0x1f, 0x8b, 0x68, 0x20,
0x3c, 0x5e, 0x4b, 0x07, 0x02, 0xf9, 0x8f, 0x41, 0x74, 0xcb, 0x1b, 0x88, 0x7b, 0x07, 0xfb, 0xdb,
0x7d, 0x6c, 0xfb, 0xef, 0x62, 0x7f, 0xfc, 0x6d, 0x54, 0x21, 0xba, 0xbf, 0x6f, 0xb6, 0xd6, 0x8d,
0x86, 0x7c, 0x1d, 0xff, 0x65, 0x39, 0x65, 0x25, 0x8c, 0xd8, 0x50, 0xd2, 0x19, 0x18, 0x8f, 0xdb,
0xcf, 0xd6, 0xd4, 0xb2, 0x3e, 0xe3, 0xe1, 0xc0, 0xf0, 0xcb, 0x24, 0x2b, 0x9e, 0x90, 0x65, 0x8b,
0xc6, 0x01, 0x3d, 0x59, 0x57, 0x8d, 0x1a, 0xc9, 0x16, 0x2c, 0x7f, 0x15, 0xfc, 0xb8, 0xa7, 0x61,
0xe7, 0x77, 0xc2, 0x9f, 0xae, 0xa7, 0x04, 0xb1, 0xfc, 0xd7, 0x20, 0xba, 0xe3, 0xb0, 0xe6, 0xa6,
0x01, 0x9d, 0x87, 0xfc, 0x24, 0x60, 0x9f, 0x52, 0xd2, 0xc1, 0xfd, 0xce, 0xb7, 0x53, 0x36, 0xdf,
0xbc, 0x70, 0x54, 0x0e, 0xd3, 0x4c, 0xb0, 0xb2, 0xfd, 0xcd, 0x0b, 0xd7, 0xae, 0xa2, 0x46, 0xf4,
0x37, 0x2f, 0x02, 0xb8, 0xf5, 0xcd, 0x0b, 0x8f, 0x67, 0xef, 0x37, 0x2f, 0xbc, 0xd6, 0x82, 0xdf,
0xbc, 0x08, 0x6b, 0x50, 0x8b, 0x4f, 0x13, 0x82, 0x3a, 0xd1, 0xee, 0x65, 0xd1, 0x3d, 0xe0, 0x7e,
0xb4, 0x8e, 0x0a, 0xb1, 0xfc, 0x2a, 0x4e, 0xbe, 0x19, 0xd6, 0xe3, 0x99, 0x3a, 0x6f, 0x87, 0xed,
0xf6, 0xe6, 0xc1, 0xf7, 0xcf, 0x60, 0xdf, 0xa3, 0x17, 0x1b, 0x5e, 0xca, 0xef, 0x9d, 0x6c, 0x87,
0x16, 0x8f, 0xda, 0x82, 0xdd, 0xf3, 0x0f, 0xfa, 0xc1, 0x44, 0x73, 0x6b, 0x02, 0x3a, 0x7d, 0xd4,
0x65, 0x08, 0x75, 0xf9, 0x6e, 0x6f, 0x9e, 0x58, 0xe4, 0x94, 0x6f, 0xd5, 0xdb, 0x3d, 0x8c, 0xb9,
0x7d, 0xfd, 0xb0, 0xbf, 0x82, 0x79, 0xb5, 0xa5, 0xe5, 0x5e, 0xf6, 0x73, 0xe7, 0x13, 0x74, 0x7a,
0x79, 0xa7, 0x27, 0x1d, 0x2a, 0x6e, 0xec, 0xe5, 0xbd, 0xab, 0xb8, 0xf1, 0x2e, 0xf1, 0x9f, 0xae,
0xa7, 0x04, 0xb1, 0xfc, 0xf3, 0x20, 0xba, 0x49, 0xc6, 0x02, 0x59, 0xf0, 0xa4, 0xaf, 0x65, 0x94,
0x0d, 0x9f, 0xaf, 0xad, 0x07, 0x41, 0xfd, 0xdb, 0x20, 0xfa, 0x30, 0x10, 0x94, 0x4a, 0x8f, 0x35,
0xac, 0xbb, 0x69, 0xf2, 0xa3, 0xf5, 0x15, 0xa9, 0xc5, 0xde, 0xc6, 0xc7, 0xed, 0x4f, 0x41, 0x04,
0x6c, 0x8f, 0xe9, 0x4f, 0x41, 0x74, 0x6b, 0xe1, 0xc3, 0x9f, 0xba, 0x24, 0x81, 0x7d, 0x91, 0xef,
0xf0, 0x47, 0x56, 0x2c, 0x68, 0x3f, 0xb4, 0xd5, 0xc9, 0xf9, 0x9c, 0x3c, 0xbb, 0x2e, 0xe2, 0x7c,
0x4a, 0x3b, 0x51, 0xf2, 0x6e, 0x27, 0x9a, 0xc3, 0x87, 0x66, 0xb5, 0xf4, 0x8c, 0x37, 0x9b, 0xbc,
0x7b, 0x94, 0xbe, 0x46, 0x82, 0x87, 0x66, 0x2d, 0x94, 0xf0, 0x06, 0x15, 0x6d, 0xc8, 0x1b, 0x2a,
0x64, 0xef, 0xf7, 0x41, 0xd1, 0xf6, 0x41, 0x7b, 0xd3, 0x67, 0xf1, 0x0f, 0x42, 0x56, 0x5a, 0xe7,
0xf1, 0x3b, 0x3d, 0x69, 0xc2, 0xed, 0x98, 0x89, 0x2f, 0x58, 0x3c, 0x65, 0x65, 0xd0, 0xad, 0xa6,
0x7a, 0xb9, 0xb5, 0x69, 0x9f, 0xdb, 0x7d, 0x9e, 0x2d, 0xe6, 0x39, 0x74, 0x26, 0xe9, 0xd6, 0xa6,
0xba, 0xdd, 0x22, 0x1a, 0x1f, 0x17, 0x1a, 0xb7, 0xb2, 0xb8, 0xbc, 0x1f, 0x36, 0xe3, 0xd4, 0x94,
0xdb, 0xbd, 0x58, 0xba, 0x9d, 0x90, 0x46, 0x1d, 0xed, 0x44, 0x99, 0xb4, 0xd3, 0x93, 0xc6, 0xe7,
0x76, 0x96, 0x5b, 0x9d, 0x4f, 0xbb, 0x1d, 0xb6, 0x5a, 0x29, 0xf5, 0xb0, 0xbf, 0x02, 0x3e, 0x25,
0x85, 0xac, 0xaa, 0x77, 0x45, 0x87, 0x69, 0x96, 0x0d, 0xb7, 0x03, 0x69, 0xd2, 0x40, 0xc1, 0x53,
0x52, 0x0f, 0x4c, 0x64, 0x72, 0x73, 0xaa, 0x98, 0x0f, 0xbb, 0xec, 0x48, 0xaa, 0x57, 0x26, 0xdb,
0x34, 0x3a, 0x6d, 0xb3, 0x1e, 0xb5, 0x6e, 0xed, 0x28, 0xfc, 0xe0, 0x5a, 0x0d, 0xde, 0xed, 0xcd,
0xa3, 0x6b, 0x78, 0x49, 0xc9, 0x95, 0xe5, 0x36, 0x65, 0xc2, 0x59, 0x49, 0xee, 0x74, 0x50, 0xe8,
0xc4, 0x52, 0x0d, 0xa3, 0x37, 0xe9, 0x74, 0xc6, 0x84, 0xf7, 0x06, 0xc9, 0x06, 0x82, 0x37, 0x48,
0x08, 0x44, 0x5d, 0xa7, 0xfe, 0x3e, 0x66, 0x62, 0x12, 0x97, 0x33, 0x26, 0x8e, 0xa7, 0xbe, 0xae,
0x03, 0x65, 0x8b, 0x0a, 0x75, 0x9d, 0x97, 0x46, 0xb3, 0x81, 0x76, 0x0b, 0xbf, 0xa7, 0xbe, 0x1f,
0x32, 0x83, 0x7e, 0x54, 0xbd, 0xdd, 0x8b, 0x45, 0x2b, 0x8a, 0x71, 0x98, 0xce, 0x53, 0xe1, 0x5b,
0x51, 0x2c, 0x1b, 0x35, 0x12, 0x5a, 0x51, 0xda, 0x28, 0xd5, 0xbc, 0xba, 0x46, 0x38, 0x9e, 0x86,
0x9b, 0xa7, 0x98, 0x7e, 0xcd, 0xd3, 0x6c, 0xeb, 0xc2, 0x33, 0xd7, 0x29, 0x23, 0x2e, 0x60, 0xab,
0xec, 0xc9, 0x6d, 0xf9, 0x13, 0x43, 0x0c, 0x86, 0x66, 0x1d, 0x4a, 0xc1, 0xfa, 0x15, 0x8b, 0xe6,
0x9a, 0x3b, 0xd9, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x89, 0x77, 0x6b, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0,
0xd6, 0x94, 0xd4, 0x40, 0xd7, 0xe9, 0xee, 0x8f, 0x03, 0x3d, 0x43, 0x41, 0xff, 0x0a, 0xcf, 0xfd,
0x6d, 0xe0, 0xbd, 0x1e, 0x24, 0xbe, 0x4e, 0x6f, 0x00, 0x7d, 0x28, 0xaf, 0x9c, 0x7e, 0x12, 0x30,
0xe5, 0xa2, 0xa1, 0x6d, 0x30, 0xad, 0x82, 0x92, 0x5a, 0x17, 0xb8, 0x4c, 0xfc, 0x94, 0xad, 0x7c,
0x49, 0x6d, 0xea, 0x53, 0x89, 0x84, 0x92, 0xba, 0x8d, 0xa2, 0x3a, 0xd3, 0xde, 0x07, 0x6d, 0x06,
0xf4, 0xed, 0xad, 0xcf, 0x56, 0x27, 0x87, 0x46, 0xce, 0x41, 0xba, 0x74, 0xee, 0x30, 0x3c, 0x81,
0x1e, 0xa4, 0x4b, 0xff, 0x15, 0xc6, 0x76, 0x2f, 0x16, 0x5f, 0xd5, 0xc7, 0x82, 0x5d, 0x37, 0x77,
0xe8, 0x9e, 0x70, 0xa5, 0xbc, 0x75, 0x89, 0x7e, 0xb7, 0x1b, 0x34, 0x2f, 0xc6, 0x9e, 0x96, 0x3c,
0x61, 0x55, 0x05, 0xdf, 0xc7, 0x72, 0xdf, 0x3c, 0x02, 0xd9, 0x08, 0x7d, 0x1d, 0xeb, 0x76, 0x18,
0x02, 0xdb, 0x5f, 0x44, 0xef, 0x3e, 0xe7, 0xb3, 0x31, 0xcb, 0xa7, 0xc3, 0x1f, 0xba, 0xaf, 0xa2,
0xf2, 0xd9, 0xa8, 0xfe, 0xb3, 0xb6, 0xb7, 0x41, 0x89, 0xcd, 0xcb, 0x74, 0x07, 0xec, 0x7c, 0x31,
0x9b, 0x94, 0x8c, 0xa1, 0x97, 0xe9, 0xe4, 0xdf, 0x47, 0xb5, 0x80, 0x78, 0x99, 0xce, 0x01, 0xcc,
0x2a, 0xa9, 0xed, 0xd5, 0x85, 0x28, 0x7e, 0x59, 0xcd, 0xe8, 0x48, 0x29, 0xb1, 0x4a, 0xb6, 0x29,
0xd3, 0x79, 0x52, 0x26, 0x5f, 0x36, 0x1f, 0x2f, 0xe6, 0xf3, 0xb8, 0x5c, 0xa1, 0xce, 0x53, 0xba,
0x36, 0x40, 0x74, 0x9e, 0x17, 0x34, 0x59, 0xa9, 0xfc, 0x88, 0x38, 0xb9, 0x3c, 0xe2, 0x25, 0x5f,
0x88, 0x34, 0x67, 0x15, 0xca, 0x4a, 0xb0, 0xe0, 0x32, 0x44, 0x56, 0x52, 0xac, 0xa9, 0xe2, 0x24,
0xa1, 0xde, 0xa3, 0x93, 0x5f, 0x85, 0xac, 0x04, 0x2f, 0xf1, 0x5d, 0x9e, 0xb2, 0x82, 0x21, 0xa2,
0x8a, 0x23, 0x61, 0xd4, 0xf7, 0xa7, 0x69, 0x3e, 0xf3, 0xf6, 0x7d, 0x2d, 0x08, 0xf6, 0x3d, 0x00,
0x66, 0x3e, 0x56, 0x0f, 0x4d, 0x7d, 0x7e, 0x06, 0x7e, 0xdb, 0xe7, 0x7d, 0xe8, 0x36, 0x41, 0xcc,
0xc7, 0x7e, 0x12, 0xb9, 0x7a, 0x59, 0xb0, 0x9c, 0x4d, 0x9b, 0xb7, 0xc5, 0x7c, 0xae, 0x1c, 0x22,
0xe8, 0x0a, 0x93, 0x26, 0x15, 0x5e, 0x30, 0x51, 0xa6, 0x49, 0x35, 0x66, 0xe2, 0x34, 0x2e, 0xe3,
0x39, 0x13, 0xac, 0xc4, 0xa9, 0x00, 0xc8, 0xc8, 0x61, 0x88, 0x54, 0xa0, 0x58, 0x70, 0xf8, 0xbb,
0xd1, 0xf7, 0xea, 0x99, 0x8b, 0xe5, 0xf0, 0x99, 0xea, 0x67, 0xf2, 0xfb, 0xf6, 0xc3, 0xf7, 0xb5,
0x8d, 0xb1, 0x28, 0x59, 0x3c, 0x6f, 0x6c, 0xbf, 0xa7, 0xff, 0x2e, 0xc1, 0x87, 0x83, 0x7a, 0xde,
0x3e, 0xe1, 0x22, 0x7d, 0x5b, 0x6f, 0x14, 0xe0, 0x52, 0x06, 0xcd, 0xdb, 0xb6, 0x78, 0x14, 0xf8,
0x25, 0xb8, 0x8f, 0x33, 0x23, 0xd1, 0x96, 0x9e, 0xb1, 0x22, 0xc3, 0x23, 0xd1, 0xd1, 0x96, 0x00,
0x31, 0x12, 0xbd, 0xa0, 0x59, 0x84, 0x6c, 0xf1, 0x84, 0x85, 0x1b, 0x33, 0x61, 0xfd, 0x1a, 0x33,
0x71, 0x5e, 0x37, 0xaf, 0xf7, 0x50, 0x25, 0x8f, 0xa7, 0x49, 0x5c, 0x89, 0xd3, 0x78, 0x95, 0xf1,
0x78, 0x2a, 0x1f, 0x26, 0xde, 0x43, 0x35, 0xcc, 0xc8, 0x86, 0xa8, 0x3d, 0x14, 0x05, 0x2b, 0x9f,
0x4f, 0x3f, 0xfa, 0xdf, 0xaf, 0x37, 0x06, 0x5f, 0x7d, 0xbd, 0x31, 0xf8, 0xff, 0xaf, 0x37, 0x06,
0xff, 0xf4, 0xcd, 0xc6, 0x3b, 0x5f, 0x7d, 0xb3, 0xf1, 0xce, 0xff, 0x7d, 0xb3, 0xf1, 0xce, 0x97,
0xef, 0xc2, 0xbf, 0x86, 0x70, 0xfe, 0x0b, 0xf2, 0xdf, 0x34, 0x78, 0xfc, 0xf3, 0x00, 0x00, 0x00,
0xff, 0xff, 0xeb, 0xbf, 0x4d, 0x5d, 0x31, 0x61, 0x00, 0x00,
// 4410 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xe7, 0xbe, 0x30, 0xd0, 0xcb, 0x0e, 0x70, 0x17, 0x86, 0xd9, 0xb0, 0xeb, 0x64, 0x32,
0x89, 0x9d, 0xc4, 0xf1, 0x75, 0x26, 0x99, 0x8f, 0x65, 0x17, 0x09, 0x39, 0x76, 0xec, 0x31, 0x9b,
0x38, 0xc6, 0xd7, 0x49, 0xa4, 0x91, 0x90, 0x68, 0xf7, 0xad, 0x5c, 0x37, 0x6e, 0x77, 0xf5, 0x76,
0xd7, 0xf5, 0x07, 0x08, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xa7,
0xf0, 0xc4, 0xe3, 0x3c, 0x22, 0xf1, 0x82, 0x66, 0xfe, 0x91, 0x55, 0x57, 0x9f, 0xae, 0x8f, 0xd3,
0xe7, 0x54, 0xf7, 0x9d, 0xa7, 0x19, 0xf9, 0xfc, 0xce, 0x47, 0x75, 0x9d, 0xaa, 0x3a, 0x55, 0xd5,
0xb7, 0x13, 0xdd, 0x2c, 0x4e, 0x36, 0x8b, 0x52, 0x2a, 0x59, 0x6d, 0x56, 0xa2, 0xbc, 0x48, 0x13,
0xd1, 0xfe, 0x77, 0xa2, 0xff, 0x3c, 0x7e, 0x37, 0xce, 0xaf, 0xd5, 0x75, 0x21, 0x6e, 0x7c, 0x60,
0xc9, 0x44, 0x9e, 0x9f, 0xc7, 0xf9, 0xac, 0x6a, 0x90, 0x1b, 0xef, 0x5b, 0x89, 0xb8, 0x10, 0xb9,
0x82, 0xbf, 0x3f, 0xfe, 0xbf, 0xff, 0x1e, 0x45, 0xef, 0x6d, 0x67, 0xa9, 0xc8, 0xd5, 0x36, 0x68,
0x8c, 0xbf, 0x8c, 0xbe, 0xbb, 0x55, 0x14, 0x7b, 0x42, 0xbd, 0x16, 0x65, 0x95, 0xca, 0x7c, 0xfc,
0xd1, 0x04, 0x1c, 0x4c, 0x8e, 0x8a, 0x64, 0xb2, 0x55, 0x14, 0x13, 0x2b, 0x9c, 0x1c, 0x89, 0x9f,
0x2d, 0x44, 0xa5, 0x6e, 0xdc, 0x09, 0x43, 0x55, 0x21, 0xf3, 0x4a, 0x8c, 0xdf, 0x46, 0xbf, 0xb6,
0x55, 0x14, 0x53, 0xa1, 0x76, 0x44, 0xdd, 0x80, 0xa9, 0x8a, 0x95, 0x18, 0xaf, 0x75, 0x54, 0x7d,
0xc0, 0xf8, 0xb8, 0xd7, 0x0f, 0x82, 0x9f, 0xe3, 0xe8, 0x3b, 0xb5, 0x9f, 0xd3, 0x85, 0x9a, 0xc9,
0xcb, 0x7c, 0xfc, 0x61, 0x57, 0x11, 0x44, 0xc6, 0xf6, 0xed, 0x10, 0x02, 0x56, 0xdf, 0x44, 0xbf,
0xfc, 0x26, 0xce, 0x32, 0xa1, 0xb6, 0x4b, 0x51, 0x07, 0xee, 0xeb, 0x34, 0xa2, 0x49, 0x23, 0x33,
0x76, 0x3f, 0x0a, 0x32, 0x60, 0xf8, 0xcb, 0xe8, 0xbb, 0x8d, 0xe4, 0x48, 0x24, 0xf2, 0x42, 0x94,
0x63, 0x52, 0x0b, 0x84, 0xcc, 0x23, 0xef, 0x40, 0xd8, 0xf6, 0xb6, 0xcc, 0x2f, 0x44, 0xa9, 0x68,
0xdb, 0x20, 0x0c, 0xdb, 0xb6, 0x10, 0xd8, 0xfe, 0xdb, 0x51, 0xf4, 0x83, 0xad, 0x24, 0x91, 0x8b,
0x5c, 0x3d, 0x97, 0x49, 0x9c, 0x3d, 0x4f, 0xf3, 0xb3, 0x03, 0x71, 0xb9, 0x7d, 0x5a, 0xf3, 0xf9,
0x5c, 0x8c, 0x9f, 0xf8, 0x4f, 0xb5, 0x41, 0x27, 0x86, 0x9d, 0xb8, 0xb0, 0xf1, 0xfd, 0xc9, 0x72,
0x4a, 0x10, 0xcb, 0x3f, 0x8e, 0xa2, 0x15, 0x1c, 0xcb, 0x54, 0x66, 0x17, 0xc2, 0x46, 0xf3, 0x69,
0x8f, 0x61, 0x1f, 0x37, 0xf1, 0x7c, 0xb6, 0xac, 0x1a, 0x44, 0x94, 0x45, 0xdf, 0x73, 0xd3, 0x65,
0x2a, 0x2a, 0x3d, 0x9c, 0xee, 0xf3, 0x19, 0x01, 0x88, 0xf1, 0xfc, 0x60, 0x08, 0x0a, 0xde, 0xd2,
0x68, 0x0c, 0xde, 0x32, 0x59, 0x19, 0x67, 0xf7, 0x48, 0x0b, 0x0e, 0x61, 0x7c, 0xdd, 0x1f, 0x40,
0x82, 0xab, 0x3f, 0x8c, 0x7e, 0xe5, 0x8d, 0x2c, 0xcf, 0xaa, 0x22, 0x4e, 0x04, 0x0c, 0x85, 0xbb,
0xbe, 0x76, 0x2b, 0xc5, 0xa3, 0x61, 0xb5, 0x0f, 0x73, 0x92, 0xb6, 0x15, 0xbe, 0x2c, 0x04, 0x9e,
0x83, 0xac, 0x62, 0x2d, 0xe4, 0x92, 0x16, 0x43, 0x60, 0xfb, 0x2c, 0x1a, 0x5b, 0xdb, 0x27, 0x7f,
0x24, 0x12, 0xb5, 0x35, 0x9b, 0xe1, 0x5e, 0xb1, 0xba, 0x9a, 0x98, 0x6c, 0xcd, 0x66, 0x5c, 0xaf,
0xd0, 0x28, 0x38, 0xbb, 0x8c, 0xde, 0x47, 0xce, 0x9e, 0xa7, 0x95, 0x76, 0xb8, 0x11, 0xb6, 0x02,
0x98, 0x71, 0x3a, 0x19, 0x8a, 0x83, 0xe3, 0x3f, 0x1f, 0x45, 0xdf, 0x27, 0x3c, 0x1f, 0x89, 0x73,
0x79, 0x21, 0xc6, 0x8f, 0xfa, 0xad, 0x35, 0xa4, 0xf1, 0xff, 0xf1, 0x12, 0x1a, 0x44, 0x9a, 0x4c,
0x45, 0x26, 0x12, 0xc5, 0xa6, 0x49, 0x23, 0xee, 0x4d, 0x13, 0x83, 0x39, 0x23, 0xac, 0x15, 0xee,
0x09, 0xb5, 0xbd, 0x28, 0x4b, 0x91, 0x2b, 0xb6, 0x2f, 0x2d, 0xd2, 0xdb, 0x97, 0x1e, 0x4a, 0xb4,
0x67, 0x4f, 0xa8, 0xad, 0x2c, 0x63, 0xdb, 0xd3, 0x88, 0x7b, 0xdb, 0x63, 0x30, 0xf0, 0x90, 0x44,
0xbf, 0xea, 0x3c, 0x31, 0xb5, 0x9f, 0xbf, 0x95, 0x63, 0xfe, 0x59, 0x68, 0xb9, 0xf1, 0xb1, 0xd6,
0xcb, 0x11, 0xcd, 0x78, 0x76, 0x55, 0xc8, 0x92, 0xef, 0x96, 0x46, 0xdc, 0xdb, 0x0c, 0x83, 0x81,
0x87, 0x3f, 0x88, 0xde, 0x83, 0x59, 0xb2, 0x5d, 0xcf, 0xee, 0x90, 0x53, 0x28, 0x5e, 0xd0, 0xee,
0xf6, 0x50, 0x76, 0x72, 0x00, 0x19, 0x4c, 0x3e, 0x1f, 0x91, 0x7a, 0x68, 0xea, 0xb9, 0x13, 0x86,
0x3a, 0xb6, 0x77, 0x44, 0x26, 0x58, 0xdb, 0x8d, 0xb0, 0xc7, 0xb6, 0x81, 0xc0, 0x76, 0x19, 0xfd,
0x86, 0x79, 0x2c, 0xf5, 0x3a, 0xaa, 0xe5, 0xf5, 0x24, 0xbd, 0xce, 0xb4, 0xdb, 0x85, 0x8c, 0xaf,
0x87, 0xc3, 0xe0, 0x4e, 0x7b, 0x60, 0x04, 0xd2, 0xed, 0x41, 0xe3, 0xef, 0x4e, 0x18, 0x02, 0xdb,
0x7f, 0x37, 0x8a, 0x7e, 0x08, 0xb2, 0x67, 0x79, 0x7c, 0x92, 0x09, 0xbd, 0x24, 0x1e, 0x08, 0x75,
0x29, 0xcb, 0xb3, 0xe9, 0x75, 0x9e, 0x30, 0xcb, 0x3f, 0x0d, 0xf7, 0x2c, 0xff, 0xac, 0x92, 0x53,
0xf1, 0x41, 0x43, 0x95, 0x2c, 0x70, 0xc5, 0xd7, 0xb6, 0x40, 0xc9, 0x82, 0xab, 0xf8, 0x7c, 0xa4,
0x63, 0xf5, 0x45, 0x3d, 0x6d, 0xd2, 0x56, 0x5f, 0xb8, 0xf3, 0xe4, 0xed, 0x10, 0x62, 0xa7, 0xad,
0x36, 0x81, 0x65, 0xfe, 0x36, 0x9d, 0xbf, 0x2a, 0x66, 0x75, 0x1a, 0xdf, 0xa7, 0x33, 0xd4, 0x41,
0x98, 0x69, 0x8b, 0x41, 0xc1, 0xdb, 0x3f, 0xd8, 0xc2, 0x08, 0x86, 0xd2, 0x6e, 0x29, 0xcf, 0x9f,
0x8b, 0x79, 0x9c, 0x5c, 0xc3, 0xf8, 0xff, 0x24, 0x34, 0xf0, 0x30, 0x6d, 0x82, 0xf8, 0x74, 0x49,
0x2d, 0x88, 0xe7, 0x3f, 0x47, 0xd1, 0x9d, 0xb6, 0xf9, 0xa7, 0x71, 0x3e, 0x17, 0xd0, 0x9f, 0x4d,
0xf4, 0x5b, 0xf9, 0xec, 0x48, 0x54, 0x2a, 0x2e, 0xd5, 0xf8, 0xc7, 0x74, 0x23, 0x43, 0x3a, 0x26,
0xb6, 0x9f, 0x7c, 0x2b, 0x5d, 0xdb, 0xeb, 0xd3, 0x7a, 0x62, 0x83, 0x29, 0xc0, 0xef, 0x75, 0x2d,
0xc1, 0x13, 0xc0, 0xed, 0x10, 0x62, 0x7b, 0x5d, 0x0b, 0xf6, 0xf3, 0x8b, 0x54, 0x89, 0x3d, 0x91,
0x8b, 0xb2, 0xdb, 0xeb, 0x8d, 0xaa, 0x8f, 0x30, 0xbd, 0xce, 0xa0, 0x76, 0xb2, 0xf1, 0xbc, 0x99,
0xc5, 0x71, 0x3d, 0x60, 0xa4, 0xb3, 0x3c, 0x3e, 0x1c, 0x06, 0xdb, 0xdd, 0x9d, 0xe3, 0xf3, 0x48,
0x5c, 0xc8, 0x33, 0xbc, 0xbb, 0x73, 0x4d, 0x34, 0x00, 0xb3, 0xbb, 0x23, 0x41, 0xbb, 0x82, 0x39,
0x7e, 0x5e, 0xa7, 0xe2, 0x12, 0xad, 0x60, 0xae, 0x72, 0x2d, 0x66, 0x56, 0x30, 0x02, 0x03, 0x0f,
0x07, 0xd1, 0x2f, 0x69, 0xe1, 0xef, 0xc9, 0x34, 0x1f, 0xdf, 0x24, 0x94, 0x6a, 0x81, 0xb1, 0x7a,
0x8b, 0x07, 0x50, 0xc4, 0xf5, 0x5f, 0xb7, 0xe3, 0x3c, 0x11, 0x19, 0x19, 0xb1, 0x15, 0x07, 0x23,
0xf6, 0x30, 0x14, 0xf1, 0xb3, 0xab, 0x54, 0x91, 0x11, 0xd7, 0x82, 0x60, 0xc4, 0x00, 0xd8, 0x52,
0x44, 0xff, 0xb9, 0x9e, 0x0f, 0xa7, 0xa7, 0x71, 0x99, 0xe6, 0xf3, 0x31, 0x15, 0x8b, 0x23, 0x67,
0x4a, 0x11, 0x8a, 0x43, 0x43, 0x02, 0x14, 0xb7, 0x8a, 0xa2, 0xac, 0xa7, 0x59, 0x6a, 0x48, 0xf8,
0x48, 0x70, 0x48, 0x74, 0x50, 0xda, 0xdb, 0x8e, 0x48, 0xb2, 0x34, 0x0f, 0x7a, 0x03, 0x64, 0x88,
0x37, 0x8b, 0x82, 0xb7, 0x45, 0xf4, 0xbe, 0x06, 0x0e, 0xe3, 0x52, 0xa5, 0x49, 0x5a, 0xc4, 0x79,
0x5b, 0x7c, 0x53, 0x83, 0xaa, 0x43, 0x19, 0x9f, 0x1b, 0x03, 0x69, 0x70, 0xfb, 0xef, 0xa3, 0xe8,
0x43, 0xec, 0xf7, 0x50, 0x94, 0xe7, 0xa9, 0xde, 0xc3, 0x55, 0xcd, 0x0c, 0x38, 0xfe, 0x3c, 0x6c,
0xb4, 0xa3, 0x60, 0xa2, 0xf9, 0xd1, 0xf2, 0x8a, 0x10, 0xd8, 0xef, 0x47, 0x51, 0xb3, 0x57, 0xd0,
0xfb, 0x39, 0x3f, 0x01, 0x61, 0x13, 0xe1, 0x6d, 0xe6, 0x3e, 0x0c, 0x10, 0x76, 0x9e, 0x6e, 0xfe,
0xae, 0xb7, 0xa9, 0x63, 0x52, 0x43, 0x8b, 0x98, 0x79, 0x1a, 0x21, 0x38, 0xd0, 0xe9, 0xa9, 0xbc,
0xa4, 0x03, 0xad, 0x25, 0xe1, 0x40, 0x81, 0xb0, 0x07, 0x47, 0x10, 0x28, 0x75, 0x70, 0xd4, 0x86,
0x11, 0x3a, 0x38, 0xc2, 0x0c, 0x18, 0x96, 0xd1, 0xaf, 0xbb, 0x86, 0x9f, 0x4a, 0x79, 0x76, 0x1e,
0x97, 0x67, 0xe3, 0x07, 0xbc, 0x72, 0xcb, 0x18, 0x47, 0xeb, 0x83, 0x58, 0x3b, 0x86, 0x5c, 0x87,
0xf5, 0x2a, 0xff, 0xaa, 0xcc, 0xd0, 0x18, 0xf2, 0x6c, 0x00, 0xc2, 0x8c, 0x21, 0x06, 0xb5, 0xd3,
0xa6, 0xeb, 0x6d, 0x2a, 0xf0, 0x56, 0xc5, 0x53, 0x9f, 0x0a, 0x6e, 0xab, 0x42, 0x60, 0x38, 0x85,
0xf6, 0xca, 0xb8, 0x38, 0xa5, 0x53, 0x48, 0x8b, 0xc2, 0x29, 0xd4, 0x22, 0xb8, 0xbf, 0xa7, 0x22,
0x2e, 0x93, 0x53, 0xba, 0xbf, 0x1b, 0x59, 0xb8, 0xbf, 0x0d, 0x63, 0x57, 0x75, 0xd7, 0xf0, 0x74,
0x71, 0x52, 0x25, 0x65, 0x7a, 0x22, 0xc6, 0xeb, 0xbc, 0xb6, 0x81, 0x98, 0x55, 0x9d, 0x85, 0xed,
0xc1, 0x12, 0xf8, 0x6c, 0x65, 0xfb, 0xb3, 0x0a, 0x1d, 0x2c, 0xb5, 0x36, 0x1c, 0x82, 0x39, 0x58,
0xa2, 0x49, 0xdc, 0xbc, 0xbd, 0x52, 0x2e, 0x8a, 0xaa, 0xa7, 0x79, 0x08, 0x0a, 0x37, 0xaf, 0x0b,
0x83, 0xcf, 0xab, 0xe8, 0x37, 0xdd, 0x47, 0xfa, 0x2a, 0xaf, 0x8c, 0xd7, 0x0d, 0xfe, 0x39, 0x39,
0x18, 0x73, 0x44, 0x13, 0xc0, 0xed, 0x12, 0xdb, 0x7a, 0x56, 0x3b, 0x42, 0xc5, 0x69, 0x56, 0x8d,
0x57, 0x69, 0x1b, 0xad, 0x9c, 0x59, 0x62, 0x29, 0x0e, 0x0f, 0xa1, 0x9d, 0x45, 0x91, 0xa5, 0x49,
0xf7, 0xac, 0x0e, 0x74, 0x8d, 0x38, 0x3c, 0x84, 0x5c, 0x0c, 0x4f, 0x09, 0x53, 0xa1, 0x9a, 0xff,
0x39, 0xbe, 0x2e, 0x04, 0x3d, 0x25, 0x78, 0x48, 0x78, 0x4a, 0xc0, 0x28, 0x6e, 0xcf, 0x54, 0xa8,
0xe7, 0xf1, 0xb5, 0x5c, 0x30, 0x53, 0x82, 0x11, 0x87, 0xdb, 0xe3, 0x62, 0x76, 0xe1, 0x36, 0x1e,
0xf6, 0x73, 0x25, 0xca, 0x3c, 0xce, 0x76, 0xb3, 0x78, 0x5e, 0x8d, 0x99, 0x71, 0xe3, 0x53, 0xcc,
0xc2, 0xcd, 0xd3, 0xc4, 0x63, 0xdc, 0xaf, 0x76, 0xe3, 0x0b, 0x59, 0xa6, 0x8a, 0x7f, 0x8c, 0x16,
0xe9, 0x7d, 0x8c, 0x1e, 0x4a, 0x7a, 0xdb, 0x2a, 0x93, 0xd3, 0xf4, 0x42, 0xcc, 0x02, 0xde, 0x5a,
0x64, 0x80, 0x37, 0x07, 0x25, 0x3a, 0x6d, 0x2a, 0x17, 0x65, 0x22, 0xd8, 0x4e, 0x6b, 0xc4, 0xbd,
0x9d, 0x66, 0x30, 0xf0, 0xf0, 0x57, 0xa3, 0xe8, 0xb7, 0x1a, 0xa9, 0x7b, 0x80, 0xb6, 0x13, 0x57,
0xa7, 0x27, 0x32, 0x2e, 0x67, 0xe3, 0x8f, 0x29, 0x3b, 0x24, 0x6a, 0x5c, 0x3f, 0x5e, 0x46, 0x05,
0x3f, 0xd6, 0xe7, 0x69, 0xe5, 0x8c, 0x38, 0xf2, 0xb1, 0x7a, 0x48, 0xf8, 0xb1, 0x62, 0x14, 0x4f,
0x20, 0x5a, 0xde, 0x6c, 0x56, 0x57, 0x59, 0x7d, 0x7f, 0xc7, 0xba, 0xd6, 0xcb, 0xe1, 0xf9, 0xb1,
0x16, 0xfa, 0xd9, 0xb2, 0xc1, 0xd9, 0xa0, 0x33, 0x66, 0x32, 0x14, 0x67, 0x3d, 0x9b, 0x51, 0x11,
0xf6, 0xdc, 0x19, 0x19, 0x93, 0xa1, 0x38, 0xe3, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x89, 0xa9, 0x6d,
0x32, 0x14, 0xc7, 0x09, 0xb4, 0x55, 0x14, 0xd9, 0xf5, 0xb1, 0x38, 0x2f, 0x32, 0x36, 0x81, 0x3c,
0x24, 0x9c, 0x40, 0x18, 0xc5, 0xd5, 0xcf, 0xb1, 0xac, 0x6b, 0x2b, 0xb2, 0xfa, 0xd1, 0xa2, 0x70,
0xf5, 0xd3, 0x22, 0xb8, 0x60, 0x38, 0x96, 0xdb, 0x32, 0xcb, 0x44, 0xa2, 0xba, 0x37, 0x51, 0x46,
0xd3, 0x12, 0xe1, 0x82, 0x01, 0x91, 0xf6, 0xc4, 0xa1, 0xad, 0xd5, 0xe3, 0x52, 0x3c, 0xbd, 0x7e,
0x9e, 0xe6, 0x67, 0x63, 0x7a, 0x6d, 0xb4, 0x00, 0x73, 0xe2, 0x40, 0x82, 0x78, 0x4f, 0xf0, 0x2a,
0x9f, 0x49, 0x7a, 0x4f, 0x50, 0x4b, 0xc2, 0x7b, 0x02, 0x20, 0xb0, 0xc9, 0x23, 0xc1, 0x99, 0xac,
0x25, 0x61, 0x93, 0x40, 0x50, 0xf3, 0x01, 0x1c, 0xed, 0xb1, 0xf3, 0x01, 0x3a, 0xcc, 0x5b, 0xeb,
0xe5, 0x70, 0x86, 0xb6, 0x9b, 0x83, 0x5d, 0xa1, 0x92, 0x53, 0x3a, 0x43, 0x3d, 0x24, 0x9c, 0xa1,
0x18, 0xc5, 0x4d, 0x3a, 0x96, 0x66, 0x73, 0xb3, 0x4a, 0xe7, 0x47, 0x67, 0x63, 0xb3, 0xd6, 0xcb,
0xe1, 0x72, 0x7d, 0xff, 0x5c, 0x3f, 0x33, 0x32, 0xc9, 0x1b, 0x59, 0xb8, 0x5c, 0x37, 0x0c, 0x8e,
0xbe, 0x11, 0xd4, 0x8f, 0x93, 0x8e, 0xde, 0xca, 0xc3, 0xd1, 0x7b, 0x1c, 0x38, 0xf9, 0xd7, 0x51,
0x74, 0xd3, 0xf5, 0x72, 0x20, 0xeb, 0x31, 0xf2, 0x3a, 0xce, 0xd2, 0x59, 0xac, 0xc4, 0xb1, 0x3c,
0x13, 0x39, 0xda, 0xef, 0xfb, 0xd1, 0x36, 0xfc, 0xc4, 0x53, 0x60, 0xf6, 0xfb, 0x83, 0x14, 0x71,
0x9e, 0x34, 0xf4, 0xab, 0x4a, 0x6c, 0xc7, 0x15, 0x33, 0x93, 0x79, 0x48, 0x38, 0x4f, 0x30, 0x8a,
0x8b, 0xb6, 0x46, 0xfe, 0xec, 0xaa, 0x10, 0x65, 0x2a, 0xf2, 0x44, 0xd0, 0x45, 0x1b, 0xa6, 0xc2,
0x45, 0x1b, 0x41, 0x77, 0xb6, 0xc3, 0x66, 0x72, 0xea, 0x5e, 0x26, 0x63, 0x22, 0x70, 0x99, 0xcc,
0xa0, 0xb8, 0x91, 0x16, 0x20, 0x8f, 0x94, 0x3a, 0x56, 0x82, 0x47, 0x4a, 0x3c, 0xdd, 0x39, 0x64,
0x30, 0xcc, 0xb4, 0x1e, 0x26, 0x3d, 0xa1, 0x4f, 0xdd, 0xe1, 0xb2, 0x3e, 0x88, 0xa5, 0x4f, 0x35,
0x8e, 0x44, 0x16, 0xeb, 0x25, 0x24, 0x70, 0x74, 0xd0, 0x32, 0x43, 0x4e, 0x35, 0x1c, 0x16, 0x1c,
0xfe, 0xc5, 0x28, 0xba, 0x41, 0x79, 0x7c, 0x59, 0x68, 0xbf, 0x8f, 0xfa, 0x6d, 0x35, 0x24, 0x73,
0x5b, 0x1e, 0xd6, 0x80, 0x18, 0xfe, 0x24, 0xfa, 0xa0, 0x15, 0xd9, 0xcb, 0x74, 0x08, 0xc0, 0xaf,
0x22, 0x4c, 0xfc, 0x98, 0x33, 0xee, 0x37, 0x07, 0xf3, 0xb6, 0x40, 0xf7, 0xe3, 0xaa, 0x50, 0x81,
0x6e, 0x6c, 0x80, 0x98, 0x29, 0xd0, 0x09, 0x0c, 0xaf, 0xd4, 0x2d, 0x52, 0x8f, 0x13, 0x6a, 0x8e,
0x33, 0x26, 0xdc, 0x51, 0x72, 0xaf, 0x1f, 0xc4, 0xb9, 0xd3, 0x8a, 0xa1, 0x2e, 0x7e, 0x10, 0xb2,
0x80, 0x6a, 0xe3, 0xf5, 0x41, 0x2c, 0x38, 0xfc, 0xb3, 0xe8, 0xfb, 0x9d, 0x86, 0xed, 0x8a, 0x58,
0x2d, 0x4a, 0x31, 0x1b, 0x6f, 0xf6, 0xc4, 0xdd, 0x82, 0xc6, 0xf5, 0xa3, 0xe1, 0x0a, 0xe0, 0xff,
0x6f, 0x46, 0xd1, 0x0f, 0x7c, 0xae, 0xe9, 0x62, 0x13, 0xc3, 0xe3, 0x90, 0x49, 0x9f, 0x35, 0x61,
0x3c, 0x59, 0x4a, 0xa7, 0xb3, 0x07, 0x73, 0x13, 0x79, 0xeb, 0x22, 0x4e, 0xb3, 0xf8, 0x24, 0x13,
0xe4, 0x1e, 0xcc, 0xcb, 0x4d, 0x83, 0x06, 0xf7, 0x60, 0xac, 0x4a, 0x67, 0x96, 0xd4, 0xe3, 0xcd,
0xa9, 0xdd, 0x1f, 0xf2, 0xa3, 0x92, 0x28, 0xdd, 0x37, 0x06, 0xd2, 0xe0, 0x56, 0xb5, 0x67, 0x57,
0xf5, 0x9f, 0xdd, 0x24, 0xa7, 0xbc, 0x82, 0x2a, 0x91, 0xe9, 0x1b, 0x03, 0x69, 0xf0, 0xfa, 0xa7,
0xd1, 0x07, 0x5d, 0xaf, 0xb0, 0x28, 0x6c, 0xf6, 0x9a, 0x42, 0xeb, 0xc2, 0xa3, 0xe1, 0x0a, 0xb6,
0xd4, 0xff, 0x22, 0xad, 0x94, 0x2c, 0xaf, 0xa7, 0xa7, 0xf2, 0xb2, 0x7d, 0x61, 0xd4, 0x1f, 0xad,
0x00, 0x4c, 0x1c, 0x82, 0x29, 0xf5, 0x69, 0xb2, 0xe3, 0xca, 0xbe, 0x58, 0x5a, 0x31, 0xae, 0x1c,
0xa2, 0xc7, 0x95, 0x4f, 0xda, 0xb9, 0xaa, 0x6d, 0x95, 0x7d, 0x0b, 0x76, 0x8d, 0x0e, 0xb5, 0xfb,
0x26, 0xec, 0xbd, 0x7e, 0xd0, 0x6e, 0xbf, 0x76, 0xd3, 0x4c, 0xbc, 0x7c, 0xfb, 0x36, 0x93, 0xf1,
0x0c, 0x6d, 0xbf, 0x6a, 0xc9, 0x04, 0x44, 0xcc, 0xf6, 0x0b, 0x21, 0xb6, 0xe8, 0xac, 0x05, 0xfa,
0x6e, 0xa6, 0x35, 0xbd, 0xda, 0xd5, 0x73, 0xe5, 0x4c, 0xd1, 0x49, 0x71, 0x76, 0xc1, 0xa8, 0xa5,
0xf5, 0x10, 0x6c, 0x7d, 0xdc, 0xed, 0xea, 0x3a, 0x62, 0x66, 0xc1, 0x20, 0x30, 0xbb, 0x3f, 0xaa,
0x85, 0xaf, 0x0a, 0x6d, 0xfc, 0x56, 0x57, 0xab, 0x91, 0x30, 0xfb, 0x23, 0x9f, 0xb0, 0x75, 0x7e,
0xfd, 0xf7, 0x1d, 0x79, 0x99, 0x6b, 0xa3, 0xc4, 0xd3, 0x6c, 0x65, 0x4c, 0x9d, 0x8f, 0x19, 0x30,
0xfc, 0xd3, 0xe8, 0x17, 0xb5, 0xe1, 0x52, 0x16, 0xe3, 0x15, 0x42, 0xa1, 0x74, 0x5e, 0x3b, 0xb9,
0xc9, 0xca, 0xed, 0xdb, 0x53, 0xa6, 0xff, 0x5e, 0x55, 0xf1, 0x5c, 0xa0, 0xb7, 0xa7, 0x6c, 0xaf,
0x68, 0x29, 0xf3, 0xf6, 0x54, 0x97, 0xb2, 0x6f, 0x04, 0xd5, 0xb2, 0x03, 0x39, 0x03, 0xeb, 0x44,
0x0b, 0x8d, 0x90, 0x79, 0x23, 0xa8, 0x03, 0xd9, 0xf3, 0xfb, 0x83, 0xf8, 0x22, 0x9d, 0x9b, 0xc9,
0xbf, 0x99, 0x43, 0x2a, 0x74, 0x7e, 0x6f, 0x99, 0x89, 0x03, 0x31, 0xe7, 0xf7, 0x2c, 0x0c, 0x3e,
0xff, 0x65, 0x14, 0xdd, 0xb2, 0xcc, 0x5e, 0x7b, 0xac, 0xb2, 0x9f, 0xbf, 0x95, 0x6f, 0x52, 0x75,
0x5a, 0xef, 0xe3, 0xab, 0xf1, 0x67, 0x9c, 0x49, 0x9a, 0x37, 0xa1, 0x7c, 0xbe, 0xb4, 0x9e, 0xad,
0xe6, 0xda, 0xe3, 0x16, 0x7b, 0xb7, 0xd5, 0x68, 0xa0, 0x6a, 0xce, 0x9c, 0xca, 0x60, 0x8e, 0xa9,
0xe6, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0x93, 0x39, 0xee, 0x62, 0x6b, 0xa1, 0x16, 0x32, 0x5d,
0xdc, 0x81, 0xec, 0xdc, 0xd8, 0x8a, 0x9a, 0x93, 0x81, 0xad, 0x2c, 0x43, 0x73, 0xa3, 0x51, 0x35,
0x00, 0x33, 0x37, 0x92, 0x20, 0xf8, 0x39, 0x8a, 0xbe, 0x53, 0x3f, 0xd2, 0xc3, 0x52, 0x5c, 0xa4,
0x02, 0x5f, 0xc3, 0x3a, 0x12, 0x66, 0xfc, 0xfb, 0x84, 0x1d, 0x59, 0xaf, 0xf2, 0xaa, 0xc8, 0xe2,
0xea, 0x14, 0x2e, 0xe6, 0xfc, 0x36, 0xb7, 0x42, 0x7c, 0x35, 0x77, 0xb7, 0x87, 0xb2, 0x13, 0x6f,
0x2b, 0x33, 0x53, 0xcc, 0x2a, 0xad, 0xda, 0x99, 0x66, 0xd6, 0x7a, 0x39, 0x7b, 0x34, 0xb9, 0x17,
0x67, 0x99, 0x28, 0xaf, 0x5b, 0xd9, 0x8b, 0x38, 0x4f, 0xdf, 0x8a, 0x4a, 0xa1, 0xa3, 0x49, 0xa0,
0x26, 0x18, 0x63, 0x8e, 0x26, 0x03, 0xb8, 0xad, 0xac, 0x91, 0xe7, 0xfd, 0x7c, 0x26, 0xae, 0x50,
0x65, 0x8d, 0xed, 0x68, 0x86, 0xa9, 0xac, 0x39, 0xd6, 0x2e, 0x8f, 0x4f, 0x33, 0x99, 0x9c, 0xc1,
0x12, 0xe0, 0x77, 0xb0, 0x96, 0xe0, 0x35, 0xe0, 0x76, 0x08, 0xb1, 0x8b, 0x80, 0x16, 0x1c, 0x89,
0x22, 0x8b, 0x13, 0x7c, 0x17, 0xdf, 0xe8, 0x80, 0x8c, 0x59, 0x04, 0x30, 0x83, 0xc2, 0x85, 0x3b,
0x7e, 0x2a, 0x5c, 0x74, 0xc5, 0x7f, 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0b, 0xa6, 0x45, 0x96, 0x2a,
0x34, 0x0c, 0x1a, 0x0d, 0x2d, 0x61, 0x86, 0x81, 0x4f, 0x20, 0x93, 0x2f, 0x44, 0x39, 0x17, 0xa4,
0x49, 0x2d, 0x09, 0x9a, 0x6c, 0x09, 0xfb, 0xf6, 0x51, 0xd3, 0x76, 0x59, 0x5c, 0xa3, 0xb7, 0x8f,
0xa0, 0x59, 0xb2, 0xb8, 0x66, 0xde, 0x3e, 0xf2, 0x00, 0x14, 0xe2, 0x61, 0x5c, 0x29, 0x3a, 0x44,
0x2d, 0x09, 0x86, 0xd8, 0x12, 0x76, 0x8d, 0x6e, 0x42, 0x5c, 0x28, 0xb4, 0x46, 0x43, 0x00, 0xce,
0x55, 0xe1, 0x4d, 0x56, 0x6e, 0x67, 0x92, 0xa6, 0x57, 0x84, 0xda, 0x4d, 0x45, 0x36, 0xab, 0xd0,
0x4c, 0x02, 0xcf, 0xbd, 0x95, 0x32, 0x33, 0x49, 0x97, 0x42, 0xa9, 0x04, 0x67, 0xb8, 0x54, 0xeb,
0xd0, 0xf1, 0xed, 0xed, 0x10, 0x62, 0xe7, 0xa7, 0x36, 0xe8, 0xed, 0xb8, 0x2c, 0xd3, 0x7a, 0xf1,
0x5f, 0xa5, 0x03, 0x6a, 0xe5, 0xcc, 0xfc, 0x44, 0x71, 0x68, 0x78, 0xb5, 0x13, 0x37, 0x15, 0x18,
0x9e, 0xba, 0x3f, 0x0a, 0x32, 0xb6, 0xe2, 0xd4, 0x12, 0xe7, 0xae, 0x8b, 0x7a, 0x9a, 0xc4, 0x55,
0xd7, 0x6a, 0x1f, 0xe6, 0xbc, 0xcf, 0x6c, 0x5c, 0xbc, 0x90, 0x17, 0xe2, 0x58, 0x3e, 0xbb, 0x4a,
0x2b, 0x95, 0xe6, 0x73, 0x58, 0xb9, 0x9f, 0x30, 0x96, 0x28, 0x98, 0x79, 0x9f, 0xb9, 0x57, 0xc9,
0x16, 0x10, 0x28, 0x96, 0x03, 0x71, 0x49, 0x16, 0x10, 0xd8, 0xa2, 0xe1, 0x98, 0x02, 0x22, 0xc4,
0xdb, 0x33, 0x0d, 0xe3, 0x1c, 0x7e, 0xf4, 0x75, 0x2c, 0xdb, 0x5a, 0x8e, 0xb3, 0x86, 0x41, 0x66,
0x5b, 0x19, 0x54, 0xb0, 0x7b, 0x3d, 0xe3, 0xdf, 0x0e, 0xb1, 0x7b, 0x8c, 0x9d, 0xee, 0x30, 0xbb,
0x3f, 0x80, 0x24, 0x5c, 0xd9, 0x0b, 0x5b, 0xce, 0x55, 0xf7, 0xbe, 0xf6, 0xfe, 0x00, 0xd2, 0x39,
0x1f, 0x71, 0x9b, 0xf5, 0x34, 0x4e, 0xce, 0xe6, 0xa5, 0x5c, 0xe4, 0xb3, 0x6d, 0x99, 0xc9, 0x12,
0x9d, 0x8f, 0x78, 0x51, 0x23, 0x94, 0x39, 0x1f, 0xe9, 0x51, 0xb1, 0x15, 0x9c, 0x1b, 0xc5, 0x56,
0x96, 0xce, 0xf1, 0xee, 0xd6, 0x33, 0xa4, 0x01, 0xa6, 0x82, 0x23, 0x41, 0x22, 0x89, 0x9a, 0xdd,
0xaf, 0x4a, 0x93, 0x38, 0x6b, 0xfc, 0x6d, 0xf2, 0x66, 0x3c, 0xb0, 0x37, 0x89, 0x08, 0x05, 0xa2,
0x9d, 0xc7, 0x8b, 0x32, 0xdf, 0xcf, 0x95, 0x64, 0xdb, 0xd9, 0x02, 0xbd, 0xed, 0x74, 0x40, 0x34,
0xad, 0x1e, 0x8b, 0xab, 0x3a, 0x9a, 0xfa, 0x3f, 0xd4, 0xb4, 0x5a, 0xff, 0x7d, 0x02, 0xf2, 0xd0,
0xb4, 0x8a, 0x38, 0xd4, 0x18, 0x70, 0xd2, 0x24, 0x4c, 0x40, 0xdb, 0x4f, 0x93, 0x7b, 0xfd, 0x20,
0xed, 0x67, 0xaa, 0xae, 0x33, 0x11, 0xf2, 0xa3, 0x81, 0x21, 0x7e, 0x5a, 0xd0, 0x5e, 0x9c, 0x78,
0xed, 0x39, 0x15, 0xc9, 0x59, 0xe7, 0xfd, 0x13, 0x3f, 0xd0, 0x06, 0x61, 0x2e, 0x4e, 0x18, 0x94,
0xee, 0xa2, 0xfd, 0x44, 0xe6, 0xa1, 0x2e, 0xaa, 0xe5, 0x43, 0xba, 0x08, 0x38, 0xbb, 0xf9, 0x35,
0x52, 0xc8, 0xcc, 0xa6, 0x9b, 0xd6, 0x19, 0x0b, 0x2e, 0xc4, 0x6c, 0x7e, 0x59, 0xd8, 0xd6, 0xe4,
0xd8, 0xe7, 0x8b, 0xee, 0xfb, 0x9f, 0x1d, 0x2b, 0x2f, 0xf8, 0xf7, 0x3f, 0x39, 0x96, 0x6f, 0x64,
0x93, 0x23, 0x3d, 0x56, 0xfc, 0x3c, 0x79, 0x38, 0x0c, 0xb6, 0x5b, 0x1e, 0xcf, 0xe7, 0x76, 0x26,
0xe2, 0xb2, 0xf1, 0xba, 0x11, 0x30, 0x64, 0x31, 0x66, 0xcb, 0x13, 0xc0, 0xd1, 0x14, 0xe6, 0x79,
0xde, 0x96, 0xb9, 0x12, 0xb9, 0xa2, 0xa6, 0x30, 0xdf, 0x18, 0x80, 0xa1, 0x29, 0x8c, 0x53, 0x40,
0x79, 0xab, 0xcf, 0x83, 0x84, 0x3a, 0x88, 0xcf, 0xc9, 0x8a, 0xad, 0x39, 0xeb, 0x69, 0xe4, 0xa1,
0xbc, 0x45, 0x1c, 0x1a, 0xf2, 0xfb, 0xe7, 0xf1, 0xdc, 0x78, 0x21, 0xb4, 0xb5, 0xbc, 0xe3, 0xe6,
0x5e, 0x3f, 0x88, 0xfc, 0xbc, 0x4e, 0x67, 0x42, 0x06, 0xfc, 0x68, 0xf9, 0x10, 0x3f, 0x18, 0x44,
0x95, 0x53, 0xdd, 0xda, 0x66, 0x37, 0xb5, 0x95, 0xcf, 0x60, 0x0f, 0x39, 0x61, 0x1e, 0x0a, 0xe2,
0x42, 0x95, 0x13, 0xc3, 0xa3, 0xf1, 0xd1, 0x1e, 0x8e, 0x86, 0xc6, 0x87, 0x39, 0xfb, 0x1c, 0x32,
0x3e, 0x28, 0x18, 0x7c, 0xfe, 0x31, 0x8c, 0x8f, 0x9d, 0x58, 0xc5, 0x75, 0xcd, 0xfc, 0x3a, 0x15,
0x97, 0xb0, 0x09, 0x25, 0xda, 0xdb, 0x52, 0x13, 0xfd, 0x8b, 0x17, 0xb4, 0x23, 0xdd, 0x1c, 0xcc,
0x07, 0x7c, 0x43, 0x75, 0xde, 0xeb, 0x1b, 0x95, 0xe9, 0x9b, 0x83, 0xf9, 0x80, 0x6f, 0xf8, 0x29,
0x5d, 0xaf, 0x6f, 0xf4, 0x7b, 0xba, 0xcd, 0xc1, 0x3c, 0xf8, 0xfe, 0xcb, 0x51, 0x74, 0xa3, 0xe3,
0xbc, 0xae, 0x81, 0x12, 0x95, 0x5e, 0x08, 0xaa, 0x94, 0xf3, 0xed, 0x19, 0x34, 0x54, 0xca, 0xf1,
0x2a, 0xce, 0xf7, 0x17, 0xa8, 0x28, 0x0e, 0x65, 0x95, 0xea, 0x8b, 0xe3, 0x27, 0x03, 0x8c, 0xb6,
0x70, 0x68, 0xc3, 0x12, 0x52, 0xb2, 0xd7, 0x6e, 0x1e, 0x6a, 0x5f, 0xf5, 0x7c, 0x18, 0xb0, 0xd7,
0x7d, 0xe3, 0x73, 0x63, 0x20, 0x6d, 0x2f, 0xc0, 0x3c, 0xc6, 0xbd, 0x79, 0x0b, 0xf5, 0x2a, 0x79,
0xf9, 0xf6, 0x68, 0xb8, 0x02, 0xb8, 0xff, 0xeb, 0xb6, 0xa6, 0xc7, 0xfe, 0x61, 0x10, 0x3c, 0x1e,
0x62, 0x11, 0x0d, 0x84, 0x27, 0x4b, 0xe9, 0x40, 0x20, 0xff, 0x31, 0x8a, 0x6e, 0x93, 0x81, 0xf8,
0x77, 0xb0, 0xbf, 0x3d, 0xc4, 0x36, 0x7d, 0x17, 0xfb, 0xe3, 0x6f, 0xa3, 0x0a, 0xd1, 0xfd, 0x7d,
0xbb, 0xb5, 0x6e, 0x35, 0xf4, 0xeb, 0xf8, 0x2f, 0xcb, 0x99, 0x28, 0x61, 0xc4, 0x86, 0x92, 0xce,
0xc2, 0x78, 0xdc, 0x7e, 0xba, 0xa4, 0x96, 0xf3, 0xad, 0x10, 0x0f, 0x86, 0x5f, 0x26, 0x39, 0xf1,
0x84, 0x2c, 0x3b, 0x34, 0x0e, 0xe8, 0xb3, 0x65, 0xd5, 0xb8, 0x91, 0xec, 0xc0, 0xfa, 0xa7, 0xc7,
0x4f, 0x06, 0x1a, 0xf6, 0x7e, 0x8c, 0xfc, 0xc9, 0x72, 0x4a, 0x10, 0xcb, 0x7f, 0x8d, 0xa2, 0xbb,
0x1e, 0x6b, 0x6f, 0x1a, 0xd0, 0x79, 0xc8, 0x4f, 0x02, 0xf6, 0x39, 0x25, 0x13, 0xdc, 0xef, 0x7c,
0x3b, 0x65, 0xfb, 0x61, 0x0d, 0x4f, 0x65, 0x37, 0xcd, 0x94, 0x28, 0xbb, 0x1f, 0xd6, 0xf0, 0xed,
0x36, 0xd4, 0x84, 0xff, 0xb0, 0x46, 0x00, 0x77, 0x3e, 0xac, 0x41, 0x78, 0x26, 0x3f, 0xac, 0x41,
0x5a, 0x0b, 0x7e, 0x58, 0x23, 0xac, 0xc1, 0x2d, 0x3e, 0x6d, 0x08, 0xcd, 0x89, 0xf6, 0x20, 0x8b,
0xfe, 0x01, 0xf7, 0xe3, 0x65, 0x54, 0x98, 0xe5, 0xb7, 0xe1, 0xf4, 0x9b, 0x61, 0x03, 0x9e, 0xa9,
0xf7, 0x76, 0xd8, 0xe6, 0x60, 0x1e, 0x7c, 0xff, 0x0c, 0xf6, 0x3d, 0x66, 0xb1, 0x91, 0xa5, 0xfe,
0xa8, 0xca, 0x7a, 0x68, 0xf1, 0xa8, 0x2d, 0xb8, 0x3d, 0xff, 0x70, 0x18, 0xcc, 0x34, 0xb7, 0x26,
0xa0, 0xd3, 0x27, 0x7d, 0x86, 0x50, 0x97, 0x6f, 0x0e, 0xe6, 0x99, 0x45, 0xae, 0xf1, 0xdd, 0xf4,
0xf6, 0x00, 0x63, 0x7e, 0x5f, 0x3f, 0x1a, 0xae, 0x60, 0x5f, 0x6d, 0xe9, 0xb8, 0xd7, 0xfd, 0xdc,
0xfb, 0x04, 0xbd, 0x5e, 0xde, 0x18, 0x48, 0x87, 0x8a, 0x1b, 0x77, 0x79, 0xef, 0x2b, 0x6e, 0xc8,
0x25, 0xfe, 0x93, 0xe5, 0x94, 0x20, 0x96, 0x7f, 0x1e, 0x45, 0x37, 0xd9, 0x58, 0x20, 0x0b, 0x3e,
0x1b, 0x6a, 0x19, 0x65, 0xc3, 0xe7, 0x4b, 0xeb, 0x41, 0x50, 0xff, 0x36, 0x8a, 0x6e, 0x05, 0x82,
0x6a, 0xd2, 0x63, 0x09, 0xeb, 0x7e, 0x9a, 0xfc, 0x68, 0x79, 0x45, 0x6e, 0xb1, 0x77, 0xf1, 0x69,
0xf7, 0x7b, 0x13, 0x01, 0xdb, 0x53, 0xfe, 0x7b, 0x13, 0xfd, 0x5a, 0xf8, 0xf0, 0xa7, 0x2e, 0x49,
0x60, 0x5f, 0x44, 0x1d, 0xfe, 0xe8, 0x8a, 0x05, 0xed, 0x87, 0xd6, 0x7a, 0x39, 0xca, 0xc9, 0xb3,
0xab, 0x22, 0xce, 0x67, 0xbc, 0x93, 0x46, 0xde, 0xef, 0xc4, 0x70, 0xf8, 0xd0, 0xac, 0x96, 0x1e,
0xc9, 0x76, 0x93, 0x77, 0x9f, 0xd3, 0x37, 0x48, 0xf0, 0xd0, 0xac, 0x83, 0x32, 0xde, 0xa0, 0xa2,
0x0d, 0x79, 0x43, 0x85, 0xec, 0x83, 0x21, 0x28, 0xda, 0x3e, 0x18, 0x6f, 0xe6, 0x2c, 0xfe, 0x61,
0xc8, 0x4a, 0xe7, 0x3c, 0x7e, 0x63, 0x20, 0xcd, 0xb8, 0x9d, 0x0a, 0xf5, 0x85, 0x88, 0x67, 0xa2,
0x0c, 0xba, 0x35, 0xd4, 0x20, 0xb7, 0x2e, 0x4d, 0xb9, 0xdd, 0x96, 0xd9, 0xe2, 0x3c, 0x87, 0xce,
0x64, 0xdd, 0xba, 0x54, 0xbf, 0x5b, 0x44, 0xe3, 0xe3, 0x42, 0xeb, 0x56, 0x17, 0x97, 0x0f, 0xc2,
0x66, 0xbc, 0x9a, 0x72, 0x7d, 0x10, 0xcb, 0xb7, 0x13, 0xd2, 0xa8, 0xa7, 0x9d, 0x28, 0x93, 0x36,
0x06, 0xd2, 0xf8, 0xdc, 0xce, 0x71, 0x6b, 0xf2, 0x69, 0xb3, 0xc7, 0x56, 0x27, 0xa5, 0x1e, 0x0d,
0x57, 0xc0, 0xa7, 0xa4, 0x90, 0x55, 0xf5, 0xae, 0x68, 0x37, 0xcd, 0xb2, 0xf1, 0x7a, 0x20, 0x4d,
0x5a, 0x28, 0x78, 0x4a, 0x4a, 0xc0, 0x4c, 0x26, 0xb7, 0xa7, 0x8a, 0xf9, 0xb8, 0xcf, 0x8e, 0xa6,
0x06, 0x65, 0xb2, 0x4b, 0xa3, 0xd3, 0x36, 0xe7, 0x51, 0x9b, 0xd6, 0x4e, 0xc2, 0x0f, 0xae, 0xd3,
0xe0, 0xcd, 0xc1, 0x3c, 0xba, 0x86, 0xd7, 0x94, 0x5e, 0x59, 0xee, 0x70, 0x26, 0xbc, 0x95, 0xe4,
0x6e, 0x0f, 0x85, 0x4e, 0x2c, 0x9b, 0x61, 0xf4, 0x26, 0x9d, 0xcd, 0x85, 0x22, 0x6f, 0x90, 0x5c,
0x20, 0x78, 0x83, 0x84, 0x40, 0xd4, 0x75, 0xcd, 0xdf, 0xa7, 0x42, 0x1d, 0xc7, 0xe5, 0x5c, 0xa8,
0xfd, 0x19, 0xd5, 0x75, 0xa0, 0xec, 0x50, 0xa1, 0xae, 0x23, 0x69, 0x34, 0x1b, 0x18, 0xb7, 0xf0,
0x7b, 0xea, 0x07, 0x21, 0x33, 0xe8, 0x47, 0xd5, 0xeb, 0x83, 0x58, 0xb4, 0xa2, 0x58, 0x87, 0xe9,
0x79, 0xaa, 0xa8, 0x15, 0xc5, 0xb1, 0x51, 0x23, 0xa1, 0x15, 0xa5, 0x8b, 0x72, 0xcd, 0xab, 0x6b,
0x84, 0xfd, 0x59, 0xb8, 0x79, 0x0d, 0x33, 0xac, 0x79, 0x86, 0xed, 0x5c, 0x78, 0xe6, 0x26, 0x65,
0xd4, 0x29, 0x6c, 0x95, 0x89, 0xdc, 0xd6, 0x3f, 0x31, 0xc4, 0x60, 0x68, 0xd6, 0xe1, 0x14, 0x9c,
0x5f, 0xb1, 0x18, 0xae, 0xbd, 0x93, 0x2d, 0x0a, 0x11, 0x97, 0x71, 0x9e, 0x90, 0x5b, 0x53, 0x6d,
0xb0, 0x43, 0x86, 0xb6, 0xa6, 0xac, 0x06, 0xba, 0x4e, 0xf7, 0x7f, 0x1c, 0x48, 0x0c, 0x05, 0xf3,
0x2b, 0x3c, 0xff, 0xb7, 0x81, 0xf7, 0x07, 0x90, 0xf8, 0x3a, 0xbd, 0x05, 0xcc, 0xa1, 0x7c, 0xe3,
0xf4, 0xe3, 0x80, 0x29, 0x1f, 0x0d, 0x6d, 0x83, 0x79, 0x15, 0x94, 0xd4, 0xa6, 0xc0, 0x15, 0xea,
0xa7, 0xe2, 0x9a, 0x4a, 0x6a, 0x5b, 0x9f, 0x6a, 0x24, 0x94, 0xd4, 0x5d, 0x14, 0xd5, 0x99, 0xee,
0x3e, 0x68, 0x35, 0xa0, 0xef, 0x6e, 0x7d, 0xd6, 0x7a, 0x39, 0x34, 0x72, 0x76, 0xd2, 0x0b, 0xef,
0x0e, 0x83, 0x08, 0x74, 0x27, 0xbd, 0xa0, 0xaf, 0x30, 0xd6, 0x07, 0xb1, 0xf8, 0xaa, 0x3e, 0x56,
0xe2, 0xaa, 0xbd, 0x43, 0x27, 0xc2, 0xd5, 0xf2, 0xce, 0x25, 0xfa, 0xbd, 0x7e, 0xd0, 0xbe, 0x18,
0x7b, 0x58, 0xca, 0x44, 0x54, 0x15, 0x7c, 0x84, 0xcb, 0x7f, 0xf3, 0x08, 0x64, 0x13, 0xf4, 0x09,
0xae, 0x3b, 0x61, 0x08, 0x6c, 0x7f, 0x11, 0xbd, 0xfb, 0x5c, 0xce, 0xa7, 0x22, 0x9f, 0x8d, 0x7f,
0xe8, 0xbf, 0x8a, 0x2a, 0xe7, 0x93, 0xfa, 0xcf, 0xc6, 0xde, 0x0a, 0x27, 0xb6, 0x2f, 0xd3, 0xed,
0x88, 0x93, 0xc5, 0x7c, 0xaa, 0x62, 0xfc, 0x29, 0x2f, 0xfd, 0xf7, 0x49, 0x2d, 0x60, 0x5e, 0xa6,
0xf3, 0x00, 0x64, 0xef, 0xb8, 0x14, 0x82, 0xb4, 0x57, 0x0b, 0x82, 0xf6, 0x00, 0xb0, 0xab, 0xae,
0xb1, 0x57, 0x17, 0xb6, 0xf8, 0xe5, 0x37, 0xab, 0xa3, 0xa5, 0xcc, 0xaa, 0xdb, 0xa5, 0x6c, 0x32,
0x34, 0xcd, 0xd7, 0x9f, 0x59, 0x58, 0x9c, 0x9f, 0xc7, 0xe5, 0x35, 0x4a, 0x06, 0x68, 0xa5, 0x03,
0x30, 0xc9, 0x40, 0x82, 0x36, 0xcb, 0xdb, 0xc7, 0x9c, 0x9c, 0xed, 0xc9, 0x52, 0x2e, 0x54, 0x9a,
0x8b, 0x0a, 0x65, 0xb9, 0x79, 0xa0, 0x2e, 0xc3, 0x64, 0x39, 0xc7, 0xda, 0xaa, 0x50, 0x13, 0xcd,
0x7b, 0x79, 0xfa, 0x53, 0x96, 0x95, 0x92, 0x25, 0xbe, 0x1b, 0x6c, 0xac, 0x60, 0x88, 0xa9, 0x0a,
0x59, 0x18, 0xf5, 0xfd, 0x61, 0x9a, 0xcf, 0xc9, 0xbe, 0x3f, 0x74, 0x3f, 0xdc, 0x76, 0x8b, 0x07,
0xec, 0xfc, 0xde, 0x3c, 0xb4, 0xe6, 0x73, 0x36, 0xf0, 0x5b, 0x41, 0xf2, 0xa1, 0xbb, 0x04, 0x33,
0xbf, 0xd3, 0x24, 0x72, 0xf5, 0xb2, 0x10, 0xb9, 0x98, 0xb5, 0x6f, 0x9f, 0x51, 0xae, 0x3c, 0x22,
0xe8, 0x0a, 0x93, 0x36, 0x15, 0x5e, 0x08, 0x55, 0xa6, 0x49, 0x35, 0x15, 0xea, 0x30, 0x2e, 0xe3,
0x73, 0xa1, 0x44, 0x89, 0x53, 0x01, 0x90, 0x89, 0xc7, 0x30, 0xa9, 0xc0, 0xb1, 0xe0, 0xf0, 0x77,
0xa3, 0xef, 0xd5, 0x33, 0xa1, 0xc8, 0xe1, 0xdb, 0xda, 0xcf, 0xf4, 0x47, 0xf9, 0xc7, 0xef, 0x1b,
0x1b, 0x53, 0x55, 0x8a, 0xf8, 0xbc, 0xb5, 0xfd, 0x9e, 0xf9, 0xbb, 0x06, 0x1f, 0x8d, 0xea, 0x75,
0xe0, 0x40, 0xaa, 0xf4, 0x6d, 0xbd, 0xf1, 0x80, 0x4b, 0x1e, 0xb4, 0x0e, 0xb8, 0xe2, 0x49, 0xe0,
0x97, 0xe5, 0x14, 0x67, 0x47, 0xa2, 0x2b, 0x3d, 0x12, 0x45, 0x86, 0x47, 0xa2, 0xa7, 0xad, 0x01,
0x66, 0x24, 0x92, 0xa0, 0x5d, 0xd4, 0x5c, 0xf1, 0xb1, 0x08, 0x37, 0xe6, 0x58, 0x0c, 0x6b, 0xcc,
0xb1, 0xf7, 0xfa, 0x7a, 0xbd, 0x27, 0x2b, 0x65, 0x3c, 0x4b, 0xe2, 0x4a, 0x1d, 0xc6, 0xd7, 0x99,
0x8c, 0x67, 0xfa, 0x61, 0xe2, 0x3d, 0x59, 0xcb, 0x4c, 0x5c, 0x88, 0xdb, 0x93, 0x71, 0x70, 0xe3,
0xf3, 0xe9, 0x87, 0xff, 0xf3, 0xf5, 0xca, 0xe8, 0xab, 0xaf, 0x57, 0x46, 0xff, 0xff, 0xf5, 0xca,
0xe8, 0x9f, 0xbe, 0x59, 0x79, 0xe7, 0xab, 0x6f, 0x56, 0xde, 0xf9, 0xdf, 0x6f, 0x56, 0xde, 0xf9,
0xf2, 0x5d, 0xf8, 0x27, 0x1c, 0x4e, 0x7e, 0x41, 0xff, 0x43, 0x0c, 0x4f, 0x7e, 0x1e, 0x00, 0x00,
0xff, 0xff, 0xad, 0xa3, 0x91, 0xda, 0xe6, 0x61, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -356,6 +358,7 @@ type ClientCommandsHandler interface {
SpaceJoin(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse
SpaceJoinCancel(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse
SpaceExit(context.Context, *pb.RpcSpaceExitRequest) *pb.RpcSpaceExitResponse
SpaceStopSharing(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse
SpaceRequestApprove(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse
SpaceRequestDecline(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse
SpaceParticipantRemove(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse
@ -560,6 +563,7 @@ type ClientCommandsHandler interface {
BlockLatexSetText(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse
ProcessCancel(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse
LogSend(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse
DebugStat(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse
DebugTree(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse
DebugTreeHeads(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse
DebugSpaceSummary(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse
@ -1361,6 +1365,26 @@ func SpaceExit(b []byte) (resp []byte) {
return resp
}
func SpaceStopSharing(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcSpaceStopSharingResponse{Error: &pb.RpcSpaceStopSharingResponseError{Code: pb.RpcSpaceStopSharingResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcSpaceStopSharingRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcSpaceStopSharingResponse{Error: &pb.RpcSpaceStopSharingResponseError{Code: pb.RpcSpaceStopSharingResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.SpaceStopSharing(context.Background(), in).Marshal()
return resp
}
func SpaceRequestApprove(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
@ -4801,6 +4825,26 @@ func LogSend(b []byte) (resp []byte) {
return resp
}
func DebugStat(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
if r := recover(); r != nil {
resp, _ = (&pb.RpcDebugStatResponse{Error: &pb.RpcDebugStatResponseError{Code: pb.RpcDebugStatResponseError_UNKNOWN_ERROR, Description: "panic recovered"}}).Marshal()
PanicHandler(r)
}
}
}()
in := new(pb.RpcDebugStatRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ = (&pb.RpcDebugStatResponse{Error: &pb.RpcDebugStatResponseError{Code: pb.RpcDebugStatResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ = clientCommandsHandler.DebugStat(context.Background(), in).Marshal()
return resp
}
func DebugTree(b []byte) (resp []byte) {
defer func() {
if PanicHandler != nil {
@ -5145,6 +5189,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = SpaceJoinCancel(data)
case "SpaceExit":
cd = SpaceExit(data)
case "SpaceStopSharing":
cd = SpaceStopSharing(data)
case "SpaceRequestApprove":
cd = SpaceRequestApprove(data)
case "SpaceRequestDecline":
@ -5489,6 +5535,8 @@ func CommandAsync(cmd string, data []byte, callback func(data []byte)) {
cd = ProcessCancel(data)
case "LogSend":
cd = LogSend(data)
case "DebugStat":
cd = DebugStat(data)
case "DebugTree":
cd = DebugTree(data)
case "DebugTreeHeads":
@ -6083,6 +6131,20 @@ func (h *ClientCommandsHandlerProxy) SpaceExit(ctx context.Context, req *pb.RpcS
call, _ := actualCall(ctx, req)
return call.(*pb.RpcSpaceExitResponse)
}
func (h *ClientCommandsHandlerProxy) SpaceStopSharing(ctx context.Context, req *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.SpaceStopSharing(ctx, req.(*pb.RpcSpaceStopSharingRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "SpaceStopSharing", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcSpaceStopSharingResponse)
}
func (h *ClientCommandsHandlerProxy) SpaceRequestApprove(ctx context.Context, req *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.SpaceRequestApprove(ctx, req.(*pb.RpcSpaceRequestApproveRequest)), nil
@ -8491,6 +8553,20 @@ func (h *ClientCommandsHandlerProxy) LogSend(ctx context.Context, req *pb.RpcLog
call, _ := actualCall(ctx, req)
return call.(*pb.RpcLogSendResponse)
}
func (h *ClientCommandsHandlerProxy) DebugStat(ctx context.Context, req *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.DebugStat(ctx, req.(*pb.RpcDebugStatRequest)), nil
}
for _, interceptor := range h.interceptors {
toCall := actualCall
currentInterceptor := interceptor
actualCall = func(ctx context.Context, req any) (any, error) {
return currentInterceptor(ctx, req, "DebugStat", toCall)
}
}
call, _ := actualCall(ctx, req)
return call.(*pb.RpcDebugStatResponse)
}
func (h *ClientCommandsHandlerProxy) DebugTree(ctx context.Context, req *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse {
actualCall := func(ctx context.Context, req any) (any, error) {
return h.client.DebugTree(ctx, req.(*pb.RpcDebugTreeRequest)), nil

115
cmd/testcase/main.go Normal file
View file

@ -0,0 +1,115 @@
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"github.com/gogo/protobuf/jsonpb"
"github.com/gogo/protobuf/proto"
"github.com/anyproto/anytype-heart/pb"
)
func run() error {
if len(os.Args) == 1 {
return fmt.Errorf("select command: generate-json-helpers")
}
if os.Args[1] == "generate-json-helpers" {
return generateJsonHelpers()
}
return nil
}
func generateJsonHelpers() error {
rootPath := "./tests/integration/testdata/import"
entries, err := os.ReadDir(rootPath)
if err != nil {
return fmt.Errorf("read dir: %w", err)
}
for _, entry := range entries {
if entry.IsDir() {
err := generateJsonHelpersForImportCase(filepath.Join(rootPath, entry.Name()))
if err != nil {
return fmt.Errorf("generate json helpers for dir %s: %w", entry.Name(), err)
}
}
}
return nil
}
func generateJsonHelpersForImportCase(dir string) error {
entries, err := os.ReadDir(dir)
if err != nil {
return fmt.Errorf("read dir: %w", err)
}
for _, entry := range entries {
if entry.IsDir() {
continue
}
// Remove old json files
if filepath.Ext(entry.Name()) == ".txt" {
path := filepath.Join(dir, entry.Name())
fmt.Println("delete old json file: ", path)
err := os.Remove(path)
if err != nil {
return fmt.Errorf("remove file: %w", err)
}
}
}
for _, entry := range entries {
if entry.IsDir() {
continue
}
if filepath.Ext(entry.Name()) == ".pb" {
err = generateJsonHelper(dir, entry.Name())
if err != nil {
return fmt.Errorf("generate helper: %w", err)
}
}
}
return nil
}
func generateJsonHelper(dir string, pbFileName string) error {
f, err := os.Open(filepath.Join(dir, pbFileName))
if err != nil {
return fmt.Errorf("open file: %w", err)
}
defer f.Close()
snapshot := &pb.SnapshotWithType{}
data, err := io.ReadAll(f)
if err != nil {
return fmt.Errorf("read pb file: %w", err)
}
err = proto.Unmarshal(data, snapshot)
if err != nil {
return fmt.Errorf("unmarshal pb: %w", err)
}
jsonFilePath := filepath.Join(dir, pbFileName+".txt")
jsonFile, err := os.Create(jsonFilePath)
if err != nil {
return fmt.Errorf("create file: %w", err)
}
defer jsonFile.Close()
marshaler := &jsonpb.Marshaler{Indent: " "}
err = marshaler.Marshal(jsonFile, snapshot)
if err != nil {
return fmt.Errorf("marshal to json: %w", err)
}
fmt.Println("created json file: ", jsonFilePath)
return nil
}
func main() {
err := run()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

View file

@ -60,7 +60,7 @@ type (
analytics, validate, creator bool
list, removeRelations, exclude bool
collectCustomUsageInfo bool
path, rules string
path, rules, spaceDashboardId string
}
)
@ -164,6 +164,7 @@ func getFlags() (*cliFlags, error) {
rules := flag.String("rules", "", "Path to file with processing rules")
exclude := flag.Bool("exclude", false, "Exclude objects that did not pass validation")
custom := flag.Bool("c", false, "Collect usage information about custom types and relations")
spaceDashboardId := flag.String("s", "", "Id of object to be set as Space Dashboard")
flag.Parse()
@ -181,6 +182,7 @@ func getFlags() (*cliFlags, error) {
rules: *rules,
exclude: *exclude,
collectCustomUsageInfo: *custom,
spaceDashboardId: *spaceDashboardId,
}, nil
}
@ -201,7 +203,7 @@ func collectUseCaseInfo(files []*zip.File, fileName string) (info *useCaseInfo,
continue
}
if strings.HasPrefix(f.Name, "files/") {
if strings.HasPrefix(f.Name, "files") {
continue
}
@ -290,6 +292,7 @@ func processFiles(files []*zip.File, zw *zip.Writer, info *useCaseInfo, flags *c
if err != nil {
if !(flags.exclude && errors.Is(err, errValidationFailed)) {
// just do not include object that failed validation
fmt.Println(f.Name)
incorrectFileFound = true
}
continue
@ -298,9 +301,9 @@ func processFiles(files []*zip.File, zw *zip.Writer, info *useCaseInfo, flags *c
continue
}
newFileName := f.Name
if strings.HasPrefix(newFileName, ".pb.json") {
if strings.HasSuffix(newFileName, ".pb.json") {
// output of usecase validator is always an archive with protobufs
newFileName = strings.TrimPrefix(newFileName, ".json")
newFileName = strings.TrimSuffix(newFileName, ".json")
}
nf, err := zw.Create(newFileName)
if err != nil {
@ -319,10 +322,10 @@ func processFiles(files []*zip.File, zw *zip.Writer, info *useCaseInfo, flags *c
func processRawData(data []byte, name string, info *useCaseInfo, flags *cliFlags) ([]byte, error) {
if name == constant.ProfileFile {
return processProfile(data, info)
return processProfile(data, info, flags.spaceDashboardId)
}
if strings.HasPrefix(name, "files/") {
if strings.HasPrefix(name, "files") {
return data, nil
}
@ -441,7 +444,8 @@ func removeAccountRelatedDetails(s *pb.ChangeSnapshot) {
bundle.RelationKeyRelationFormatObjectTypes.String(),
bundle.RelationKeySourceFilePath.String(),
bundle.RelationKeyLinks.String(),
bundle.RelationKeyBacklinks.String():
bundle.RelationKeyBacklinks.String(),
bundle.RelationKeyWorkspaceId.String():
delete(s.Data.Details.Fields, key)
}
@ -453,7 +457,7 @@ func insertCreatorInfo(s *pb.ChangeSnapshot) {
s.Data.Details.Fields[bundle.RelationKeyLastModifiedBy.String()] = pbtypes.String(addr.AnytypeProfileId)
}
func processProfile(data []byte, info *useCaseInfo) ([]byte, error) {
func processProfile(data []byte, info *useCaseInfo, spaceDashboardId string) ([]byte, error) {
profile := &pb.Profile{}
if err := profile.Unmarshal(data); err != nil {
e := fmt.Errorf("cannot unmarshal profile: %w", err)
@ -462,6 +466,12 @@ func processProfile(data []byte, info *useCaseInfo) ([]byte, error) {
}
profile.Name = ""
profile.ProfileId = ""
if spaceDashboardId != "" {
profile.SpaceDashboardId = spaceDashboardId
return profile.Marshal()
}
fmt.Println("spaceDashboardId = " + profile.SpaceDashboardId)
if _, found := info.objects[profile.SpaceDashboardId]; !found {
err := fmt.Errorf("failed to find Space Dashboard object '%s' among provided", profile.SpaceDashboardId)

View file

@ -63,6 +63,13 @@ func validateRelationBlocks(s *pb.SnapshotWithType, _ *useCaseInfo) (err error)
relLinks := pbtypes.RelationLinks(s.Snapshot.Data.GetRelationLinks())
for _, rk := range relKeys {
if !relLinks.Has(rk) {
if rel, errFound := bundle.GetRelation(domain.RelationKey(rk)); errFound == nil {
s.Snapshot.Data.RelationLinks = append(s.Snapshot.Data.RelationLinks, &model.RelationLink{
Key: rk,
Format: rel.Format,
})
continue
}
err = multierror.Append(err, fmt.Errorf("relation '%v' exists in relation block but not in relation links of object %s", rk, id))
}
}
@ -84,6 +91,13 @@ func validateDetails(s *pb.SnapshotWithType, info *useCaseInfo) (err error) {
if e != nil {
rel = getRelationLinkByKey(s.Snapshot.Data.RelationLinks, k)
if rel == nil {
if relation, errFound := bundle.GetRelation(domain.RelationKey(k)); errFound == nil {
s.Snapshot.Data.RelationLinks = append(s.Snapshot.Data.RelationLinks, &model.RelationLink{
Key: k,
Format: relation.Format,
})
continue
}
err = multierror.Append(err, fmt.Errorf("relation '%s' exists in details of object '%s', but not in relation links", k, id))
continue
}

View file

@ -10,6 +10,7 @@ import (
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/util/crypto"
"github.com/gogo/protobuf/proto"
"github.com/gogo/protobuf/types"
"github.com/ipfs/go-cid"
"github.com/mr-tron/base58/base58"
"go.uber.org/zap"
@ -49,9 +50,11 @@ type AccountPermissions struct {
type AclService interface {
app.Component
GenerateInvite(ctx context.Context, spaceId string) (*InviteInfo, error)
RevokeInvite(ctx context.Context, spaceId string) error
GetCurrentInvite(spaceId string) (*InviteInfo, error)
ViewInvite(ctx context.Context, inviteCid cid.Cid, inviteFileKey crypto.SymKey) (*InviteView, error)
Join(ctx context.Context, spaceId string, inviteCid cid.Cid, inviteFileKey crypto.SymKey) error
StopSharing(ctx context.Context, spaceId string) error
CancelJoin(ctx context.Context, spaceId string) (err error)
Accept(ctx context.Context, spaceId string, identity crypto.PubKey, permissions model.ParticipantPermissions) error
Decline(ctx context.Context, spaceId string, identity crypto.PubKey) (err error)
@ -112,17 +115,11 @@ func (a *aclService) Remove(ctx context.Context, spaceId string, identities []cr
}
func (a *aclService) CancelJoin(ctx context.Context, spaceId string) (err error) {
// TODO: finish this by implementing space offload for join canceled spaces (?)
sp, err := a.spaceService.Get(ctx, spaceId)
if err != nil {
return err
}
cl := sp.CommonSpace().AclClient()
err = cl.CancelRequest(ctx)
err = a.joiningClient.CancelJoin(ctx, spaceId)
if err != nil {
return fmt.Errorf("%w, %w", ErrAclRequestFailed, err)
}
return nil
return a.spaceService.Delete(ctx, spaceId)
}
func (a *aclService) Decline(ctx context.Context, spaceId string, identity crypto.PubKey) (err error) {
@ -138,6 +135,23 @@ func (a *aclService) Decline(ctx context.Context, spaceId string, identity crypt
return nil
}
func (a *aclService) RevokeInvite(ctx context.Context, spaceId string) error {
sp, err := a.spaceService.Get(ctx, spaceId)
if err != nil {
return err
}
cl := sp.CommonSpace().AclClient()
err = cl.RevokeAllInvites(ctx)
if err != nil {
return fmt.Errorf("%w, %w", ErrAclRequestFailed, err)
}
spaceViewId, err := a.spaceService.SpaceViewId(spaceId)
if err != nil {
return fmt.Errorf("get space view id: %w", err)
}
return a.removeExistingInviteFileInfo(ctx, spaceViewId)
}
func (a *aclService) ChangePermissions(ctx context.Context, spaceId string, perms []AccountPermissions) error {
sp, err := a.spaceService.Get(ctx, spaceId)
if err != nil {
@ -194,25 +208,62 @@ func (a *aclService) Leave(ctx context.Context, spaceId string) error {
return nil
}
func (a *aclService) StopSharing(ctx context.Context, spaceId string) error {
removeSpace, err := a.spaceService.Get(ctx, spaceId)
if err != nil {
return err
}
newPrivKey, _, err := crypto.GenerateRandomEd25519KeyPair()
if err != nil {
return err
}
cl := removeSpace.CommonSpace().AclClient()
err = cl.StopSharing(ctx, list.ReadKeyChangePayload{
MetadataKey: newPrivKey,
ReadKey: crypto.NewAES(),
})
if err != nil {
return fmt.Errorf("%w, %w", ErrAclRequestFailed, err)
}
spaceViewId, err := a.spaceService.SpaceViewId(spaceId)
if err != nil {
return fmt.Errorf("get space view id: %w", err)
}
return a.removeExistingInviteFileInfo(ctx, spaceViewId)
}
func (a *aclService) Join(ctx context.Context, spaceId string, inviteCid cid.Cid, inviteFileKey crypto.SymKey) error {
invitePayload, err := a.getInvitePayload(ctx, inviteCid, inviteFileKey)
if err != nil {
return fmt.Errorf("get invite payload: %w", err)
}
inviteKey, err := crypto.UnmarshalEd25519PrivateKeyProto(invitePayload.InviteKey)
if err != nil {
return fmt.Errorf("unmarshal invite key: %w", err)
}
err = a.joiningClient.RequestJoin(ctx, spaceId, list.RequestJoinPayload{
aclHeadId, err := a.joiningClient.RequestJoin(ctx, spaceId, list.RequestJoinPayload{
InviteKey: inviteKey,
Metadata: a.spaceService.AccountMetadataPayload(),
})
if err != nil {
if errors.Is(err, list.ErrInsufficientPermissions) {
err = a.joiningClient.CancelRemoveSelf(ctx, spaceId)
if err != nil {
return fmt.Errorf("%w, %w", ErrAclRequestFailed, err)
}
return a.spaceService.CancelLeave(ctx, spaceId)
}
return fmt.Errorf("%w, %w", ErrAclRequestFailed, err)
}
return a.spaceService.Join(ctx, spaceId)
err = a.spaceService.Join(ctx, spaceId, aclHeadId)
if err != nil {
return err
}
return a.spaceService.TechSpace().SpaceViewSetData(ctx, spaceId, &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String(invitePayload.SpaceName),
bundle.RelationKeyIconImage.String(): pbtypes.String(invitePayload.SpaceIconCid),
}})
}
type InviteView struct {
@ -385,6 +436,25 @@ func (a *aclService) getExistingInviteFileInfo(spaceViewId string) (fileCid stri
return
}
func (a *aclService) removeExistingInviteFileInfo(ctx context.Context, spaceViewId string) (err error) {
var fileCid string
err = getblock.Do(a.objectGetter, spaceViewId, func(sb smartblock.SmartBlock) error {
details := sb.Details()
fileCid = pbtypes.GetString(details, bundle.RelationKeySpaceInviteFileCid.String())
newState := sb.NewState()
newState.RemoveDetail(bundle.RelationKeySpaceInviteFileCid.String(), bundle.RelationKeySpaceInviteFileKey.String())
return sb.Apply(newState)
})
if err != nil {
return err
}
cId, err := cid.Decode(fileCid)
if err != nil {
return fmt.Errorf("decode file cid: %w", err)
}
return a.inviteStore.RemoveInvite(ctx, cId)
}
func (a *aclService) GetCurrentInvite(spaceId string) (*InviteInfo, error) {
spaceViewId, err := a.spaceService.SpaceViewId(spaceId)
if err != nil {

View file

@ -7,6 +7,7 @@ import (
"time"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/debugstat"
"github.com/anyproto/any-sync/commonfile/fileservice"
"github.com/anyproto/any-sync/commonspace"
"github.com/anyproto/any-sync/commonspace/acl/aclclient"
@ -189,6 +190,7 @@ func Bootstrap(a *app.App, components ...app.Component) {
a.
// Data storages
Register(clientds.New()).
Register(debugstat.New()).
Register(ftsearch.New()).
Register(objectstore.New()).
Register(backlinks.New()).

View file

@ -32,6 +32,7 @@ import (
"github.com/anyproto/anytype-heart/space"
"github.com/anyproto/anytype-heart/util/linkpreview"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/uri"
)
const CName = "bookmark"
@ -40,6 +41,7 @@ const CName = "bookmark"
type ContentFuture func() *bookmark.ObjectContent
type Service interface {
CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error)
CreateBookmarkObject(ctx context.Context, spaceID string, details *types.Struct, getContent ContentFuture) (objectId string, newDetails *types.Struct, err error)
UpdateObject(objectId string, getContent *bookmark.ObjectContent) error
// TODO Maybe Fetch and FetchBookmarkContent do the same thing differently?
@ -89,6 +91,23 @@ func (s *service) Name() (name string) {
var log = logging.Logger("anytype-mw-bookmark")
func (s *service) CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error) {
source := pbtypes.GetString(req.Details, bundle.RelationKeySource.String())
var res ContentFuture
if source != "" {
u, err := uri.NormalizeURI(source)
if err != nil {
return "", nil, fmt.Errorf("process uri: %w", err)
}
res = s.FetchBookmarkContent(req.SpaceId, u, false)
} else {
res = func() *bookmark.ObjectContent {
return nil
}
}
return s.CreateBookmarkObject(ctx, spaceId, req.Details, res)
}
func (s *service) CreateBookmarkObject(ctx context.Context, spaceID string, details *types.Struct, getContent ContentFuture) (objectId string, objectDetails *types.Struct, err error) {
if details == nil || details.Fields == nil {
return "", nil, fmt.Errorf("empty details")

View file

@ -226,7 +226,7 @@ func isRangeSelect(firstTextBlock *model.Block, lastTextBlock *model.Block, rang
lastTextBlock == nil &&
rang != nil &&
rang.To-rang.From != int32(textutil.UTF16RuneCountString(firstTextBlock.GetText().Text)) &&
rang.To != 0 && rang.From != 0
rang.To > 0
}
func unlinkAndClearBlocks(

View file

@ -1310,6 +1310,124 @@ func Test_CopyAndCutText(t *testing.T) {
assert.Equal(t, expected, textSlotCopy)
assert.Equal(t, expected, textSlotCut)
})
t.Run("cut/copy - text range from 0", func(t *testing.T) {
// given
sb := smarttest.New("text")
require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithEmpty))
s := sb.NewState()
bl := givenBlockWithStyle(0, "")
insertBlock(s, bl, "")
require.NoError(t, sb.Apply(s))
// when
cb := newFixture(sb)
textSlotCopy, _, _, err := cb.Copy(nil, pb.RpcBlockCopyRequest{
SelectedTextRange: &model.Range{From: 0, To: 7},
Blocks: []*model.Block{bl},
})
textSlotCut, _, _, err := cb.Cut(nil, pb.RpcBlockCutRequest{
SelectedTextRange: &model.Range{From: 0, To: 7},
Blocks: []*model.Block{bl},
})
// then
require.NoError(t, err)
const expected = "some te"
assert.Equal(t, expected, textSlotCopy)
assert.Equal(t, expected, textSlotCut)
assert.Len(t, sb.Blocks(), 2)
})
t.Run("cut/copy - text range from 0 to the end of block", func(t *testing.T) {
// given
const expected = "some text 1"
sb := smarttest.New("text")
require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithEmpty))
s := sb.NewState()
bl := givenBlockWithStyle(0, "")
insertBlock(s, bl, "")
require.NoError(t, sb.Apply(s))
// when
cb := newFixture(sb)
textSlotCopy, _, _, err := cb.Copy(nil, pb.RpcBlockCopyRequest{
SelectedTextRange: &model.Range{From: 0, To: int32(len(expected))},
Blocks: []*model.Block{bl},
})
textSlotCut, _, _, err := cb.Cut(nil, pb.RpcBlockCutRequest{
SelectedTextRange: &model.Range{From: 0, To: int32(len(expected))},
Blocks: []*model.Block{bl},
})
// then
require.NoError(t, err)
assert.Equal(t, expected, textSlotCopy)
assert.Equal(t, expected, textSlotCut)
assert.Len(t, sb.Blocks(), 1)
})
t.Run("cut/copy - inner text range", func(t *testing.T) {
// given
sb := smarttest.New("text")
require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithEmpty))
s := sb.NewState()
bl := givenBlockWithStyle(0, "")
insertBlock(s, bl, "")
require.NoError(t, sb.Apply(s))
// when
cb := newFixture(sb)
textSlotCopy, _, _, err := cb.Copy(nil, pb.RpcBlockCopyRequest{
SelectedTextRange: &model.Range{From: 2, To: 8},
Blocks: []*model.Block{bl},
})
textSlotCut, _, _, err := cb.Cut(nil, pb.RpcBlockCutRequest{
SelectedTextRange: &model.Range{From: 2, To: 8},
Blocks: []*model.Block{bl},
})
// then
require.NoError(t, err)
const expected = "me tex"
assert.Equal(t, expected, textSlotCopy)
assert.Equal(t, expected, textSlotCut)
assert.Len(t, sb.Blocks(), 2)
})
t.Run("cut/copy - text range from 0 to 0", func(t *testing.T) {
// given
sb := smarttest.New("text")
require.NoError(t, smartblock.ObjectApplyTemplate(sb, nil, template.WithEmpty))
s := sb.NewState()
bl := givenBlockWithStyle(0, "")
insertBlock(s, bl, "")
require.NoError(t, sb.Apply(s))
// when
cb := newFixture(sb)
textSlotCopy, _, anySlotCopy, err := cb.Copy(nil, pb.RpcBlockCopyRequest{
SelectedTextRange: &model.Range{From: 0, To: 0},
Blocks: []*model.Block{bl},
})
textSlotCut, _, anySlotCut, err := cb.Cut(nil, pb.RpcBlockCutRequest{
SelectedTextRange: &model.Range{From: 0, To: 0},
Blocks: []*model.Block{bl},
})
// then
require.NoError(t, err)
const expected = "some text 1"
assert.Equal(t, expected, textSlotCopy)
assert.Equal(t, expected, textSlotCut)
assert.Len(t, sb.Blocks(), 1)
assert.Len(t, anySlotCopy, 1)
assert.Len(t, anySlotCut, 1)
})
}
func givenRow3Level1NumberedBlock(s *state.State) *model.Block {

View file

@ -8,8 +8,9 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/stext"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/migration"
"github.com/anyproto/anytype-heart/core/block/source"
"github.com/anyproto/anytype-heart/core/files/fileobject"
"github.com/anyproto/anytype-heart/core/filestorage"
coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
)
@ -17,16 +18,19 @@ import (
func (f *ObjectFactory) newFile(sb smartblock.SmartBlock) *File {
basicComponent := basic.NewBasic(sb, f.objectStore, f.layoutConverter)
return &File{
SmartBlock: sb,
AllOperations: basicComponent,
Text: stext.NewText(sb, f.objectStore, f.eventSender),
SmartBlock: sb,
ChangeReceiver: sb.(source.ChangeReceiver),
AllOperations: basicComponent,
Text: stext.NewText(sb, f.objectStore, f.eventSender), fileObjectService: f.fileObjectService,
}
}
type File struct {
smartblock.SmartBlock
source.ChangeReceiver
basic.AllOperations
stext.Text
fileObjectService fileobject.Service
}
func (p *File) CreationStateMigration(ctx *smartblock.InitContext) migration.Migration {
@ -37,14 +41,12 @@ func (p *File) CreationStateMigration(ctx *smartblock.InitContext) migration.Mig
ctx.State.SetObjectTypeKeys(ctx.ObjectTypeKeys)
}
// Other blocks added in file indexer (see fileobject package)
template.InitTemplate(s,
template.WithEmpty,
template.WithTitle,
template.WithDefaultFeaturedRelations,
template.WithFeaturedRelations,
template.WithAllBlocksEditsRestricted,
)
// Other blocks added:
// - While creating file object, if we use synchronous metadata indexing mode
// - In background metadata indexer, if we use asynchronous metadata indexing mode
//
// See fileobject.Service
p.fileObjectService.InitEmptyFileState(ctx.State)
},
}
}

View file

@ -85,10 +85,13 @@ func (p *Page) Init(ctx *smartblock.InitContext) (err error) {
}
if p.isRelationDeleted(ctx) {
err = p.deleteRelationOptions(ctx)
if err != nil {
return err
}
// todo: move this to separate component
go func() {
err = p.deleteRelationOptions(p.SpaceID(), pbtypes.GetString(p.Details(), bundle.RelationKeyRelationKey.String()))
if err != nil {
log.With("err", err).Error("failed to delete relation options")
}
}()
}
return nil
}
@ -98,8 +101,7 @@ func (p *Page) isRelationDeleted(ctx *smartblock.InitContext) bool {
pbtypes.GetBool(ctx.State.Details(), bundle.RelationKeyIsUninstalled.String())
}
func (p *Page) deleteRelationOptions(ctx *smartblock.InitContext) error {
relationKey := pbtypes.GetString(ctx.State.Details(), bundle.RelationKeyRelationKey.String())
func (p *Page) deleteRelationOptions(spaceID string, relationKey string) error {
relationOptions, _, err := p.objectStore.QueryObjectIDs(database.Query{
Filters: []*model.BlockContentDataviewFilter{
{
@ -117,7 +119,7 @@ func (p *Page) deleteRelationOptions(ctx *smartblock.InitContext) error {
if err != nil {
return err
}
spaceID := p.Space().Id()
for _, id := range relationOptions {
err := p.objectDeleter.DeleteObjectByFullID(domain.FullID{SpaceID: spaceID, ObjectID: id})
if err != nil {

View file

@ -82,10 +82,7 @@ func (p *Profile) CreationStateMigration(ctx *smartblock.InitContext) migration.
template.InitTemplate(st,
template.WithObjectTypesAndLayout([]domain.TypeKey{bundle.TypeKeyProfile}, model.ObjectType_profile),
template.WithDetail(bundle.RelationKeyLayoutAlign, pbtypes.Float64(float64(model.Block_AlignCenter))),
template.WithTitle,
template.WithFeaturedRelations,
template.WithRequiredRelations(),
migrationWithIdentityBlock,
migrationSetHidden,
)
},
@ -126,6 +123,11 @@ func (p *Profile) StateMigrations() migration.Migrations {
Version: 3,
Proc: migrationSetHidden,
},
{
Version: 4,
Proc: func(s *state.State) {
},
},
})
}

View file

@ -0,0 +1,100 @@
package profilemigration
import (
"fmt"
"strings"
"golang.org/x/exp/slices"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/block/simple/text"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
const InternalKeyOldProfileData = "oldprofile"
var ErrNoCustomStateFound = fmt.Errorf("no custom state found")
// ExtractCustomState extract user-added state to the separate state and removes all the custom blocks/details from the original one
func ExtractCustomState(st *state.State) (userState *state.State, err error) {
identityBlockId := "identity"
// we leave identity and other blocks in the original object to avoid them being re-added by old clients
whitelistBlocks := []string{state.HeaderLayoutID, state.DescriptionBlockID, state.FeaturedRelationsID, state.TitleBlockID, identityBlockId}
hasCustomState := false
st.Iterate(func(b simple.Block) (isContinue bool) {
if slices.Contains(whitelistBlocks, b.Model().Id) {
return true
}
if textBlock, ok := b.(text.Block); ok {
// custom one for text block
if strings.TrimSpace(textBlock.GetText()) != "" {
hasCustomState = true
return false
}
} else if emptyChecker, ok := b.(IsEmpty); ok && !emptyChecker.IsEmpty() {
hasCustomState = true
return false
}
return true
})
if !hasCustomState {
return nil, ErrNoCustomStateFound
}
blocksMap := map[string]simple.Block{}
st.Iterate(func(b simple.Block) (isContinue bool) {
blocksMap[b.Model().Id] = b.Copy()
return true
})
uk, err := domain.NewUniqueKey(coresb.SmartBlockTypePage, InternalKeyOldProfileData)
if err != nil {
return nil, err
}
newState := state.NewDocWithUniqueKey(st.RootId(), blocksMap, uk).(*state.State)
newState.AddRelationLinks(st.GetRelationLinks()...)
newStateDetails := pbtypes.CopyStruct(st.Details())
newName := pbtypes.GetString(newStateDetails, bundle.RelationKeyName.String()) + " [migrated]"
newStateDetails.Fields[bundle.RelationKeyName.String()] = pbtypes.String(newName)
newStateDetails.Fields[bundle.RelationKeyIsHidden.String()] = pbtypes.Bool(false)
newState.SetDetails(newStateDetails)
// remove the identity block
newState.Unlink(identityBlockId)
newState.CleanupBlock(identityBlockId)
newState.SetObjectTypeKey(bundle.TypeKeyPage)
// now cleanup the original state
rootBlock := st.Get(st.RootId())
rootBlock.Model().ChildrenIds = slices.DeleteFunc(rootBlock.Model().ChildrenIds, func(s string) bool {
return !slices.Contains(whitelistBlocks, s)
})
whitelistDetailKeys := []string{
"iconEmoji",
"name",
"isHidden",
"featuredRelations",
"layout",
"layoutAlign",
"iconImage",
"iconOption",
}
var keysToRemove []string
for k := range st.Details().GetFields() {
if !slices.Contains(whitelistDetailKeys, k) {
keysToRemove = append(keysToRemove, k)
}
}
// cleanup custom details from old state
st.RemoveDetail(keysToRemove...)
st.RemoveRelation(keysToRemove...)
return newState, nil
}
type IsEmpty interface {
IsEmpty() bool
}

View file

@ -0,0 +1,921 @@
package profilemigration
import (
"testing"
"github.com/gogo/protobuf/jsonpb"
"github.com/stretchr/testify/require"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
var (
stateOriginalRootId = "bafyreiew6ma6fkw3hyceivukjd2zelgwcsfdyr2mmbb34slf2575y6s63a"
stateOriginal = `{
"sbType": "ProfilePage",
"snapshot": {
"data": {
"blocks": [
{
"id": "bafyreiew6ma6fkw3hyceivukjd2zelgwcsfdyr2mmbb34slf2575y6s63a",
"childrenIds": [
"header",
"65d7c13961fab283c2729ad5",
"65d7c14061fab283c2729ad8",
"65d7c14f61fab283c2729adb",
"65d7c15a61fab283c2729add",
"65d7c16f61fab283c2729ae0",
"65d7c17a61fab283c2729ae2"
],
"smartblock": {
}
},
{
"id": "header",
"restrictions": {
"edit": true,
"remove": true,
"drag": true,
"dropOn": true
},
"childrenIds": [
"title",
"identity",
"featuredRelations"
],
"layout": {
"style": "Header"
}
},
{
"id": "65d7c13961fab283c2729ad5",
"text": {
"text": "block1",
"marks": {
}
}
},
{
"id": "65d7c14061fab283c2729ad8",
"text": {
"text": "block2",
"marks": {
"marks": [
{
"range": {
"to": 6
},
"type": "Bold"
}
]
}
}
},
{
"id": "65d7c14f61fab283c2729adb",
"file": {
"hash": "bafybeiarwjntnmjxc3wysufrqb6udvlm5s6exj6o5wzqjppvwpx4hvxx6m",
"name": "image.png",
"type": "Image",
"mime": "image/png",
"size": "42782",
"targetObjectId": "bafyreibdezouiipznowdp7wi7hsvysakdavydjjzu7ny7hcstdnqhthpqi",
"state": "Done",
"style": "Embed"
}
},
{
"id": "65d7c15a61fab283c2729add",
"relation": {
"key": "lastModifiedBy"
}
},
{
"id": "65d7c16f61fab283c2729ae0",
"relation": {
"key": "tag"
}
},
{
"id": "65d7c17a61fab283c2729ae2",
"dataview": {
"views": [
{
"id": "63c59da2c54d2d6c985c2b6b",
"name": "All",
"sorts": [
{
"id": "63db97200e01101ff536a754",
"RelationKey": "type"
},
{
"id": "63db97200e01101ff536a755",
"RelationKey": "lastModifiedDate",
"type": "Desc"
}
],
"filters": [
{
"id": "63d24bef257d7bad62f58c7d",
"RelationKey": "type",
"condition": "NotIn",
"value": [
"bafyreihatd4tx3xsdgp7hr72amclva3x4x35webt5vuufxhxc5ikhp77hy",
"bafyreih33gcr4t4fq3kgmsuq5dou42otzfrou6rn6eohkeidcd7aw7tme4",
"bafyreiaparytg33b7ekqjfchni3axdrzrevbcw3uq7a5m5324slmtzq4ai",
"bafyreiawofrlyhnlobrrjh2qkdfz5rzfa5nvz7salq62573v4ktqrcytey",
"bafyreib2tcsejm5pvkj5b77ac7ezrt2kc5htlqlnlrqwa2vbh56byryvva",
"bafyreifn7xdb6wzawml5ymf6i67raq2yxjgcgrfcyuxoiiiuglygdxyxni",
"bafyreic6ncroguyctlvsepoaay67fve75xg3ongvc2yiz46r4tcxftzkva",
"bafyreic7jleoay7jaeaonqdpaeqimivgzsdgsqnrklhgodh6to6aenze6q",
"bafyreibyffj6c5surbofv3mjdpkwyozygmutqhn2pkz4g3gajr4bzqlv2e",
"bafyreibz5s4pjua57dnukiglqzi63jskryfd4g7xppbzoqyjbevyb6lche",
"bafyreieayrnuafcadst7x6emrsdc2wf4db2y72zbpikvciam2o7huc76iy"
],
"format": "object"
},
{
"id": "63d24bef257d7bad62f58c7e",
"RelationKey": "name",
"value": ""
}
],
"relations": [
{
"key": "name",
"isVisible": true,
"width": 500
},
{
"key": "type",
"isVisible": true,
"width": 192
},
{
"key": "lastModifiedDate",
"width": 178
},
{
"key": "description",
"width": 192
},
{
"key": "createdDate",
"width": 192
},
{
"key": "lastModifiedBy",
"width": 192
},
{
"key": "lastOpenedDate",
"width": 192
},
{
"key": "done"
}
]
},
{
"id": "e83e70ab-0601-4ab7-abd9-d4dc09b9e703",
"type": "Gallery",
"name": "Media",
"sorts": [
{
"id": "63db97200e01101ff536a758",
"RelationKey": "type"
},
{
"id": "63db97200e01101ff536a759",
"RelationKey": "name"
}
],
"filters": [
{
"id": "63d24bef257d7bad62f58c81",
"RelationKey": "type",
"condition": "In",
"value": [
"bafyreic7jleoay7jaeaonqdpaeqimivgzsdgsqnrklhgodh6to6aenze6q",
"bafyreib2tcsejm5pvkj5b77ac7ezrt2kc5htlqlnlrqwa2vbh56byryvva",
"bafyreibyffj6c5surbofv3mjdpkwyozygmutqhn2pkz4g3gajr4bzqlv2e",
"bafyreieayrnuafcadst7x6emrsdc2wf4db2y72zbpikvciam2o7huc76iy"
]
}
],
"relations": [
{
"key": "name",
"isVisible": true,
"width": 500
},
{
"key": "type",
"width": 192
},
{
"key": "createdDate",
"width": 192
},
{
"key": "description",
"width": 192
},
{
"key": "lastModifiedDate",
"width": 192
},
{
"key": "lastModifiedBy",
"width": 192
},
{
"key": "lastOpenedDate",
"width": 192
},
{
"key": "done"
}
],
"coverRelationKey": "iconImage",
"groupRelationKey": "done"
},
{
"id": "2589f7e2-aad5-43ed-8759-f0771a6a40c9",
"name": "Pre-installed",
"sorts": [
{
"id": "63db97200e01101ff536a754",
"RelationKey": "type"
},
{
"id": "63db97200e01101ff536a757",
"RelationKey": "name"
},
{
"id": "63db97200e01101ff536a755",
"RelationKey": "lastModifiedDate",
"type": "Desc"
}
],
"filters": [
{
"id": "63d24bef257d7bad62f58c7d",
"RelationKey": "type",
"condition": "NotIn",
"value": [
"bafyreihatd4tx3xsdgp7hr72amclva3x4x35webt5vuufxhxc5ikhp77hy",
"bafyreih33gcr4t4fq3kgmsuq5dou42otzfrou6rn6eohkeidcd7aw7tme4",
"bafyreiaparytg33b7ekqjfchni3axdrzrevbcw3uq7a5m5324slmtzq4ai",
"bafyreiawofrlyhnlobrrjh2qkdfz5rzfa5nvz7salq62573v4ktqrcytey",
"bafyreib2tcsejm5pvkj5b77ac7ezrt2kc5htlqlnlrqwa2vbh56byryvva",
"bafyreifn7xdb6wzawml5ymf6i67raq2yxjgcgrfcyuxoiiiuglygdxyxni",
"bafyreic6ncroguyctlvsepoaay67fve75xg3ongvc2yiz46r4tcxftzkva",
"bafyreic7jleoay7jaeaonqdpaeqimivgzsdgsqnrklhgodh6to6aenze6q",
"bafyreibyffj6c5surbofv3mjdpkwyozygmutqhn2pkz4g3gajr4bzqlv2e",
"bafyreibz5s4pjua57dnukiglqzi63jskryfd4g7xppbzoqyjbevyb6lche",
"bafyreieayrnuafcadst7x6emrsdc2wf4db2y72zbpikvciam2o7huc76iy"
]
},
{
"id": "63d24bef257d7bad62f58c7e",
"RelationKey": "tag",
"condition": "In",
"value": [
"bafyreiawm24apxzqyhiz36a3aguwpywqyka7l7qpt2hxvasx3ivww7dawq"
],
"format": "tag"
}
],
"relations": [
{
"key": "name",
"isVisible": true,
"width": 500
},
{
"key": "type",
"isVisible": true,
"width": 192
},
{
"key": "lastModifiedDate",
"width": 178
},
{
"key": "description",
"width": 192
},
{
"key": "createdDate",
"width": 192
},
{
"key": "lastModifiedBy",
"width": 192
},
{
"key": "lastOpenedDate",
"width": 192
},
{
"key": "done",
"width": 192
},
{
"key": "tag",
"isVisible": true,
"width": 192
}
],
"cardSize": "Medium",
"groupRelationKey": "done"
}
],
"relationLinks": [
{
"key": "name",
"format": "shorttext"
},
{
"key": "type",
"format": "object"
},
{
"key": "lastModifiedDate",
"format": "date"
},
{
"key": "description"
},
{
"key": "createdDate",
"format": "date"
},
{
"key": "lastModifiedBy",
"format": "object"
},
{
"key": "lastOpenedDate",
"format": "date"
},
{
"key": "done",
"format": "checkbox"
},
{
"key": "tag",
"format": "tag"
}
],
"TargetObjectId": "bafyreibgdh7ka67etpdwwsckhnsez7k7qjqtxkxo2nkrx67w5otgsl4bsi"
}
},
{
"id": "title",
"fields": {
"_detailsKey": [
"name",
"done"
]
},
"restrictions": {
"remove": true,
"drag": true,
"dropOn": true
},
"align": "AlignCenter",
"text": {
"style": "Title",
"marks": {
}
}
},
{
"id": "identity",
"restrictions": {
"edit": true,
"remove": true,
"drag": true,
"dropOn": true
},
"relation": {
"key": "profileOwnerIdentity"
}
},
{
"id": "featuredRelations",
"restrictions": {
"remove": true,
"drag": true,
"dropOn": true
},
"align": "AlignCenter",
"featuredRelations": {
}
}
],
"details": {
"backlinks": [
],
"createdDate": 1708638507,
"creator": "_participant_bafyreifqavrshf5l2ovfexjzboibyvmweh6edx477mggj6lvpprp2tltgq_2msp3m2jb2vcd_A9YAB51C9MMWR5HLDzBR4A3BnkReMYHSR1wdmYEVfP4biKfr",
"featuredRelations": [
"backlinks"
],
"iconEmoji": "",
"iconImage": "bafyreifhebpqmp3kx52wyfhmje23j7du3kguziddj4ilri7m5jngogbs24",
"iconOption": 5,
"id": "bafyreiew6ma6fkw3hyceivukjd2zelgwcsfdyr2mmbb34slf2575y6s63a",
"isHidden": true,
"lastModifiedBy": "_participant_bafyreifqavrshf5l2ovfexjzboibyvmweh6edx477mggj6lvpprp2tltgq_2msp3m2jb2vcd_A9YAB51C9MMWR5HLDzBR4A3BnkReMYHSR1wdmYEVfP4biKfr",
"lastModifiedDate": 1708694933,
"layout": 1,
"layoutAlign": 1,
"links": [
"bafyreibgdh7ka67etpdwwsckhnsez7k7qjqtxkxo2nkrx67w5otgsl4bsi"
],
"name": "Roma",
"profileOwnerIdentity": "_participant_bafyreifqavrshf5l2ovfexjzboibyvmweh6edx477mggj6lvpprp2tltgq_2msp3m2jb2vcd_A9YAB51C9MMWR5HLDzBR4A3BnkReMYHSR1wdmYEVfP4biKfr",
"restrictions": [
6,
5,
1,
8
],
"snippet": "block1\nblock2",
"spaceId": "bafyreifqavrshf5l2ovfexjzboibyvmweh6edx477mggj6lvpprp2tltgq.2msp3m2jb2vcd",
"tag": [
"bafyreiayeo7sk3i56v5cqyenjgr73wuz2fn52mmcuirqqdefhjiy6qji24"
],
"type": "bafyreifci7gcmxafbn6eikujw2elra4ynpxmdqs4fqzhql5n63gus7olpm"
},
"objectTypes": [
"ot-profile"
],
"relationLinks": [
{
"key": "backlinks",
"format": "object"
},
{
"key": "featuredRelations",
"format": "object"
},
{
"key": "id",
"format": "object"
},
{
"key": "spaceId",
"format": "object"
},
{
"key": "snippet"
},
{
"key": "layout",
"format": "number"
},
{
"key": "layoutAlign",
"format": "number"
},
{
"key": "name",
"format": "shorttext"
},
{
"key": "description"
},
{
"key": "iconEmoji",
"format": "emoji"
},
{
"key": "iconImage",
"format": "file"
},
{
"key": "type",
"format": "object"
},
{
"key": "coverId"
},
{
"key": "coverScale",
"format": "number"
},
{
"key": "coverType",
"format": "number"
},
{
"key": "coverX",
"format": "number"
},
{
"key": "coverY",
"format": "number"
},
{
"key": "createdDate",
"format": "date"
},
{
"key": "creator",
"format": "object"
},
{
"key": "lastModifiedDate",
"format": "date"
},
{
"key": "lastModifiedBy",
"format": "object"
},
{
"key": "lastOpenedDate",
"format": "date"
},
{
"key": "isFavorite",
"format": "checkbox"
},
{
"key": "workspaceId",
"format": "object"
},
{
"key": "links",
"format": "object"
},
{
"key": "internalFlags",
"format": "number"
},
{
"key": "restrictions",
"format": "number"
},
{
"key": "iconOption",
"format": "number"
},
{
"key": "tag",
"format": "tag"
},
{
"key": "isHidden",
"format": "checkbox"
},
{
"key": "profileOwnerIdentity",
"format": "shorttext"
}
]
}
}
}`
stateOriginalEmptyRootId = "bafyreif5rmdsvap7ieqnpvlm6vafizxw7igz37bmixtboopaiygpepyycm"
stateOriginalEmpty = `
{
"sbType": "ProfilePage",
"snapshot": {
"data": {
"blocks": [
{
"id": "bafyreif5rmdsvap7ieqnpvlm6vafizxw7igz37bmixtboopaiygpepyycm",
"childrenIds": [
"header",
"65d8a97961fab22b735aa569",
"65d8a98061fab22b735aa56b",
"65d8a98061fab22b735aa56c"
],
"smartblock": {
}
},
{
"id": "header",
"restrictions": {
"edit": true,
"remove": true,
"drag": true,
"dropOn": true
},
"childrenIds": [
"title",
"identity",
"featuredRelations"
],
"layout": {
"style": "Header"
}
},
{
"id": "65d8a97961fab22b735aa569",
"text": {
"marks": {
}
}
},
{
"id": "65d8a98061fab22b735aa56b",
"text": {
"marks": {
}
}
},
{
"id": "65d8a98061fab22b735aa56c",
"text": {
"marks": {
}
}
},
{
"id": "title",
"fields": {
"_detailsKey": [
"name",
"done"
]
},
"restrictions": {
"remove": true,
"drag": true,
"dropOn": true
},
"align": "AlignCenter",
"text": {
"style": "Title",
"marks": {
}
}
},
{
"id": "identity",
"restrictions": {
"edit": true,
"remove": true,
"drag": true,
"dropOn": true
},
"relation": {
"key": "profileOwnerIdentity"
}
},
{
"id": "featuredRelations",
"restrictions": {
"remove": true,
"drag": true,
"dropOn": true
},
"align": "AlignCenter",
"featuredRelations": {
}
}
],
"details": {
"backlinks": [
],
"createdDate": 1708697957,
"creator": "_participant_bafyreicqzro4ea6ibejpswsq3ygdvl5yrswdhv3wcaeiya4zrhgxijorhi_25fl2y3kgedrp_ABG7CU4WFNtAtdYMbDoJArFguPJRHqq9Bag5un1iBoy2qqkn",
"featuredRelations": [
"backlinks"
],
"iconOption": 15,
"id": "bafyreif5rmdsvap7ieqnpvlm6vafizxw7igz37bmixtboopaiygpepyycm",
"isHidden": true,
"lastModifiedBy": "_participant_bafyreicqzro4ea6ibejpswsq3ygdvl5yrswdhv3wcaeiya4zrhgxijorhi_25fl2y3kgedrp_ABG7CU4WFNtAtdYMbDoJArFguPJRHqq9Bag5un1iBoy2qqkn",
"lastModifiedDate": 1708698142,
"layout": 1,
"layoutAlign": 1,
"links": [
],
"name": "ooo",
"profileOwnerIdentity": "_participant_bafyreicqzro4ea6ibejpswsq3ygdvl5yrswdhv3wcaeiya4zrhgxijorhi_25fl2y3kgedrp_ABG7CU4WFNtAtdYMbDoJArFguPJRHqq9Bag5un1iBoy2qqkn",
"restrictions": [
6,
5,
1,
8
],
"snippet": "",
"spaceId": "bafyreicqzro4ea6ibejpswsq3ygdvl5yrswdhv3wcaeiya4zrhgxijorhi.25fl2y3kgedrp",
"type": "bafyreiawi7jklmbhjqfux73ncl2t3ujytjahv2steorcqabydchkfze4iy"
},
"objectTypes": [
"ot-profile"
],
"relationLinks": [
{
"key": "backlinks",
"format": "object"
},
{
"key": "featuredRelations",
"format": "object"
},
{
"key": "id",
"format": "object"
},
{
"key": "spaceId",
"format": "object"
},
{
"key": "snippet"
},
{
"key": "layout",
"format": "number"
},
{
"key": "layoutAlign",
"format": "number"
},
{
"key": "name",
"format": "shorttext"
},
{
"key": "description"
},
{
"key": "iconEmoji",
"format": "emoji"
},
{
"key": "iconImage",
"format": "file"
},
{
"key": "type",
"format": "object"
},
{
"key": "coverId"
},
{
"key": "coverScale",
"format": "number"
},
{
"key": "coverType",
"format": "number"
},
{
"key": "coverX",
"format": "number"
},
{
"key": "coverY",
"format": "number"
},
{
"key": "createdDate",
"format": "date"
},
{
"key": "creator",
"format": "object"
},
{
"key": "lastModifiedDate",
"format": "date"
},
{
"key": "lastModifiedBy",
"format": "object"
},
{
"key": "lastOpenedDate",
"format": "date"
},
{
"key": "isFavorite",
"format": "checkbox"
},
{
"key": "workspaceId",
"format": "object"
},
{
"key": "links",
"format": "object"
},
{
"key": "internalFlags",
"format": "number"
},
{
"key": "restrictions",
"format": "number"
},
{
"key": "iconOption",
"format": "number"
},
{
"key": "isHidden",
"format": "checkbox"
},
{
"key": "profileOwnerIdentity",
"format": "shorttext"
}
]
}
}
}`
)
func TestProfileMigrationExtractCustomState(t *testing.T) {
sn := pb.SnapshotWithType{}
err := jsonpb.UnmarshalString(stateOriginal, &sn)
require.NoError(t, err)
var identityBlockId = "identity"
originalState := state.NewDocFromSnapshot(stateOriginalRootId, sn.Snapshot).(*state.State)
originalStateCopy := originalState.Copy()
extractedState, err := ExtractCustomState(originalState)
require.NoError(t, err)
for _, block := range originalState.Blocks() {
// should contains only whitelisted blocks
require.Containsf(t, []string{
stateOriginalRootId,
state.FeaturedRelationsID,
state.TitleBlockID,
state.HeaderLayoutID,
state.FeaturedRelationsID,
identityBlockId, // we do not remove this block
}, block.Id, "state should not contain block %s", block.Id)
}
for _, block := range originalStateCopy.Blocks() {
if block.Id == identityBlockId {
require.Nilf(t, extractedState.Get(block.Id), "extractedState should not contain block %s", block.Id)
} else {
require.NotNilf(t, extractedState.Get(block.Id), "extractedState should contain block %s", block.Id)
}
}
var whitelistedDetailKeys = []string{
"iconEmoji",
"name",
"isHidden",
"featuredRelations",
"layout",
"layoutAlign",
"iconImage",
"iconOption",
}
for k, v := range originalStateCopy.Details().GetFields() {
if k == bundle.RelationKeyName.String() {
// should has suffix in the name
v = pbtypes.String(v.GetStringValue() + " [migrated]")
}
if k == bundle.RelationKeyIsHidden.String() {
// extracted state should not be hidden
v = pbtypes.Bool(false)
}
require.Truef(t, v.Equal(extractedState.Details().Fields[k]), "detail %s should be equal to original state", k)
}
for k, _ := range originalState.Details().GetFields() {
require.Contains(t, whitelistedDetailKeys, k, "old state should not contain %s", k)
}
require.Equal(t, bundle.TypeKeyPage, extractedState.ObjectTypeKey())
_, err = ExtractCustomState(originalState.NewState())
require.ErrorIsf(t, err, ErrNoCustomStateFound, "should return error on the second time call")
}
func TestProfileMigrationExtractCustomStateEmpty(t *testing.T) {
sn := pb.SnapshotWithType{}
err := jsonpb.UnmarshalString(stateOriginalEmpty, &sn)
require.NoError(t, err)
originalStateEmpty := state.NewDocFromSnapshot(stateOriginalEmptyRootId, sn.Snapshot).(*state.State)
_, err = ExtractCustomState(originalStateEmpty)
require.ErrorIsf(t, err, ErrNoCustomStateFound, "should return error because profile was not changed by user")
}

View file

@ -16,11 +16,14 @@ import (
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/files/fileobject"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/pkg/lib/logging"
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
"github.com/anyproto/anytype-heart/space/spaceinfo"
"github.com/anyproto/anytype-heart/util/pbtypes"
)
var spaceViewLog = logging.Logger("core.block.editor.spaceview")
var ErrIncorrectSpaceInfo = errors.New("space info is incorrect")
type spaceService interface {
@ -33,6 +36,7 @@ type SpaceView struct {
smartblock.SmartBlock
spaceService spaceService
fileObjectService fileobject.Service
log *logging.Sugared
}
// newSpaceView creates a new SpaceView with given deps
@ -40,6 +44,7 @@ func (f *ObjectFactory) newSpaceView(sb smartblock.SmartBlock) *SpaceView {
return &SpaceView{
SmartBlock: sb,
spaceService: f.spaceService,
log: spaceViewLog,
fileObjectService: f.fileObjectService,
}
}
@ -53,10 +58,11 @@ func (s *SpaceView) Init(ctx *smartblock.InitContext) (err error) {
if err != nil {
return
}
s.log = s.log.With("spaceId", spaceID)
s.DisableLayouts()
info := s.getSpaceInfo(ctx.State)
newPersistentInfo := spaceinfo.SpacePersistentInfo{SpaceID: spaceID, AccountStatus: info.AccountStatus}
newPersistentInfo := spaceinfo.SpacePersistentInfo{SpaceID: spaceID, AccountStatus: info.AccountStatus, AclHeadId: info.AclHeadId}
s.setSpacePersistentInfo(ctx.State, newPersistentInfo)
s.setSpaceLocalInfo(ctx.State, spaceinfo.SpaceLocalInfo{
SpaceID: spaceID,
@ -138,11 +144,18 @@ func (s *SpaceView) setSpaceLocalInfo(st *state.State, info spaceinfo.SpaceLocal
st.SetLocalDetail(bundle.RelationKeyTargetSpaceId.String(), pbtypes.String(info.SpaceID))
st.SetLocalDetail(bundle.RelationKeySpaceLocalStatus.String(), pbtypes.Int64(int64(info.LocalStatus)))
st.SetLocalDetail(bundle.RelationKeySpaceRemoteStatus.String(), pbtypes.Int64(int64(info.RemoteStatus)))
s.log.Infof("set space local status: %s, remote status: %s", info.LocalStatus.String(), info.RemoteStatus.String())
}
func (s *SpaceView) setSpacePersistentInfo(st *state.State, info spaceinfo.SpacePersistentInfo) {
st.SetLocalDetail(bundle.RelationKeyTargetSpaceId.String(), pbtypes.String(info.SpaceID))
st.SetDetail(bundle.RelationKeySpaceAccountStatus.String(), pbtypes.Int64(int64(info.AccountStatus)))
log := s.log
if info.AclHeadId != "" {
log = log.With("aclHeadId", info.AclHeadId)
st.SetDetail(bundle.RelationKeyLatestAclHeadId.String(), pbtypes.String(info.AclHeadId))
}
log.Infof("set space account status: %s", info.AccountStatus.String())
}
// targetSpaceID returns space id from the root of space object's tree
@ -167,6 +180,7 @@ func (s *SpaceView) getSpaceInfo(st *state.State) (info spaceinfo.SpacePersisten
return spaceinfo.SpacePersistentInfo{
SpaceID: pbtypes.GetString(details, bundle.RelationKeyTargetSpaceId.String()),
AccountStatus: spaceinfo.AccountStatus(pbtypes.GetInt64(details, bundle.RelationKeySpaceAccountStatus.String())),
AclHeadId: pbtypes.GetString(details, bundle.RelationKeyLatestAclHeadId.String()),
}
}

View file

@ -89,13 +89,16 @@ func (s *State) normalizeLayout() {
}
func (s *State) removeEmptyLayoutBlocks(blocks map[string]simple.Block) {
// TODO: rewrite to use DFS routine: If layout block has no children, remove it, then check its parent
for _, b := range blocks {
if layout := b.Model().GetLayout(); layout != nil {
if len(b.Model().ChildrenIds) == 0 {
s.Unlink(b.Model().Id)
if layout.Style == model.BlockContentLayout_Row || layout.Style == model.BlockContentLayout_Column || layout.Style == model.BlockContentLayout_Div {
if len(b.Model().ChildrenIds) == 0 {
s.Unlink(b.Model().Id)
}
// load parent for checking
s.GetParentOf(b.Model().Id)
}
// load parent for checking
s.GetParentOf(b.Model().Id)
}
}
}
@ -112,14 +115,14 @@ func (s *State) normalizeChildren(b simple.Block) {
}
func (s *State) normalizeLayoutRow(b simple.Block) {
if b.Model().GetLayout().Style != model.BlockContentLayout_Row {
return
}
// remove empty layout
if len(b.Model().ChildrenIds) == 0 {
s.Unlink(b.Model().Id)
return
}
if b.Model().GetLayout().Style != model.BlockContentLayout_Row {
return
}
// one column - remove row
if len(b.Model().ChildrenIds) == 1 {
var (

View file

@ -76,11 +76,26 @@ func TestState_Normalize(t *testing.T) {
r.Add(simple.New(&model.Block{Id: "r1", ChildrenIds: []string{"c1", "c2"}, Content: contRow}))
r.Add(simple.New(&model.Block{Id: "c1", Content: contColumn}))
r.Add(simple.New(&model.Block{Id: "c2", Content: contColumn}))
r.Add(simple.New(&model.Block{Id: "t1"}))
r.Add(simple.New(&model.Block{Id: "t1", ChildrenIds: []string{"tableRows", "tableColumns"}, Content: &model.BlockContentOfTable{
Table: &model.BlockContentTable{},
}}))
r.Add(simple.New(&model.Block{Id: "tableRows", Content: &model.BlockContentOfLayout{
Layout: &model.BlockContentLayout{
Style: model.BlockContentLayout_TableRows,
},
}}))
r.Add(simple.New(&model.Block{Id: "tableColumns", Content: &model.BlockContentOfLayout{
Layout: &model.BlockContentLayout{
Style: model.BlockContentLayout_TableColumns,
},
}}))
s := r.NewState()
s.Get("c1")
s.Get("c2")
s.Get("tableRows")
s.Get("tableColumns")
msgs, hist, err := ApplyState(s, true)
require.NoError(t, err)
@ -91,6 +106,8 @@ func TestState_Normalize(t *testing.T) {
assert.Nil(t, r.Pick("r1"))
assert.Nil(t, r.Pick("c1"))
assert.Nil(t, r.Pick("c2"))
assert.NotNil(t, r.Pick("tableRows")) // Do not remove table rows
assert.NotNil(t, r.Pick("tableColumns")) // Do not remove table columns
})
t.Run("remove one column row", func(t *testing.T) {

View file

@ -120,7 +120,7 @@ func (s *State) addChangesForSideMoving(targetID string, pos model.BlockPosition
targetID = lastTargetID
pos = model.Block_Bottom
}
cb.Add(targetID, pos, blockToAdd.Model())
cb.Add(targetID, pos, blockToAdd.Copy().Model())
lastOperation = operationAdd
lastTargetID = id
} else {

View file

@ -388,16 +388,12 @@ func TestTextImpl_SetText(t *testing.T) {
BlockId: "1",
Text: "1",
}))
tb.(*textImpl).Lock()
tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
tb.(*textImpl).Unlock()
flushLocked(tb)
require.NoError(t, setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
BlockId: "2",
Text: "2",
}))
tb.(*textImpl).Lock()
tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
tb.(*textImpl).Unlock()
flushLocked(tb)
assert.Equal(t, "1", sb.NewState().Pick("1").Model().GetText().Text)
assert.Equal(t, "2", sb.NewState().Pick("2").Model().GetText().Text)
time.Sleep(time.Second)
@ -442,7 +438,7 @@ func TestTextImpl_SetText(t *testing.T) {
}))
})
// TODO: GO-2062 Need to review tests after text shortening refactor
//t.Run("set text greater than limit", func(t *testing.T) {
// t.Run("set text greater than limit", func(t *testing.T) {
// //given
// sb := smarttest.New("test")
// sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"1"}})).
@ -458,9 +454,9 @@ func TestTextImpl_SetText(t *testing.T) {
// //then
// assert.NoError(t, err)
// assert.Equal(t, strings.Repeat("a", textSizeLimit), sb.NewState().Pick("1").Model().GetText().Text)
//})
// })
t.Run("carriage state is saved in history", func(t *testing.T) {
//given
// given
ctx := session.NewContext()
sb := smarttest.New("test")
sb.AddBlock(simple.New(&model.Block{Id: "test", ChildrenIds: []string{"1"}})).
@ -468,7 +464,7 @@ func TestTextImpl_SetText(t *testing.T) {
tb := NewText(sb, nil, nil)
carriageState := undo.CarriageState{BlockID: "1", RangeFrom: 2, RangeTo: 3}
//when
// when
err := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
BlockId: carriageState.BlockID,
SelectedTextRange: &model.Range{From: carriageState.RangeFrom, To: carriageState.RangeTo},
@ -476,7 +472,7 @@ func TestTextImpl_SetText(t *testing.T) {
tb.(*textImpl).History().Add(undo.Action{Add: []simple.Block{simple.New(&model.Block{Id: "1"})}})
action, err := tb.(*textImpl).History().Previous()
//then
// then
assert.NoError(t, err)
assert.Equal(t, carriageState, action.CarriageInfo.Before)
})
@ -584,16 +580,15 @@ func TestTextImpl_removeInternalFlags(t *testing.T) {
tb := NewText(sb, nil, nil)
// when
err1 := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
err := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
ContextId: rootID,
BlockId: blockID,
Text: text,
})
err2 := tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
flushLocked(tb)
// then
assert.NoError(t, err1)
assert.NoError(t, err2)
assert.NoError(t, err)
assert.Len(t, pbtypes.GetIntList(sb.Details(), bundle.RelationKeyInternalFlags.String()), 3)
})
@ -607,16 +602,15 @@ func TestTextImpl_removeInternalFlags(t *testing.T) {
tb := NewText(sb, nil, nil)
// when
err1 := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
err := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
ContextId: rootID,
BlockId: blockID,
Text: text + " is changed",
})
err2 := tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
flushLocked(tb)
// then
assert.NoError(t, err1)
assert.NoError(t, err2)
assert.NoError(t, err)
assert.Empty(t, pbtypes.GetIntList(sb.Details(), bundle.RelationKeyInternalFlags.String()))
})
@ -630,17 +624,16 @@ func TestTextImpl_removeInternalFlags(t *testing.T) {
tb := NewText(sb, nil, nil)
// when
err1 := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
err := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
ContextId: rootID,
BlockId: blockID,
Text: text,
Marks: &model.BlockContentTextMarks{Marks: []*model.BlockContentTextMark{{Type: model.BlockContentTextMark_Bold}}},
})
err2 := tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
flushLocked(tb)
// then
assert.NoError(t, err1)
assert.NoError(t, err2)
assert.NoError(t, err)
assert.Empty(t, pbtypes.GetIntList(sb.Details(), bundle.RelationKeyInternalFlags.String()))
})
@ -654,18 +647,23 @@ func TestTextImpl_removeInternalFlags(t *testing.T) {
tb := NewText(sb, nil, nil)
// when
err1 := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
err := setText(tb, ctx, pb.RpcBlockTextSetTextRequest{
ContextId: rootID,
BlockId: template.TitleBlockId,
Text: text + " is changed",
})
err2 := tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
flushLocked(tb)
// then
assert.NoError(t, err1)
assert.NoError(t, err2)
assert.NoError(t, err)
flags := pbtypes.GetIntList(sb.Details(), bundle.RelationKeyInternalFlags.String())
assert.Len(t, flags, 2)
assert.NotContains(t, flags, model.InternalFlag_editorDeleteEmpty)
})
}
func flushLocked(tb Text) {
tb.(*textImpl).Lock()
tb.(*textImpl).flushSetTextState(smartblock.ApplyInfo{})
tb.(*textImpl).Unlock()
}

View file

@ -10,6 +10,7 @@ import (
"strconv"
"strings"
"sync"
"sync/atomic"
"github.com/anyproto/any-sync/app"
"github.com/globalsign/mgo/bson"
@ -138,12 +139,14 @@ func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest)
succeed = e.exportGraphJson(ctx, req, docs, succeed, wr, queue)
} else {
tasks := make([]process.Task, 0, len(docs))
succeed, tasks = e.exportDocs(ctx, req, docs, wr, queue, succeed, tasks)
var succeedAsync int64
tasks = e.exportDocs(ctx, req, docs, wr, queue, &succeedAsync, tasks)
err := queue.Wait(tasks...)
if err != nil {
e.cleanupFile(wr)
return "", 0, err
}
succeed += int(succeedAsync)
}
if err = queue.Finalize(); err != nil {
e.cleanupFile(wr)
@ -156,19 +159,19 @@ func (e *export) Export(ctx context.Context, req pb.RpcObjectListExportRequest)
return wr.Path(), succeed, nil
}
func (e *export) exportDocs(ctx context.Context, req pb.RpcObjectListExportRequest, docs map[string]*types.Struct, wr writer, queue process.Queue, succeed int, tasks []process.Task) (int, []process.Task) {
func (e *export) exportDocs(ctx context.Context, req pb.RpcObjectListExportRequest, docs map[string]*types.Struct, wr writer, queue process.Queue, succeed *int64, tasks []process.Task) []process.Task {
for docId := range docs {
did := docId
task := func() {
if werr := e.writeDoc(ctx, req.Format, wr, docs, queue, did, req.IncludeFiles, req.IsJson); werr != nil {
log.With("objectID", did).Warnf("can't export doc: %v", werr)
} else {
succeed++
atomic.AddInt64(succeed, 1)
}
}
tasks = append(tasks, task)
}
return succeed, tasks
return tasks
}
func (e *export) exportGraphJson(ctx context.Context, req pb.RpcObjectListExportRequest, docs map[string]*types.Struct, succeed int, wr writer, queue process.Queue) int {

View file

@ -46,7 +46,7 @@ func extractFileFromArchiveToTempDirectory(fileName string, rc io.ReadCloser, te
directoryWithFile := filepath.Dir(fileName)
if directoryWithFile != "" {
directoryWithFile = filepath.Join(tempDir, directoryWithFile)
if err := os.Mkdir(directoryWithFile, 0777); err != nil && !os.IsExist(err) {
if err := os.MkdirAll(directoryWithFile, 0777); err != nil && !os.IsExist(err) {
return "", oserror.TransformError(err)
}
}

View file

@ -119,7 +119,7 @@ func (oc *ObjectCreator) Create(dataObject *DataObject, sn *common.Snapshot) (*t
}
st.ModifyLinkedFilesInDetails(func(fileId string) string {
newFileId := oc.relationSyncer.Sync(spaceID, fileId, dataObject.createPayloads, origin)
newFileId := oc.relationSyncer.Sync(spaceID, fileId, dataObject.newIdsSet, origin)
if newFileId != fileId {
filesToDelete = append(filesToDelete, fileId)
}
@ -151,13 +151,12 @@ func (oc *ObjectCreator) Create(dataObject *DataObject, sn *common.Snapshot) (*t
oc.setArchived(snapshot, newID)
syncErr := oc.syncFilesAndLinks(dataObject.createPayloads, domain.FullID{SpaceID: spaceID, ObjectID: newID}, origin)
syncErr := oc.syncFilesAndLinks(dataObject.newIdsSet, domain.FullID{SpaceID: spaceID, ObjectID: newID}, origin)
if syncErr != nil {
if errors.Is(syncErr, common.ErrFileLoad) {
return respDetails, newID, syncErr
}
}
return respDetails, newID, nil
}
@ -400,7 +399,7 @@ func (oc *ObjectCreator) setArchived(snapshot *model.SmartBlockSnapshotBase, new
}
}
func (oc *ObjectCreator) syncFilesAndLinks(snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, id domain.FullID, origin objectorigin.ObjectOrigin) error {
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 := block.Do(oc.service, id.ObjectID, func(b smartblock.SmartBlock) error {
@ -410,7 +409,7 @@ func (oc *ObjectCreator) syncFilesAndLinks(snapshotPayloads map[string]treestora
if s != nil {
// We can't run syncer here because it will cause a deadlock, so we defer this operation
tasks = append(tasks, func() error {
err := s.Sync(id, snapshotPayloads, bl, origin)
err := s.Sync(id, newIdsSet, bl, origin)
if err != nil {
return err
}

View file

@ -17,6 +17,8 @@ type DataObject struct {
ctx context.Context
origin objectorigin.ObjectOrigin
spaceID string
newIdsSet map[string]struct{}
}
type Result struct {
@ -32,6 +34,10 @@ func NewDataObject(ctx context.Context,
origin objectorigin.ObjectOrigin,
spaceID string,
) *DataObject {
newIdsSet := make(map[string]struct{}, len(oldIDtoNew))
for _, newId := range oldIDtoNew {
newIdsSet[newId] = struct{}{}
}
return &DataObject{
oldIDtoNew: oldIDtoNew,
createPayloads: createPayloads,
@ -39,6 +45,7 @@ func NewDataObject(ctx context.Context,
ctx: ctx,
origin: origin,
spaceID: spaceID,
newIdsSet: newIdsSet,
}
}

View file

@ -39,7 +39,8 @@ func (o *fileObject) GetIDAndPayload(ctx context.Context, spaceId string, sn *co
encryptionKeys[key.Path] = key.Key
}
}
fileObjectId, err := uploadFile(ctx, o.blockService, spaceId, filePath, origin, encryptionKeys)
name := pbtypes.GetString(sn.Snapshot.Data.Details, bundle.RelationKeyName.String())
fileObjectId, err := uploadFile(ctx, o.blockService, spaceId, name, filePath, origin, encryptionKeys)
if err != nil {
log.Error("handling file object: upload file", zap.Error(err))
return id, payload, nil

View file

@ -7,6 +7,7 @@ import (
"time"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/gogo/protobuf/types"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/block"
@ -39,7 +40,8 @@ func (f *oldFile) GetIDAndPayload(ctx context.Context, spaceId string, sn *commo
filePath := pbtypes.GetString(sn.Snapshot.Data.Details, bundle.RelationKeySource.String())
if filePath != "" {
fileObjectId, err := uploadFile(ctx, f.blockService, spaceId, filePath, origin, filesKeys)
name := pbtypes.GetString(sn.Snapshot.Data.Details, bundle.RelationKeyName.String())
fileObjectId, err := uploadFile(ctx, f.blockService, spaceId, name, filePath, origin, filesKeys)
if err != nil {
log.Error("handling old file object: upload file", zap.Error(err))
}
@ -62,16 +64,20 @@ func (f *oldFile) GetIDAndPayload(ctx context.Context, spaceId string, sn *commo
return objectId, treestorage.TreeStorageCreatePayload{}, nil
}
func uploadFile(ctx context.Context, blockService *block.Service, spaceId string, filePath string, origin objectorigin.ObjectOrigin, encryptionKeys map[string]string) (string, error) {
func uploadFile(ctx context.Context, blockService *block.Service, spaceId string, name string, filePath string, origin objectorigin.ObjectOrigin, encryptionKeys map[string]string) (string, error) {
params := pb.RpcFileUploadRequest{
SpaceId: spaceId,
LocalPath: filePath,
SpaceId: spaceId,
Details: &types.Struct{
Fields: map[string]*types.Value{
bundle.RelationKeyName.String(): pbtypes.String(name),
},
},
}
if strings.HasPrefix(filePath, "http://") || strings.HasPrefix(filePath, "https://") {
params = pb.RpcFileUploadRequest{
SpaceId: spaceId,
Url: filePath,
}
params.Url = filePath
} else {
params.LocalPath = filePath
}
dto := block.FileUploadRequest{
RpcFileUploadRequest: params,

View file

@ -3,8 +3,6 @@ package syncer
import (
"fmt"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/anyproto/anytype-heart/core/block"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
@ -20,7 +18,7 @@ func NewBookmarkSyncer(service *block.Service) *BookmarkSyncer {
return &BookmarkSyncer{service: service}
}
func (bs *BookmarkSyncer) Sync(id domain.FullID, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, b simple.Block, origin objectorigin.ObjectOrigin) error {
func (bs *BookmarkSyncer) Sync(id domain.FullID, newIdsSet map[string]struct{}, b simple.Block, origin objectorigin.ObjectOrigin) error {
if b.Model().GetBookmark().TargetObjectId != "" {
return nil
}

View file

@ -4,8 +4,6 @@ import (
"fmt"
"strings"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/anyproto/anytype-heart/core/block"
"github.com/anyproto/anytype-heart/core/block/editor/basic"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
@ -42,7 +40,7 @@ func NewFileSyncer(
}
}
func (s *FileSyncer) Sync(id domain.FullID, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, b simple.Block, origin objectorigin.ObjectOrigin) error {
func (s *FileSyncer) Sync(id domain.FullID, newIdsSet map[string]struct{}, b simple.Block, origin objectorigin.ObjectOrigin) error {
if targetObjectId := b.Model().GetFile().GetTargetObjectId(); targetObjectId != "" {
return nil
}

View file

@ -5,7 +5,6 @@ import (
"fmt"
"strings"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/ipfs/go-cid"
"github.com/anyproto/anytype-heart/core/block"
@ -44,9 +43,9 @@ func NewIconSyncer(service *block.Service, resolver idresolver.Resolver, fileSto
}
}
func (s *IconSyncer) Sync(id domain.FullID, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, b simple.Block, origin objectorigin.ObjectOrigin) error {
func (s *IconSyncer) Sync(id domain.FullID, newIdsSet map[string]struct{}, b simple.Block, origin objectorigin.ObjectOrigin) error {
iconImage := b.Model().GetText().GetIconImage()
newId, err := s.handleIconImage(id.SpaceID, snapshotPayloads, iconImage, origin)
newId, err := s.handleIconImage(id.SpaceID, newIdsSet, iconImage, origin)
if err != nil {
return fmt.Errorf("%w: %w", common.ErrFileLoad, err)
}
@ -71,8 +70,8 @@ func (s *IconSyncer) Sync(id domain.FullID, snapshotPayloads map[string]treestor
return nil
}
func (s *IconSyncer) handleIconImage(spaceId string, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, iconImage string, origin objectorigin.ObjectOrigin) (string, error) {
if _, ok := snapshotPayloads[iconImage]; ok {
func (s *IconSyncer) handleIconImage(spaceId string, newIdsSet map[string]struct{}, iconImage string, origin objectorigin.ObjectOrigin) (string, error) {
if _, ok := newIdsSet[iconImage]; ok {
return iconImage, nil
}
_, err := cid.Decode(iconImage)

View file

@ -4,7 +4,6 @@ import (
"context"
"strings"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/ipfs/go-cid"
"github.com/anyproto/anytype-heart/core/block"
@ -32,9 +31,9 @@ func NewFileRelationSyncer(service *block.Service, fileStore filestore.FileStore
}
}
func (fs *FileRelationSyncer) Sync(spaceID string, fileId string, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, origin objectorigin.ObjectOrigin) string {
func (fs *FileRelationSyncer) Sync(spaceID string, fileId string, newIdsSet map[string]struct{}, origin objectorigin.ObjectOrigin) string {
// If file is created during import, do nothing
if _, ok := snapshotPayloads[fileId]; ok {
if _, ok := newIdsSet[fileId]; ok {
return fileId
}

View file

@ -1,13 +1,11 @@
package syncer
import (
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/domain/objectorigin"
)
type Syncer interface {
Sync(id domain.FullID, snapshotPayloads map[string]treestorage.TreeStorageCreatePayload, b simple.Block, origin objectorigin.ObjectOrigin) error
Sync(id domain.FullID, newIdsSet map[string]struct{}, b simple.Block, origin objectorigin.ObjectOrigin) error
}

View file

@ -139,7 +139,7 @@ func (i *Import) Import(ctx context.Context,
var rootCollectionId string
if c, ok := i.converters[req.Type.String()]; ok {
rootCollectionId, returnedErr = i.importFromBuiltinConverter(ctx, req, c, progress, origin)
return rootCollectionId, "", returnedErr
return rootCollectionId, progress.Id(), returnedErr
}
if req.Type == model.Import_External {
returnedErr = i.importFromExternalSource(ctx, req, progress)

View file

@ -1,33 +0,0 @@
package objectcreator
import (
"context"
"fmt"
"github.com/gogo/protobuf/types"
"github.com/anyproto/anytype-heart/core/block/bookmark"
simpleBookmark "github.com/anyproto/anytype-heart/core/block/simple/bookmark"
"github.com/anyproto/anytype-heart/pb"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
"github.com/anyproto/anytype-heart/util/pbtypes"
"github.com/anyproto/anytype-heart/util/uri"
)
// createBookmark creates a new Bookmark object for provided URL or returns id of existing one
func (s *service) createBookmark(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error) {
source := pbtypes.GetString(req.Details, bundle.RelationKeySource.String())
var res bookmark.ContentFuture
if source != "" {
u, err := uri.NormalizeURI(source)
if err != nil {
return "", nil, fmt.Errorf("process uri: %w", err)
}
res = s.bookmark.FetchBookmarkContent(req.SpaceId, u, false)
} else {
res = func() *simpleBookmark.ObjectContent {
return nil
}
}
return s.bookmark.CreateBookmarkObject(ctx, spaceId, req.Details, res)
}

View file

@ -6,9 +6,10 @@ import (
"github.com/anyproto/any-sync/app"
"github.com/gogo/protobuf/types"
"github.com/pkg/errors"
"github.com/anyproto/anytype-heart/core/block/bookmark"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/restriction"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/files"
"github.com/anyproto/anytype-heart/pb"
@ -49,10 +50,14 @@ type Service interface {
app.Component
}
type bookmarkService interface {
CreateObjectAndFetch(ctx context.Context, spaceId string, req *pb.RpcObjectCreateBookmarkRequest) (objectID string, newDetails *types.Struct, err error)
}
type service struct {
objectStore objectstore.ObjectStore
collectionService CollectionService
bookmark bookmark.Service
bookmarkService bookmarkService
app *app.App
spaceService space.Service
templateService TemplateService
@ -65,7 +70,7 @@ func NewCreator() Service {
func (s *service) Init(a *app.App) (err error) {
s.objectStore = a.MustComponent(objectstore.CName).(objectstore.ObjectStore)
s.bookmark = a.MustComponent(bookmark.CName).(bookmark.Service)
s.bookmarkService = app.MustComponent[bookmarkService](a)
s.collectionService = app.MustComponent[CollectionService](a)
s.spaceService = app.MustComponent[space.Service](a)
s.templateService = app.MustComponent[TemplateService](a)
@ -106,6 +111,8 @@ func (s *service) CreateObjectUsingObjectUniqueTypeKey(
return s.CreateObject(ctx, spaceID, req)
}
// createObjectInSpace is supposed to be called for user-initiated object creation requests
// will return Restricted error in case called with types like File or Participant
func (s *service) createObjectInSpace(
ctx context.Context, space clientspace.Space, req CreateObjectRequest,
) (id string, details *types.Struct, err error) {
@ -115,9 +122,14 @@ func (s *service) createObjectInSpace(
}
details = internalflag.PutToDetails(details, req.InternalFlags)
if bundle.HasObjectTypeByKey(req.ObjectTypeKey) {
if t := bundle.MustGetType(req.ObjectTypeKey); t.RestrictObjectCreation {
return "", nil, errors.Wrap(restriction.ErrRestricted, "creation of this object type is restricted")
}
}
switch req.ObjectTypeKey {
case bundle.TypeKeyBookmark:
return s.createBookmark(ctx, space.Id(), &pb.RpcObjectCreateBookmarkRequest{
return s.bookmarkService.CreateObjectAndFetch(ctx, space.Id(), &pb.RpcObjectCreateBookmarkRequest{
Details: details,
})
case bundle.TypeKeySet:

View file

@ -5,6 +5,7 @@ import (
"strings"
"time"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/gogo/protobuf/types"
"golang.org/x/exp/slices"
@ -26,6 +27,18 @@ type eventKey int
const eventCreate eventKey = 0
type CreateOptions struct {
payload *treestorage.TreeStorageCreatePayload
}
type CreateOption func(opts *CreateOptions)
func WithPayload(payload *treestorage.TreeStorageCreatePayload) CreateOption {
return func(opts *CreateOptions) {
opts.payload = payload
}
}
// CreateSmartBlockFromState create new object from the provided `createState` and `details`.
// If you pass `details` into the function, it will automatically add missing relationLinks and override the details from the `createState`
// It will return error if some of the relation keys in `details` not installed in the workspace.
@ -41,6 +54,12 @@ func (s *service) CreateSmartBlockFromState(
func (s *service) CreateSmartBlockFromStateInSpace(
ctx context.Context, spc clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State,
) (id string, newDetails *types.Struct, err error) {
return s.CreateSmartBlockFromStateInSpaceWithOptions(ctx, spc, objectTypeKeys, createState)
}
func (s *service) CreateSmartBlockFromStateInSpaceWithOptions(
ctx context.Context, spc clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State, opts ...CreateOption,
) (id string, newDetails *types.Struct, err error) {
if createState == nil {
createState = state.NewDoc("", nil).(*state.State)
@ -74,7 +93,7 @@ func (s *service) CreateSmartBlockFromStateInSpace(
}
}
sb, err := createSmartBlock(ctx, spc, initFunc, createState, sbType)
sb, err := createSmartBlock(ctx, spc, initFunc, createState, sbType, opts...)
if err != nil {
return "", nil, err
}
@ -120,7 +139,7 @@ func objectTypeKeysToSmartBlockType(typeKeys []domain.TypeKey) coresb.SmartBlock
}
func createSmartBlock(
ctx context.Context, spc clientspace.Space, initFunc objectcache.InitFunc, st *state.State, sbType coresb.SmartBlockType,
ctx context.Context, spc clientspace.Space, initFunc objectcache.InitFunc, st *state.State, sbType coresb.SmartBlockType, opts ...CreateOption,
) (smartblock.SmartBlock, error) {
if uKey := st.UniqueKeyInternal(); uKey != "" {
uk, err := domain.NewUniqueKey(sbType, uKey)
@ -139,6 +158,15 @@ func createSmartBlock(
})
}
}
createOpts := &CreateOptions{}
for _, opt := range opts {
opt(createOpts)
}
if createOpts.payload != nil {
return spc.CreateTreeObjectWithPayload(ctx, *createOpts.payload, initFunc)
}
return spc.CreateTreeObject(ctx, objectcache.TreeCreationParams{
Time: time.Now(),
SmartblockType: sbType,

View file

@ -61,7 +61,7 @@ func (s *service) listAllTypesAndRelations(spaceId string) (map[string]*types.St
func reviseSystemObject(space clientspace.Space, localObject *types.Struct, marketObjects map[string]*types.Struct) {
source := pbtypes.GetString(localObject, bundle.RelationKeySourceObject.String())
marketObject, found := marketObjects[source]
if !found || !isSystemObject(localObject) || pbtypes.GetInt64(marketObject, revisionKey) < pbtypes.GetInt64(localObject, revisionKey) {
if !found || !isSystemObject(localObject) || pbtypes.GetInt64(marketObject, revisionKey) <= pbtypes.GetInt64(localObject, revisionKey) {
return
}
details := buildDiffDetails(marketObject, localObject)
@ -98,10 +98,17 @@ func buildDiffDetails(origin, current *types.Struct) (details []*pb.RpcObjectSet
bundle.RelationKeyName.String(), bundle.RelationKeyDescription.String(),
bundle.RelationKeyIsReadonly.String(), bundle.RelationKeyIsHidden.String(),
bundle.RelationKeyRevision.String(), bundle.RelationKeyRelationReadonlyValue.String(),
bundle.RelationKeyRelationMaxCount.String(),
bundle.RelationKeyRelationMaxCount.String(), bundle.RelationKeyTargetObjectType.String(),
})
for key, value := range diff.Fields {
if key == bundle.RelationKeyTargetObjectType.String() {
// special case. We don't want to remove the types that was set by user, so only add ones that we have
currentList := pbtypes.GetStringList(current, bundle.RelationKeyTargetObjectType.String())
missedInCurrent, _ := lo.Difference(pbtypes.GetStringList(origin, bundle.RelationKeyTargetObjectType.String()), currentList)
currentList = append(currentList, missedInCurrent...)
value = pbtypes.StringList(currentList)
}
details = append(details, &pb.RpcObjectSetDetailsDetail{Key: key, Value: value})
}
return

View file

@ -209,20 +209,25 @@ func (s *service) getObjectRestrictions(rh RestrictionHolder) (r ObjectRestricti
}
func GetRestrictionsForUniqueKey(uk domain.UniqueKey) (r ObjectRestrictions) {
r = objectRestrictionsBySBType[uk.SmartblockType()]
switch uk.SmartblockType() {
case smartblock.SmartBlockTypeObjectType:
key := uk.InternalKey()
if lo.Contains(bundle.SystemTypes, domain.TypeKey(key)) {
return sysTypesRestrictions
r = sysTypesRestrictions
}
if t, _ := bundle.GetType(domain.TypeKey(key)); t != nil && t.RestrictObjectCreation {
r = append(r, model.Restrictions_CreateObjectOfThisType)
}
return r
case smartblock.SmartBlockTypeRelation:
key := uk.InternalKey()
if lo.Contains(bundle.SystemRelations, domain.RelationKey(key)) {
return sysRelationsRestrictions
r = sysRelationsRestrictions
}
}
// we assume that all sb types exist in objectRestrictionsBySBType
return objectRestrictionsBySBType[uk.SmartblockType()]
return r
}
func GetDataviewRestrictionsForUniqueKey(uk domain.UniqueKey) DataviewRestrictions {

View file

@ -47,10 +47,17 @@ func TestService_ObjectRestrictionsById(t *testing.T) {
), ErrRestricted)
})
t.Run("system type restricted creation", func(t *testing.T) {
assert.ErrorIs(t, rest.GetRestrictions(givenObjectType(bundle.TypeKeyParticipant)).Object.Check(
model.Restrictions_CreateObjectOfThisType,
), ErrRestricted)
})
t.Run("ordinary type", func(t *testing.T) {
assert.NoError(t, rest.GetRestrictions(givenObjectType(bundle.TypeKeyDailyPlan)).Object.Check(
model.Restrictions_Details,
model.Restrictions_Delete,
model.Restrictions_CreateObjectOfThisType,
))
})

View file

@ -798,7 +798,7 @@ func (s *Service) CreateObjectFromUrl(ctx context.Context, req *pb.RpcObjectCrea
return "", nil, err
}
res := s.bookmark.FetchBookmarkContent(req.SpaceId, url, true)
res := s.bookmark.FetchBookmarkContent(req.SpaceId, url, req.AddPageContent)
content := res()
shouldUpdateDetails := s.updateBookmarkContentWithUserDetails(req.Details, objectDetails, content)
if shouldUpdateDetails {

View file

@ -218,3 +218,7 @@ func (b *Bookmark) FillSmartIds(ids []string) []string {
func (b *Bookmark) HasSmartIds() bool {
return b.content.TargetObjectId != ""
}
func (l *Bookmark) IsEmpty() bool {
return l.content.TargetObjectId == ""
}

View file

@ -516,3 +516,7 @@ func (s *Dataview) UpdateRelationOld(relationKey string, rel model.Relation) err
return nil
}
func (d *Dataview) IsEmpty() bool {
return d.content.TargetObjectId == "" && len(d.content.Views) == 0
}

View file

@ -96,3 +96,7 @@ func (l *Latex) ApplyEvent(e *pb.EventBlockSetLatex) error {
}
return nil
}
func (l *Latex) IsEmpty() bool {
return l.content.Text == ""
}

View file

@ -241,6 +241,10 @@ func (f *File) HasSmartIds() bool {
return f.content.TargetObjectId != ""
}
func (f *File) IsEmpty() bool {
return f.content.TargetObjectId == "" && f.content.Hash == ""
}
func DetectTypeByMIME(mime string) model.BlockContentFileType {
if mill.IsImage(mime) {
return model.BlockContentFile_Image

View file

@ -73,14 +73,3 @@ func TestFile_Diff(t *testing.T) {
}), diff)
})
}
func TestFile_Validate(t *testing.T) {
t.Run("not validated", func(t *testing.T) {
b := NewFile(&model.Block{
Restrictions: &model.BlockRestrictions{},
Content: &model.BlockContentOfFile{File: &model.BlockContentFile{State: model.BlockContentFile_Done, Size_: 0}},
}).(*File)
err := b.Validate()
assert.NoError(t, err)
})
}

View file

@ -188,3 +188,7 @@ func (l *Link) ToText(targetDetails *types.Struct) simple.Block {
}
return simple.New(m)
}
func (l *Link) IsEmpty() bool {
return l.content.TargetBlockId == ""
}

View file

@ -136,12 +136,10 @@ func (m *subObjectsAndProfileLinksMigration) Migrate(s *state.State) {
func (m *subObjectsAndProfileLinksMigration) migrateId(oldId string) (newId string) {
if m.profileID != "" && m.identityObjectID != "" {
// we substitute all links to profile object with identity object EXCEPT the case with
// widget to identity in Personal space, we must substitute identity with profile to show links correctly
if oldId == m.profileID && (m.space.Id() != m.personalSpaceId || m.sbType != smartblock.SmartBlockTypeWidget) {
// we substitute all links to profile object with space member object
if oldId == m.profileID ||
strings.HasPrefix(oldId, "_id_") { // we don't need to check the exact accountID here, because we only have links to our own identity
return m.identityObjectID
} else if oldId == m.identityObjectID && m.space.Id() == m.personalSpaceId && m.sbType == smartblock.SmartBlockTypeWidget {
return m.profileID
}
}
uniqueKey, valid := subObjectIdToUniqueKey(oldId)

View file

@ -152,7 +152,7 @@ func (s *service) createCustomTemplateState(templateId string) (targetState *sta
return
}
targetState.RemoveDetail(bundle.RelationKeyTargetObjectType.String(), bundle.RelationKeyTemplateIsBundled.String())
targetState.RemoveDetail(bundle.RelationKeyTargetObjectType.String(), bundle.RelationKeyTemplateIsBundled.String(), bundle.RelationKeyOrigin.String())
targetState.SetDetailAndBundledRelation(bundle.RelationKeySourceObject, pbtypes.String(sb.Id()))
targetState.SetLocalDetails(nil)
return

View file

@ -44,7 +44,7 @@ func (p *pbc) Convert(sbType model.SmartBlockType) []byte {
Snapshot: snapshot,
}
if p.isJSON {
m := jsonpb.Marshaler{Indent: " "}
m := jsonpb.Marshaler{Indent: " ", EmitDefaults: true}
result, err := m.MarshalToString(mo)
if err != nil {
log.Errorf("failed to convert object to json: %s", err)

View file

@ -101,6 +101,21 @@ func (mw *Middleware) DebugSpaceSummary(cctx context.Context, req *pb.RpcDebugSp
return response(nil, spaceSummary)
}
func (mw *Middleware) DebugStat(ctx context.Context, request *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse {
debugService := mw.applicationService.GetApp().MustComponent(debug.CName).(debug.Debug)
debugStat, err := debugService.DebugStat()
code := mapErrorCode(err,
errToCode(err, pb.RpcDebugStatResponseError_UNKNOWN_ERROR),
)
return &pb.RpcDebugStatResponse{
JsonStat: debugStat,
Error: &pb.RpcDebugStatResponseError{
Code: code,
Description: getErrorDescription(err),
},
}
}
func (mw *Middleware) DebugStackGoroutines(_ context.Context, req *pb.RpcDebugStackGoroutinesRequest) *pb.RpcDebugStackGoroutinesResponse {
response := func(err error) (res *pb.RpcDebugStackGoroutinesResponse) {
res = &pb.RpcDebugStackGoroutinesResponse{

View file

@ -3,6 +3,7 @@ package debug
import (
"archive/zip"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
@ -13,6 +14,7 @@ import (
"time"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/debugstat"
"github.com/anyproto/any-sync/commonspace/objecttreebuilder"
"github.com/go-chi/chi/v5"
"github.com/gogo/protobuf/jsonpb"
@ -36,6 +38,7 @@ func New() Debug {
type Debug interface {
app.Component
DebugStat() (string, error)
DumpTree(ctx context.Context, objectID string, path string, anonymize bool, withSvg bool) (filename string, err error)
DumpLocalstore(ctx context.Context, spaceID string, objectIds []string, path string) (filename string, err error)
SpaceSummary(ctx context.Context, spaceID string) (summary SpaceSummary, err error)
@ -47,6 +50,7 @@ type debug struct {
store objectstore.ObjectStore
spaceService space.Service
resolver idresolver.Resolver
statService debugstat.StatService
server *http.Server
}
@ -60,7 +64,10 @@ func (d *debug) Init(a *app.App) (err error) {
d.block = a.MustComponent(block.CName).(*block.Service)
d.spaceService = app.MustComponent[space.Service](a)
d.resolver = app.MustComponent[idresolver.Resolver](a)
d.statService, _ = a.Component(debugstat.CName).(debugstat.StatService)
if d.statService == nil {
d.statService = debugstat.NewNoOp()
}
d.initHandlers(a)
return nil
}
@ -139,6 +146,15 @@ func (d *debug) SpaceSummary(ctx context.Context, spaceID string) (summary Space
return
}
func (d *debug) DebugStat() (string, error) {
stats := d.statService.GetStat()
marshaled, err := json.Marshal(stats)
if err != nil {
return "", err
}
return string(marshaled), nil
}
func (d *debug) TreeHeads(ctx context.Context, id string) (info TreeInfo, err error) {
spcID, err := d.resolver.ResolveSpaceID(id)
if err != nil {

View file

@ -21,6 +21,8 @@ var smartBlockTypeToKey = map[smartblock.SmartBlockType]string{
smartblock.SmartBlockTypeWidget: "widget",
smartblock.SmartBlockTypeSpaceView: "spaceview",
smartblock.SmartBlockTypeFileObject: "file", // For migration purposes only
smartblock.SmartBlockTypePage: "page", // For migration purposes only, used for old profile data migration
}
// UniqueKey is unique key composed of two parts: smartblock type and internal key.

View file

@ -178,35 +178,15 @@ func (ind *indexer) indexNext(ctx context.Context) error {
func (ind *indexer) indexFile(ctx context.Context, id domain.FullID, fileId domain.FullFileId) error {
defer ind.markIndexingDone(id)
details, typeKey, err := ind.buildDetails(ctx, fileId)
if errors.Is(err, domain.ErrFileNotFound) {
log.Errorf("build details: %v", err)
return ind.markFileAsNotFound(id)
}
if err != nil {
return fmt.Errorf("build details: %w", err)
}
space, err := ind.spaceService.Get(ctx, id.SpaceID)
if err != nil {
return fmt.Errorf("get space: %w", err)
}
err = space.Do(id.ObjectID, func(sb smartblock.SmartBlock) error {
st := sb.NewState()
st.SetObjectTypeKey(typeKey)
prevDetails := st.CombinedDetails()
keys := make([]domain.RelationKey, 0, len(details.Fields))
for k := range details.Fields {
keys = append(keys, domain.RelationKey(k))
}
st.AddBundledRelations(keys...)
details = pbtypes.StructMerge(prevDetails, details, true)
st.SetDetails(details)
err = ind.addBlocks(st, details, id.ObjectID)
err := ind.injectMetadataToState(ctx, st, fileId, id)
if err != nil {
return fmt.Errorf("add blocks: %w", err)
return fmt.Errorf("inject metadata to state: %w", err)
}
return sb.Apply(st)
})
@ -216,16 +196,38 @@ func (ind *indexer) indexFile(ctx context.Context, id domain.FullID, fileId doma
return nil
}
func (ind *indexer) markFileAsNotFound(id domain.FullID) error {
space, err := ind.spaceService.Get(ind.indexCtx, id.SpaceID)
if err != nil {
return fmt.Errorf("get space: %w", err)
func (ind *indexer) injectMetadataToState(ctx context.Context, st *state.State, fileId domain.FullFileId, id domain.FullID) error {
details, typeKey, err := ind.buildDetails(ctx, fileId)
if errors.Is(err, domain.ErrFileNotFound) {
log.Errorf("build details: %v", err)
ind.markFileAsNotFound(st)
return nil
}
return space.Do(id.ObjectID, func(sb smartblock.SmartBlock) error {
st := sb.NewState()
st.SetDetailAndBundledRelation(bundle.RelationKeyFileIndexingStatus, pbtypes.Int64(int64(model.FileIndexingStatus_NotFound)))
return sb.Apply(st)
})
if err != nil {
return fmt.Errorf("build details: %w", err)
}
st.SetObjectTypeKey(typeKey)
prevDetails := st.CombinedDetails()
keys := make([]domain.RelationKey, 0, len(details.Fields))
for k := range details.Fields {
keys = append(keys, domain.RelationKey(k))
}
st.AddBundledRelations(keys...)
details = pbtypes.StructMerge(prevDetails, details, true)
st.SetDetails(details)
err = ind.addBlocks(st, details, id.ObjectID)
if err != nil {
return fmt.Errorf("add blocks: %w", err)
}
return nil
}
func (ind *indexer) markFileAsNotFound(st *state.State) {
st.SetDetailAndBundledRelation(bundle.RelationKeyFileIndexingStatus, pbtypes.Int64(int64(model.FileIndexingStatus_NotFound)))
}
func (ind *indexer) buildDetails(ctx context.Context, id domain.FullFileId) (details *types.Struct, typeKey domain.TypeKey, err error) {

View file

@ -608,6 +608,39 @@ func (_c *MockService_Init_Call) RunAndReturn(run func(*app.App) error) *MockSer
return _c
}
// InitEmptyFileState provides a mock function with given fields: st
func (_m *MockService) InitEmptyFileState(st *state.State) {
_m.Called(st)
}
// MockService_InitEmptyFileState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InitEmptyFileState'
type MockService_InitEmptyFileState_Call struct {
*mock.Call
}
// InitEmptyFileState is a helper method to define mock.On call
// - st *state.State
func (_e *MockService_Expecter) InitEmptyFileState(st interface{}) *MockService_InitEmptyFileState_Call {
return &MockService_InitEmptyFileState_Call{Call: _e.mock.On("InitEmptyFileState", st)}
}
func (_c *MockService_InitEmptyFileState_Call) Run(run func(st *state.State)) *MockService_InitEmptyFileState_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(*state.State))
})
return _c
}
func (_c *MockService_InitEmptyFileState_Call) Return() *MockService_InitEmptyFileState_Call {
_c.Call.Return()
return _c
}
func (_c *MockService_InitEmptyFileState_Call) RunAndReturn(run func(*state.State)) *MockService_InitEmptyFileState_Call {
_c.Call.Return(run)
return _c
}
// MigrateBlocks provides a mock function with given fields: st, spc, keys
func (_m *MockService) MigrateBlocks(st *state.State, spc source.Space, keys []*pb.ChangeFileKeys) {
_m.Called(st, spc, keys)

View file

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"time"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
@ -12,6 +13,9 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/editor/template"
"github.com/anyproto/anytype-heart/core/block/object/objectcreator"
"github.com/anyproto/anytype-heart/core/block/object/payloadcreator"
"github.com/anyproto/anytype-heart/core/block/simple"
"github.com/anyproto/anytype-heart/core/block/source"
"github.com/anyproto/anytype-heart/core/domain"
@ -41,6 +45,7 @@ const CName = "fileobject"
type Service interface {
app.ComponentRunnable
InitEmptyFileState(st *state.State)
DeleteFileData(objectId string) error
Create(ctx context.Context, spaceId string, req CreateRequest) (id string, object *types.Struct, err error)
CreateFromImport(fileId domain.FullFileId, origin objectorigin.ObjectOrigin) (string, error)
@ -55,7 +60,7 @@ type Service interface {
}
type objectCreatorService interface {
CreateSmartBlockFromStateInSpace(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State) (id string, newDetails *types.Struct, err error)
CreateSmartBlockFromStateInSpaceWithOptions(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State, opts ...objectcreator.CreateOption) (id string, newDetails *types.Struct, err error)
}
type service struct {
@ -98,10 +103,21 @@ func (s *service) Close(ctx context.Context) error {
}
type CreateRequest struct {
FileId domain.FileId
EncryptionKeys map[string]string
ObjectOrigin objectorigin.ObjectOrigin
AdditionalDetails *types.Struct
FileId domain.FileId
EncryptionKeys map[string]string
ObjectOrigin objectorigin.ObjectOrigin
AdditionalDetails *types.Struct
AsyncMetadataIndexing bool
}
func (s *service) InitEmptyFileState(st *state.State) {
template.InitTemplate(st,
template.WithEmpty,
template.WithTitle,
template.WithDefaultFeaturedRelations,
template.WithFeaturedRelations,
template.WithAllBlocksEditsRestricted,
)
}
func (s *service) Create(ctx context.Context, spaceId string, req CreateRequest) (id string, object *types.Struct, err error) {
@ -128,32 +144,49 @@ func (s *service) createInSpace(ctx context.Context, space clientspace.Space, re
}
details := s.makeInitialDetails(req.FileId, req.ObjectOrigin)
if req.AdditionalDetails != nil {
for k, v := range req.AdditionalDetails.GetFields() {
if _, ok := details.Fields[k]; !ok {
details.Fields[k] = pbtypes.CopyVal(v)
}
}
payload, err := space.CreateTreePayload(ctx, payloadcreator.PayloadCreationParams{
Time: time.Now(),
SmartblockType: coresb.SmartBlockTypeFileObject,
})
if err != nil {
return "", nil, fmt.Errorf("create tree payload: %w", err)
}
createState := state.NewDoc("", nil).(*state.State)
createState := state.NewDoc(payload.RootRawChange.Id, nil).(*state.State)
createState.SetDetails(details)
createState.SetFileInfo(state.FileInfo{
FileId: req.FileId,
EncryptionKeys: req.EncryptionKeys,
})
if !req.AsyncMetadataIndexing {
s.InitEmptyFileState(createState)
fullFileId := domain.FullFileId{SpaceId: space.Id(), FileId: req.FileId}
fullObjectId := domain.FullID{SpaceID: space.Id(), ObjectID: payload.RootRawChange.Id}
err := s.indexer.injectMetadataToState(ctx, createState, fullFileId, fullObjectId)
if err != nil {
return "", nil, fmt.Errorf("inject metadata to state: %w", err)
}
}
if req.AdditionalDetails != nil {
for k, v := range req.AdditionalDetails.GetFields() {
createState.SetDetailAndBundledRelation(domain.RelationKey(k), v)
}
}
// Type will be changed after indexing, just use general type File for now
id, object, err = s.objectCreator.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyFile}, createState)
id, object, err = s.objectCreator.CreateSmartBlockFromStateInSpaceWithOptions(ctx, space, []domain.TypeKey{bundle.TypeKeyFile}, createState, objectcreator.WithPayload(&payload))
if err != nil {
return "", nil, fmt.Errorf("create object: %w", err)
}
err = s.indexer.addToQueue(ctx, domain.FullID{SpaceID: space.Id(), ObjectID: id}, domain.FullFileId{SpaceId: space.Id(), FileId: req.FileId})
if err != nil {
// Will be retried in background, so don't return error
log.Errorf("add to index queue: %v", err)
err = nil
if req.AsyncMetadataIndexing {
err = s.indexer.addToQueue(ctx, domain.FullID{SpaceID: space.Id(), ObjectID: id}, domain.FullFileId{SpaceId: space.Id(), FileId: req.FileId})
if err != nil {
// Will be retried in background, so don't return error
log.Errorf("add to index queue: %v", err)
}
}
return id, object, nil
@ -174,7 +207,7 @@ func (s *service) migrateDeriveObject(ctx context.Context, space clientspace.Spa
})
// Type will be changed after indexing, just use general type File for now
id, _, err := s.objectCreator.CreateSmartBlockFromStateInSpace(ctx, space, []domain.TypeKey{bundle.TypeKeyFile}, createState)
id, _, err := s.objectCreator.CreateSmartBlockFromStateInSpaceWithOptions(ctx, space, []domain.TypeKey{bundle.TypeKeyFile}, createState)
if errors.Is(err, treestorage.ErrTreeExists) {
return nil
}
@ -233,9 +266,10 @@ func (s *service) CreateFromImport(fileId domain.FullFileId, origin objectorigin
return "", fmt.Errorf("get file keys: %w", err)
}
fileObjectId, _, err = s.Create(context.Background(), fileId.SpaceId, CreateRequest{
FileId: fileId.FileId,
EncryptionKeys: keys,
ObjectOrigin: origin,
FileId: fileId.FileId,
EncryptionKeys: keys,
ObjectOrigin: origin,
AsyncMetadataIndexing: true,
})
if err != nil {
return "", fmt.Errorf("create object: %w", err)

View file

@ -16,6 +16,7 @@ import (
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/editor/state"
"github.com/anyproto/anytype-heart/core/block/object/objectcreator"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/core/domain/objectorigin"
"github.com/anyproto/anytype-heart/core/event/mock_event"
@ -109,7 +110,7 @@ func (c *objectCreatorStub) Name() string {
return "objectCreatorStub"
}
func (c *objectCreatorStub) CreateSmartBlockFromStateInSpace(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State) (id string, newDetails *types.Struct, err error) {
func (c *objectCreatorStub) CreateSmartBlockFromStateInSpaceWithOptions(ctx context.Context, space clientspace.Space, objectTypeKeys []domain.TypeKey, createState *state.State, opts ...objectcreator.CreateOption) (id string, newDetails *types.Struct, err error) {
c.creationState = createState
return c.objectId, c.details, nil
}

View file

@ -127,9 +127,8 @@ func (f *fileSync) Run(ctx context.Context) (err error) {
return
}
go f.runNodeUsageUpdater()
f.loopCtx, f.loopCancel = context.WithCancel(context.Background())
go f.runNodeUsageUpdater()
go f.addLoop()
go f.removeLoop()
return

View file

@ -251,6 +251,9 @@ func (s *service) cacheProfileDetails(details *types.Struct) {
Description: pbtypes.GetString(details, bundle.RelationKeyDescription.String()),
IconCid: pbtypes.GetString(details, bundle.RelationKeyIconImage.String()),
}
s.lock.RLock()
defer s.lock.RUnlock()
observers, ok := s.identityObservers[s.myIdentity]
if ok {
for _, obs := range observers {

View file

@ -29,7 +29,7 @@ type fixture struct {
coordinatorClient *inMemoryIdentityRepo
}
const testObserverPeriod = 5 * time.Millisecond
const testObserverPeriod = 1 * time.Millisecond
func newFixture(t *testing.T) *fixture {
ctx := context.Background()
@ -188,7 +188,7 @@ func TestObservers(t *testing.T) {
})
require.NoError(t, err)
time.Sleep(testObserverPeriod)
time.Sleep(testObserverPeriod * 2)
err = fx.identityRepoClient.IdentityRepoPut(context.Background(), identity, []*identityrepoproto.Data{
{
@ -206,7 +206,7 @@ func TestObservers(t *testing.T) {
}
wantData2 := marshalProfile(t, wantProfile2, profileSymKey)
time.Sleep(testObserverPeriod)
time.Sleep(testObserverPeriod * 2)
err = fx.identityRepoClient.IdentityRepoPut(context.Background(), identity, []*identityrepoproto.Data{
{
Kind: identityRepoDataKind,

View file

@ -26,7 +26,7 @@ import (
const (
// ForceObjectsReindexCounter reindex thread-based objects
ForceObjectsReindexCounter int32 = 15
ForceObjectsReindexCounter int32 = 16
// ForceFilesReindexCounter reindex ipfs-file-based objects
ForceFilesReindexCounter int32 = 11 //
@ -36,7 +36,7 @@ const (
// ForceIdxRebuildCounter erases localstore indexes and reindex all type of objects
// (no need to increase ForceObjectsReindexCounter & ForceFilesReindexCounter)
ForceIdxRebuildCounter int32 = 63
ForceIdxRebuildCounter int32 = 62
// ForceFulltextIndexCounter performs fulltext indexing for all type of objects (useful when we change fulltext config)
ForceFulltextIndexCounter int32 = 6
@ -431,6 +431,7 @@ func (i *indexer) saveLatestChecksums(spaceID string) error {
FilesForceReindexCounter: ForceFilesReindexCounter,
IdxRebuildCounter: ForceIdxRebuildCounter,
FulltextRebuild: ForceFulltextIndexCounter,
FulltextErase: ForceFulltextEraseCounter,
BundledObjects: ForceBundledObjectsReindexCounter,
FilestoreKeysForceReindexCounter: ForceFilestoreKeysReindexCounter,
}

View file

@ -96,7 +96,7 @@ func (s *service) RemoveInvite(ctx context.Context, id cid.Cid) error {
if err != nil {
return fmt.Errorf("offload file: %w", err)
}
return s.fileSyncService.RemoveSynchronously(s.techSpaceId, domain.FileId(id.String()))
return s.fileSyncService.RemoveFile(s.techSpaceId, domain.FileId(id.String()))
}
func (s *service) GetInvite(ctx context.Context, id cid.Cid, key crypto.SymKey) (*model.Invite, error) {

View file

@ -82,10 +82,17 @@ func (mw *Middleware) SpaceInviteGetCurrent(cctx context.Context, req *pb.RpcSpa
}
func (mw *Middleware) SpaceInviteRevoke(cctx context.Context, req *pb.RpcSpaceInviteRevokeRequest) *pb.RpcSpaceInviteRevokeResponse {
aclService := mw.applicationService.GetApp().MustComponent(acl.CName).(acl.AclService)
err := aclService.RevokeInvite(cctx, req.SpaceId)
code := mapErrorCode(err,
errToCode(space.ErrSpaceDeleted, pb.RpcSpaceInviteRevokeResponseError_SPACE_IS_DELETED),
errToCode(space.ErrSpaceNotExists, pb.RpcSpaceInviteRevokeResponseError_NO_SUCH_SPACE),
errToCode(acl.ErrAclRequestFailed, pb.RpcSpaceInviteRevokeResponseError_REQUEST_FAILED),
)
return &pb.RpcSpaceInviteRevokeResponse{
Error: &pb.RpcSpaceInviteRevokeResponseError{
Code: 1,
Description: getErrorDescription(fmt.Errorf("not implemented")),
Code: code,
Description: getErrorDescription(err),
},
}
}
@ -140,11 +147,34 @@ func (mw *Middleware) SpaceJoin(cctx context.Context, req *pb.RpcSpaceJoinReques
}
}
func (mw *Middleware) SpaceStopSharing(cctx context.Context, req *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse {
aclService := mw.applicationService.GetApp().MustComponent(acl.CName).(acl.AclService)
err := aclService.StopSharing(cctx, req.SpaceId)
code := mapErrorCode(err,
errToCode(space.ErrSpaceDeleted, pb.RpcSpaceStopSharingResponseError_SPACE_IS_DELETED),
errToCode(space.ErrSpaceNotExists, pb.RpcSpaceStopSharingResponseError_NO_SUCH_SPACE),
errToCode(acl.ErrAclRequestFailed, pb.RpcSpaceStopSharingResponseError_REQUEST_FAILED),
)
return &pb.RpcSpaceStopSharingResponse{
Error: &pb.RpcSpaceStopSharingResponseError{
Code: code,
Description: getErrorDescription(err),
},
}
}
func (mw *Middleware) SpaceJoinCancel(cctx context.Context, req *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse {
aclService := mw.applicationService.GetApp().MustComponent(acl.CName).(acl.AclService)
err := aclService.CancelJoin(cctx, req.SpaceId)
code := mapErrorCode(err,
errToCode(space.ErrSpaceDeleted, pb.RpcSpaceJoinCancelResponseError_SPACE_IS_DELETED),
errToCode(space.ErrSpaceNotExists, pb.RpcSpaceJoinCancelResponseError_NO_SUCH_SPACE),
errToCode(acl.ErrAclRequestFailed, pb.RpcSpaceJoinCancelResponseError_REQUEST_FAILED),
)
return &pb.RpcSpaceJoinCancelResponse{
Error: &pb.RpcSpaceJoinCancelResponseError{
Code: 1,
Description: getErrorDescription(fmt.Errorf("not implemented")),
Code: code,
Description: getErrorDescription(err),
},
}
}

View file

@ -539,6 +539,10 @@
- [Rpc.Debug.StackGoroutines.Request](#anytype-Rpc-Debug-StackGoroutines-Request)
- [Rpc.Debug.StackGoroutines.Response](#anytype-Rpc-Debug-StackGoroutines-Response)
- [Rpc.Debug.StackGoroutines.Response.Error](#anytype-Rpc-Debug-StackGoroutines-Response-Error)
- [Rpc.Debug.Stat](#anytype-Rpc-Debug-Stat)
- [Rpc.Debug.Stat.Request](#anytype-Rpc-Debug-Stat-Request)
- [Rpc.Debug.Stat.Response](#anytype-Rpc-Debug-Stat-Response)
- [Rpc.Debug.Stat.Response.Error](#anytype-Rpc-Debug-Stat-Response-Error)
- [Rpc.Debug.Subscriptions](#anytype-Rpc-Debug-Subscriptions)
- [Rpc.Debug.Subscriptions.Request](#anytype-Rpc-Debug-Subscriptions-Request)
- [Rpc.Debug.Subscriptions.Response](#anytype-Rpc-Debug-Subscriptions-Response)
@ -955,6 +959,10 @@
- [Rpc.Space.RequestDecline.Request](#anytype-Rpc-Space-RequestDecline-Request)
- [Rpc.Space.RequestDecline.Response](#anytype-Rpc-Space-RequestDecline-Response)
- [Rpc.Space.RequestDecline.Response.Error](#anytype-Rpc-Space-RequestDecline-Response-Error)
- [Rpc.Space.StopSharing](#anytype-Rpc-Space-StopSharing)
- [Rpc.Space.StopSharing.Request](#anytype-Rpc-Space-StopSharing-Request)
- [Rpc.Space.StopSharing.Response](#anytype-Rpc-Space-StopSharing-Response)
- [Rpc.Space.StopSharing.Response.Error](#anytype-Rpc-Space-StopSharing-Response-Error)
- [Rpc.Template](#anytype-Rpc-Template)
- [Rpc.Template.Clone](#anytype-Rpc-Template-Clone)
- [Rpc.Template.Clone.Request](#anytype-Rpc-Template-Clone-Request)
@ -1164,6 +1172,7 @@
- [Rpc.Debug.Ping.Response.Error.Code](#anytype-Rpc-Debug-Ping-Response-Error-Code)
- [Rpc.Debug.SpaceSummary.Response.Error.Code](#anytype-Rpc-Debug-SpaceSummary-Response-Error-Code)
- [Rpc.Debug.StackGoroutines.Response.Error.Code](#anytype-Rpc-Debug-StackGoroutines-Response-Error-Code)
- [Rpc.Debug.Stat.Response.Error.Code](#anytype-Rpc-Debug-Stat-Response-Error-Code)
- [Rpc.Debug.Subscriptions.Response.Error.Code](#anytype-Rpc-Debug-Subscriptions-Response-Error-Code)
- [Rpc.Debug.Tree.Response.Error.Code](#anytype-Rpc-Debug-Tree-Response-Error-Code)
- [Rpc.Debug.TreeHeads.Response.Error.Code](#anytype-Rpc-Debug-TreeHeads-Response-Error-Code)
@ -1268,6 +1277,7 @@
- [Rpc.Space.ParticipantRemove.Response.Error.Code](#anytype-Rpc-Space-ParticipantRemove-Response-Error-Code)
- [Rpc.Space.RequestApprove.Response.Error.Code](#anytype-Rpc-Space-RequestApprove-Response-Error-Code)
- [Rpc.Space.RequestDecline.Response.Error.Code](#anytype-Rpc-Space-RequestDecline-Response-Error-Code)
- [Rpc.Space.StopSharing.Response.Error.Code](#anytype-Rpc-Space-StopSharing-Response-Error-Code)
- [Rpc.Template.Clone.Response.Error.Code](#anytype-Rpc-Template-Clone-Response-Error-Code)
- [Rpc.Template.CreateFromObject.Response.Error.Code](#anytype-Rpc-Template-CreateFromObject-Response-Error-Code)
- [Rpc.Template.ExportAll.Response.Error.Code](#anytype-Rpc-Template-ExportAll-Response-Error-Code)
@ -1692,6 +1702,7 @@
| SpaceJoin | [Rpc.Space.Join.Request](#anytype-Rpc-Space-Join-Request) | [Rpc.Space.Join.Response](#anytype-Rpc-Space-Join-Response) | |
| SpaceJoinCancel | [Rpc.Space.JoinCancel.Request](#anytype-Rpc-Space-JoinCancel-Request) | [Rpc.Space.JoinCancel.Response](#anytype-Rpc-Space-JoinCancel-Response) | |
| SpaceExit | [Rpc.Space.Exit.Request](#anytype-Rpc-Space-Exit-Request) | [Rpc.Space.Exit.Response](#anytype-Rpc-Space-Exit-Response) | |
| SpaceStopSharing | [Rpc.Space.StopSharing.Request](#anytype-Rpc-Space-StopSharing-Request) | [Rpc.Space.StopSharing.Response](#anytype-Rpc-Space-StopSharing-Response) | |
| SpaceRequestApprove | [Rpc.Space.RequestApprove.Request](#anytype-Rpc-Space-RequestApprove-Request) | [Rpc.Space.RequestApprove.Response](#anytype-Rpc-Space-RequestApprove-Response) | |
| SpaceRequestDecline | [Rpc.Space.RequestDecline.Request](#anytype-Rpc-Space-RequestDecline-Request) | [Rpc.Space.RequestDecline.Response](#anytype-Rpc-Space-RequestDecline-Response) | |
| SpaceParticipantRemove | [Rpc.Space.ParticipantRemove.Request](#anytype-Rpc-Space-ParticipantRemove-Request) | [Rpc.Space.ParticipantRemove.Response](#anytype-Rpc-Space-ParticipantRemove-Response) | |
@ -1864,6 +1875,7 @@
| BlockLatexSetText | [Rpc.BlockLatex.SetText.Request](#anytype-Rpc-BlockLatex-SetText-Request) | [Rpc.BlockLatex.SetText.Response](#anytype-Rpc-BlockLatex-SetText-Response) | |
| ProcessCancel | [Rpc.Process.Cancel.Request](#anytype-Rpc-Process-Cancel-Request) | [Rpc.Process.Cancel.Response](#anytype-Rpc-Process-Cancel-Response) | |
| LogSend | [Rpc.Log.Send.Request](#anytype-Rpc-Log-Send-Request) | [Rpc.Log.Send.Response](#anytype-Rpc-Log-Send-Response) | |
| DebugStat | [Rpc.Debug.Stat.Request](#anytype-Rpc-Debug-Stat-Request) | [Rpc.Debug.Stat.Response](#anytype-Rpc-Debug-Stat-Response) | |
| DebugTree | [Rpc.Debug.Tree.Request](#anytype-Rpc-Debug-Tree-Request) | [Rpc.Debug.Tree.Response](#anytype-Rpc-Debug-Tree-Response) | |
| DebugTreeHeads | [Rpc.Debug.TreeHeads.Request](#anytype-Rpc-Debug-TreeHeads-Request) | [Rpc.Debug.TreeHeads.Response](#anytype-Rpc-Debug-TreeHeads-Response) | |
| DebugSpaceSummary | [Rpc.Debug.SpaceSummary.Request](#anytype-Rpc-Debug-SpaceSummary-Request) | [Rpc.Debug.SpaceSummary.Response](#anytype-Rpc-Debug-SpaceSummary-Response) | |
@ -9672,6 +9684,58 @@ Get marks list in the selected range in text block.
<a name="anytype-Rpc-Debug-Stat"></a>
### Rpc.Debug.Stat
<a name="anytype-Rpc-Debug-Stat-Request"></a>
### Rpc.Debug.Stat.Request
<a name="anytype-Rpc-Debug-Stat-Response"></a>
### Rpc.Debug.Stat.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Debug.Stat.Response.Error](#anytype-Rpc-Debug-Stat-Response-Error) | | |
| jsonStat | [string](#string) | | |
<a name="anytype-Rpc-Debug-Stat-Response-Error"></a>
### Rpc.Debug.Stat.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Debug.Stat.Response.Error.Code](#anytype-Rpc-Debug-Stat-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-Debug-Subscriptions"></a>
### Rpc.Debug.Subscriptions
@ -11591,6 +11655,7 @@ Get the info for page alongside with info for all inbound and outbound links fro
| objectTypeUniqueKey | [string](#string) | | |
| url | [string](#string) | | |
| details | [google.protobuf.Struct](#google-protobuf-Struct) | | |
| addPageContent | [bool](#bool) | | |
@ -15464,8 +15529,6 @@ Available undo/redo operations
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| spaceId | [string](#string) | | |
| inviteCid | [string](#string) | | |
| inviteFileKey | [string](#string) | | |
@ -15732,6 +15795,62 @@ Available undo/redo operations
<a name="anytype-Rpc-Space-StopSharing"></a>
### Rpc.Space.StopSharing
<a name="anytype-Rpc-Space-StopSharing-Request"></a>
### Rpc.Space.StopSharing.Request
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| spaceId | [string](#string) | | |
<a name="anytype-Rpc-Space-StopSharing-Response"></a>
### Rpc.Space.StopSharing.Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| error | [Rpc.Space.StopSharing.Response.Error](#anytype-Rpc-Space-StopSharing-Response-Error) | | |
<a name="anytype-Rpc-Space-StopSharing-Response-Error"></a>
### Rpc.Space.StopSharing.Response.Error
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| code | [Rpc.Space.StopSharing.Response.Error.Code](#anytype-Rpc-Space-StopSharing-Response-Error-Code) | | |
| description | [string](#string) | | |
<a name="anytype-Rpc-Template"></a>
### Rpc.Template
@ -18607,6 +18726,19 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-Debug-Stat-Response-Error-Code"></a>
### Rpc.Debug.Stat.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | ... |
<a name="anytype-Rpc-Debug-Subscriptions-Response-Error-Code"></a>
### Rpc.Debug.Subscriptions.Response.Error.Code
@ -20034,6 +20166,22 @@ Middleware-to-front-end response, that can contain a NULL error or a non-NULL er
<a name="anytype-Rpc-Space-StopSharing-Response-Error-Code"></a>
### Rpc.Space.StopSharing.Response.Error.Code
| Name | Number | Description |
| ---- | ------ | ----------- |
| NULL | 0 | |
| UNKNOWN_ERROR | 1 | |
| BAD_INPUT | 2 | |
| NO_SUCH_SPACE | 101 | |
| SPACE_IS_DELETED | 102 | |
| REQUEST_FAILED | 103 | |
<a name="anytype-Rpc-Template-Clone-Response-Error-Code"></a>
### Rpc.Template.Clone.Response.Error.Code
@ -24670,6 +24818,7 @@ Used to decode block meta only, without the content itself
| installedByDefault | [bool](#bool) | | |
| key | [string](#string) | | name of objectType (can be localized for bundled types) |
| revision | [int64](#int64) | | revision of system objectType. Used to check if we should change type content or not |
| restrictObjectCreation | [bool](#bool) | | restricts creating objects of this type for users |
@ -25693,6 +25842,7 @@ RelationFormat describes how the underlying data is stored in the google.protobu
| LayoutChange | 6 | restricts layout changing |
| Template | 7 | restricts template creation from this object |
| Duplicate | 8 | restricts duplicate object |
| CreateObjectOfThisType | 9 | can be set only for types. Restricts creating objects of this type |

40
go.mod
View file

@ -7,7 +7,7 @@ require (
github.com/PuerkitoBio/goquery v1.8.1
github.com/VividCortex/ewma v1.2.0
github.com/adrium/goheif v0.0.0-20230113233934-ca402e77a786
github.com/anyproto/any-sync v0.3.25
github.com/anyproto/any-sync v0.3.32
github.com/anyproto/go-naturaldate/v2 v2.0.2-0.20230524105841-9829cfd13438
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
github.com/blevesearch/bleve/v2 v2.3.10
@ -31,7 +31,7 @@ require (
github.com/gogo/status v1.1.1
github.com/golang-jwt/jwt v3.2.2+incompatible
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
github.com/golang/snappy v0.0.4
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb
github.com/google/uuid v1.6.0
github.com/gosimple/slug v1.13.1
github.com/grokify/html-strip-tags-go v0.1.0
@ -70,7 +70,8 @@ require (
github.com/opentracing/opentracing-go v1.2.0
github.com/otiai10/copy v1.14.0
github.com/otiai10/opengraph/v2 v2.1.0
github.com/prometheus/client_golang v1.17.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.18.0
github.com/pseudomuto/protoc-gen-doc v1.5.1
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd
github.com/samber/lo v1.39.0
@ -85,7 +86,7 @@ require (
go.uber.org/atomic v1.11.0
go.uber.org/mock v0.4.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.26.0
go.uber.org/zap v1.27.0
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3
golang.org/x/image v0.15.0
golang.org/x/mobile v0.0.0-20231006135142-2b44d11868fe
@ -114,7 +115,7 @@ require (
github.com/anyproto/go-slip21 v1.0.0 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.2.0 // indirect
github.com/bits-and-blooms/bitset v1.10.0 // indirect
github.com/blevesearch/bleve_index_api v1.0.6 // indirect
github.com/blevesearch/geo v0.1.18 // indirect
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
@ -130,13 +131,18 @@ require (
github.com/blevesearch/zapx/v13 v13.3.10 // indirect
github.com/blevesearch/zapx/v14 v14.3.10 // indirect
github.com/blevesearch/zapx/v15 v15.3.13 // indirect
github.com/btcsuite/btcd v0.21.0-beta // indirect
github.com/btcsuite/btcd v0.22.1 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect
github.com/cenkalti/backoff/v4 v4.2.0 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chigopher/pathlib v0.15.0 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect
github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
@ -146,13 +152,14 @@ require (
github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect
github.com/ethereum/go-ethereum v1.10.4 // indirect
github.com/ethereum/c-kzg-4844 v0.4.0 // indirect
github.com/ethereum/go-ethereum v1.13.12 // 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
github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-shiori/dom v0.0.0-20210627111528-4e4722cd0d65 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect
@ -172,6 +179,7 @@ require (
github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/holiman/uint256 v1.2.4 // indirect
github.com/huandu/xstrings v1.4.0 // indirect
github.com/iancoleman/strcase v0.2.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
@ -194,14 +202,15 @@ require (
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
github.com/miekg/dns v1.1.56 // indirect
github.com/miguelmota/go-ethereum-hdwallet v0.1.1 // indirect
github.com/miguelmota/go-ethereum-hdwallet v0.1.2 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mschoch/smat v0.2.0 // indirect
@ -214,13 +223,12 @@ require (
github.com/onsi/ginkgo/v2 v2.15.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/polydawn/refmt v0.89.0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
github.com/prometheus/common v0.44.0 // indirect
github.com/prometheus/procfs v0.11.1 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/pseudomuto/protokit v0.2.1 // indirect
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
github.com/quic-go/quic-go v0.40.1 // indirect
@ -237,6 +245,7 @@ require (
github.com/spf13/viper v1.15.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/supranational/blst v0.3.11 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
@ -266,13 +275,14 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
lukechampine.com/blake3 v1.2.1 // indirect
nhooyr.io/websocket v1.8.7 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
)
replace github.com/dgraph-io/badger/v4 => github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580
replace github.com/dgraph-io/ristretto => github.com/anyproto/ristretto v0.1.2-0.20240221153107-2b23839cc50c
replace github.com/libp2p/zeroconf/v2 => github.com/anyproto/zeroconf/v2 v2.2.1-0.20230303151330-fa3ab41a4941
replace github.com/libp2p/zeroconf/v2 => github.com/anyproto/zeroconf/v2 v2.2.1-0.20240228113933-f90a5cc4439d
replace github.com/JohannesKaufmann/html-to-markdown => github.com/anyproto/html-to-markdown v0.0.0-20231025221133-830bf0a6f139

261
go.sum
View file

@ -1,14 +1,12 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
@ -25,7 +23,6 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
@ -38,28 +35,14 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4=
github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc=
github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
@ -78,11 +61,9 @@ github.com/RoaringBitmap/roaring v1.2.3 h1:yqreLINqIrX22ErkKI0vY47/ivtJr6n+kMhVO
github.com/RoaringBitmap/roaring v1.2.3/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8=
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
@ -100,15 +81,12 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAu
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 h1:iW0a5ljuFxkLGPNem5Ui+KBjFJzKg4Fv2fnxe4dvzpM=
github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA=
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
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-sync v0.3.25 h1:qqZoRorh7gB67p0KreMbZzYvza6KLr34zmCK73/xyJE=
github.com/anyproto/any-sync v0.3.25/go.mod h1:rYmapuCpZBcNgbVGhMEHlqLtwFr1N48BL6sjFcgEgj4=
github.com/anyproto/any-sync v0.3.32 h1:SKSzA4YOCVPwdT6Mf9p0yKnRE3xkvax/EUflspd5pbY=
github.com/anyproto/any-sync v0.3.32/go.mod h1:q7O3a4p3DwhFzIACjh6I6rv2RzgqPQesZNZv27B8Xdo=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580 h1:Ba80IlCCxkZ9H1GF+7vFu/TSpPvbpDCxXJ5ogc4euYc=
github.com/anyproto/badger/v4 v4.2.1-0.20240110160636-80743fa3d580/go.mod h1:T/uWAYxrXdaXw64ihI++9RMbKTCpKd/yE9+saARew7k=
github.com/anyproto/go-chash v0.1.0 h1:I9meTPjXFRfXZHRJzjOHC/XF7Q5vzysKkiT/grsogXY=
@ -131,9 +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/zeroconf/v2 v2.2.1-0.20230303151330-fa3ab41a4941 h1:sXnKo0P45QWddNR4Gfh9CgbgdQXiKjry+KJjU8evoyw=
github.com/anyproto/zeroconf/v2 v2.2.1-0.20230303151330-fa3ab41a4941/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs=
github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0=
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=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@ -144,15 +121,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo=
github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y=
github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8=
github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4=
github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0=
github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM=
github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@ -162,8 +130,9 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88=
github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blevesearch/bleve/v2 v2.3.10 h1:z8V0wwGoL4rp7nG/O3qVVLYxUqCbEwskMt4iRJsPLgg=
github.com/blevesearch/bleve/v2 v2.3.10/go.mod h1:RJzeoeHC+vNHsoLR54+crS1HmOWpnH87fL70HAUCzIA=
github.com/blevesearch/bleve_index_api v1.0.6 h1:gyUUxdsrvmW3jVhhYdCVL6h9dCjNT/geNU7PxGn37p8=
@ -196,36 +165,33 @@ github.com/blevesearch/zapx/v14 v14.3.10 h1:SG6xlsL+W6YjhX5N3aEiL/2tcWh3DO75Bnz7
github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns=
github.com/blevesearch/zapx/v15 v15.3.13 h1:6EkfaZiPlAxqXz0neniq35my6S48QI94W/wyhnpDHHQ=
github.com/blevesearch/zapx/v15 v15.3.13/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg=
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.0.0-20190605094302-a0d1e3e36d50/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M=
github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94=
github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I=
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@ -244,14 +210,21 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y=
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY=
github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A=
github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw=
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM=
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ=
github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q=
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
@ -269,11 +242,13 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg=
github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE=
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ=
github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA=
github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE=
github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -283,11 +258,9 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218=
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I=
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE=
github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
@ -295,7 +268,6 @@ github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhY
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ=
github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
@ -306,9 +278,6 @@ github.com/dhowden/tag v0.0.0-20201120070457-d52dcb253c63 h1:/u5RVRk3Nh7Zw1QQnPt
github.com/dhowden/tag v0.0.0-20201120070457-d52dcb253c63/go.mod h1:SniNVYuaD1jmdEEvi+7ywb1QFR7agjeTdGKyFb0p7Rw=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
github.com/dsoprea/go-exif/v2 v2.0.0-20200321225314-640175a69fe4/go.mod h1:Lm2lMM2zx8p4a34ZemkaUV95AnMl4ZvLbCUbwOvLC2E=
github.com/dsoprea/go-exif/v3 v3.0.0-20200717053412-08f1b6708903/go.mod h1:0nsO1ce0mh5czxGeLo4+OCZ/C6Eo6ZlMWsz7rH/Gxv8=
github.com/dsoprea/go-exif/v3 v3.0.0-20210428042052-dca55bf8ca15/go.mod h1:cg5SNYKHMmzxsr9X6ZeLh/nfBRHHp5PngtEPcujONtk=
@ -339,7 +308,6 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@ -350,10 +318,11 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
github.com/ethereum/go-ethereum v1.10.4 h1:JPZPL2MHbegfFStcaOrrggMVIcf57OQHQ0J3UhjQ+xQ=
github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg=
github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY=
github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
github.com/ethereum/go-ethereum v1.13.12 h1:iDr9UM2JWkngBHGovRJEQn4Kor7mT4gt9rUZqB5M29Y=
github.com/ethereum/go-ethereum v1.13.12/go.mod h1:hKL2Qcj1OvStXNSEDbucexqnEt1Wh4Cz329XsjAalZY=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ=
github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
@ -365,10 +334,9 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
@ -376,8 +344,6 @@ github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is=
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk=
github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
@ -401,9 +367,9 @@ github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
@ -415,10 +381,7 @@ github.com/go-shiori/dom v0.0.0-20210627111528-4e4722cd0d65 h1:zx4B0AiwqKDQq+Agq
github.com/go-shiori/dom v0.0.0-20210627111528-4e4722cd0d65/go.mod h1:NPO1+buE6TYOWhUI98/hXLHHJhunIpXRuvDN4xjkCoE=
github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b h1:yrGomo5CP7IvXwSwKbDeaJkhwa4BxfgOO/s1V7iOQm4=
github.com/go-shiori/go-readability v0.0.0-20220215145315-dd6828d2f09b/go.mod h1:LTRGsNyO3/Y6u3ERbz17OiXy2qO1Y+/8QjXpg2ViyEY=
github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
@ -436,7 +399,7 @@ github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk=
github.com/goccy/go-graphviz v0.1.2 h1:sWSJ6w13BCm/ZOUTHDVrdvbsxqN8yyzaFcHrH/hQ9Yg=
github.com/goccy/go-graphviz v0.1.2/go.mod h1:pMYpbAqJT10V8dzV1JN/g/wUlG/0imKPzn3ZsrchGCI=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/googleapis v1.3.1 h1:CzMaKrvF6Qa7XtRii064vKBQiyvmY8H8vG1xa1/W1JA=
@ -491,13 +454,10 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw=
github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@ -518,7 +478,6 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@ -537,10 +496,10 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo=
github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
@ -563,7 +522,6 @@ github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q=
github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc=
github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc=
github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@ -602,7 +560,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4=
github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
@ -615,9 +572,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hbagdi/go-unsplash v0.0.0-20230414214043-474fc02c9119 h1:Xqi5LlXRyF1GlNGXSb2NZJuOeTrXGzwGiQDwkwNXEc8=
github.com/hbagdi/go-unsplash v0.0.0-20230414214043-474fc02c9119/go.mod h1:DEzhU5CxSdknL3hUXTco1n5AO2BZHs4KeJo5ADWU0Iw=
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw=
github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU=
github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
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=
@ -627,7 +583,6 @@ 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=
github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc=
github.com/huin/goupnp v1.0.1-0.20210310174557-0ca763054c88/go.mod h1:nNs7wvRfN1eKaMknBydLNQU6146XQim8t4h+q90biWo=
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o=
github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
@ -641,15 +596,7 @@ github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPt
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY=
github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk=
github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE=
github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8=
github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE=
github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0=
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI=
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
@ -761,7 +708,6 @@ github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA=
@ -775,15 +721,12 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o=
github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
@ -798,7 +741,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o=
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e h1:LvL4XsI70QxOGHed6yhQtAU34Kx3Qq2wwBzGFKY8zKk=
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@ -807,26 +749,20 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0=
github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0=
github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
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.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E=
github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk=
@ -842,11 +778,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ=
github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E=
github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ=
@ -1029,17 +964,13 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
@ -1048,15 +979,11 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d h1:eAS2t2Vy+6psf9LZ4T5WXWsbkBt3Tu5PWekJy5AGyEU=
github.com/mb0/diff v0.0.0-20131118162322-d8d9a906c24d/go.mod h1:3YMHqrw2Qu3Liy82v4QdAG17e9k91HZ7w3hqlpWqhDo=
github.com/mehanizm/dateparse v0.0.0-20210806203422-f82c8742c9f8 h1:SA/3Lk2gFZilCejaXeCTkA3+MHt9uI9ogzx45F/nOFE=
@ -1072,8 +999,8 @@ github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJys
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE=
github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY=
github.com/miguelmota/go-ethereum-hdwallet v0.1.1 h1:zdXGlHao7idpCBjEGTXThVAtMKs+IxAgivZ75xqkWK0=
github.com/miguelmota/go-ethereum-hdwallet v0.1.1/go.mod h1:f9m9uXokAHA6WNoYOPjj4AqjJS5pquQRiYYj/XSyPYc=
github.com/miguelmota/go-ethereum-hdwallet v0.1.2 h1:mz9LO6V7QCRkLYb0AH17t5R8KeqCe3E+hx9YXpmZeXA=
github.com/miguelmota/go-ethereum-hdwallet v0.1.2/go.mod h1:fdNwFSoBFVBPnU0xpOd6l2ueqsPSH/Gch5kIvSvTGk8=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U=
@ -1100,6 +1027,9 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -1113,7 +1043,6 @@ github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjW
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
@ -1168,8 +1097,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW
github.com/mwitkow/go-proto-validators v0.3.2 h1:qRlmpTzm2pstMKKzTdvwPCF5QfBNURSlAgN/R+qbKos=
github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA7a5VarXUOUxD+oeD30w=
github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo=
github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0=
github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E=
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
@ -1185,27 +1112,22 @@ github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQ
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY=
github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM=
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
@ -1226,17 +1148,13 @@ github.com/otiai10/opengraph/v2 v2.1.0 h1:rsrq/Krr4E6IPMPUdJ+pit4mc8ijzH9P7eyfEq
github.com/otiai10/opengraph/v2 v2.1.0/go.mod h1:gHYa6c2GENKqbB7O6Mkqpq2Ma0Nti31xIM/3QHNcD/M=
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE=
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ=
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@ -1245,7 +1163,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/polydawn/refmt v0.0.0-20190221155625-df39d6c2d992/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o=
@ -1262,26 +1179,25 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@ -1289,9 +1205,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w=
github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM=
@ -1304,10 +1219,8 @@ github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1
github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c=
github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc=
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
@ -1331,14 +1244,11 @@ github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/shirou/gopsutil/v3 v3.24.1 h1:R3t6ondCEvmARp3wxODhXMTLC/klMa87h2PHUw5m7QI=
github.com/shirou/gopsutil/v3 v3.24.1/go.mod h1:UU7a2MSBQa+kW1uuDq8DeEBS8kmrnQwsv2b5O513rwU=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
@ -1393,7 +1303,6 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc=
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
@ -1402,7 +1311,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@ -1416,21 +1324,18 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs=
github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM=
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160 h1:NSWpaDaurcAJY7PkL8Xt0PhZE7qpvbZl5ljd8r6U0bI=
github.com/tj/assert v0.0.0-20190920132354-ee03d75cd160/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0=
github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o=
@ -1446,7 +1351,6 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/vektra/mockery/v2 v2.38.0 h1:I0LBuUzZHqAU4d1DknW0DTFBPO6n8TaD38WL2KJf3yI=
@ -1467,7 +1371,6 @@ github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvX
github.com/whyrusleeping/mdns v0.0.0-20180901202407-ef14215e6b30/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4=
github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI=
github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@ -1476,7 +1379,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -1527,7 +1429,7 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0
go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
@ -1537,7 +1439,6 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
@ -1545,8 +1446,8 @@ go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@ -1562,16 +1463,13 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@ -1629,7 +1527,6 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@ -1667,11 +1564,9 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200923182212-328152dc79b1/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@ -1679,7 +1574,6 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
@ -1754,14 +1648,12 @@ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1775,13 +1667,11 @@ golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1792,11 +1682,8 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -1814,6 +1701,7 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@ -1849,7 +1737,6 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@ -1882,7 +1769,6 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@ -1920,10 +1806,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU=
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
@ -1964,7 +1847,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
@ -1972,7 +1854,6 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
@ -2058,18 +1939,14 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8=
gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@ -2081,7 +1958,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@ -2090,7 +1966,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI=
lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
@ -2100,6 +1975,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI=

View file

@ -148,10 +148,10 @@ func (c *client) sendNextBatch(info amplitude.AppInfoProvider, batcher *mb.MB[am
}
func (c *client) recordAggregatedData() {
c.lock.RLock()
c.lock.Lock()
toSend := c.aggregatableMap
c.aggregatableMap = make(map[string]SamplableEvent)
c.lock.RUnlock()
c.lock.Unlock()
// итерейтим сразу старую мапу и скармливаем ГЦ
for _, ev := range toSend {
c.send(ev)

View file

@ -53,13 +53,14 @@ type MetricsService interface {
}
type service struct {
lock sync.RWMutex
appVersion string
startVersion string
userId string
deviceId string
platform string
clients [2]*client
lock sync.RWMutex
appVersion string
startVersion string
userId string
deviceId string
platform string
clients [2]*client
alreadyRunning bool
}
func (s *service) SendSampled(ev SamplableEvent) {
@ -161,6 +162,11 @@ func (s *service) GetStartVersion() string {
func (s *service) Run() {
s.lock.Lock()
defer s.lock.Unlock()
if s.alreadyRunning {
return
}
s.alreadyRunning = true
for _, c := range s.clients {
c.ctx, c.cancel = context.WithCancel(context.Background())
c.setBatcher(mb.New[amplitude.Event](0))
@ -171,10 +177,11 @@ func (s *service) Run() {
func (s *service) Close() {
s.lock.Lock()
defer s.lock.Unlock()
for _, c := range s.clients {
c.Close()
}
defer s.lock.Unlock()
s.alreadyRunning = false
}
func (s *service) Send(ev amplitude.Event) {

File diff suppressed because it is too large Load diff

View file

@ -120,6 +120,31 @@ message Rpc {
}
}
message StopSharing {
message Request {
string spaceId = 1;
}
message Response {
Error error = 1;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
NO_SUCH_SPACE = 101;
SPACE_IS_DELETED = 102;
REQUEST_FAILED = 103;
}
}
}
}
message InviteGetCurrent {
message Request {
string spaceId = 1;
@ -237,8 +262,6 @@ message Rpc {
message JoinCancel {
message Request {
string spaceId = 1;
string inviteCid = 2;
string inviteFileKey = 3;
}
message Response {
@ -1490,6 +1513,7 @@ message Rpc {
string objectTypeUniqueKey = 2;
string url = 3;
google.protobuf.Struct details = 4;
bool addPageContent = 5;
}
message Response {
@ -5957,6 +5981,28 @@ message Rpc {
repeated string headIds = 2;
}
message Stat {
message Request {
}
message Response {
Error error = 1;
string jsonStat = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
}
}
}
}
message TreeHeads {
message Request {
string treeId = 1;

View file

@ -57,6 +57,7 @@ service ClientCommands {
rpc SpaceJoin (anytype.Rpc.Space.Join.Request) returns (anytype.Rpc.Space.Join.Response);
rpc SpaceJoinCancel (anytype.Rpc.Space.JoinCancel.Request) returns (anytype.Rpc.Space.JoinCancel.Response);
rpc SpaceExit (anytype.Rpc.Space.Exit.Request) returns (anytype.Rpc.Space.Exit.Response);
rpc SpaceStopSharing (anytype.Rpc.Space.StopSharing.Request) returns (anytype.Rpc.Space.StopSharing.Response);
rpc SpaceRequestApprove (anytype.Rpc.Space.RequestApprove.Request) returns (anytype.Rpc.Space.RequestApprove.Response);
rpc SpaceRequestDecline (anytype.Rpc.Space.RequestDecline.Request) returns (anytype.Rpc.Space.RequestDecline.Response);
rpc SpaceParticipantRemove (anytype.Rpc.Space.ParticipantRemove.Request) returns (anytype.Rpc.Space.ParticipantRemove.Response);
@ -290,6 +291,7 @@ service ClientCommands {
rpc LogSend (anytype.Rpc.Log.Send.Request) returns (anytype.Rpc.Log.Send.Response);
rpc DebugStat (anytype.Rpc.Debug.Stat.Request) returns (anytype.Rpc.Debug.Stat.Response);
rpc DebugTree (anytype.Rpc.Debug.Tree.Request) returns (anytype.Rpc.Debug.Tree.Response);
rpc DebugTreeHeads (anytype.Rpc.Debug.TreeHeads.Request) returns (anytype.Rpc.Debug.TreeHeads.Response);
rpc DebugSpaceSummary (anytype.Rpc.Debug.SpaceSummary.Request) returns (anytype.Rpc.Debug.SpaceSummary.Response);

View file

@ -26,281 +26,283 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("pb/protos/service/service.proto", fileDescriptor_93a29dc403579097) }
var fileDescriptor_93a29dc403579097 = []byte{
// 4378 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x1c, 0xc9,
0x56, 0xc0, 0x77, 0x5e, 0x58, 0xe8, 0xcb, 0x5d, 0x60, 0x2e, 0x2c, 0x7b, 0xc3, 0xbd, 0xce, 0x6e,
0x36, 0xb1, 0x93, 0x38, 0x1e, 0x67, 0x93, 0xdd, 0xec, 0xe5, 0x5e, 0x24, 0xe4, 0xd8, 0xb1, 0xd7,
0xdc, 0xc4, 0x31, 0x9e, 0x49, 0x22, 0xad, 0x84, 0x44, 0xbb, 0xa7, 0x32, 0x6e, 0xdc, 0xd3, 0xd5,
0xb7, 0xbb, 0x66, 0xec, 0x01, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0xe2, 0xeb, 0x85, 0x07, 0x24,
0x1e, 0xf8, 0x3f, 0x78, 0xe3, 0x71, 0x1f, 0x79, 0x44, 0xbb, 0xff, 0xc8, 0x55, 0x57, 0x9d, 0xae,
0x8f, 0xd3, 0x75, 0xaa, 0x7b, 0xf6, 0x69, 0x57, 0x3e, 0xbf, 0xf3, 0x51, 0x5d, 0xa7, 0xaa, 0x4e,
0x55, 0xf5, 0x74, 0xa2, 0x9b, 0xc5, 0xf9, 0x6e, 0x51, 0x72, 0xc1, 0xab, 0xdd, 0x8a, 0x95, 0xcb,
0x34, 0x61, 0xcd, 0x7f, 0x47, 0xf2, 0xcf, 0xc3, 0x77, 0xe3, 0x7c, 0x25, 0x56, 0x05, 0xbb, 0xf1,
0x81, 0x21, 0x13, 0x3e, 0x9f, 0xc7, 0xf9, 0xb4, 0x52, 0xc8, 0x8d, 0xf7, 0x8d, 0x84, 0x2d, 0x59,
0x2e, 0xe0, 0xef, 0x8f, 0xfe, 0xfb, 0x7f, 0x06, 0xd1, 0x7b, 0xfb, 0x59, 0xca, 0x72, 0xb1, 0x0f,
0x1a, 0xc3, 0x2f, 0xa3, 0xef, 0xee, 0x15, 0xc5, 0x11, 0x13, 0xaf, 0x59, 0x59, 0xa5, 0x3c, 0x1f,
0x7e, 0x3c, 0x02, 0x07, 0xa3, 0xb3, 0x22, 0x19, 0xed, 0x15, 0xc5, 0xc8, 0x08, 0x47, 0x67, 0xec,
0x67, 0x0b, 0x56, 0x89, 0x1b, 0xb7, 0xc3, 0x50, 0x55, 0xf0, 0xbc, 0x62, 0xc3, 0xb7, 0xd1, 0xaf,
0xed, 0x15, 0xc5, 0x98, 0x89, 0x03, 0x56, 0x37, 0x60, 0x2c, 0x62, 0xc1, 0x86, 0x5b, 0x2d, 0x55,
0x17, 0xd0, 0x3e, 0xee, 0x76, 0x83, 0xe0, 0x67, 0x12, 0x7d, 0xa7, 0xf6, 0x73, 0xb1, 0x10, 0x53,
0x7e, 0x95, 0x0f, 0x3f, 0x6a, 0x2b, 0x82, 0x48, 0xdb, 0xbe, 0x15, 0x42, 0xc0, 0xea, 0x9b, 0xe8,
0x97, 0xdf, 0xc4, 0x59, 0xc6, 0xc4, 0x7e, 0xc9, 0xea, 0xc0, 0x5d, 0x1d, 0x25, 0x1a, 0x29, 0x99,
0xb6, 0xfb, 0x71, 0x90, 0x01, 0xc3, 0x5f, 0x46, 0xdf, 0x55, 0x92, 0x33, 0x96, 0xf0, 0x25, 0x2b,
0x87, 0x5e, 0x2d, 0x10, 0x12, 0x8f, 0xbc, 0x05, 0x61, 0xdb, 0xfb, 0x3c, 0x5f, 0xb2, 0x52, 0xf8,
0x6d, 0x83, 0x30, 0x6c, 0xdb, 0x40, 0x60, 0xfb, 0x6f, 0x07, 0xd1, 0x0f, 0xf6, 0x92, 0x84, 0x2f,
0x72, 0xf1, 0x9c, 0x27, 0x71, 0xf6, 0x3c, 0xcd, 0x2f, 0x4f, 0xd8, 0xd5, 0xfe, 0x45, 0xcd, 0xe7,
0x33, 0x36, 0x7c, 0xec, 0x3e, 0x55, 0x85, 0x8e, 0x34, 0x3b, 0xb2, 0x61, 0xed, 0xfb, 0xd3, 0xf5,
0x94, 0x20, 0x96, 0x7f, 0x1c, 0x44, 0x1b, 0x38, 0x96, 0x31, 0xcf, 0x96, 0xcc, 0x44, 0xf3, 0x59,
0x87, 0x61, 0x17, 0xd7, 0xf1, 0x3c, 0x59, 0x57, 0x0d, 0x22, 0xca, 0xa2, 0xef, 0xd9, 0xe9, 0x32,
0x66, 0x95, 0x1c, 0x4e, 0xf7, 0xe8, 0x8c, 0x00, 0x44, 0x7b, 0xbe, 0xdf, 0x07, 0x05, 0x6f, 0x69,
0x34, 0x04, 0x6f, 0x19, 0xaf, 0xb4, 0xb3, 0xbb, 0x5e, 0x0b, 0x16, 0xa1, 0x7d, 0xdd, 0xeb, 0x41,
0x82, 0xab, 0x3f, 0x8c, 0x7e, 0xe5, 0x0d, 0x2f, 0x2f, 0xab, 0x22, 0x4e, 0x18, 0x0c, 0x85, 0x3b,
0xae, 0x76, 0x23, 0xc5, 0xa3, 0x61, 0xb3, 0x0b, 0xb3, 0x92, 0xb6, 0x11, 0xbe, 0x2c, 0x18, 0x9e,
0x83, 0x8c, 0x62, 0x2d, 0xa4, 0x92, 0x16, 0x43, 0x60, 0xfb, 0x32, 0x1a, 0x1a, 0xdb, 0xe7, 0x7f,
0xc4, 0x12, 0xb1, 0x37, 0x9d, 0xe2, 0x5e, 0x31, 0xba, 0x92, 0x18, 0xed, 0x4d, 0xa7, 0x54, 0xaf,
0xf8, 0x51, 0x70, 0x76, 0x15, 0xbd, 0x8f, 0x9c, 0x3d, 0x4f, 0x2b, 0xe9, 0x70, 0x27, 0x6c, 0x05,
0x30, 0xed, 0x74, 0xd4, 0x17, 0x07, 0xc7, 0x7f, 0x3e, 0x88, 0xbe, 0xef, 0xf1, 0x7c, 0xc6, 0xe6,
0x7c, 0xc9, 0x86, 0x0f, 0xbb, 0xad, 0x29, 0x52, 0xfb, 0xff, 0x64, 0x0d, 0x0d, 0x4f, 0x9a, 0x8c,
0x59, 0xc6, 0x12, 0x41, 0xa6, 0x89, 0x12, 0x77, 0xa6, 0x89, 0xc6, 0xac, 0x11, 0xd6, 0x08, 0x8f,
0x98, 0xd8, 0x5f, 0x94, 0x25, 0xcb, 0x05, 0xd9, 0x97, 0x06, 0xe9, 0xec, 0x4b, 0x07, 0xf5, 0xb4,
0xe7, 0x88, 0x89, 0xbd, 0x2c, 0x23, 0xdb, 0xa3, 0xc4, 0x9d, 0xed, 0xd1, 0x18, 0x78, 0x48, 0xa2,
0x5f, 0xb5, 0x9e, 0x98, 0x38, 0xce, 0xdf, 0xf2, 0x21, 0xfd, 0x2c, 0xa4, 0x5c, 0xfb, 0xd8, 0xea,
0xe4, 0x3c, 0xcd, 0x78, 0x76, 0x5d, 0xf0, 0x92, 0xee, 0x16, 0x25, 0xee, 0x6c, 0x86, 0xc6, 0xc0,
0xc3, 0x1f, 0x44, 0xef, 0xc1, 0x2c, 0xd9, 0xac, 0x67, 0xb7, 0xbd, 0x53, 0x28, 0x5e, 0xd0, 0xee,
0x74, 0x50, 0x66, 0x72, 0x00, 0x19, 0x4c, 0x3e, 0x1f, 0x7b, 0xf5, 0xd0, 0xd4, 0x73, 0x3b, 0x0c,
0xb5, 0x6c, 0x1f, 0xb0, 0x8c, 0x91, 0xb6, 0x95, 0xb0, 0xc3, 0xb6, 0x86, 0xc0, 0x76, 0x19, 0xfd,
0x86, 0x7e, 0x2c, 0xf5, 0x3a, 0x2a, 0xe5, 0xf5, 0x24, 0xbd, 0x4d, 0xb4, 0xdb, 0x86, 0xb4, 0xaf,
0x07, 0xfd, 0xe0, 0x56, 0x7b, 0x60, 0x04, 0xfa, 0xdb, 0x83, 0xc6, 0xdf, 0xed, 0x30, 0x04, 0xb6,
0xff, 0x6e, 0x10, 0xfd, 0x10, 0x64, 0xcf, 0xf2, 0xf8, 0x3c, 0x63, 0x72, 0x49, 0x3c, 0x61, 0xe2,
0x8a, 0x97, 0x97, 0xe3, 0x55, 0x9e, 0x10, 0xcb, 0xbf, 0x1f, 0xee, 0x58, 0xfe, 0x49, 0x25, 0xab,
0xe2, 0x83, 0x86, 0x0a, 0x5e, 0xe0, 0x8a, 0xaf, 0x69, 0x81, 0xe0, 0x05, 0x55, 0xf1, 0xb9, 0x48,
0xcb, 0xea, 0x8b, 0x7a, 0xda, 0xf4, 0x5b, 0x7d, 0x61, 0xcf, 0x93, 0xb7, 0x42, 0x88, 0x99, 0xb6,
0x9a, 0x04, 0xe6, 0xf9, 0xdb, 0x74, 0xf6, 0xaa, 0x98, 0xd6, 0x69, 0x7c, 0xcf, 0x9f, 0xa1, 0x16,
0x42, 0x4c, 0x5b, 0x04, 0x0a, 0xde, 0xfe, 0xc1, 0x14, 0x46, 0x30, 0x94, 0x0e, 0x4b, 0x3e, 0x7f,
0xce, 0x66, 0x71, 0xb2, 0x82, 0xf1, 0xff, 0x69, 0x68, 0xe0, 0x61, 0x5a, 0x07, 0xf1, 0xd9, 0x9a,
0x5a, 0x10, 0xcf, 0x7f, 0x0e, 0xa2, 0xdb, 0x4d, 0xf3, 0x2f, 0xe2, 0x7c, 0xc6, 0xa0, 0x3f, 0x55,
0xf4, 0x7b, 0xf9, 0xf4, 0x8c, 0x55, 0x22, 0x2e, 0xc5, 0xf0, 0xc7, 0xfe, 0x46, 0x86, 0x74, 0x74,
0x6c, 0x3f, 0xf9, 0x56, 0xba, 0xa6, 0xd7, 0xc7, 0xf5, 0xc4, 0x06, 0x53, 0x80, 0xdb, 0xeb, 0x52,
0x82, 0x27, 0x80, 0x5b, 0x21, 0xc4, 0xf4, 0xba, 0x14, 0x1c, 0xe7, 0xcb, 0x54, 0xb0, 0x23, 0x96,
0xb3, 0xb2, 0xdd, 0xeb, 0x4a, 0xd5, 0x45, 0x88, 0x5e, 0x27, 0x50, 0x33, 0xd9, 0x38, 0xde, 0xf4,
0xe2, 0xb8, 0x1d, 0x30, 0xd2, 0x5a, 0x1e, 0x1f, 0xf4, 0x83, 0xcd, 0xee, 0xce, 0xf2, 0x79, 0xc6,
0x96, 0xfc, 0x12, 0xef, 0xee, 0x6c, 0x13, 0x0a, 0x20, 0x76, 0x77, 0x5e, 0xd0, 0xac, 0x60, 0x96,
0x9f, 0xd7, 0x29, 0xbb, 0x42, 0x2b, 0x98, 0xad, 0x5c, 0x8b, 0x89, 0x15, 0xcc, 0x83, 0x81, 0x87,
0x93, 0xe8, 0x97, 0xa4, 0xf0, 0xf7, 0x78, 0x9a, 0x0f, 0x6f, 0x7a, 0x94, 0x6a, 0x81, 0xb6, 0xfa,
0x21, 0x0d, 0xa0, 0x88, 0xeb, 0xbf, 0xee, 0xc7, 0x79, 0xc2, 0x32, 0x6f, 0xc4, 0x46, 0x1c, 0x8c,
0xd8, 0xc1, 0x50, 0xc4, 0xcf, 0xae, 0x53, 0xe1, 0x8d, 0xb8, 0x16, 0x04, 0x23, 0x06, 0x00, 0x65,
0x2b, 0x68, 0xec, 0x15, 0x45, 0x59, 0xcf, 0x80, 0xbe, 0x6c, 0x75, 0x91, 0x60, 0xb6, 0xb6, 0x50,
0xbf, 0xb7, 0x03, 0x96, 0x64, 0x69, 0x1e, 0xf4, 0x06, 0x48, 0x1f, 0x6f, 0x06, 0x05, 0x6f, 0x8b,
0xe8, 0x7d, 0x09, 0x9c, 0xc6, 0xa5, 0x48, 0x93, 0xb4, 0x88, 0xf3, 0xa6, 0x2e, 0xf6, 0xe5, 0x7b,
0x8b, 0xd2, 0x3e, 0x77, 0x7a, 0xd2, 0xe0, 0xf6, 0xdf, 0x07, 0xd1, 0x47, 0xd8, 0xef, 0x29, 0x2b,
0xe7, 0xa9, 0xdc, 0x5e, 0x55, 0x6a, 0x72, 0x1a, 0x7e, 0x1e, 0x36, 0xda, 0x52, 0xd0, 0xd1, 0xfc,
0x68, 0x7d, 0x45, 0x08, 0xec, 0xf7, 0xa3, 0x48, 0x95, 0xf1, 0x72, 0xab, 0xe5, 0xe6, 0x06, 0xd4,
0xf7, 0xce, 0x3e, 0xeb, 0xa3, 0x00, 0x61, 0xa6, 0x50, 0xf5, 0x77, 0xb9, 0x83, 0x1c, 0x7a, 0x35,
0xa4, 0x88, 0x98, 0x42, 0x11, 0x82, 0x03, 0x1d, 0x5f, 0xf0, 0x2b, 0x7f, 0xa0, 0xb5, 0x24, 0x1c,
0x28, 0x10, 0xe6, 0x4c, 0x07, 0x02, 0xf5, 0x9d, 0xe9, 0x34, 0x61, 0x84, 0xce, 0x74, 0x30, 0x03,
0x86, 0x79, 0xf4, 0xeb, 0xb6, 0xe1, 0xa7, 0x9c, 0x5f, 0xce, 0xe3, 0xf2, 0x72, 0x78, 0x9f, 0x56,
0x6e, 0x18, 0xed, 0x68, 0xbb, 0x17, 0x6b, 0xc6, 0x90, 0xed, 0xb0, 0x5e, 0x80, 0x5f, 0x95, 0x19,
0x1a, 0x43, 0x8e, 0x0d, 0x40, 0x88, 0x31, 0x44, 0xa0, 0x66, 0x46, 0xb3, 0xbd, 0x8d, 0x19, 0xde,
0x45, 0x38, 0xea, 0x63, 0x46, 0xed, 0x22, 0x3c, 0x18, 0x4e, 0xa1, 0xa3, 0x32, 0x2e, 0x2e, 0xfc,
0x29, 0x24, 0x45, 0xe1, 0x14, 0x6a, 0x10, 0xdc, 0xdf, 0x63, 0x16, 0x97, 0xc9, 0x85, 0xbf, 0xbf,
0x95, 0x2c, 0xdc, 0xdf, 0x9a, 0x31, 0x0b, 0xae, 0x6d, 0x78, 0xbc, 0x38, 0xaf, 0x92, 0x32, 0x3d,
0x67, 0xc3, 0x6d, 0x5a, 0x5b, 0x43, 0xc4, 0x82, 0x4b, 0xc2, 0xe6, 0xcc, 0x07, 0x7c, 0x36, 0xb2,
0xe3, 0x69, 0x85, 0xce, 0x7c, 0x1a, 0x1b, 0x16, 0x41, 0x9c, 0xf9, 0xf8, 0x49, 0xdc, 0xbc, 0xa3,
0x92, 0x2f, 0x8a, 0xaa, 0xa3, 0x79, 0x08, 0x0a, 0x37, 0xaf, 0x0d, 0x83, 0xcf, 0xeb, 0xe8, 0x37,
0xed, 0x47, 0xfa, 0x2a, 0xaf, 0xb4, 0xd7, 0x1d, 0xfa, 0x39, 0x59, 0x18, 0x71, 0x7a, 0x12, 0xc0,
0xcd, 0x46, 0xbc, 0xf1, 0x2c, 0x0e, 0x98, 0x88, 0xd3, 0xac, 0x1a, 0x6e, 0xfa, 0x6d, 0x34, 0x72,
0x62, 0x23, 0xee, 0xe3, 0xf0, 0x10, 0x3a, 0x58, 0x14, 0x59, 0x9a, 0xb4, 0x8f, 0xd1, 0x40, 0x57,
0x8b, 0xc3, 0x43, 0xc8, 0xc6, 0xf0, 0x94, 0x30, 0x66, 0x42, 0xfd, 0xcf, 0x64, 0x55, 0x30, 0xff,
0x94, 0xe0, 0x20, 0xe1, 0x29, 0x01, 0xa3, 0xb8, 0x3d, 0x63, 0x26, 0x9e, 0xc7, 0x2b, 0xbe, 0x20,
0xa6, 0x04, 0x2d, 0x0e, 0xb7, 0xc7, 0xc6, 0xcc, 0xc2, 0xad, 0x3d, 0x1c, 0xe7, 0x82, 0x95, 0x79,
0x9c, 0x1d, 0x66, 0xf1, 0xac, 0x1a, 0x12, 0xe3, 0xc6, 0xa5, 0x88, 0x85, 0x9b, 0xa6, 0x3d, 0x8f,
0xf1, 0xb8, 0x3a, 0x8c, 0x97, 0xbc, 0x4c, 0x05, 0xfd, 0x18, 0x0d, 0xd2, 0xf9, 0x18, 0x1d, 0xd4,
0xeb, 0x6d, 0xaf, 0x4c, 0x2e, 0xd2, 0x25, 0x9b, 0x06, 0xbc, 0x35, 0x48, 0x0f, 0x6f, 0x16, 0xea,
0xe9, 0xb4, 0x31, 0x5f, 0x94, 0x09, 0x23, 0x3b, 0x4d, 0x89, 0x3b, 0x3b, 0x4d, 0x63, 0xe0, 0xe1,
0xaf, 0x06, 0xd1, 0x6f, 0x29, 0xa9, 0x7d, 0xb6, 0x75, 0x10, 0x57, 0x17, 0xe7, 0x3c, 0x2e, 0xa7,
0xc3, 0x4f, 0x7c, 0x76, 0xbc, 0xa8, 0x76, 0xfd, 0x68, 0x1d, 0x15, 0xfc, 0x58, 0x9f, 0xa7, 0x95,
0x35, 0xe2, 0xbc, 0x8f, 0xd5, 0x41, 0xc2, 0x8f, 0x15, 0xa3, 0x78, 0x02, 0x91, 0x72, 0xb5, 0x8f,
0xdc, 0x24, 0xf5, 0xdd, 0xcd, 0xe4, 0x56, 0x27, 0x87, 0xe7, 0xc7, 0x5a, 0xe8, 0x66, 0xcb, 0x0e,
0x65, 0xc3, 0x9f, 0x31, 0xa3, 0xbe, 0x38, 0xe9, 0x59, 0x8f, 0x8a, 0xb0, 0xe7, 0xd6, 0xc8, 0x18,
0xf5, 0xc5, 0x09, 0xcf, 0xd6, 0xb4, 0x16, 0xf2, 0xec, 0x99, 0xda, 0x46, 0x7d, 0x71, 0x9c, 0x40,
0x7b, 0x45, 0x91, 0xad, 0x26, 0x6c, 0x5e, 0x64, 0x64, 0x02, 0x39, 0x48, 0x38, 0x81, 0x30, 0x8a,
0xab, 0x9f, 0x09, 0xaf, 0x6b, 0x2b, 0x6f, 0xf5, 0x23, 0x45, 0xe1, 0xea, 0xa7, 0x41, 0x70, 0xc1,
0x30, 0xe1, 0xfb, 0x3c, 0xcb, 0x58, 0x22, 0xda, 0x97, 0x44, 0x5a, 0xd3, 0x10, 0xe1, 0x82, 0x01,
0x91, 0xe6, 0x30, 0xa0, 0xa9, 0xd5, 0xe3, 0x92, 0x3d, 0x5d, 0x3d, 0x4f, 0xf3, 0xcb, 0xa1, 0x7f,
0x6d, 0x34, 0x00, 0x71, 0x18, 0xe0, 0x05, 0xf1, 0x9e, 0xe0, 0x55, 0x3e, 0xe5, 0xfe, 0x3d, 0x41,
0x2d, 0x09, 0xef, 0x09, 0x80, 0xc0, 0x26, 0xcf, 0x18, 0x65, 0xb2, 0x96, 0x84, 0x4d, 0x02, 0xe1,
0x9b, 0x0f, 0xe0, 0xd4, 0x8d, 0x9c, 0x0f, 0xd0, 0x39, 0xdb, 0x56, 0x27, 0x87, 0x33, 0xb4, 0xd9,
0x1c, 0x1c, 0x32, 0x91, 0x5c, 0xf8, 0x33, 0xd4, 0x41, 0xc2, 0x19, 0x8a, 0x51, 0xdc, 0xa4, 0x09,
0xd7, 0x9b, 0x9b, 0x4d, 0x7f, 0x7e, 0xb4, 0x36, 0x36, 0x5b, 0x9d, 0x1c, 0x2e, 0xd7, 0x8f, 0xe7,
0xf2, 0x99, 0x79, 0x93, 0x5c, 0xc9, 0xc2, 0xe5, 0xba, 0x66, 0x70, 0xf4, 0x4a, 0x50, 0x3f, 0x4e,
0x7f, 0xf4, 0x46, 0x1e, 0x8e, 0xde, 0xe1, 0xc0, 0xc9, 0xbf, 0x0e, 0xa2, 0x9b, 0xb6, 0x97, 0x13,
0x5e, 0x8f, 0x91, 0xd7, 0x71, 0x96, 0x4e, 0x63, 0xc1, 0x26, 0xfc, 0x92, 0xe5, 0x68, 0xbf, 0xef,
0x46, 0xab, 0xf8, 0x91, 0xa3, 0x40, 0xec, 0xf7, 0x7b, 0x29, 0xe2, 0x3c, 0x51, 0xf4, 0xab, 0x8a,
0xed, 0xc7, 0x15, 0x31, 0x93, 0x39, 0x48, 0x38, 0x4f, 0x30, 0x8a, 0x8b, 0x36, 0x25, 0x7f, 0x76,
0x5d, 0xb0, 0x32, 0x65, 0x79, 0xc2, 0xfc, 0x45, 0x1b, 0xa6, 0xc2, 0x45, 0x9b, 0x87, 0x6e, 0x6d,
0x87, 0xf5, 0xe4, 0xd4, 0xbe, 0xe7, 0xc5, 0x44, 0xe0, 0x9e, 0x97, 0x40, 0x71, 0x23, 0x0d, 0xe0,
0x3d, 0x52, 0x6a, 0x59, 0x09, 0x1e, 0x29, 0xd1, 0x74, 0xeb, 0x90, 0x41, 0x33, 0xe3, 0x7a, 0x98,
0x74, 0x84, 0x3e, 0xb6, 0x87, 0xcb, 0x76, 0x2f, 0xd6, 0x7f, 0xaa, 0x71, 0xc6, 0xb2, 0x58, 0x2e,
0x21, 0x81, 0xa3, 0x83, 0x86, 0xe9, 0x73, 0xaa, 0x61, 0xb1, 0xe0, 0xf0, 0x2f, 0x06, 0xd1, 0x0d,
0x9f, 0xc7, 0x97, 0x85, 0xf4, 0xfb, 0xb0, 0xdb, 0x96, 0x22, 0x89, 0x8b, 0xec, 0xb0, 0x06, 0xc4,
0xf0, 0x27, 0xd1, 0x07, 0x8d, 0xc8, 0xdc, 0x73, 0x43, 0x00, 0x6e, 0x15, 0xa1, 0xe3, 0xc7, 0x9c,
0x76, 0xbf, 0xdb, 0x9b, 0x37, 0x05, 0xba, 0x1b, 0x57, 0x85, 0x0a, 0x74, 0x6d, 0x03, 0xc4, 0x44,
0x81, 0xee, 0xc1, 0xf0, 0x4a, 0xdd, 0x20, 0xf5, 0x38, 0xf1, 0xcd, 0x71, 0xda, 0x84, 0x3d, 0x4a,
0xee, 0x76, 0x83, 0x38, 0x77, 0x1a, 0x31, 0xd4, 0xc5, 0xf7, 0x43, 0x16, 0x50, 0x6d, 0xbc, 0xdd,
0x8b, 0x05, 0x87, 0x7f, 0x16, 0x7d, 0xbf, 0xd5, 0xb0, 0x43, 0x16, 0x8b, 0x45, 0xc9, 0xa6, 0xc3,
0xdd, 0x8e, 0xb8, 0x1b, 0x50, 0xbb, 0x7e, 0xd8, 0x5f, 0x01, 0xfc, 0xff, 0xcd, 0x20, 0xfa, 0x81,
0xcb, 0xa9, 0x2e, 0xd6, 0x31, 0x3c, 0x0a, 0x99, 0x74, 0x59, 0x1d, 0xc6, 0xe3, 0xb5, 0x74, 0x5a,
0x7b, 0x30, 0x3b, 0x91, 0xf7, 0x96, 0x71, 0x9a, 0xc5, 0xe7, 0x19, 0xf3, 0xee, 0xc1, 0x9c, 0xdc,
0xd4, 0x68, 0x70, 0x0f, 0x46, 0xaa, 0xb4, 0x66, 0x49, 0x39, 0xde, 0xac, 0xda, 0xfd, 0x01, 0x3d,
0x2a, 0x3d, 0xa5, 0xfb, 0x4e, 0x4f, 0x1a, 0xdc, 0x8a, 0xe6, 0xec, 0xaa, 0xfe, 0xb3, 0x9d, 0xe4,
0x3e, 0xaf, 0xa0, 0xea, 0xc9, 0xf4, 0x9d, 0x9e, 0x34, 0x78, 0xfd, 0xd3, 0xe8, 0x83, 0xb6, 0x57,
0x58, 0x14, 0x76, 0x3b, 0x4d, 0xa1, 0x75, 0xe1, 0x61, 0x7f, 0x05, 0x53, 0xea, 0x7f, 0x91, 0x56,
0x82, 0x97, 0xab, 0xf1, 0x05, 0xbf, 0x6a, 0xde, 0xe5, 0x74, 0x47, 0x2b, 0x00, 0x23, 0x8b, 0x20,
0x4a, 0x7d, 0x3f, 0xd9, 0x72, 0x65, 0xde, 0xf9, 0xac, 0x08, 0x57, 0x16, 0xd1, 0xe1, 0xca, 0x25,
0xcd, 0x5c, 0xd5, 0xb4, 0xca, 0xbc, 0xa0, 0xba, 0xe5, 0x0f, 0xb5, 0xfd, 0x92, 0xea, 0xdd, 0x6e,
0xd0, 0x6c, 0xbf, 0x0e, 0xd3, 0x8c, 0xbd, 0x7c, 0xfb, 0x36, 0xe3, 0xf1, 0x14, 0x6d, 0xbf, 0x6a,
0xc9, 0x08, 0x44, 0xc4, 0xf6, 0x0b, 0x21, 0xa6, 0xe8, 0xac, 0x05, 0xf2, 0x6e, 0xa6, 0x31, 0xbd,
0xd9, 0xd6, 0xb3, 0xe5, 0x44, 0xd1, 0xe9, 0xe3, 0xcc, 0x82, 0x51, 0x4b, 0xeb, 0x21, 0xd8, 0xf8,
0xb8, 0xd3, 0xd6, 0xb5, 0xc4, 0xc4, 0x82, 0xe1, 0xc1, 0xcc, 0xfe, 0xa8, 0x16, 0xbe, 0x2a, 0xa4,
0xf1, 0x0f, 0xdb, 0x5a, 0x4a, 0x42, 0xec, 0x8f, 0x5c, 0xc2, 0xd4, 0xf9, 0xf5, 0xdf, 0x0f, 0xf8,
0x55, 0x2e, 0x8d, 0x7a, 0x9e, 0x66, 0x23, 0x23, 0xea, 0x7c, 0xcc, 0x80, 0xe1, 0x9f, 0x46, 0xbf,
0x28, 0x0d, 0x97, 0xbc, 0x18, 0x6e, 0x78, 0x14, 0x4a, 0xeb, 0x8d, 0x90, 0x9b, 0xa4, 0xdc, 0xbc,
0xd8, 0xa4, 0xfb, 0xef, 0x55, 0x15, 0xcf, 0x18, 0x7a, 0xb1, 0xc9, 0xf4, 0x8a, 0x94, 0x12, 0x2f,
0x36, 0xb5, 0x29, 0xf3, 0xb2, 0x4e, 0x2d, 0x3b, 0xe1, 0x53, 0xb0, 0xee, 0x69, 0xa1, 0x16, 0x12,
0x2f, 0xeb, 0xb4, 0x20, 0x73, 0x7e, 0x7f, 0x12, 0x2f, 0xd3, 0x99, 0x9e, 0xfc, 0xd5, 0x1c, 0x52,
0xa1, 0xf3, 0x7b, 0xc3, 0x8c, 0x2c, 0x88, 0x38, 0xbf, 0x27, 0x61, 0xf0, 0xf9, 0x2f, 0x83, 0xe8,
0x43, 0xc3, 0x1c, 0x35, 0xc7, 0x2a, 0xc7, 0xf9, 0x5b, 0xfe, 0x26, 0x15, 0x17, 0xf5, 0x3e, 0xbe,
0x1a, 0x3e, 0xa1, 0x4c, 0xfa, 0x79, 0x1d, 0xca, 0xe7, 0x6b, 0xeb, 0x99, 0x6a, 0xae, 0x39, 0x6e,
0x31, 0x77, 0x5b, 0x4a, 0x03, 0x55, 0x73, 0xfa, 0x54, 0x06, 0x73, 0x44, 0x35, 0x17, 0xe2, 0x4d,
0x17, 0x6b, 0xe7, 0x19, 0xcf, 0x71, 0x17, 0x1b, 0x0b, 0xb5, 0x90, 0xe8, 0xe2, 0x16, 0x64, 0xe6,
0xc6, 0x46, 0xa4, 0x4e, 0x06, 0xf6, 0xb2, 0x0c, 0xcd, 0x8d, 0x5a, 0x55, 0x03, 0xc4, 0xdc, 0xe8,
0x05, 0xc1, 0xcf, 0x59, 0xf4, 0x9d, 0xfa, 0x91, 0x9e, 0x96, 0x6c, 0x99, 0x32, 0x7c, 0x0d, 0x6b,
0x49, 0x88, 0xf1, 0xef, 0x12, 0x66, 0x64, 0xbd, 0xca, 0xab, 0x22, 0x8b, 0xab, 0x0b, 0xb8, 0x98,
0x73, 0xdb, 0xdc, 0x08, 0xf1, 0xd5, 0xdc, 0x9d, 0x0e, 0xca, 0x4c, 0xbc, 0x8d, 0x4c, 0x4f, 0x31,
0x9b, 0x7e, 0xd5, 0xd6, 0x34, 0xb3, 0xd5, 0xc9, 0x99, 0xa3, 0xc9, 0xa3, 0x38, 0xcb, 0x58, 0xb9,
0x6a, 0x64, 0x2f, 0xe2, 0x3c, 0x7d, 0xcb, 0x2a, 0x81, 0x8e, 0x26, 0x81, 0x1a, 0x61, 0x8c, 0x38,
0x9a, 0x0c, 0xe0, 0xa6, 0xb2, 0x46, 0x9e, 0x8f, 0xf3, 0x29, 0xbb, 0x46, 0x95, 0x35, 0xb6, 0x23,
0x19, 0xa2, 0xb2, 0xa6, 0x58, 0xb3, 0x3c, 0x3e, 0xcd, 0x78, 0x72, 0x09, 0x4b, 0x80, 0xdb, 0xc1,
0x52, 0x82, 0xd7, 0x80, 0x5b, 0x21, 0xc4, 0x2c, 0x02, 0x52, 0x70, 0xc6, 0x8a, 0x2c, 0x4e, 0xf0,
0x5d, 0xbc, 0xd2, 0x01, 0x19, 0xb1, 0x08, 0x60, 0x06, 0x85, 0x0b, 0x77, 0xfc, 0xbe, 0x70, 0xd1,
0x15, 0xff, 0xad, 0x10, 0x62, 0x96, 0x41, 0x29, 0x18, 0x17, 0x59, 0x2a, 0xd0, 0x30, 0x50, 0x1a,
0x52, 0x42, 0x0c, 0x03, 0x97, 0x40, 0x26, 0x5f, 0xb0, 0x72, 0xc6, 0xbc, 0x26, 0xa5, 0x24, 0x68,
0xb2, 0x21, 0xcc, 0x8b, 0x41, 0xaa, 0xed, 0xbc, 0x58, 0xa1, 0x17, 0x83, 0xa0, 0x59, 0xbc, 0x58,
0x11, 0x2f, 0x06, 0x39, 0x00, 0x0a, 0xf1, 0x34, 0xae, 0x84, 0x3f, 0x44, 0x29, 0x09, 0x86, 0xd8,
0x10, 0x66, 0x8d, 0x56, 0x21, 0x2e, 0x04, 0x5a, 0xa3, 0x21, 0x00, 0xeb, 0xaa, 0xf0, 0x26, 0x29,
0x37, 0x33, 0x89, 0xea, 0x15, 0x26, 0x0e, 0x53, 0x96, 0x4d, 0x2b, 0x34, 0x93, 0xc0, 0x73, 0x6f,
0xa4, 0xc4, 0x4c, 0xd2, 0xa6, 0x50, 0x2a, 0xc1, 0x19, 0xae, 0xaf, 0x75, 0xe8, 0xf8, 0xf6, 0x56,
0x08, 0x31, 0xf3, 0x53, 0x13, 0xf4, 0x7e, 0x5c, 0x96, 0x69, 0xbd, 0xf8, 0x6f, 0xfa, 0x03, 0x6a,
0xe4, 0xc4, 0xfc, 0xe4, 0xe3, 0xd0, 0xf0, 0x6a, 0x26, 0x6e, 0x5f, 0x60, 0x78, 0xea, 0xfe, 0x38,
0xc8, 0x98, 0x8a, 0x53, 0x4a, 0xac, 0xbb, 0x2e, 0xdf, 0xd3, 0xf4, 0x5c, 0x75, 0x6d, 0x76, 0x61,
0xd6, 0xab, 0xc6, 0xda, 0xc5, 0x0b, 0xbe, 0x64, 0x13, 0xfe, 0xec, 0x3a, 0xad, 0x44, 0x9a, 0xcf,
0x60, 0xe5, 0x7e, 0x4c, 0x58, 0xf2, 0xc1, 0xc4, 0xab, 0xc6, 0x9d, 0x4a, 0xa6, 0x80, 0x40, 0xb1,
0x9c, 0xb0, 0x2b, 0x6f, 0x01, 0x81, 0x2d, 0x6a, 0x8e, 0x28, 0x20, 0x42, 0xbc, 0x39, 0xd3, 0xd0,
0xce, 0xe1, 0xf7, 0x58, 0x13, 0xde, 0xd4, 0x72, 0x94, 0x35, 0x0c, 0x12, 0xdb, 0xca, 0xa0, 0x82,
0xd9, 0xeb, 0x69, 0xff, 0x66, 0x88, 0xdd, 0x25, 0xec, 0xb4, 0x87, 0xd9, 0xbd, 0x1e, 0xa4, 0xc7,
0x95, 0xb9, 0xb0, 0xa5, 0x5c, 0xb5, 0xef, 0x6b, 0xef, 0xf5, 0x20, 0xad, 0xf3, 0x11, 0xbb, 0x59,
0x4f, 0xe3, 0xe4, 0x72, 0x56, 0xf2, 0x45, 0x3e, 0xdd, 0xe7, 0x19, 0x2f, 0xd1, 0xf9, 0x88, 0x13,
0x35, 0x42, 0x89, 0xf3, 0x91, 0x0e, 0x15, 0x53, 0xc1, 0xd9, 0x51, 0xec, 0x65, 0xe9, 0x0c, 0xef,
0x6e, 0x1d, 0x43, 0x12, 0x20, 0x2a, 0x38, 0x2f, 0xe8, 0x49, 0x22, 0xb5, 0xfb, 0x15, 0x69, 0x12,
0x67, 0xca, 0xdf, 0x2e, 0x6d, 0xc6, 0x01, 0x3b, 0x93, 0xc8, 0xa3, 0xe0, 0x69, 0xe7, 0x64, 0x51,
0xe6, 0xc7, 0xb9, 0xe0, 0x64, 0x3b, 0x1b, 0xa0, 0xb3, 0x9d, 0x16, 0x88, 0xa6, 0xd5, 0x09, 0xbb,
0xae, 0xa3, 0xa9, 0xff, 0xe3, 0x9b, 0x56, 0xeb, 0xbf, 0x8f, 0x40, 0x1e, 0x9a, 0x56, 0x11, 0x87,
0x1a, 0x03, 0x4e, 0x54, 0xc2, 0x04, 0xb4, 0xdd, 0x34, 0xb9, 0xdb, 0x0d, 0xfa, 0xfd, 0x8c, 0xc5,
0x2a, 0x63, 0x21, 0x3f, 0x12, 0xe8, 0xe3, 0xa7, 0x01, 0xcd, 0xc5, 0x89, 0xd3, 0x9e, 0x0b, 0x96,
0x5c, 0xb6, 0xde, 0x3f, 0x71, 0x03, 0x55, 0x08, 0x71, 0x71, 0x42, 0xa0, 0xfe, 0x2e, 0x3a, 0x4e,
0x78, 0x1e, 0xea, 0xa2, 0x5a, 0xde, 0xa7, 0x8b, 0x80, 0x33, 0x9b, 0x5f, 0x2d, 0x85, 0xcc, 0x54,
0xdd, 0xb4, 0x4d, 0x58, 0xb0, 0x21, 0x62, 0xf3, 0x4b, 0xc2, 0xa6, 0x26, 0xc7, 0x3e, 0x5f, 0xb4,
0xdf, 0xff, 0x6c, 0x59, 0x79, 0x41, 0xbf, 0xff, 0x49, 0xb1, 0x74, 0x23, 0x55, 0x8e, 0x74, 0x58,
0x71, 0xf3, 0xe4, 0x41, 0x3f, 0xd8, 0x6c, 0x79, 0x1c, 0x9f, 0xfb, 0x19, 0x8b, 0x4b, 0xe5, 0x75,
0x27, 0x60, 0xc8, 0x60, 0xc4, 0x96, 0x27, 0x80, 0xa3, 0x29, 0xcc, 0xf1, 0xbc, 0xcf, 0x73, 0xc1,
0x72, 0xe1, 0x9b, 0xc2, 0x5c, 0x63, 0x00, 0x86, 0xa6, 0x30, 0x4a, 0x01, 0xe5, 0xad, 0x3c, 0x0f,
0x62, 0xe2, 0x24, 0x9e, 0x7b, 0x2b, 0x36, 0x75, 0xd6, 0xa3, 0xe4, 0xa1, 0xbc, 0x45, 0x1c, 0x1a,
0xf2, 0xc7, 0xf3, 0x78, 0xa6, 0xbd, 0x78, 0xb4, 0xa5, 0xbc, 0xe5, 0xe6, 0x6e, 0x37, 0x88, 0xfc,
0xbc, 0x4e, 0xa7, 0x8c, 0x07, 0xfc, 0x48, 0x79, 0x1f, 0x3f, 0x18, 0x44, 0x95, 0x53, 0xdd, 0x5a,
0xb5, 0x9b, 0xda, 0xcb, 0xa7, 0xb0, 0x87, 0x1c, 0x11, 0x0f, 0x05, 0x71, 0xa1, 0xca, 0x89, 0xe0,
0xd1, 0xf8, 0x68, 0x0e, 0x47, 0x43, 0xe3, 0x43, 0x9f, 0x7d, 0xf6, 0x19, 0x1f, 0x3e, 0x18, 0x7c,
0xfe, 0x31, 0x8c, 0x8f, 0x83, 0x58, 0xc4, 0x75, 0xcd, 0xfc, 0x3a, 0x65, 0x57, 0xb0, 0x09, 0xf5,
0xb4, 0xb7, 0xa1, 0x46, 0xf2, 0xc7, 0x28, 0x68, 0x47, 0xba, 0xdb, 0x9b, 0x0f, 0xf8, 0x86, 0xea,
0xbc, 0xd3, 0x37, 0x2a, 0xd3, 0x77, 0x7b, 0xf3, 0x01, 0xdf, 0xf0, 0x2b, 0xb7, 0x4e, 0xdf, 0xe8,
0xa7, 0x6e, 0xbb, 0xbd, 0x79, 0xf0, 0xfd, 0x97, 0x83, 0xe8, 0x46, 0xcb, 0x79, 0x5d, 0x03, 0x25,
0x22, 0x5d, 0x32, 0x5f, 0x29, 0xe7, 0xda, 0xd3, 0x68, 0xa8, 0x94, 0xa3, 0x55, 0xac, 0x4f, 0x23,
0xf8, 0xa2, 0x38, 0xe5, 0x55, 0x2a, 0x2f, 0x8e, 0x1f, 0xf7, 0x30, 0xda, 0xc0, 0xa1, 0x0d, 0x4b,
0x48, 0xc9, 0x5c, 0xbb, 0x39, 0xa8, 0x79, 0xd5, 0xf3, 0x41, 0xc0, 0x5e, 0xfb, 0x8d, 0xcf, 0x9d,
0x9e, 0xb4, 0xb9, 0x00, 0x73, 0x18, 0xfb, 0xe6, 0x2d, 0xd4, 0xab, 0xde, 0xcb, 0xb7, 0x87, 0xfd,
0x15, 0xc0, 0xfd, 0x5f, 0x37, 0x35, 0x3d, 0xf6, 0x0f, 0x83, 0xe0, 0x51, 0x1f, 0x8b, 0x68, 0x20,
0x3c, 0x5e, 0x4b, 0x07, 0x02, 0xf9, 0x8f, 0x41, 0x74, 0xcb, 0x1b, 0x88, 0x7b, 0x07, 0xfb, 0xdb,
0x7d, 0x6c, 0xfb, 0xef, 0x62, 0x7f, 0xfc, 0x6d, 0x54, 0x21, 0xba, 0xbf, 0x6f, 0xb6, 0xd6, 0x8d,
0x86, 0x7c, 0x1d, 0xff, 0x65, 0x39, 0x65, 0x25, 0x8c, 0xd8, 0x50, 0xd2, 0x19, 0x18, 0x8f, 0xdb,
0xcf, 0xd6, 0xd4, 0xb2, 0x3e, 0xe3, 0xe1, 0xc0, 0xf0, 0xcb, 0x24, 0x2b, 0x9e, 0x90, 0x65, 0x8b,
0xc6, 0x01, 0x3d, 0x59, 0x57, 0x8d, 0x1a, 0xc9, 0x16, 0x2c, 0x7f, 0x15, 0xfc, 0xb8, 0xa7, 0x61,
0xe7, 0x77, 0xc2, 0x9f, 0xae, 0xa7, 0x04, 0xb1, 0xfc, 0xd7, 0x20, 0xba, 0xe3, 0xb0, 0xe6, 0xa6,
0x01, 0x9d, 0x87, 0xfc, 0x24, 0x60, 0x9f, 0x52, 0xd2, 0xc1, 0xfd, 0xce, 0xb7, 0x53, 0x36, 0xdf,
0xbc, 0x70, 0x54, 0x0e, 0xd3, 0x4c, 0xb0, 0xb2, 0xfd, 0xcd, 0x0b, 0xd7, 0xae, 0xa2, 0x46, 0xf4,
0x37, 0x2f, 0x02, 0xb8, 0xf5, 0xcd, 0x0b, 0x8f, 0x67, 0xef, 0x37, 0x2f, 0xbc, 0xd6, 0x82, 0xdf,
0xbc, 0x08, 0x6b, 0x50, 0x8b, 0x4f, 0x13, 0x82, 0x3a, 0xd1, 0xee, 0x65, 0xd1, 0x3d, 0xe0, 0x7e,
0xb4, 0x8e, 0x0a, 0xb1, 0xfc, 0x2a, 0x4e, 0xbe, 0x19, 0xd6, 0xe3, 0x99, 0x3a, 0x6f, 0x87, 0xed,
0xf6, 0xe6, 0xc1, 0xf7, 0xcf, 0x60, 0xdf, 0xa3, 0x17, 0x1b, 0x5e, 0xca, 0xef, 0x9d, 0x6c, 0x87,
0x16, 0x8f, 0xda, 0x82, 0xdd, 0xf3, 0x0f, 0xfa, 0xc1, 0x44, 0x73, 0x6b, 0x02, 0x3a, 0x7d, 0xd4,
0x65, 0x08, 0x75, 0xf9, 0x6e, 0x6f, 0x9e, 0x58, 0xe4, 0x94, 0x6f, 0xd5, 0xdb, 0x3d, 0x8c, 0xb9,
0x7d, 0xfd, 0xb0, 0xbf, 0x82, 0x79, 0xb5, 0xa5, 0xe5, 0x5e, 0xf6, 0x73, 0xe7, 0x13, 0x74, 0x7a,
0x79, 0xa7, 0x27, 0x1d, 0x2a, 0x6e, 0xec, 0xe5, 0xbd, 0xab, 0xb8, 0xf1, 0x2e, 0xf1, 0x9f, 0xae,
0xa7, 0x04, 0xb1, 0xfc, 0xf3, 0x20, 0xba, 0x49, 0xc6, 0x02, 0x59, 0xf0, 0xa4, 0xaf, 0x65, 0x94,
0x0d, 0x9f, 0xaf, 0xad, 0x07, 0x41, 0xfd, 0xdb, 0x20, 0xfa, 0x30, 0x10, 0x94, 0x4a, 0x8f, 0x35,
0xac, 0xbb, 0x69, 0xf2, 0xa3, 0xf5, 0x15, 0xa9, 0xc5, 0xde, 0xc6, 0xc7, 0xed, 0x4f, 0x41, 0x04,
0x6c, 0x8f, 0xe9, 0x4f, 0x41, 0x74, 0x6b, 0xe1, 0xc3, 0x9f, 0xba, 0x24, 0x81, 0x7d, 0x91, 0xef,
0xf0, 0x47, 0x56, 0x2c, 0x68, 0x3f, 0xb4, 0xd5, 0xc9, 0xf9, 0x9c, 0x3c, 0xbb, 0x2e, 0xe2, 0x7c,
0x4a, 0x3b, 0x51, 0xf2, 0x6e, 0x27, 0x9a, 0xc3, 0x87, 0x66, 0xb5, 0xf4, 0x8c, 0x37, 0x9b, 0xbc,
0x7b, 0x94, 0xbe, 0x46, 0x82, 0x87, 0x66, 0x2d, 0x94, 0xf0, 0x06, 0x15, 0x6d, 0xc8, 0x1b, 0x2a,
0x64, 0xef, 0xf7, 0x41, 0xd1, 0xf6, 0x41, 0x7b, 0xd3, 0x67, 0xf1, 0x0f, 0x42, 0x56, 0x5a, 0xe7,
0xf1, 0x3b, 0x3d, 0x69, 0xc2, 0xed, 0x98, 0x89, 0x2f, 0x58, 0x3c, 0x65, 0x65, 0xd0, 0xad, 0xa6,
0x7a, 0xb9, 0xb5, 0x69, 0x9f, 0xdb, 0x7d, 0x9e, 0x2d, 0xe6, 0x39, 0x74, 0x26, 0xe9, 0xd6, 0xa6,
0xba, 0xdd, 0x22, 0x1a, 0x1f, 0x17, 0x1a, 0xb7, 0xb2, 0xb8, 0xbc, 0x1f, 0x36, 0xe3, 0xd4, 0x94,
0xdb, 0xbd, 0x58, 0xba, 0x9d, 0x90, 0x46, 0x1d, 0xed, 0x44, 0x99, 0xb4, 0xd3, 0x93, 0xc6, 0xe7,
0x76, 0x96, 0x5b, 0x9d, 0x4f, 0xbb, 0x1d, 0xb6, 0x5a, 0x29, 0xf5, 0xb0, 0xbf, 0x02, 0x3e, 0x25,
0x85, 0xac, 0xaa, 0x77, 0x45, 0x87, 0x69, 0x96, 0x0d, 0xb7, 0x03, 0x69, 0xd2, 0x40, 0xc1, 0x53,
0x52, 0x0f, 0x4c, 0x64, 0x72, 0x73, 0xaa, 0x98, 0x0f, 0xbb, 0xec, 0x48, 0xaa, 0x57, 0x26, 0xdb,
0x34, 0x3a, 0x6d, 0xb3, 0x1e, 0xb5, 0x6e, 0xed, 0x28, 0xfc, 0xe0, 0x5a, 0x0d, 0xde, 0xed, 0xcd,
0xa3, 0x6b, 0x78, 0x49, 0xc9, 0x95, 0xe5, 0x36, 0x65, 0xc2, 0x59, 0x49, 0xee, 0x74, 0x50, 0xe8,
0xc4, 0x52, 0x0d, 0xa3, 0x37, 0xe9, 0x74, 0xc6, 0x84, 0xf7, 0x06, 0xc9, 0x06, 0x82, 0x37, 0x48,
0x08, 0x44, 0x5d, 0xa7, 0xfe, 0x3e, 0x66, 0x62, 0x12, 0x97, 0x33, 0x26, 0x8e, 0xa7, 0xbe, 0xae,
0x03, 0x65, 0x8b, 0x0a, 0x75, 0x9d, 0x97, 0x46, 0xb3, 0x81, 0x76, 0x0b, 0xbf, 0xa7, 0xbe, 0x1f,
0x32, 0x83, 0x7e, 0x54, 0xbd, 0xdd, 0x8b, 0x45, 0x2b, 0x8a, 0x71, 0x98, 0xce, 0x53, 0xe1, 0x5b,
0x51, 0x2c, 0x1b, 0x35, 0x12, 0x5a, 0x51, 0xda, 0x28, 0xd5, 0xbc, 0xba, 0x46, 0x38, 0x9e, 0x86,
0x9b, 0xa7, 0x98, 0x7e, 0xcd, 0xd3, 0x6c, 0xeb, 0xc2, 0x33, 0xd7, 0x29, 0x23, 0x2e, 0x60, 0xab,
0xec, 0xc9, 0x6d, 0xf9, 0x13, 0x43, 0x0c, 0x86, 0x66, 0x1d, 0x4a, 0xc1, 0xfa, 0x15, 0x8b, 0xe6,
0x9a, 0x3b, 0xd9, 0xa2, 0x60, 0x71, 0x19, 0xe7, 0x89, 0x77, 0x6b, 0x2a, 0x0d, 0xb6, 0xc8, 0xd0,
0xd6, 0x94, 0xd4, 0x40, 0xd7, 0xe9, 0xee, 0x8f, 0x03, 0x3d, 0x43, 0x41, 0xff, 0x0a, 0xcf, 0xfd,
0x6d, 0xe0, 0xbd, 0x1e, 0x24, 0xbe, 0x4e, 0x6f, 0x00, 0x7d, 0x28, 0xaf, 0x9c, 0x7e, 0x12, 0x30,
0xe5, 0xa2, 0xa1, 0x6d, 0x30, 0xad, 0x82, 0x92, 0x5a, 0x17, 0xb8, 0x4c, 0xfc, 0x94, 0xad, 0x7c,
0x49, 0x6d, 0xea, 0x53, 0x89, 0x84, 0x92, 0xba, 0x8d, 0xa2, 0x3a, 0xd3, 0xde, 0x07, 0x6d, 0x06,
0xf4, 0xed, 0xad, 0xcf, 0x56, 0x27, 0x87, 0x46, 0xce, 0x41, 0xba, 0x74, 0xee, 0x30, 0x3c, 0x81,
0x1e, 0xa4, 0x4b, 0xff, 0x15, 0xc6, 0x76, 0x2f, 0x16, 0x5f, 0xd5, 0xc7, 0x82, 0x5d, 0x37, 0x77,
0xe8, 0x9e, 0x70, 0xa5, 0xbc, 0x75, 0x89, 0x7e, 0xb7, 0x1b, 0x34, 0x2f, 0xc6, 0x9e, 0x96, 0x3c,
0x61, 0x55, 0x05, 0xdf, 0xc7, 0x72, 0xdf, 0x3c, 0x02, 0xd9, 0x08, 0x7d, 0x1d, 0xeb, 0x76, 0x18,
0x02, 0xdb, 0x5f, 0x44, 0xef, 0x3e, 0xe7, 0xb3, 0x31, 0xcb, 0xa7, 0xc3, 0x1f, 0xba, 0xaf, 0xa2,
0xf2, 0xd9, 0xa8, 0xfe, 0xb3, 0xb6, 0xb7, 0x41, 0x89, 0xcd, 0xcb, 0x74, 0x07, 0xec, 0x7c, 0x31,
0x9b, 0x94, 0x8c, 0xa1, 0x97, 0xe9, 0xe4, 0xdf, 0x47, 0xb5, 0x80, 0x78, 0x99, 0xce, 0x01, 0xcc,
0x2a, 0xa9, 0xed, 0xd5, 0x85, 0x28, 0x7e, 0x59, 0xcd, 0xe8, 0x48, 0x29, 0xb1, 0x4a, 0xb6, 0x29,
0xd3, 0x79, 0x52, 0x26, 0x5f, 0x36, 0x1f, 0x2f, 0xe6, 0xf3, 0xb8, 0x5c, 0xa1, 0xce, 0x53, 0xba,
0x36, 0x40, 0x74, 0x9e, 0x17, 0x34, 0x59, 0xa9, 0xfc, 0x88, 0x38, 0xb9, 0x3c, 0xe2, 0x25, 0x5f,
0x88, 0x34, 0x67, 0x15, 0xca, 0x4a, 0xb0, 0xe0, 0x32, 0x44, 0x56, 0x52, 0xac, 0xa9, 0xe2, 0x24,
0xa1, 0xde, 0xa3, 0x93, 0x5f, 0x85, 0xac, 0x04, 0x2f, 0xf1, 0x5d, 0x9e, 0xb2, 0x82, 0x21, 0xa2,
0x8a, 0x23, 0x61, 0xd4, 0xf7, 0xa7, 0x69, 0x3e, 0xf3, 0xf6, 0x7d, 0x2d, 0x08, 0xf6, 0x3d, 0x00,
0x66, 0x3e, 0x56, 0x0f, 0x4d, 0x7d, 0x7e, 0x06, 0x7e, 0xdb, 0xe7, 0x7d, 0xe8, 0x36, 0x41, 0xcc,
0xc7, 0x7e, 0x12, 0xb9, 0x7a, 0x59, 0xb0, 0x9c, 0x4d, 0x9b, 0xb7, 0xc5, 0x7c, 0xae, 0x1c, 0x22,
0xe8, 0x0a, 0x93, 0x26, 0x15, 0x5e, 0x30, 0x51, 0xa6, 0x49, 0x35, 0x66, 0xe2, 0x34, 0x2e, 0xe3,
0x39, 0x13, 0xac, 0xc4, 0xa9, 0x00, 0xc8, 0xc8, 0x61, 0x88, 0x54, 0xa0, 0x58, 0x70, 0xf8, 0xbb,
0xd1, 0xf7, 0xea, 0x99, 0x8b, 0xe5, 0xf0, 0x99, 0xea, 0x67, 0xf2, 0xfb, 0xf6, 0xc3, 0xf7, 0xb5,
0x8d, 0xb1, 0x28, 0x59, 0x3c, 0x6f, 0x6c, 0xbf, 0xa7, 0xff, 0x2e, 0xc1, 0x87, 0x83, 0x7a, 0xde,
0x3e, 0xe1, 0x22, 0x7d, 0x5b, 0x6f, 0x14, 0xe0, 0x52, 0x06, 0xcd, 0xdb, 0xb6, 0x78, 0x14, 0xf8,
0x25, 0xb8, 0x8f, 0x33, 0x23, 0xd1, 0x96, 0x9e, 0xb1, 0x22, 0xc3, 0x23, 0xd1, 0xd1, 0x96, 0x00,
0x31, 0x12, 0xbd, 0xa0, 0x59, 0x84, 0x6c, 0xf1, 0x84, 0x85, 0x1b, 0x33, 0x61, 0xfd, 0x1a, 0x33,
0x71, 0x5e, 0x37, 0xaf, 0xf7, 0x50, 0x25, 0x8f, 0xa7, 0x49, 0x5c, 0x89, 0xd3, 0x78, 0x95, 0xf1,
0x78, 0x2a, 0x1f, 0x26, 0xde, 0x43, 0x35, 0xcc, 0xc8, 0x86, 0xa8, 0x3d, 0x14, 0x05, 0x2b, 0x9f,
0x4f, 0x3f, 0xfa, 0xdf, 0xaf, 0x37, 0x06, 0x5f, 0x7d, 0xbd, 0x31, 0xf8, 0xff, 0xaf, 0x37, 0x06,
0xff, 0xf4, 0xcd, 0xc6, 0x3b, 0x5f, 0x7d, 0xb3, 0xf1, 0xce, 0xff, 0x7d, 0xb3, 0xf1, 0xce, 0x97,
0xef, 0xc2, 0xbf, 0x86, 0x70, 0xfe, 0x0b, 0xf2, 0xdf, 0x34, 0x78, 0xfc, 0xf3, 0x00, 0x00, 0x00,
0xff, 0xff, 0xeb, 0xbf, 0x4d, 0x5d, 0x31, 0x61, 0x00, 0x00,
// 4410 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x9d, 0xdd, 0x6f, 0x1d, 0x49,
0x56, 0xc0, 0xe7, 0xbe, 0x30, 0xd0, 0xcb, 0x0e, 0x70, 0x17, 0x86, 0xd9, 0xb0, 0xeb, 0x64, 0x32,
0x89, 0x9d, 0xc4, 0xf1, 0x75, 0x26, 0x99, 0x8f, 0x65, 0x17, 0x09, 0x39, 0x76, 0xec, 0x31, 0x9b,
0x38, 0xc6, 0xd7, 0x49, 0xa4, 0x91, 0x90, 0x68, 0xf7, 0xad, 0x5c, 0x37, 0x6e, 0x77, 0xf5, 0x76,
0xd7, 0xf5, 0x07, 0x08, 0x04, 0x02, 0x81, 0x40, 0x20, 0x10, 0x5f, 0x2f, 0x3c, 0x20, 0xf1, 0xa7,
0xf0, 0xc4, 0xe3, 0x3c, 0x22, 0xf1, 0x82, 0x66, 0xfe, 0x91, 0x55, 0x57, 0x9f, 0xae, 0x8f, 0xd3,
0xe7, 0x54, 0xf7, 0x9d, 0xa7, 0x19, 0xf9, 0xfc, 0xce, 0x47, 0x75, 0x9d, 0xaa, 0x3a, 0x55, 0xd5,
0xb7, 0x13, 0xdd, 0x2c, 0x4e, 0x36, 0x8b, 0x52, 0x2a, 0x59, 0x6d, 0x56, 0xa2, 0xbc, 0x48, 0x13,
0xd1, 0xfe, 0x77, 0xa2, 0xff, 0x3c, 0x7e, 0x37, 0xce, 0xaf, 0xd5, 0x75, 0x21, 0x6e, 0x7c, 0x60,
0xc9, 0x44, 0x9e, 0x9f, 0xc7, 0xf9, 0xac, 0x6a, 0x90, 0x1b, 0xef, 0x5b, 0x89, 0xb8, 0x10, 0xb9,
0x82, 0xbf, 0x3f, 0xfe, 0xbf, 0xff, 0x1e, 0x45, 0xef, 0x6d, 0x67, 0xa9, 0xc8, 0xd5, 0x36, 0x68,
0x8c, 0xbf, 0x8c, 0xbe, 0xbb, 0x55, 0x14, 0x7b, 0x42, 0xbd, 0x16, 0x65, 0x95, 0xca, 0x7c, 0xfc,
0xd1, 0x04, 0x1c, 0x4c, 0x8e, 0x8a, 0x64, 0xb2, 0x55, 0x14, 0x13, 0x2b, 0x9c, 0x1c, 0x89, 0x9f,
0x2d, 0x44, 0xa5, 0x6e, 0xdc, 0x09, 0x43, 0x55, 0x21, 0xf3, 0x4a, 0x8c, 0xdf, 0x46, 0xbf, 0xb6,
0x55, 0x14, 0x53, 0xa1, 0x76, 0x44, 0xdd, 0x80, 0xa9, 0x8a, 0x95, 0x18, 0xaf, 0x75, 0x54, 0x7d,
0xc0, 0xf8, 0xb8, 0xd7, 0x0f, 0x82, 0x9f, 0xe3, 0xe8, 0x3b, 0xb5, 0x9f, 0xd3, 0x85, 0x9a, 0xc9,
0xcb, 0x7c, 0xfc, 0x61, 0x57, 0x11, 0x44, 0xc6, 0xf6, 0xed, 0x10, 0x02, 0x56, 0xdf, 0x44, 0xbf,
0xfc, 0x26, 0xce, 0x32, 0xa1, 0xb6, 0x4b, 0x51, 0x07, 0xee, 0xeb, 0x34, 0xa2, 0x49, 0x23, 0x33,
0x76, 0x3f, 0x0a, 0x32, 0x60, 0xf8, 0xcb, 0xe8, 0xbb, 0x8d, 0xe4, 0x48, 0x24, 0xf2, 0x42, 0x94,
0x63, 0x52, 0x0b, 0x84, 0xcc, 0x23, 0xef, 0x40, 0xd8, 0xf6, 0xb6, 0xcc, 0x2f, 0x44, 0xa9, 0x68,
0xdb, 0x20, 0x0c, 0xdb, 0xb6, 0x10, 0xd8, 0xfe, 0xdb, 0x51, 0xf4, 0x83, 0xad, 0x24, 0x91, 0x8b,
0x5c, 0x3d, 0x97, 0x49, 0x9c, 0x3d, 0x4f, 0xf3, 0xb3, 0x03, 0x71, 0xb9, 0x7d, 0x5a, 0xf3, 0xf9,
0x5c, 0x8c, 0x9f, 0xf8, 0x4f, 0xb5, 0x41, 0x27, 0x86, 0x9d, 0xb8, 0xb0, 0xf1, 0xfd, 0xc9, 0x72,
0x4a, 0x10, 0xcb, 0x3f, 0x8e, 0xa2, 0x15, 0x1c, 0xcb, 0x54, 0x66, 0x17, 0xc2, 0x46, 0xf3, 0x69,
0x8f, 0x61, 0x1f, 0x37, 0xf1, 0x7c, 0xb6, 0xac, 0x1a, 0x44, 0x94, 0x45, 0xdf, 0x73, 0xd3, 0x65,
0x2a, 0x2a, 0x3d, 0x9c, 0xee, 0xf3, 0x19, 0x01, 0x88, 0xf1, 0xfc, 0x60, 0x08, 0x0a, 0xde, 0xd2,
0x68, 0x0c, 0xde, 0x32, 0x59, 0x19, 0x67, 0xf7, 0x48, 0x0b, 0x0e, 0x61, 0x7c, 0xdd, 0x1f, 0x40,
0x82, 0xab, 0x3f, 0x8c, 0x7e, 0xe5, 0x8d, 0x2c, 0xcf, 0xaa, 0x22, 0x4e, 0x04, 0x0c, 0x85, 0xbb,
0xbe, 0x76, 0x2b, 0xc5, 0xa3, 0x61, 0xb5, 0x0f, 0x73, 0x92, 0xb6, 0x15, 0xbe, 0x2c, 0x04, 0x9e,
0x83, 0xac, 0x62, 0x2d, 0xe4, 0x92, 0x16, 0x43, 0x60, 0xfb, 0x2c, 0x1a, 0x5b, 0xdb, 0x27, 0x7f,
0x24, 0x12, 0xb5, 0x35, 0x9b, 0xe1, 0x5e, 0xb1, 0xba, 0x9a, 0x98, 0x6c, 0xcd, 0x66, 0x5c, 0xaf,
0xd0, 0x28, 0x38, 0xbb, 0x8c, 0xde, 0x47, 0xce, 0x9e, 0xa7, 0x95, 0x76, 0xb8, 0x11, 0xb6, 0x02,
0x98, 0x71, 0x3a, 0x19, 0x8a, 0x83, 0xe3, 0x3f, 0x1f, 0x45, 0xdf, 0x27, 0x3c, 0x1f, 0x89, 0x73,
0x79, 0x21, 0xc6, 0x8f, 0xfa, 0xad, 0x35, 0xa4, 0xf1, 0xff, 0xf1, 0x12, 0x1a, 0x44, 0x9a, 0x4c,
0x45, 0x26, 0x12, 0xc5, 0xa6, 0x49, 0x23, 0xee, 0x4d, 0x13, 0x83, 0x39, 0x23, 0xac, 0x15, 0xee,
0x09, 0xb5, 0xbd, 0x28, 0x4b, 0x91, 0x2b, 0xb6, 0x2f, 0x2d, 0xd2, 0xdb, 0x97, 0x1e, 0x4a, 0xb4,
0x67, 0x4f, 0xa8, 0xad, 0x2c, 0x63, 0xdb, 0xd3, 0x88, 0x7b, 0xdb, 0x63, 0x30, 0xf0, 0x90, 0x44,
0xbf, 0xea, 0x3c, 0x31, 0xb5, 0x9f, 0xbf, 0x95, 0x63, 0xfe, 0x59, 0x68, 0xb9, 0xf1, 0xb1, 0xd6,
0xcb, 0x11, 0xcd, 0x78, 0x76, 0x55, 0xc8, 0x92, 0xef, 0x96, 0x46, 0xdc, 0xdb, 0x0c, 0x83, 0x81,
0x87, 0x3f, 0x88, 0xde, 0x83, 0x59, 0xb2, 0x5d, 0xcf, 0xee, 0x90, 0x53, 0x28, 0x5e, 0xd0, 0xee,
0xf6, 0x50, 0x76, 0x72, 0x00, 0x19, 0x4c, 0x3e, 0x1f, 0x91, 0x7a, 0x68, 0xea, 0xb9, 0x13, 0x86,
0x3a, 0xb6, 0x77, 0x44, 0x26, 0x58, 0xdb, 0x8d, 0xb0, 0xc7, 0xb6, 0x81, 0xc0, 0x76, 0x19, 0xfd,
0x86, 0x79, 0x2c, 0xf5, 0x3a, 0xaa, 0xe5, 0xf5, 0x24, 0xbd, 0xce, 0xb4, 0xdb, 0x85, 0x8c, 0xaf,
0x87, 0xc3, 0xe0, 0x4e, 0x7b, 0x60, 0x04, 0xd2, 0xed, 0x41, 0xe3, 0xef, 0x4e, 0x18, 0x02, 0xdb,
0x7f, 0x37, 0x8a, 0x7e, 0x08, 0xb2, 0x67, 0x79, 0x7c, 0x92, 0x09, 0xbd, 0x24, 0x1e, 0x08, 0x75,
0x29, 0xcb, 0xb3, 0xe9, 0x75, 0x9e, 0x30, 0xcb, 0x3f, 0x0d, 0xf7, 0x2c, 0xff, 0xac, 0x92, 0x53,
0xf1, 0x41, 0x43, 0x95, 0x2c, 0x70, 0xc5, 0xd7, 0xb6, 0x40, 0xc9, 0x82, 0xab, 0xf8, 0x7c, 0xa4,
0x63, 0xf5, 0x45, 0x3d, 0x6d, 0xd2, 0x56, 0x5f, 0xb8, 0xf3, 0xe4, 0xed, 0x10, 0x62, 0xa7, 0xad,
0x36, 0x81, 0x65, 0xfe, 0x36, 0x9d, 0xbf, 0x2a, 0x66, 0x75, 0x1a, 0xdf, 0xa7, 0x33, 0xd4, 0x41,
0x98, 0x69, 0x8b, 0x41, 0xc1, 0xdb, 0x3f, 0xd8, 0xc2, 0x08, 0x86, 0xd2, 0x6e, 0x29, 0xcf, 0x9f,
0x8b, 0x79, 0x9c, 0x5c, 0xc3, 0xf8, 0xff, 0x24, 0x34, 0xf0, 0x30, 0x6d, 0x82, 0xf8, 0x74, 0x49,
0x2d, 0x88, 0xe7, 0x3f, 0x47, 0xd1, 0x9d, 0xb6, 0xf9, 0xa7, 0x71, 0x3e, 0x17, 0xd0, 0x9f, 0x4d,
0xf4, 0x5b, 0xf9, 0xec, 0x48, 0x54, 0x2a, 0x2e, 0xd5, 0xf8, 0xc7, 0x74, 0x23, 0x43, 0x3a, 0x26,
0xb6, 0x9f, 0x7c, 0x2b, 0x5d, 0xdb, 0xeb, 0xd3, 0x7a, 0x62, 0x83, 0x29, 0xc0, 0xef, 0x75, 0x2d,
0xc1, 0x13, 0xc0, 0xed, 0x10, 0x62, 0x7b, 0x5d, 0x0b, 0xf6, 0xf3, 0x8b, 0x54, 0x89, 0x3d, 0x91,
0x8b, 0xb2, 0xdb, 0xeb, 0x8d, 0xaa, 0x8f, 0x30, 0xbd, 0xce, 0xa0, 0x76, 0xb2, 0xf1, 0xbc, 0x99,
0xc5, 0x71, 0x3d, 0x60, 0xa4, 0xb3, 0x3c, 0x3e, 0x1c, 0x06, 0xdb, 0xdd, 0x9d, 0xe3, 0xf3, 0x48,
0x5c, 0xc8, 0x33, 0xbc, 0xbb, 0x73, 0x4d, 0x34, 0x00, 0xb3, 0xbb, 0x23, 0x41, 0xbb, 0x82, 0x39,
0x7e, 0x5e, 0xa7, 0xe2, 0x12, 0xad, 0x60, 0xae, 0x72, 0x2d, 0x66, 0x56, 0x30, 0x02, 0x03, 0x0f,
0x07, 0xd1, 0x2f, 0x69, 0xe1, 0xef, 0xc9, 0x34, 0x1f, 0xdf, 0x24, 0x94, 0x6a, 0x81, 0xb1, 0x7a,
0x8b, 0x07, 0x50, 0xc4, 0xf5, 0x5f, 0xb7, 0xe3, 0x3c, 0x11, 0x19, 0x19, 0xb1, 0x15, 0x07, 0x23,
0xf6, 0x30, 0x14, 0xf1, 0xb3, 0xab, 0x54, 0x91, 0x11, 0xd7, 0x82, 0x60, 0xc4, 0x00, 0xd8, 0x52,
0x44, 0xff, 0xb9, 0x9e, 0x0f, 0xa7, 0xa7, 0x71, 0x99, 0xe6, 0xf3, 0x31, 0x15, 0x8b, 0x23, 0x67,
0x4a, 0x11, 0x8a, 0x43, 0x43, 0x02, 0x14, 0xb7, 0x8a, 0xa2, 0xac, 0xa7, 0x59, 0x6a, 0x48, 0xf8,
0x48, 0x70, 0x48, 0x74, 0x50, 0xda, 0xdb, 0x8e, 0x48, 0xb2, 0x34, 0x0f, 0x7a, 0x03, 0x64, 0x88,
0x37, 0x8b, 0x82, 0xb7, 0x45, 0xf4, 0xbe, 0x06, 0x0e, 0xe3, 0x52, 0xa5, 0x49, 0x5a, 0xc4, 0x79,
0x5b, 0x7c, 0x53, 0x83, 0xaa, 0x43, 0x19, 0x9f, 0x1b, 0x03, 0x69, 0x70, 0xfb, 0xef, 0xa3, 0xe8,
0x43, 0xec, 0xf7, 0x50, 0x94, 0xe7, 0xa9, 0xde, 0xc3, 0x55, 0xcd, 0x0c, 0x38, 0xfe, 0x3c, 0x6c,
0xb4, 0xa3, 0x60, 0xa2, 0xf9, 0xd1, 0xf2, 0x8a, 0x10, 0xd8, 0xef, 0x47, 0x51, 0xb3, 0x57, 0xd0,
0xfb, 0x39, 0x3f, 0x01, 0x61, 0x13, 0xe1, 0x6d, 0xe6, 0x3e, 0x0c, 0x10, 0x76, 0x9e, 0x6e, 0xfe,
0xae, 0xb7, 0xa9, 0x63, 0x52, 0x43, 0x8b, 0x98, 0x79, 0x1a, 0x21, 0x38, 0xd0, 0xe9, 0xa9, 0xbc,
0xa4, 0x03, 0xad, 0x25, 0xe1, 0x40, 0x81, 0xb0, 0x07, 0x47, 0x10, 0x28, 0x75, 0x70, 0xd4, 0x86,
0x11, 0x3a, 0x38, 0xc2, 0x0c, 0x18, 0x96, 0xd1, 0xaf, 0xbb, 0x86, 0x9f, 0x4a, 0x79, 0x76, 0x1e,
0x97, 0x67, 0xe3, 0x07, 0xbc, 0x72, 0xcb, 0x18, 0x47, 0xeb, 0x83, 0x58, 0x3b, 0x86, 0x5c, 0x87,
0xf5, 0x2a, 0xff, 0xaa, 0xcc, 0xd0, 0x18, 0xf2, 0x6c, 0x00, 0xc2, 0x8c, 0x21, 0x06, 0xb5, 0xd3,
0xa6, 0xeb, 0x6d, 0x2a, 0xf0, 0x56, 0xc5, 0x53, 0x9f, 0x0a, 0x6e, 0xab, 0x42, 0x60, 0x38, 0x85,
0xf6, 0xca, 0xb8, 0x38, 0xa5, 0x53, 0x48, 0x8b, 0xc2, 0x29, 0xd4, 0x22, 0xb8, 0xbf, 0xa7, 0x22,
0x2e, 0x93, 0x53, 0xba, 0xbf, 0x1b, 0x59, 0xb8, 0xbf, 0x0d, 0x63, 0x57, 0x75, 0xd7, 0xf0, 0x74,
0x71, 0x52, 0x25, 0x65, 0x7a, 0x22, 0xc6, 0xeb, 0xbc, 0xb6, 0x81, 0x98, 0x55, 0x9d, 0x85, 0xed,
0xc1, 0x12, 0xf8, 0x6c, 0x65, 0xfb, 0xb3, 0x0a, 0x1d, 0x2c, 0xb5, 0x36, 0x1c, 0x82, 0x39, 0x58,
0xa2, 0x49, 0xdc, 0xbc, 0xbd, 0x52, 0x2e, 0x8a, 0xaa, 0xa7, 0x79, 0x08, 0x0a, 0x37, 0xaf, 0x0b,
0x83, 0xcf, 0xab, 0xe8, 0x37, 0xdd, 0x47, 0xfa, 0x2a, 0xaf, 0x8c, 0xd7, 0x0d, 0xfe, 0x39, 0x39,
0x18, 0x73, 0x44, 0x13, 0xc0, 0xed, 0x12, 0xdb, 0x7a, 0x56, 0x3b, 0x42, 0xc5, 0x69, 0x56, 0x8d,
0x57, 0x69, 0x1b, 0xad, 0x9c, 0x59, 0x62, 0x29, 0x0e, 0x0f, 0xa1, 0x9d, 0x45, 0x91, 0xa5, 0x49,
0xf7, 0xac, 0x0e, 0x74, 0x8d, 0x38, 0x3c, 0x84, 0x5c, 0x0c, 0x4f, 0x09, 0x53, 0xa1, 0x9a, 0xff,
0x39, 0xbe, 0x2e, 0x04, 0x3d, 0x25, 0x78, 0x48, 0x78, 0x4a, 0xc0, 0x28, 0x6e, 0xcf, 0x54, 0xa8,
0xe7, 0xf1, 0xb5, 0x5c, 0x30, 0x53, 0x82, 0x11, 0x87, 0xdb, 0xe3, 0x62, 0x76, 0xe1, 0x36, 0x1e,
0xf6, 0x73, 0x25, 0xca, 0x3c, 0xce, 0x76, 0xb3, 0x78, 0x5e, 0x8d, 0x99, 0x71, 0xe3, 0x53, 0xcc,
0xc2, 0xcd, 0xd3, 0xc4, 0x63, 0xdc, 0xaf, 0x76, 0xe3, 0x0b, 0x59, 0xa6, 0x8a, 0x7f, 0x8c, 0x16,
0xe9, 0x7d, 0x8c, 0x1e, 0x4a, 0x7a, 0xdb, 0x2a, 0x93, 0xd3, 0xf4, 0x42, 0xcc, 0x02, 0xde, 0x5a,
0x64, 0x80, 0x37, 0x07, 0x25, 0x3a, 0x6d, 0x2a, 0x17, 0x65, 0x22, 0xd8, 0x4e, 0x6b, 0xc4, 0xbd,
0x9d, 0x66, 0x30, 0xf0, 0xf0, 0x57, 0xa3, 0xe8, 0xb7, 0x1a, 0xa9, 0x7b, 0x80, 0xb6, 0x13, 0x57,
0xa7, 0x27, 0x32, 0x2e, 0x67, 0xe3, 0x8f, 0x29, 0x3b, 0x24, 0x6a, 0x5c, 0x3f, 0x5e, 0x46, 0x05,
0x3f, 0xd6, 0xe7, 0x69, 0xe5, 0x8c, 0x38, 0xf2, 0xb1, 0x7a, 0x48, 0xf8, 0xb1, 0x62, 0x14, 0x4f,
0x20, 0x5a, 0xde, 0x6c, 0x56, 0x57, 0x59, 0x7d, 0x7f, 0xc7, 0xba, 0xd6, 0xcb, 0xe1, 0xf9, 0xb1,
0x16, 0xfa, 0xd9, 0xb2, 0xc1, 0xd9, 0xa0, 0x33, 0x66, 0x32, 0x14, 0x67, 0x3d, 0x9b, 0x51, 0x11,
0xf6, 0xdc, 0x19, 0x19, 0x93, 0xa1, 0x38, 0xe3, 0xd9, 0x99, 0xd6, 0x42, 0x9e, 0x89, 0xa9, 0x6d,
0x32, 0x14, 0xc7, 0x09, 0xb4, 0x55, 0x14, 0xd9, 0xf5, 0xb1, 0x38, 0x2f, 0x32, 0x36, 0x81, 0x3c,
0x24, 0x9c, 0x40, 0x18, 0xc5, 0xd5, 0xcf, 0xb1, 0xac, 0x6b, 0x2b, 0xb2, 0xfa, 0xd1, 0xa2, 0x70,
0xf5, 0xd3, 0x22, 0xb8, 0x60, 0x38, 0x96, 0xdb, 0x32, 0xcb, 0x44, 0xa2, 0xba, 0x37, 0x51, 0x46,
0xd3, 0x12, 0xe1, 0x82, 0x01, 0x91, 0xf6, 0xc4, 0xa1, 0xad, 0xd5, 0xe3, 0x52, 0x3c, 0xbd, 0x7e,
0x9e, 0xe6, 0x67, 0x63, 0x7a, 0x6d, 0xb4, 0x00, 0x73, 0xe2, 0x40, 0x82, 0x78, 0x4f, 0xf0, 0x2a,
0x9f, 0x49, 0x7a, 0x4f, 0x50, 0x4b, 0xc2, 0x7b, 0x02, 0x20, 0xb0, 0xc9, 0x23, 0xc1, 0x99, 0xac,
0x25, 0x61, 0x93, 0x40, 0x50, 0xf3, 0x01, 0x1c, 0xed, 0xb1, 0xf3, 0x01, 0x3a, 0xcc, 0x5b, 0xeb,
0xe5, 0x70, 0x86, 0xb6, 0x9b, 0x83, 0x5d, 0xa1, 0x92, 0x53, 0x3a, 0x43, 0x3d, 0x24, 0x9c, 0xa1,
0x18, 0xc5, 0x4d, 0x3a, 0x96, 0x66, 0x73, 0xb3, 0x4a, 0xe7, 0x47, 0x67, 0x63, 0xb3, 0xd6, 0xcb,
0xe1, 0x72, 0x7d, 0xff, 0x5c, 0x3f, 0x33, 0x32, 0xc9, 0x1b, 0x59, 0xb8, 0x5c, 0x37, 0x0c, 0x8e,
0xbe, 0x11, 0xd4, 0x8f, 0x93, 0x8e, 0xde, 0xca, 0xc3, 0xd1, 0x7b, 0x1c, 0x38, 0xf9, 0xd7, 0x51,
0x74, 0xd3, 0xf5, 0x72, 0x20, 0xeb, 0x31, 0xf2, 0x3a, 0xce, 0xd2, 0x59, 0xac, 0xc4, 0xb1, 0x3c,
0x13, 0x39, 0xda, 0xef, 0xfb, 0xd1, 0x36, 0xfc, 0xc4, 0x53, 0x60, 0xf6, 0xfb, 0x83, 0x14, 0x71,
0x9e, 0x34, 0xf4, 0xab, 0x4a, 0x6c, 0xc7, 0x15, 0x33, 0x93, 0x79, 0x48, 0x38, 0x4f, 0x30, 0x8a,
0x8b, 0xb6, 0x46, 0xfe, 0xec, 0xaa, 0x10, 0x65, 0x2a, 0xf2, 0x44, 0xd0, 0x45, 0x1b, 0xa6, 0xc2,
0x45, 0x1b, 0x41, 0x77, 0xb6, 0xc3, 0x66, 0x72, 0xea, 0x5e, 0x26, 0x63, 0x22, 0x70, 0x99, 0xcc,
0xa0, 0xb8, 0x91, 0x16, 0x20, 0x8f, 0x94, 0x3a, 0x56, 0x82, 0x47, 0x4a, 0x3c, 0xdd, 0x39, 0x64,
0x30, 0xcc, 0xb4, 0x1e, 0x26, 0x3d, 0xa1, 0x4f, 0xdd, 0xe1, 0xb2, 0x3e, 0x88, 0xa5, 0x4f, 0x35,
0x8e, 0x44, 0x16, 0xeb, 0x25, 0x24, 0x70, 0x74, 0xd0, 0x32, 0x43, 0x4e, 0x35, 0x1c, 0x16, 0x1c,
0xfe, 0xc5, 0x28, 0xba, 0x41, 0x79, 0x7c, 0x59, 0x68, 0xbf, 0x8f, 0xfa, 0x6d, 0x35, 0x24, 0x73,
0x5b, 0x1e, 0xd6, 0x80, 0x18, 0xfe, 0x24, 0xfa, 0xa0, 0x15, 0xd9, 0xcb, 0x74, 0x08, 0xc0, 0xaf,
0x22, 0x4c, 0xfc, 0x98, 0x33, 0xee, 0x37, 0x07, 0xf3, 0xb6, 0x40, 0xf7, 0xe3, 0xaa, 0x50, 0x81,
0x6e, 0x6c, 0x80, 0x98, 0x29, 0xd0, 0x09, 0x0c, 0xaf, 0xd4, 0x2d, 0x52, 0x8f, 0x13, 0x6a, 0x8e,
0x33, 0x26, 0xdc, 0x51, 0x72, 0xaf, 0x1f, 0xc4, 0xb9, 0xd3, 0x8a, 0xa1, 0x2e, 0x7e, 0x10, 0xb2,
0x80, 0x6a, 0xe3, 0xf5, 0x41, 0x2c, 0x38, 0xfc, 0xb3, 0xe8, 0xfb, 0x9d, 0x86, 0xed, 0x8a, 0x58,
0x2d, 0x4a, 0x31, 0x1b, 0x6f, 0xf6, 0xc4, 0xdd, 0x82, 0xc6, 0xf5, 0xa3, 0xe1, 0x0a, 0xe0, 0xff,
0x6f, 0x46, 0xd1, 0x0f, 0x7c, 0xae, 0xe9, 0x62, 0x13, 0xc3, 0xe3, 0x90, 0x49, 0x9f, 0x35, 0x61,
0x3c, 0x59, 0x4a, 0xa7, 0xb3, 0x07, 0x73, 0x13, 0x79, 0xeb, 0x22, 0x4e, 0xb3, 0xf8, 0x24, 0x13,
0xe4, 0x1e, 0xcc, 0xcb, 0x4d, 0x83, 0x06, 0xf7, 0x60, 0xac, 0x4a, 0x67, 0x96, 0xd4, 0xe3, 0xcd,
0xa9, 0xdd, 0x1f, 0xf2, 0xa3, 0x92, 0x28, 0xdd, 0x37, 0x06, 0xd2, 0xe0, 0x56, 0xb5, 0x67, 0x57,
0xf5, 0x9f, 0xdd, 0x24, 0xa7, 0xbc, 0x82, 0x2a, 0x91, 0xe9, 0x1b, 0x03, 0x69, 0xf0, 0xfa, 0xa7,
0xd1, 0x07, 0x5d, 0xaf, 0xb0, 0x28, 0x6c, 0xf6, 0x9a, 0x42, 0xeb, 0xc2, 0xa3, 0xe1, 0x0a, 0xb6,
0xd4, 0xff, 0x22, 0xad, 0x94, 0x2c, 0xaf, 0xa7, 0xa7, 0xf2, 0xb2, 0x7d, 0x61, 0xd4, 0x1f, 0xad,
0x00, 0x4c, 0x1c, 0x82, 0x29, 0xf5, 0x69, 0xb2, 0xe3, 0xca, 0xbe, 0x58, 0x5a, 0x31, 0xae, 0x1c,
0xa2, 0xc7, 0x95, 0x4f, 0xda, 0xb9, 0xaa, 0x6d, 0x95, 0x7d, 0x0b, 0x76, 0x8d, 0x0e, 0xb5, 0xfb,
0x26, 0xec, 0xbd, 0x7e, 0xd0, 0x6e, 0xbf, 0x76, 0xd3, 0x4c, 0xbc, 0x7c, 0xfb, 0x36, 0x93, 0xf1,
0x0c, 0x6d, 0xbf, 0x6a, 0xc9, 0x04, 0x44, 0xcc, 0xf6, 0x0b, 0x21, 0xb6, 0xe8, 0xac, 0x05, 0xfa,
0x6e, 0xa6, 0x35, 0xbd, 0xda, 0xd5, 0x73, 0xe5, 0x4c, 0xd1, 0x49, 0x71, 0x76, 0xc1, 0xa8, 0xa5,
0xf5, 0x10, 0x6c, 0x7d, 0xdc, 0xed, 0xea, 0x3a, 0x62, 0x66, 0xc1, 0x20, 0x30, 0xbb, 0x3f, 0xaa,
0x85, 0xaf, 0x0a, 0x6d, 0xfc, 0x56, 0x57, 0xab, 0x91, 0x30, 0xfb, 0x23, 0x9f, 0xb0, 0x75, 0x7e,
0xfd, 0xf7, 0x1d, 0x79, 0x99, 0x6b, 0xa3, 0xc4, 0xd3, 0x6c, 0x65, 0x4c, 0x9d, 0x8f, 0x19, 0x30,
0xfc, 0xd3, 0xe8, 0x17, 0xb5, 0xe1, 0x52, 0x16, 0xe3, 0x15, 0x42, 0xa1, 0x74, 0x5e, 0x3b, 0xb9,
0xc9, 0xca, 0xed, 0xdb, 0x53, 0xa6, 0xff, 0x5e, 0x55, 0xf1, 0x5c, 0xa0, 0xb7, 0xa7, 0x6c, 0xaf,
0x68, 0x29, 0xf3, 0xf6, 0x54, 0x97, 0xb2, 0x6f, 0x04, 0xd5, 0xb2, 0x03, 0x39, 0x03, 0xeb, 0x44,
0x0b, 0x8d, 0x90, 0x79, 0x23, 0xa8, 0x03, 0xd9, 0xf3, 0xfb, 0x83, 0xf8, 0x22, 0x9d, 0x9b, 0xc9,
0xbf, 0x99, 0x43, 0x2a, 0x74, 0x7e, 0x6f, 0x99, 0x89, 0x03, 0x31, 0xe7, 0xf7, 0x2c, 0x0c, 0x3e,
0xff, 0x65, 0x14, 0xdd, 0xb2, 0xcc, 0x5e, 0x7b, 0xac, 0xb2, 0x9f, 0xbf, 0x95, 0x6f, 0x52, 0x75,
0x5a, 0xef, 0xe3, 0xab, 0xf1, 0x67, 0x9c, 0x49, 0x9a, 0x37, 0xa1, 0x7c, 0xbe, 0xb4, 0x9e, 0xad,
0xe6, 0xda, 0xe3, 0x16, 0x7b, 0xb7, 0xd5, 0x68, 0xa0, 0x6a, 0xce, 0x9c, 0xca, 0x60, 0x8e, 0xa9,
0xe6, 0x42, 0xbc, 0xed, 0x62, 0xe3, 0x3c, 0x93, 0x39, 0xee, 0x62, 0x6b, 0xa1, 0x16, 0x32, 0x5d,
0xdc, 0x81, 0xec, 0xdc, 0xd8, 0x8a, 0x9a, 0x93, 0x81, 0xad, 0x2c, 0x43, 0x73, 0xa3, 0x51, 0x35,
0x00, 0x33, 0x37, 0x92, 0x20, 0xf8, 0x39, 0x8a, 0xbe, 0x53, 0x3f, 0xd2, 0xc3, 0x52, 0x5c, 0xa4,
0x02, 0x5f, 0xc3, 0x3a, 0x12, 0x66, 0xfc, 0xfb, 0x84, 0x1d, 0x59, 0xaf, 0xf2, 0xaa, 0xc8, 0xe2,
0xea, 0x14, 0x2e, 0xe6, 0xfc, 0x36, 0xb7, 0x42, 0x7c, 0x35, 0x77, 0xb7, 0x87, 0xb2, 0x13, 0x6f,
0x2b, 0x33, 0x53, 0xcc, 0x2a, 0xad, 0xda, 0x99, 0x66, 0xd6, 0x7a, 0x39, 0x7b, 0x34, 0xb9, 0x17,
0x67, 0x99, 0x28, 0xaf, 0x5b, 0xd9, 0x8b, 0x38, 0x4f, 0xdf, 0x8a, 0x4a, 0xa1, 0xa3, 0x49, 0xa0,
0x26, 0x18, 0x63, 0x8e, 0x26, 0x03, 0xb8, 0xad, 0xac, 0x91, 0xe7, 0xfd, 0x7c, 0x26, 0xae, 0x50,
0x65, 0x8d, 0xed, 0x68, 0x86, 0xa9, 0xac, 0x39, 0xd6, 0x2e, 0x8f, 0x4f, 0x33, 0x99, 0x9c, 0xc1,
0x12, 0xe0, 0x77, 0xb0, 0x96, 0xe0, 0x35, 0xe0, 0x76, 0x08, 0xb1, 0x8b, 0x80, 0x16, 0x1c, 0x89,
0x22, 0x8b, 0x13, 0x7c, 0x17, 0xdf, 0xe8, 0x80, 0x8c, 0x59, 0x04, 0x30, 0x83, 0xc2, 0x85, 0x3b,
0x7e, 0x2a, 0x5c, 0x74, 0xc5, 0x7f, 0x3b, 0x84, 0xd8, 0x65, 0x50, 0x0b, 0xa6, 0x45, 0x96, 0x2a,
0x34, 0x0c, 0x1a, 0x0d, 0x2d, 0x61, 0x86, 0x81, 0x4f, 0x20, 0x93, 0x2f, 0x44, 0x39, 0x17, 0xa4,
0x49, 0x2d, 0x09, 0x9a, 0x6c, 0x09, 0xfb, 0xf6, 0x51, 0xd3, 0x76, 0x59, 0x5c, 0xa3, 0xb7, 0x8f,
0xa0, 0x59, 0xb2, 0xb8, 0x66, 0xde, 0x3e, 0xf2, 0x00, 0x14, 0xe2, 0x61, 0x5c, 0x29, 0x3a, 0x44,
0x2d, 0x09, 0x86, 0xd8, 0x12, 0x76, 0x8d, 0x6e, 0x42, 0x5c, 0x28, 0xb4, 0x46, 0x43, 0x00, 0xce,
0x55, 0xe1, 0x4d, 0x56, 0x6e, 0x67, 0x92, 0xa6, 0x57, 0x84, 0xda, 0x4d, 0x45, 0x36, 0xab, 0xd0,
0x4c, 0x02, 0xcf, 0xbd, 0x95, 0x32, 0x33, 0x49, 0x97, 0x42, 0xa9, 0x04, 0x67, 0xb8, 0x54, 0xeb,
0xd0, 0xf1, 0xed, 0xed, 0x10, 0x62, 0xe7, 0xa7, 0x36, 0xe8, 0xed, 0xb8, 0x2c, 0xd3, 0x7a, 0xf1,
0x5f, 0xa5, 0x03, 0x6a, 0xe5, 0xcc, 0xfc, 0x44, 0x71, 0x68, 0x78, 0xb5, 0x13, 0x37, 0x15, 0x18,
0x9e, 0xba, 0x3f, 0x0a, 0x32, 0xb6, 0xe2, 0xd4, 0x12, 0xe7, 0xae, 0x8b, 0x7a, 0x9a, 0xc4, 0x55,
0xd7, 0x6a, 0x1f, 0xe6, 0xbc, 0xcf, 0x6c, 0x5c, 0xbc, 0x90, 0x17, 0xe2, 0x58, 0x3e, 0xbb, 0x4a,
0x2b, 0x95, 0xe6, 0x73, 0x58, 0xb9, 0x9f, 0x30, 0x96, 0x28, 0x98, 0x79, 0x9f, 0xb9, 0x57, 0xc9,
0x16, 0x10, 0x28, 0x96, 0x03, 0x71, 0x49, 0x16, 0x10, 0xd8, 0xa2, 0xe1, 0x98, 0x02, 0x22, 0xc4,
0xdb, 0x33, 0x0d, 0xe3, 0x1c, 0x7e, 0xf4, 0x75, 0x2c, 0xdb, 0x5a, 0x8e, 0xb3, 0x86, 0x41, 0x66,
0x5b, 0x19, 0x54, 0xb0, 0x7b, 0x3d, 0xe3, 0xdf, 0x0e, 0xb1, 0x7b, 0x8c, 0x9d, 0xee, 0x30, 0xbb,
0x3f, 0x80, 0x24, 0x5c, 0xd9, 0x0b, 0x5b, 0xce, 0x55, 0xf7, 0xbe, 0xf6, 0xfe, 0x00, 0xd2, 0x39,
0x1f, 0x71, 0x9b, 0xf5, 0x34, 0x4e, 0xce, 0xe6, 0xa5, 0x5c, 0xe4, 0xb3, 0x6d, 0x99, 0xc9, 0x12,
0x9d, 0x8f, 0x78, 0x51, 0x23, 0x94, 0x39, 0x1f, 0xe9, 0x51, 0xb1, 0x15, 0x9c, 0x1b, 0xc5, 0x56,
0x96, 0xce, 0xf1, 0xee, 0xd6, 0x33, 0xa4, 0x01, 0xa6, 0x82, 0x23, 0x41, 0x22, 0x89, 0x9a, 0xdd,
0xaf, 0x4a, 0x93, 0x38, 0x6b, 0xfc, 0x6d, 0xf2, 0x66, 0x3c, 0xb0, 0x37, 0x89, 0x08, 0x05, 0xa2,
0x9d, 0xc7, 0x8b, 0x32, 0xdf, 0xcf, 0x95, 0x64, 0xdb, 0xd9, 0x02, 0xbd, 0xed, 0x74, 0x40, 0x34,
0xad, 0x1e, 0x8b, 0xab, 0x3a, 0x9a, 0xfa, 0x3f, 0xd4, 0xb4, 0x5a, 0xff, 0x7d, 0x02, 0xf2, 0xd0,
0xb4, 0x8a, 0x38, 0xd4, 0x18, 0x70, 0xd2, 0x24, 0x4c, 0x40, 0xdb, 0x4f, 0x93, 0x7b, 0xfd, 0x20,
0xed, 0x67, 0xaa, 0xae, 0x33, 0x11, 0xf2, 0xa3, 0x81, 0x21, 0x7e, 0x5a, 0xd0, 0x5e, 0x9c, 0x78,
0xed, 0x39, 0x15, 0xc9, 0x59, 0xe7, 0xfd, 0x13, 0x3f, 0xd0, 0x06, 0x61, 0x2e, 0x4e, 0x18, 0x94,
0xee, 0xa2, 0xfd, 0x44, 0xe6, 0xa1, 0x2e, 0xaa, 0xe5, 0x43, 0xba, 0x08, 0x38, 0xbb, 0xf9, 0x35,
0x52, 0xc8, 0xcc, 0xa6, 0x9b, 0xd6, 0x19, 0x0b, 0x2e, 0xc4, 0x6c, 0x7e, 0x59, 0xd8, 0xd6, 0xe4,
0xd8, 0xe7, 0x8b, 0xee, 0xfb, 0x9f, 0x1d, 0x2b, 0x2f, 0xf8, 0xf7, 0x3f, 0x39, 0x96, 0x6f, 0x64,
0x93, 0x23, 0x3d, 0x56, 0xfc, 0x3c, 0x79, 0x38, 0x0c, 0xb6, 0x5b, 0x1e, 0xcf, 0xe7, 0x76, 0x26,
0xe2, 0xb2, 0xf1, 0xba, 0x11, 0x30, 0x64, 0x31, 0x66, 0xcb, 0x13, 0xc0, 0xd1, 0x14, 0xe6, 0x79,
0xde, 0x96, 0xb9, 0x12, 0xb9, 0xa2, 0xa6, 0x30, 0xdf, 0x18, 0x80, 0xa1, 0x29, 0x8c, 0x53, 0x40,
0x79, 0xab, 0xcf, 0x83, 0x84, 0x3a, 0x88, 0xcf, 0xc9, 0x8a, 0xad, 0x39, 0xeb, 0x69, 0xe4, 0xa1,
0xbc, 0x45, 0x1c, 0x1a, 0xf2, 0xfb, 0xe7, 0xf1, 0xdc, 0x78, 0x21, 0xb4, 0xb5, 0xbc, 0xe3, 0xe6,
0x5e, 0x3f, 0x88, 0xfc, 0xbc, 0x4e, 0x67, 0x42, 0x06, 0xfc, 0x68, 0xf9, 0x10, 0x3f, 0x18, 0x44,
0x95, 0x53, 0xdd, 0xda, 0x66, 0x37, 0xb5, 0x95, 0xcf, 0x60, 0x0f, 0x39, 0x61, 0x1e, 0x0a, 0xe2,
0x42, 0x95, 0x13, 0xc3, 0xa3, 0xf1, 0xd1, 0x1e, 0x8e, 0x86, 0xc6, 0x87, 0x39, 0xfb, 0x1c, 0x32,
0x3e, 0x28, 0x18, 0x7c, 0xfe, 0x31, 0x8c, 0x8f, 0x9d, 0x58, 0xc5, 0x75, 0xcd, 0xfc, 0x3a, 0x15,
0x97, 0xb0, 0x09, 0x25, 0xda, 0xdb, 0x52, 0x13, 0xfd, 0x8b, 0x17, 0xb4, 0x23, 0xdd, 0x1c, 0xcc,
0x07, 0x7c, 0x43, 0x75, 0xde, 0xeb, 0x1b, 0x95, 0xe9, 0x9b, 0x83, 0xf9, 0x80, 0x6f, 0xf8, 0x29,
0x5d, 0xaf, 0x6f, 0xf4, 0x7b, 0xba, 0xcd, 0xc1, 0x3c, 0xf8, 0xfe, 0xcb, 0x51, 0x74, 0xa3, 0xe3,
0xbc, 0xae, 0x81, 0x12, 0x95, 0x5e, 0x08, 0xaa, 0x94, 0xf3, 0xed, 0x19, 0x34, 0x54, 0xca, 0xf1,
0x2a, 0xce, 0xf7, 0x17, 0xa8, 0x28, 0x0e, 0x65, 0x95, 0xea, 0x8b, 0xe3, 0x27, 0x03, 0x8c, 0xb6,
0x70, 0x68, 0xc3, 0x12, 0x52, 0xb2, 0xd7, 0x6e, 0x1e, 0x6a, 0x5f, 0xf5, 0x7c, 0x18, 0xb0, 0xd7,
0x7d, 0xe3, 0x73, 0x63, 0x20, 0x6d, 0x2f, 0xc0, 0x3c, 0xc6, 0xbd, 0x79, 0x0b, 0xf5, 0x2a, 0x79,
0xf9, 0xf6, 0x68, 0xb8, 0x02, 0xb8, 0xff, 0xeb, 0xb6, 0xa6, 0xc7, 0xfe, 0x61, 0x10, 0x3c, 0x1e,
0x62, 0x11, 0x0d, 0x84, 0x27, 0x4b, 0xe9, 0x40, 0x20, 0xff, 0x31, 0x8a, 0x6e, 0x93, 0x81, 0xf8,
0x77, 0xb0, 0xbf, 0x3d, 0xc4, 0x36, 0x7d, 0x17, 0xfb, 0xe3, 0x6f, 0xa3, 0x0a, 0xd1, 0xfd, 0x7d,
0xbb, 0xb5, 0x6e, 0x35, 0xf4, 0xeb, 0xf8, 0x2f, 0xcb, 0x99, 0x28, 0x61, 0xc4, 0x86, 0x92, 0xce,
0xc2, 0x78, 0xdc, 0x7e, 0xba, 0xa4, 0x96, 0xf3, 0xad, 0x10, 0x0f, 0x86, 0x5f, 0x26, 0x39, 0xf1,
0x84, 0x2c, 0x3b, 0x34, 0x0e, 0xe8, 0xb3, 0x65, 0xd5, 0xb8, 0x91, 0xec, 0xc0, 0xfa, 0xa7, 0xc7,
0x4f, 0x06, 0x1a, 0xf6, 0x7e, 0x8c, 0xfc, 0xc9, 0x72, 0x4a, 0x10, 0xcb, 0x7f, 0x8d, 0xa2, 0xbb,
0x1e, 0x6b, 0x6f, 0x1a, 0xd0, 0x79, 0xc8, 0x4f, 0x02, 0xf6, 0x39, 0x25, 0x13, 0xdc, 0xef, 0x7c,
0x3b, 0x65, 0xfb, 0x61, 0x0d, 0x4f, 0x65, 0x37, 0xcd, 0x94, 0x28, 0xbb, 0x1f, 0xd6, 0xf0, 0xed,
0x36, 0xd4, 0x84, 0xff, 0xb0, 0x46, 0x00, 0x77, 0x3e, 0xac, 0x41, 0x78, 0x26, 0x3f, 0xac, 0x41,
0x5a, 0x0b, 0x7e, 0x58, 0x23, 0xac, 0xc1, 0x2d, 0x3e, 0x6d, 0x08, 0xcd, 0x89, 0xf6, 0x20, 0x8b,
0xfe, 0x01, 0xf7, 0xe3, 0x65, 0x54, 0x98, 0xe5, 0xb7, 0xe1, 0xf4, 0x9b, 0x61, 0x03, 0x9e, 0xa9,
0xf7, 0x76, 0xd8, 0xe6, 0x60, 0x1e, 0x7c, 0xff, 0x0c, 0xf6, 0x3d, 0x66, 0xb1, 0x91, 0xa5, 0xfe,
0xa8, 0xca, 0x7a, 0x68, 0xf1, 0xa8, 0x2d, 0xb8, 0x3d, 0xff, 0x70, 0x18, 0xcc, 0x34, 0xb7, 0x26,
0xa0, 0xd3, 0x27, 0x7d, 0x86, 0x50, 0x97, 0x6f, 0x0e, 0xe6, 0x99, 0x45, 0xae, 0xf1, 0xdd, 0xf4,
0xf6, 0x00, 0x63, 0x7e, 0x5f, 0x3f, 0x1a, 0xae, 0x60, 0x5f, 0x6d, 0xe9, 0xb8, 0xd7, 0xfd, 0xdc,
0xfb, 0x04, 0xbd, 0x5e, 0xde, 0x18, 0x48, 0x87, 0x8a, 0x1b, 0x77, 0x79, 0xef, 0x2b, 0x6e, 0xc8,
0x25, 0xfe, 0x93, 0xe5, 0x94, 0x20, 0x96, 0x7f, 0x1e, 0x45, 0x37, 0xd9, 0x58, 0x20, 0x0b, 0x3e,
0x1b, 0x6a, 0x19, 0x65, 0xc3, 0xe7, 0x4b, 0xeb, 0x41, 0x50, 0xff, 0x36, 0x8a, 0x6e, 0x05, 0x82,
0x6a, 0xd2, 0x63, 0x09, 0xeb, 0x7e, 0x9a, 0xfc, 0x68, 0x79, 0x45, 0x6e, 0xb1, 0x77, 0xf1, 0x69,
0xf7, 0x7b, 0x13, 0x01, 0xdb, 0x53, 0xfe, 0x7b, 0x13, 0xfd, 0x5a, 0xf8, 0xf0, 0xa7, 0x2e, 0x49,
0x60, 0x5f, 0x44, 0x1d, 0xfe, 0xe8, 0x8a, 0x05, 0xed, 0x87, 0xd6, 0x7a, 0x39, 0xca, 0xc9, 0xb3,
0xab, 0x22, 0xce, 0x67, 0xbc, 0x93, 0x46, 0xde, 0xef, 0xc4, 0x70, 0xf8, 0xd0, 0xac, 0x96, 0x1e,
0xc9, 0x76, 0x93, 0x77, 0x9f, 0xd3, 0x37, 0x48, 0xf0, 0xd0, 0xac, 0x83, 0x32, 0xde, 0xa0, 0xa2,
0x0d, 0x79, 0x43, 0x85, 0xec, 0x83, 0x21, 0x28, 0xda, 0x3e, 0x18, 0x6f, 0xe6, 0x2c, 0xfe, 0x61,
0xc8, 0x4a, 0xe7, 0x3c, 0x7e, 0x63, 0x20, 0xcd, 0xb8, 0x9d, 0x0a, 0xf5, 0x85, 0x88, 0x67, 0xa2,
0x0c, 0xba, 0x35, 0xd4, 0x20, 0xb7, 0x2e, 0x4d, 0xb9, 0xdd, 0x96, 0xd9, 0xe2, 0x3c, 0x87, 0xce,
0x64, 0xdd, 0xba, 0x54, 0xbf, 0x5b, 0x44, 0xe3, 0xe3, 0x42, 0xeb, 0x56, 0x17, 0x97, 0x0f, 0xc2,
0x66, 0xbc, 0x9a, 0x72, 0x7d, 0x10, 0xcb, 0xb7, 0x13, 0xd2, 0xa8, 0xa7, 0x9d, 0x28, 0x93, 0x36,
0x06, 0xd2, 0xf8, 0xdc, 0xce, 0x71, 0x6b, 0xf2, 0x69, 0xb3, 0xc7, 0x56, 0x27, 0xa5, 0x1e, 0x0d,
0x57, 0xc0, 0xa7, 0xa4, 0x90, 0x55, 0xf5, 0xae, 0x68, 0x37, 0xcd, 0xb2, 0xf1, 0x7a, 0x20, 0x4d,
0x5a, 0x28, 0x78, 0x4a, 0x4a, 0xc0, 0x4c, 0x26, 0xb7, 0xa7, 0x8a, 0xf9, 0xb8, 0xcf, 0x8e, 0xa6,
0x06, 0x65, 0xb2, 0x4b, 0xa3, 0xd3, 0x36, 0xe7, 0x51, 0x9b, 0xd6, 0x4e, 0xc2, 0x0f, 0xae, 0xd3,
0xe0, 0xcd, 0xc1, 0x3c, 0xba, 0x86, 0xd7, 0x94, 0x5e, 0x59, 0xee, 0x70, 0x26, 0xbc, 0x95, 0xe4,
0x6e, 0x0f, 0x85, 0x4e, 0x2c, 0x9b, 0x61, 0xf4, 0x26, 0x9d, 0xcd, 0x85, 0x22, 0x6f, 0x90, 0x5c,
0x20, 0x78, 0x83, 0x84, 0x40, 0xd4, 0x75, 0xcd, 0xdf, 0xa7, 0x42, 0x1d, 0xc7, 0xe5, 0x5c, 0xa8,
0xfd, 0x19, 0xd5, 0x75, 0xa0, 0xec, 0x50, 0xa1, 0xae, 0x23, 0x69, 0x34, 0x1b, 0x18, 0xb7, 0xf0,
0x7b, 0xea, 0x07, 0x21, 0x33, 0xe8, 0x47, 0xd5, 0xeb, 0x83, 0x58, 0xb4, 0xa2, 0x58, 0x87, 0xe9,
0x79, 0xaa, 0xa8, 0x15, 0xc5, 0xb1, 0x51, 0x23, 0xa1, 0x15, 0xa5, 0x8b, 0x72, 0xcd, 0xab, 0x6b,
0x84, 0xfd, 0x59, 0xb8, 0x79, 0x0d, 0x33, 0xac, 0x79, 0x86, 0xed, 0x5c, 0x78, 0xe6, 0x26, 0x65,
0xd4, 0x29, 0x6c, 0x95, 0x89, 0xdc, 0xd6, 0x3f, 0x31, 0xc4, 0x60, 0x68, 0xd6, 0xe1, 0x14, 0x9c,
0x5f, 0xb1, 0x18, 0xae, 0xbd, 0x93, 0x2d, 0x0a, 0x11, 0x97, 0x71, 0x9e, 0x90, 0x5b, 0x53, 0x6d,
0xb0, 0x43, 0x86, 0xb6, 0xa6, 0xac, 0x06, 0xba, 0x4e, 0xf7, 0x7f, 0x1c, 0x48, 0x0c, 0x05, 0xf3,
0x2b, 0x3c, 0xff, 0xb7, 0x81, 0xf7, 0x07, 0x90, 0xf8, 0x3a, 0xbd, 0x05, 0xcc, 0xa1, 0x7c, 0xe3,
0xf4, 0xe3, 0x80, 0x29, 0x1f, 0x0d, 0x6d, 0x83, 0x79, 0x15, 0x94, 0xd4, 0xa6, 0xc0, 0x15, 0xea,
0xa7, 0xe2, 0x9a, 0x4a, 0x6a, 0x5b, 0x9f, 0x6a, 0x24, 0x94, 0xd4, 0x5d, 0x14, 0xd5, 0x99, 0xee,
0x3e, 0x68, 0x35, 0xa0, 0xef, 0x6e, 0x7d, 0xd6, 0x7a, 0x39, 0x34, 0x72, 0x76, 0xd2, 0x0b, 0xef,
0x0e, 0x83, 0x08, 0x74, 0x27, 0xbd, 0xa0, 0xaf, 0x30, 0xd6, 0x07, 0xb1, 0xf8, 0xaa, 0x3e, 0x56,
0xe2, 0xaa, 0xbd, 0x43, 0x27, 0xc2, 0xd5, 0xf2, 0xce, 0x25, 0xfa, 0xbd, 0x7e, 0xd0, 0xbe, 0x18,
0x7b, 0x58, 0xca, 0x44, 0x54, 0x15, 0x7c, 0x84, 0xcb, 0x7f, 0xf3, 0x08, 0x64, 0x13, 0xf4, 0x09,
0xae, 0x3b, 0x61, 0x08, 0x6c, 0x7f, 0x11, 0xbd, 0xfb, 0x5c, 0xce, 0xa7, 0x22, 0x9f, 0x8d, 0x7f,
0xe8, 0xbf, 0x8a, 0x2a, 0xe7, 0x93, 0xfa, 0xcf, 0xc6, 0xde, 0x0a, 0x27, 0xb6, 0x2f, 0xd3, 0xed,
0x88, 0x93, 0xc5, 0x7c, 0xaa, 0x62, 0xfc, 0x29, 0x2f, 0xfd, 0xf7, 0x49, 0x2d, 0x60, 0x5e, 0xa6,
0xf3, 0x00, 0x64, 0xef, 0xb8, 0x14, 0x82, 0xb4, 0x57, 0x0b, 0x82, 0xf6, 0x00, 0xb0, 0xab, 0xae,
0xb1, 0x57, 0x17, 0xb6, 0xf8, 0xe5, 0x37, 0xab, 0xa3, 0xa5, 0xcc, 0xaa, 0xdb, 0xa5, 0x6c, 0x32,
0x34, 0xcd, 0xd7, 0x9f, 0x59, 0x58, 0x9c, 0x9f, 0xc7, 0xe5, 0x35, 0x4a, 0x06, 0x68, 0xa5, 0x03,
0x30, 0xc9, 0x40, 0x82, 0x36, 0xcb, 0xdb, 0xc7, 0x9c, 0x9c, 0xed, 0xc9, 0x52, 0x2e, 0x54, 0x9a,
0x8b, 0x0a, 0x65, 0xb9, 0x79, 0xa0, 0x2e, 0xc3, 0x64, 0x39, 0xc7, 0xda, 0xaa, 0x50, 0x13, 0xcd,
0x7b, 0x79, 0xfa, 0x53, 0x96, 0x95, 0x92, 0x25, 0xbe, 0x1b, 0x6c, 0xac, 0x60, 0x88, 0xa9, 0x0a,
0x59, 0x18, 0xf5, 0xfd, 0x61, 0x9a, 0xcf, 0xc9, 0xbe, 0x3f, 0x74, 0x3f, 0xdc, 0x76, 0x8b, 0x07,
0xec, 0xfc, 0xde, 0x3c, 0xb4, 0xe6, 0x73, 0x36, 0xf0, 0x5b, 0x41, 0xf2, 0xa1, 0xbb, 0x04, 0x33,
0xbf, 0xd3, 0x24, 0x72, 0xf5, 0xb2, 0x10, 0xb9, 0x98, 0xb5, 0x6f, 0x9f, 0x51, 0xae, 0x3c, 0x22,
0xe8, 0x0a, 0x93, 0x36, 0x15, 0x5e, 0x08, 0x55, 0xa6, 0x49, 0x35, 0x15, 0xea, 0x30, 0x2e, 0xe3,
0x73, 0xa1, 0x44, 0x89, 0x53, 0x01, 0x90, 0x89, 0xc7, 0x30, 0xa9, 0xc0, 0xb1, 0xe0, 0xf0, 0x77,
0xa3, 0xef, 0xd5, 0x33, 0xa1, 0xc8, 0xe1, 0xdb, 0xda, 0xcf, 0xf4, 0x47, 0xf9, 0xc7, 0xef, 0x1b,
0x1b, 0x53, 0x55, 0x8a, 0xf8, 0xbc, 0xb5, 0xfd, 0x9e, 0xf9, 0xbb, 0x06, 0x1f, 0x8d, 0xea, 0x75,
0xe0, 0x40, 0xaa, 0xf4, 0x6d, 0xbd, 0xf1, 0x80, 0x4b, 0x1e, 0xb4, 0x0e, 0xb8, 0xe2, 0x49, 0xe0,
0x97, 0xe5, 0x14, 0x67, 0x47, 0xa2, 0x2b, 0x3d, 0x12, 0x45, 0x86, 0x47, 0xa2, 0xa7, 0xad, 0x01,
0x66, 0x24, 0x92, 0xa0, 0x5d, 0xd4, 0x5c, 0xf1, 0xb1, 0x08, 0x37, 0xe6, 0x58, 0x0c, 0x6b, 0xcc,
0xb1, 0xf7, 0xfa, 0x7a, 0xbd, 0x27, 0x2b, 0x65, 0x3c, 0x4b, 0xe2, 0x4a, 0x1d, 0xc6, 0xd7, 0x99,
0x8c, 0x67, 0xfa, 0x61, 0xe2, 0x3d, 0x59, 0xcb, 0x4c, 0x5c, 0x88, 0xdb, 0x93, 0x71, 0x70, 0xe3,
0xf3, 0xe9, 0x87, 0xff, 0xf3, 0xf5, 0xca, 0xe8, 0xab, 0xaf, 0x57, 0x46, 0xff, 0xff, 0xf5, 0xca,
0xe8, 0x9f, 0xbe, 0x59, 0x79, 0xe7, 0xab, 0x6f, 0x56, 0xde, 0xf9, 0xdf, 0x6f, 0x56, 0xde, 0xf9,
0xf2, 0x5d, 0xf8, 0x27, 0x1c, 0x4e, 0x7e, 0x41, 0xff, 0x43, 0x0c, 0x4f, 0x7e, 0x1e, 0x00, 0x00,
0xff, 0xff, 0xad, 0xa3, 0x91, 0xda, 0xe6, 0x61, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -362,6 +364,7 @@ type ClientCommandsClient interface {
SpaceJoin(ctx context.Context, in *pb.RpcSpaceJoinRequest, opts ...grpc.CallOption) (*pb.RpcSpaceJoinResponse, error)
SpaceJoinCancel(ctx context.Context, in *pb.RpcSpaceJoinCancelRequest, opts ...grpc.CallOption) (*pb.RpcSpaceJoinCancelResponse, error)
SpaceExit(ctx context.Context, in *pb.RpcSpaceExitRequest, opts ...grpc.CallOption) (*pb.RpcSpaceExitResponse, error)
SpaceStopSharing(ctx context.Context, in *pb.RpcSpaceStopSharingRequest, opts ...grpc.CallOption) (*pb.RpcSpaceStopSharingResponse, error)
SpaceRequestApprove(ctx context.Context, in *pb.RpcSpaceRequestApproveRequest, opts ...grpc.CallOption) (*pb.RpcSpaceRequestApproveResponse, error)
SpaceRequestDecline(ctx context.Context, in *pb.RpcSpaceRequestDeclineRequest, opts ...grpc.CallOption) (*pb.RpcSpaceRequestDeclineResponse, error)
SpaceParticipantRemove(ctx context.Context, in *pb.RpcSpaceParticipantRemoveRequest, opts ...grpc.CallOption) (*pb.RpcSpaceParticipantRemoveResponse, error)
@ -566,6 +569,7 @@ type ClientCommandsClient interface {
BlockLatexSetText(ctx context.Context, in *pb.RpcBlockLatexSetTextRequest, opts ...grpc.CallOption) (*pb.RpcBlockLatexSetTextResponse, error)
ProcessCancel(ctx context.Context, in *pb.RpcProcessCancelRequest, opts ...grpc.CallOption) (*pb.RpcProcessCancelResponse, error)
LogSend(ctx context.Context, in *pb.RpcLogSendRequest, opts ...grpc.CallOption) (*pb.RpcLogSendResponse, error)
DebugStat(ctx context.Context, in *pb.RpcDebugStatRequest, opts ...grpc.CallOption) (*pb.RpcDebugStatResponse, error)
DebugTree(ctx context.Context, in *pb.RpcDebugTreeRequest, opts ...grpc.CallOption) (*pb.RpcDebugTreeResponse, error)
DebugTreeHeads(ctx context.Context, in *pb.RpcDebugTreeHeadsRequest, opts ...grpc.CallOption) (*pb.RpcDebugTreeHeadsResponse, error)
DebugSpaceSummary(ctx context.Context, in *pb.RpcDebugSpaceSummaryRequest, opts ...grpc.CallOption) (*pb.RpcDebugSpaceSummaryResponse, error)
@ -942,6 +946,15 @@ func (c *clientCommandsClient) SpaceExit(ctx context.Context, in *pb.RpcSpaceExi
return out, nil
}
func (c *clientCommandsClient) SpaceStopSharing(ctx context.Context, in *pb.RpcSpaceStopSharingRequest, opts ...grpc.CallOption) (*pb.RpcSpaceStopSharingResponse, error) {
out := new(pb.RpcSpaceStopSharingResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/SpaceStopSharing", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientCommandsClient) SpaceRequestApprove(ctx context.Context, in *pb.RpcSpaceRequestApproveRequest, opts ...grpc.CallOption) (*pb.RpcSpaceRequestApproveResponse, error) {
out := new(pb.RpcSpaceRequestApproveResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/SpaceRequestApprove", in, out, opts...)
@ -2490,6 +2503,15 @@ func (c *clientCommandsClient) LogSend(ctx context.Context, in *pb.RpcLogSendReq
return out, nil
}
func (c *clientCommandsClient) DebugStat(ctx context.Context, in *pb.RpcDebugStatRequest, opts ...grpc.CallOption) (*pb.RpcDebugStatResponse, error) {
out := new(pb.RpcDebugStatResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/DebugStat", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *clientCommandsClient) DebugTree(ctx context.Context, in *pb.RpcDebugTreeRequest, opts ...grpc.CallOption) (*pb.RpcDebugTreeResponse, error) {
out := new(pb.RpcDebugTreeResponse)
err := c.cc.Invoke(ctx, "/anytype.ClientCommands/DebugTree", in, out, opts...)
@ -2688,6 +2710,7 @@ type ClientCommandsServer interface {
SpaceJoin(context.Context, *pb.RpcSpaceJoinRequest) *pb.RpcSpaceJoinResponse
SpaceJoinCancel(context.Context, *pb.RpcSpaceJoinCancelRequest) *pb.RpcSpaceJoinCancelResponse
SpaceExit(context.Context, *pb.RpcSpaceExitRequest) *pb.RpcSpaceExitResponse
SpaceStopSharing(context.Context, *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse
SpaceRequestApprove(context.Context, *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse
SpaceRequestDecline(context.Context, *pb.RpcSpaceRequestDeclineRequest) *pb.RpcSpaceRequestDeclineResponse
SpaceParticipantRemove(context.Context, *pb.RpcSpaceParticipantRemoveRequest) *pb.RpcSpaceParticipantRemoveResponse
@ -2892,6 +2915,7 @@ type ClientCommandsServer interface {
BlockLatexSetText(context.Context, *pb.RpcBlockLatexSetTextRequest) *pb.RpcBlockLatexSetTextResponse
ProcessCancel(context.Context, *pb.RpcProcessCancelRequest) *pb.RpcProcessCancelResponse
LogSend(context.Context, *pb.RpcLogSendRequest) *pb.RpcLogSendResponse
DebugStat(context.Context, *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse
DebugTree(context.Context, *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse
DebugTreeHeads(context.Context, *pb.RpcDebugTreeHeadsRequest) *pb.RpcDebugTreeHeadsResponse
DebugSpaceSummary(context.Context, *pb.RpcDebugSpaceSummaryRequest) *pb.RpcDebugSpaceSummaryResponse
@ -3030,6 +3054,9 @@ func (*UnimplementedClientCommandsServer) SpaceJoinCancel(ctx context.Context, r
func (*UnimplementedClientCommandsServer) SpaceExit(ctx context.Context, req *pb.RpcSpaceExitRequest) *pb.RpcSpaceExitResponse {
return nil
}
func (*UnimplementedClientCommandsServer) SpaceStopSharing(ctx context.Context, req *pb.RpcSpaceStopSharingRequest) *pb.RpcSpaceStopSharingResponse {
return nil
}
func (*UnimplementedClientCommandsServer) SpaceRequestApprove(ctx context.Context, req *pb.RpcSpaceRequestApproveRequest) *pb.RpcSpaceRequestApproveResponse {
return nil
}
@ -3546,6 +3573,9 @@ func (*UnimplementedClientCommandsServer) ProcessCancel(ctx context.Context, req
func (*UnimplementedClientCommandsServer) LogSend(ctx context.Context, req *pb.RpcLogSendRequest) *pb.RpcLogSendResponse {
return nil
}
func (*UnimplementedClientCommandsServer) DebugStat(ctx context.Context, req *pb.RpcDebugStatRequest) *pb.RpcDebugStatResponse {
return nil
}
func (*UnimplementedClientCommandsServer) DebugTree(ctx context.Context, req *pb.RpcDebugTreeRequest) *pb.RpcDebugTreeResponse {
return nil
}
@ -4295,6 +4325,24 @@ func _ClientCommands_SpaceExit_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_SpaceStopSharing_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcSpaceStopSharingRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).SpaceStopSharing(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/SpaceStopSharing",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).SpaceStopSharing(ctx, req.(*pb.RpcSpaceStopSharingRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_SpaceRequestApprove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcSpaceRequestApproveRequest)
if err := dec(in); err != nil {
@ -7391,6 +7439,24 @@ func _ClientCommands_LogSend_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_DebugStat_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcDebugStatRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ClientCommandsServer).DebugStat(ctx, in), nil
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/anytype.ClientCommands/DebugStat",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ClientCommandsServer).DebugStat(ctx, req.(*pb.RpcDebugStatRequest)), nil
}
return interceptor(ctx, in, info, handler)
}
func _ClientCommands_DebugTree_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(pb.RpcDebugTreeRequest)
if err := dec(in); err != nil {
@ -7807,6 +7873,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "SpaceExit",
Handler: _ClientCommands_SpaceExit_Handler,
},
{
MethodName: "SpaceStopSharing",
Handler: _ClientCommands_SpaceStopSharing_Handler,
},
{
MethodName: "SpaceRequestApprove",
Handler: _ClientCommands_SpaceRequestApprove_Handler,
@ -8495,6 +8565,10 @@ var _ClientCommands_serviceDesc = grpc.ServiceDesc{
MethodName: "LogSend",
Handler: _ClientCommands_LogSend_Handler,
},
{
MethodName: "DebugStat",
Handler: _ClientCommands_DebugStat_Handler,
},
{
MethodName: "DebugTree",
Handler: _ClientCommands_DebugTree_Handler,

View file

@ -52,15 +52,16 @@ type Relation struct {
}
type ObjectType struct {
ID string `json:"id"`
Name string `json:"name"`
Types []string `json:"types"`
Emoji string `json:"emoji"`
Hidden bool `json:"hidden"`
Layout string `json:"layout"`
Relations []string `json:"relations"`
Description string `json:"description"`
Revision int `json:"revision"`
ID string `json:"id"`
Name string `json:"name"`
Types []string `json:"types"`
Emoji string `json:"emoji"`
Hidden bool `json:"hidden"`
Layout string `json:"layout"`
Relations []string `json:"relations"`
Description string `json:"description"`
Revision int `json:"revision"`
RestrictObjectCreation bool `json:"restrictObjectCreation"`
}
type Layout struct {
@ -305,6 +306,10 @@ func generateTypes() error {
dictS[Id("Revision")] = Lit(ot.Revision)
}
if ot.RestrictObjectCreation {
dictS[Id("RestrictObjectCreation")] = Lit(ot.RestrictObjectCreation)
}
dict[Id(typeConst(ot.ID))] = Block(dictS)
}
g.Id("types").Op("=").Map(Qual(domainPkg, "TypeKey")).Op("*").Qual(relPbPkg, "ObjectType").Values(Dict(dict))

View file

@ -67,6 +67,7 @@ func HasObjectTypeID(id string) bool {
return exists
}
// GetTypeByUrl is deprecated, use GetType instead
func GetTypeByUrl(u string) (*model.ObjectType, error) {
if !strings.HasPrefix(u, TypePrefix) {
return nil, fmt.Errorf("invalid url with no bundled type prefix")
@ -81,6 +82,16 @@ func GetTypeByUrl(u string) (*model.ObjectType, error) {
return nil, ErrNotFound
}
func GetType(tk domain.TypeKey) (*model.ObjectType, error) {
if v, exists := types[tk]; exists {
t := pbtypes.CopyObjectType(v)
t.Key = tk.String()
return t, nil
}
return nil, ErrNotFound
}
// MustGetType returns built-in object type by predefined TypeKey constant
// PANICS IN CASE RELATION KEY IS NOT EXISTS DO NOT USE WITH ARBITRARY STRING
func MustGetType(tk domain.TypeKey) *model.ObjectType {

View file

@ -9,7 +9,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
const RelationChecksum = "56d2e69285cd7e22d75e27e8538a9f8d0d542816b9ad97568436543afa724447"
const RelationChecksum = "15ce7e760c03abd6582ca7d20c4a04cc31f315cd6067149b32a9966e4f07b3fa"
const (
RelationKeyTag domain.RelationKey = "tag"
RelationKeyCamera domain.RelationKey = "camera"
@ -19,6 +19,7 @@ const (
RelationKeyRelationFormatObjectTypes domain.RelationKey = "relationFormatObjectTypes"
RelationKeyRelationKey domain.RelationKey = "relationKey"
RelationKeyRelationOptionColor domain.RelationKey = "relationOptionColor"
RelationKeyLatestAclHeadId domain.RelationKey = "latestAclHeadId"
RelationKeyInstructions domain.RelationKey = "instructions"
RelationKeyDone domain.RelationKey = "done"
RelationKeyMediaArtistURL domain.RelationKey = "mediaArtistURL"
@ -253,9 +254,10 @@ var (
Id: "_brassignee",
Key: "assignee",
Name: "Assignee",
ObjectTypes: []string{TypePrefix + "profile", TypePrefix + "contact"},
ObjectTypes: []string{TypePrefix + "profile", TypePrefix + "contact", TypePrefix + "participant"},
ReadOnly: false,
ReadOnlyRelation: true,
Revision: 1,
Scope: model.Relation_type,
},
RelationKeyAttachments: {
@ -344,9 +346,10 @@ var (
Id: "_brauthor",
Key: "author",
Name: "Author",
ObjectTypes: []string{TypePrefix + "profile", TypePrefix + "contact"},
ObjectTypes: []string{TypePrefix + "profile", TypePrefix + "contact", TypePrefix + "participant"},
ReadOnly: false,
ReadOnlyRelation: true,
Revision: 1,
Scope: model.Relation_type,
},
RelationKeyBacklinks: {
@ -356,10 +359,10 @@ var (
Format: model.RelationFormat_object,
Id: "_brbacklinks",
Key: "backlinks",
Name: "Links to this object",
Name: "Backlinks",
ReadOnly: true,
ReadOnlyRelation: true,
Revision: 2,
Revision: 3,
Scope: model.Relation_type,
},
RelationKeyBudget: {
@ -1200,9 +1203,10 @@ var (
Key: "lastModifiedBy",
MaxCount: 1,
Name: "Last modified by",
ObjectTypes: []string{TypePrefix + "profile"},
ObjectTypes: []string{TypePrefix + "participant"},
ReadOnly: true,
ReadOnlyRelation: true,
Revision: 1,
Scope: model.Relation_type,
},
RelationKeyLastModifiedDate: {
@ -1245,6 +1249,20 @@ var (
ReadOnlyRelation: true,
Scope: model.Relation_type,
},
RelationKeyLatestAclHeadId: {
DataSource: model.Relation_details,
Description: "Latest Acl head id",
Format: model.RelationFormat_longtext,
Hidden: true,
Id: "_brlatestAclHeadId",
Key: "latestAclHeadId",
MaxCount: 1,
Name: "Latest acl head id",
ReadOnly: true,
ReadOnlyRelation: true,
Scope: model.Relation_type,
},
RelationKeyLayout: {
DataSource: model.Relation_details,
@ -1305,10 +1323,10 @@ var (
Format: model.RelationFormat_object,
Id: "_brlinks",
Key: "links",
Name: "Links from this object",
Name: "Links",
ReadOnly: true,
ReadOnlyRelation: true,
Revision: 2,
Revision: 3,
Scope: model.Relation_type,
},
RelationKeyLogic: {

View file

@ -78,6 +78,16 @@
"readonly": true,
"source": "details"
},
{
"description": "Latest Acl head id",
"format": "longtext",
"hidden": true,
"key": "latestAclHeadId",
"maxCount": 1,
"name": "Latest acl head id",
"readonly": true,
"source": "details"
},
{
"format": "longtext",
"hidden": false,
@ -609,8 +619,10 @@
"source": "details",
"objectTypes": [
"profile",
"contact"
]
"contact",
"participant"
],
"revision": 1
},
{
"description": "Name of artist",
@ -751,8 +763,10 @@
"source": "details",
"objectTypes": [
"profile",
"contact"
]
"contact",
"participant"
],
"revision": 1
},
{
"format": "longtext",
@ -1123,10 +1137,10 @@
"hidden": false,
"key": "links",
"maxCount": 0,
"name": "Links from this object",
"name": "Links",
"readonly": true,
"source": "derived",
"revision": 2
"revision": 3
},
{
"format": "number",
@ -1164,10 +1178,11 @@
"maxCount": 1,
"name": "Last modified by",
"objectTypes": [
"profile"
"participant"
],
"readonly": true,
"source": "derived"
"source": "derived",
"revision": 1
},
{
"description": "Relation allows multi values",
@ -1459,10 +1474,10 @@
"key": "backlinks",
"maxCount": 0,
"hidden": false,
"name": "Links to this object",
"name": "Backlinks",
"readonly": true,
"source": "local",
"revision": 2
"revision": 3
},
{
"description": "Relation that indicates document has been uninstalled",

View file

@ -6,7 +6,7 @@ package bundle
import domain "github.com/anyproto/anytype-heart/core/domain"
const SystemRelationsChecksum = "a0137f269c40c20710815c254a9ee8b0f452221df5e4fa40cd00617bdf4dd499"
const SystemRelationsChecksum = "f005078664bd162ec27289eeb2024aaddb83d3e9128bb25ee589ef914f4e055b"
// SystemRelations contains relations that have some special biz logic depends on them in some objects
// in case EVERY object depend on the relation please add it to RequiredInternalRelations
@ -61,5 +61,6 @@ var SystemRelations = append(RequiredInternalRelations, []domain.RelationKey{
RelationKeySpaceInviteFileKey,
RelationKeyParticipantPermissions,
RelationKeyParticipantStatus,
RelationKeyLatestAclHeadId,
RelationKeyIdentity,
}...)

View file

@ -75,5 +75,6 @@
"spaceInviteFileKey",
"participantPermissions",
"participantStatus",
"latestAclHeadId",
"identity"
]

View file

@ -9,7 +9,7 @@ import (
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
)
const TypeChecksum = "d793d61e0b07300056e692cfe82dee8f23a436a70c36e066067b837b24b09ee1"
const TypeChecksum = "fea3b06c998f4c974f06b3b0714b26dd2c5a7fa35ce9dc8b8f17d7c619215f7b"
const (
TypePrefix = "_ot"
)
@ -54,14 +54,15 @@ var (
types = map[domain.TypeKey]*model.ObjectType{
TypeKeyAudio: {
Description: "Auto-generated object from .wav, .mp3, .ogg files added to Anytype. Sound when recorded, with ability to reproduce",
IconEmoji: "🎵",
Layout: model.ObjectType_file,
Name: "Audio",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyArtist), MustGetRelationLink(RelationKeyAudioAlbum), MustGetRelationLink(RelationKeyAudioAlbumTrackNumber), MustGetRelationLink(RelationKeyAudioGenre), MustGetRelationLink(RelationKeyReleasedYear), MustGetRelationLink(RelationKeyThumbnailImage), MustGetRelationLink(RelationKeyComposer), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt), MustGetRelationLink(RelationKeyAudioArtist), MustGetRelationLink(RelationKeyAudioLyrics)},
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "audio",
Description: "Sound when recorded, with ability to reproduce",
IconEmoji: "🎵",
Layout: model.ObjectType_file,
Name: "Audio",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyArtist), MustGetRelationLink(RelationKeyAudioAlbum), MustGetRelationLink(RelationKeyAudioAlbumTrackNumber), MustGetRelationLink(RelationKeyAudioGenre), MustGetRelationLink(RelationKeyReleasedYear), MustGetRelationLink(RelationKeyThumbnailImage), MustGetRelationLink(RelationKeyComposer), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt), MustGetRelationLink(RelationKeyAudioArtist), MustGetRelationLink(RelationKeyAudioLyrics)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "audio",
},
TypeKeyBook: {
@ -142,13 +143,14 @@ var (
},
TypeKeyDashboard: {
Description: "Internal home dashboard with favourite objects",
Hidden: true,
Layout: model.ObjectType_dashboard,
Name: "Dashboard",
Readonly: true,
Types: []model.SmartBlockType{model.SmartBlockType_Home},
Url: TypePrefix + "dashboard",
Description: "Internal home dashboard with favourite objects",
Hidden: true,
Layout: model.ObjectType_dashboard,
Name: "Dashboard",
Readonly: true,
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_Home},
Url: TypePrefix + "dashboard",
},
TypeKeyDate: {
@ -197,14 +199,15 @@ var (
},
TypeKeyFile: {
Description: "Auto-generated object from files added to Anytype. Computer resource for recording data in a computer storage device",
IconEmoji: "📎",
Layout: model.ObjectType_file,
Name: "File",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt)},
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "file",
Description: "Computer resource for recording data in a computer storage device",
IconEmoji: "📎",
Layout: model.ObjectType_file,
Name: "File",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "file",
},
TypeKeyGoal: {
@ -230,14 +233,15 @@ var (
},
TypeKeyImage: {
Description: "Auto-generated object from .jpg & .png files added to Anytype. A representation of the external form of a person or thing in art",
IconEmoji: "🏞",
Layout: model.ObjectType_image,
Name: "Image",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyWidthInPixels), MustGetRelationLink(RelationKeyCamera), MustGetRelationLink(RelationKeyHeightInPixels), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyCameraIso), MustGetRelationLink(RelationKeyAperture), MustGetRelationLink(RelationKeyExposure), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFocalRatio), MustGetRelationLink(RelationKeyFileExt)},
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "image",
Description: "A representation of the external form of a person or thing in art",
IconEmoji: "🏞",
Layout: model.ObjectType_image,
Name: "Image",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyWidthInPixels), MustGetRelationLink(RelationKeyCamera), MustGetRelationLink(RelationKeyHeightInPixels), MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyCameraIso), MustGetRelationLink(RelationKeyAperture), MustGetRelationLink(RelationKeyExposure), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFocalRatio), MustGetRelationLink(RelationKeyFileExt)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "image",
},
TypeKeyMovie: {
@ -285,15 +289,16 @@ var (
},
TypeKeyParticipant: {
Description: "Participant",
Hidden: true,
IconEmoji: "🧑",
Layout: model.ObjectType_participant,
Name: "Participant",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
Types: []model.SmartBlockType{model.SmartBlockType_Participant},
Url: TypePrefix + "participant",
Description: "Anytype identity as a space participant",
IconEmoji: "🧑",
Layout: model.ObjectType_participant,
Name: "Space member",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
RestrictObjectCreation: true,
Revision: 1,
Types: []model.SmartBlockType{model.SmartBlockType_Participant},
Url: TypePrefix + "participant",
},
TypeKeyProfile: {
@ -364,27 +369,29 @@ var (
},
TypeKeySpace: {
Description: "Workspace",
Hidden: true,
IconEmoji: "🌎",
Layout: model.ObjectType_space,
Name: "Space",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
Types: []model.SmartBlockType{model.SmartBlockType_Workspace},
Url: TypePrefix + "space",
Description: "Workspace",
Hidden: true,
IconEmoji: "🌎",
Layout: model.ObjectType_space,
Name: "Space",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_Workspace},
Url: TypePrefix + "space",
},
TypeKeySpaceView: {
Description: "Space",
Hidden: true,
IconEmoji: "🌎",
Layout: model.ObjectType_spaceView,
Name: "Space",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
Types: []model.SmartBlockType{model.SmartBlockType_SpaceView},
Url: TypePrefix + "spaceView",
Description: "Space",
Hidden: true,
IconEmoji: "🌎",
Layout: model.ObjectType_spaceView,
Name: "Space",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeyTag)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_SpaceView},
Url: TypePrefix + "spaceView",
},
TypeKeyTask: {
@ -410,14 +417,15 @@ var (
},
TypeKeyVideo: {
Description: "Auto-generated object from .mpeg-4 files added to Anytype. The recording of moving visual images",
IconEmoji: "📽",
Layout: model.ObjectType_file,
Name: "Video",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyCamera), MustGetRelationLink(RelationKeyThumbnailImage), MustGetRelationLink(RelationKeyHeightInPixels), MustGetRelationLink(RelationKeyWidthInPixels), MustGetRelationLink(RelationKeyCameraIso), MustGetRelationLink(RelationKeyAperture), MustGetRelationLink(RelationKeyExposure), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt)},
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "video",
Description: "The recording of moving visual images",
IconEmoji: "📽",
Layout: model.ObjectType_file,
Name: "Video",
Readonly: true,
RelationLinks: []*model.RelationLink{MustGetRelationLink(RelationKeySizeInBytes), MustGetRelationLink(RelationKeyFileMimeType), MustGetRelationLink(RelationKeyCamera), MustGetRelationLink(RelationKeyThumbnailImage), MustGetRelationLink(RelationKeyHeightInPixels), MustGetRelationLink(RelationKeyWidthInPixels), MustGetRelationLink(RelationKeyCameraIso), MustGetRelationLink(RelationKeyAperture), MustGetRelationLink(RelationKeyExposure), MustGetRelationLink(RelationKeyAddedDate), MustGetRelationLink(RelationKeyFileExt)},
RestrictObjectCreation: true,
Types: []model.SmartBlockType{model.SmartBlockType_File},
Url: TypePrefix + "video",
},
TypeKeyWeeklyPlan: {

View file

@ -203,7 +203,8 @@
"addedDate",
"fileExt"
],
"description": "Auto-generated object from .mpeg-4 files added to Anytype. The recording of moving visual images"
"description": "The recording of moving visual images",
"restrictObjectCreation": true
},
{
"id": "dashboard",
@ -215,7 +216,8 @@
"hidden": true,
"layout": "dashboard",
"relations": [],
"description": "Internal home dashboard with favourite objects"
"description": "Internal home dashboard with favourite objects",
"restrictObjectCreation": true
},
{
"id": "dailyPlan",
@ -295,7 +297,8 @@
"relations": [
"tag"
],
"description": "Workspace"
"description": "Workspace",
"restrictObjectCreation": true
},
{
"id": "spaceView",
@ -309,21 +312,24 @@
"relations": [
"tag"
],
"description": "Space"
"description": "Space",
"restrictObjectCreation": true
},
{
"id": "participant",
"name": "Participant",
"name": "Space member",
"types": [
"Participant"
],
"emoji": "\uD83E\uDDD1",
"hidden": true,
"hidden": false,
"layout": "participant",
"relations": [
"tag"
],
"description": "Participant"
"description": "Anytype identity as a space participant",
"restrictObjectCreation": true,
"revision": 1
},
{
"id": "template",
@ -441,7 +447,8 @@
"focalRatio",
"fileExt"
],
"description": "Auto-generated object from .jpg \u0026 .png files added to Anytype. A representation of the external form of a person or thing in art"
"description": "A representation of the external form of a person or thing in art",
"restrictObjectCreation": true
},
{
"id": "bug",
@ -503,7 +510,8 @@
"audioArtist",
"audioLyrics"
],
"description": "Auto-generated object from .wav, .mp3, .ogg files added to Anytype. Sound when recorded, with ability to reproduce"
"description": "Sound when recorded, with ability to reproduce",
"restrictObjectCreation": true
},
{
"id": "goal",
@ -575,7 +583,8 @@
"addedDate",
"fileExt"
],
"description": "Auto-generated object from files added to Anytype. Computer resource for recording data in a computer storage device"
"description": "Computer resource for recording data in a computer storage device",
"restrictObjectCreation": true
},
{
"id": "project",

View file

@ -11,7 +11,7 @@ import (
"github.com/anyproto/anytype-heart/util/vcs"
)
const DefaultLogLevels = "common.commonspace.headsync=INFO;*=WARN"
const DefaultLogLevels = "common.commonspace.headsync=INFO;core.block.editor.spaceview=INFO;*=WARN"
var DefaultCfg = logger.Config{
Production: false,

File diff suppressed because it is too large Load diff

View file

@ -663,6 +663,8 @@ message Restrictions {
Template = 7;
// restricts duplicate object
Duplicate = 8;
// can be set only for types. Restricts creating objects of this type
CreateObjectOfThisType = 9;
}
@ -705,6 +707,7 @@ message ObjectType {
bool installedByDefault = 11;
string key = 12; // name of objectType (can be localized for bundled types)
int64 revision = 13; // revision of system objectType. Used to check if we should change type content or not
bool restrictObjectCreation = 14; // restricts creating objects of this type for users
enum Layout {
basic = 0;

View file

@ -13,9 +13,12 @@ import (
"github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/util/crypto"
"github.com/gogo/protobuf/types"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/core/block/editor/profilemigration"
"github.com/anyproto/anytype-heart/core/block/editor/smartblock"
"github.com/anyproto/anytype-heart/core/block/object/objectcache"
"github.com/anyproto/anytype-heart/core/block/object/payloadcreator"
"github.com/anyproto/anytype-heart/core/domain"
"github.com/anyproto/anytype-heart/pkg/lib/bundle"
coresb "github.com/anyproto/anytype-heart/pkg/lib/core/smartblock"
@ -142,6 +145,10 @@ func (s *space) mandatoryObjectsLoad(ctx context.Context, disableRemoteLoad bool
if s.loadMandatoryObjectsErr != nil {
return
}
err := s.migrationProfileObject(ctx)
if err != nil {
log.Error("failed to migrate profile object", zap.Error(err))
}
if !disableRemoteLoad {
s.common.TreeSyncer().StartSync()
}
@ -248,6 +255,63 @@ func (s *space) InstallBundledObjects(ctx context.Context) error {
return nil
}
func (s *space) migrationProfileObject(ctx context.Context) error {
if !s.IsPersonal() {
return nil
}
if s.derivedIDs.Profile == "" {
return nil
}
uniqueKey, err := domain.NewUniqueKey(coresb.SmartBlockTypePage, profilemigration.InternalKeyOldProfileData)
if err != nil {
return err
}
// lets do the cheap check if we already has this extracted object
extractedProfileId, err := s.DeriveObjectID(ctx, uniqueKey)
if err != nil {
return err
}
extractedProfileExists, _ := s.Storage().HasTree(extractedProfileId)
if extractedProfileExists {
return nil
}
return s.Do(s.derivedIDs.Profile, func(sb smartblock.SmartBlock) error {
st := sb.NewState()
extractedState, err := profilemigration.ExtractCustomState(st)
if err != nil {
if err == profilemigration.ErrNoCustomStateFound {
log.Error("no extra state found")
return nil
}
return err
}
payload, err := s.DeriveTreePayload(ctx, payloadcreator.PayloadDerivationParams{UseAccountSignature: true, Key: uniqueKey})
if err != nil {
return err
}
newSb, err := s.CreateTreeObjectWithPayload(ctx, payload, func(id string) *smartblock.InitContext {
extractedState.SetRootId(id)
return &smartblock.InitContext{
IsNewObject: true,
ObjectTypeKeys: []domain.TypeKey{bundle.TypeKeyPage},
State: extractedState,
SpaceID: s.Id(),
}
})
if err != nil {
return err
}
log.Warn("old profile custom state migrated")
newSb.Close()
return sb.Apply(st)
})
}
func (s *space) IsReadOnly() bool {
return !s.CommonSpace().Acl().AclState().Permissions(s.myIdentity).CanWrite()
}

View file

@ -5,6 +5,7 @@ import (
"sync"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/debugstat"
"github.com/anyproto/any-sync/app/logger"
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
@ -53,6 +54,7 @@ type aclObjectManager struct {
identityService dependencies.IdentityService
indexer dependencies.SpaceIndexer
notificationService notifications.Notifications
statService debugstat.StatService
started bool
ownerMetadata []byte
@ -61,6 +63,26 @@ type aclObjectManager struct {
addedParticipants map[string]struct{}
}
func (a *aclObjectManager) ProvideStat() any {
select {
case <-a.waitLoad:
if a.loadErr != nil {
return parseAcl(nil, a.status.SpaceId())
}
return parseAcl(a.sp.CommonSpace().Acl(), a.status.SpaceId())
default:
return parseAcl(nil, a.status.SpaceId())
}
}
func (a *aclObjectManager) StatId() string {
return a.status.SpaceId()
}
func (a *aclObjectManager) StatType() string {
return CName
}
func (a *aclObjectManager) UpdateAcl(aclList list.AclList) {
err := a.processAcl()
if err != nil {
@ -75,6 +97,11 @@ func (a *aclObjectManager) Init(ap *app.App) (err error) {
a.indexer = app.MustComponent[dependencies.SpaceIndexer](ap)
a.status = app.MustComponent[spacestatus.SpaceStatus](ap)
a.notificationService = app.MustComponent[notifications.Notifications](ap)
a.statService, _ = ap.Component(debugstat.CName).(debugstat.StatService)
if a.statService == nil {
a.statService = debugstat.NewNoOp()
}
a.statService.AddProvider(a)
a.waitLoad = make(chan struct{})
a.wait = make(chan struct{})
return nil
@ -103,6 +130,7 @@ func (a *aclObjectManager) Close(ctx context.Context) (err error) {
a.cancel()
<-a.wait
a.identityService.UnregisterIdentitiesInSpace(a.status.SpaceId())
a.statService.RemoveProvider(a)
return
}
@ -199,7 +227,19 @@ func (a *aclObjectManager) processAcl() (err error) {
}
a.mx.Lock()
defer a.mx.Unlock()
err = a.processStates(states, common.Acl().AclState().Identity())
a.status.Lock()
aclHeadId := a.status.LatestAclHeadId()
a.status.Unlock()
var upToDate bool
if aclHeadId != "" {
_, err := common.Acl().Get(aclHeadId)
if err == nil {
upToDate = true
}
} else {
upToDate = true
}
err = a.processStates(states, upToDate, common.Acl().AclState().Identity())
if err != nil {
return
}
@ -207,10 +247,10 @@ func (a *aclObjectManager) processAcl() (err error) {
return
}
func (a *aclObjectManager) processStates(states []list.AccountState, myIdentity crypto.PubKey) (err error) {
func (a *aclObjectManager) processStates(states []list.AccountState, upToDate bool, myIdentity crypto.PubKey) (err error) {
var numActiveUsers int
for _, state := range states {
if state.Permissions.NoPermissions() && state.PubKey.Equals(myIdentity) {
if state.Permissions.NoPermissions() && state.PubKey.Equals(myIdentity) && upToDate {
a.status.Lock()
err := a.status.SetPersistentStatus(a.ctx, spaceinfo.AccountStatusRemoving)
if err != nil {
@ -304,7 +344,7 @@ func convertPermissions(permissions list.AclPermissions) model.ParticipantPermis
case aclrecordproto.AclUserPermissions_Owner:
return model.ParticipantPermissions_Owner
}
return model.ParticipantPermissions_Reader
return model.ParticipantPermissions_NoPermissions
}
func convertStatus(status list.AclStatus) model.ParticipantStatus {
@ -359,11 +399,9 @@ func buildParticipantDetails(
status model.ParticipantStatus,
) *types.Struct {
return &types.Struct{Fields: map[string]*types.Value{
bundle.RelationKeyId.String(): pbtypes.String(id),
bundle.RelationKeyIdentity.String(): pbtypes.String(identity),
bundle.RelationKeySpaceId.String(): pbtypes.String(spaceId),
bundle.RelationKeyId.String(): pbtypes.String(id),
bundle.RelationKeyIdentity.String(): pbtypes.String(identity),
bundle.RelationKeySpaceId.String(): pbtypes.String(spaceId),
bundle.RelationKeyLastModifiedBy.String(): pbtypes.String(id),
bundle.RelationKeyParticipantPermissions.String(): pbtypes.Int64(int64(permissions)),
bundle.RelationKeyParticipantStatus.String(): pbtypes.Int64(int64(status)),

View file

@ -0,0 +1,83 @@
package aclobjectmanager
import "github.com/anyproto/any-sync/commonspace/object/acl/list"
type accountStatus struct {
Permission string `json:"permission"`
Status string `json:"status"`
Identity string `json:"identity"`
}
type aclStat struct {
TotalRecords int `json:"totalRecords"`
Loaded bool `json:"loaded"`
AclHeadId string `json:"aclHeadId"`
SpaceId string `json:"spaceId"`
AclId string
Statuses []accountStatus `json:"statuses"`
}
func parseAcl(acl list.AclList, spaceId string) aclStat {
if acl == nil {
return aclStat{
Loaded: false,
SpaceId: spaceId,
}
}
acl.RLock()
defer acl.RUnlock()
statuses := make([]accountStatus, 0, len(acl.AclState().CurrentAccounts()))
for _, acc := range acl.AclState().CurrentAccounts() {
statuses = append(statuses, accountStatus{
Permission: convPermissionToString(acc.Permissions),
Status: convStatusToString(acc.Status),
Identity: acc.PubKey.Account(),
})
}
totalRecs := len(acl.Records())
headId := acl.Head().Id
return aclStat{
TotalRecords: totalRecs,
Loaded: true,
SpaceId: spaceId,
AclHeadId: headId,
Statuses: statuses,
AclId: acl.Id(),
}
}
func convPermissionToString(perm list.AclPermissions) string {
switch perm {
case list.AclPermissionsNone:
return "none"
case list.AclPermissionsReader:
return "read"
case list.AclPermissionsWriter:
return "write"
case list.AclPermissionsAdmin:
return "admin"
case list.AclPermissionsOwner:
return "owner"
}
return "unknown"
}
func convStatusToString(status list.AclStatus) string {
switch status {
case list.StatusJoining:
return "joining"
case list.StatusActive:
return "active"
case list.StatusDeclined:
return "declined"
case list.StatusRemoved:
return "removed"
case list.StatusRemoving:
return "removing"
case list.StatusCanceled:
return "canceled"
case list.StatusNone:
return "none"
}
return "unknown"
}

View file

@ -34,16 +34,18 @@ type loadingSpace struct {
// results
stopIfMandatoryFail bool
disableRemoteLoad bool
latestAclHeadId string
space clientspace.Space
loadErr error
loadCh chan struct{}
}
func (s *spaceLoader) newLoadingSpace(ctx context.Context, stopIfMandatoryFail, disableRemoteLoad bool) *loadingSpace {
func (s *spaceLoader) newLoadingSpace(ctx context.Context, stopIfMandatoryFail, disableRemoteLoad bool, aclHeadId string) *loadingSpace {
ls := &loadingSpace{
stopIfMandatoryFail: stopIfMandatoryFail,
disableRemoteLoad: disableRemoteLoad,
retryTimeout: loadingRetryTimeout,
latestAclHeadId: aclHeadId,
spaceServiceProvider: s,
loadCh: make(chan struct{}),
}
@ -103,6 +105,15 @@ func (ls *loadingSpace) load(ctx context.Context) (ok bool) {
}
ls.loadErr = err
} else {
if ls.latestAclHeadId != "" && !ls.disableRemoteLoad {
acl := sp.CommonSpace().Acl()
acl.RLock()
defer acl.RUnlock()
_, err := acl.Get(ls.latestAclHeadId)
if err != nil {
return false
}
}
ls.space = sp
}
return true

View file

@ -104,7 +104,7 @@ func (s *spaceLoader) startLoad(ctx context.Context) (err error) {
if err = s.status.SetLocalInfo(ctx, info); err != nil {
return
}
s.loading = s.newLoadingSpace(s.ctx, s.stopIfMandatoryFail, s.disableRemoteLoad)
s.loading = s.newLoadingSpace(s.ctx, s.stopIfMandatoryFail, s.disableRemoteLoad, s.status.LatestAclHeadId())
return
}

View file

@ -5,6 +5,7 @@ import (
"sync"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/debugstat"
"github.com/anyproto/anytype-heart/space/internal/techspace"
"github.com/anyproto/anytype-heart/space/spaceinfo"
@ -13,15 +14,18 @@ import (
const CName = "client.components.spacestatus"
type SpaceStatus interface {
app.Component
app.ComponentRunnable
sync.Locker
SpaceId() string
GetLocalStatus() spaceinfo.LocalStatus
GetRemoteStatus() spaceinfo.RemoteStatus
GetPersistentStatus() spaceinfo.AccountStatus
LatestAclHeadId() string
UpdatePersistentStatus(ctx context.Context, status spaceinfo.AccountStatus)
UpdatePersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo)
SetRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error
SetPersistentStatus(ctx context.Context, status spaceinfo.AccountStatus) (err error)
SetPersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) (err error)
SetLocalStatus(ctx context.Context, status spaceinfo.LocalStatus) error
SetLocalInfo(ctx context.Context, info spaceinfo.SpaceLocalInfo) (err error)
SetAccessType(ctx context.Context, status spaceinfo.AccessType) (err error)
@ -29,22 +33,57 @@ type SpaceStatus interface {
type spaceStatus struct {
sync.Mutex
spaceId string
accountStatus spaceinfo.AccountStatus
localStatus spaceinfo.LocalStatus
remoteStatus spaceinfo.RemoteStatus
techSpace techspace.TechSpace
spaceId string
accountStatus spaceinfo.AccountStatus
localStatus spaceinfo.LocalStatus
remoteStatus spaceinfo.RemoteStatus
latestAclHeadId string
techSpace techspace.TechSpace
statService debugstat.StatService
}
func New(spaceId string, accountStatus spaceinfo.AccountStatus) SpaceStatus {
func (s *spaceStatus) ProvideStat() any {
return spaceStatusStat{
SpaceId: s.spaceId,
AccountStatus: s.accountStatus.String(),
LocalStatus: s.localStatus.String(),
RemoteStatus: s.remoteStatus.String(),
AclHeadId: s.latestAclHeadId,
}
}
func (s *spaceStatus) StatId() string {
return s.spaceId
}
func (s *spaceStatus) StatType() string {
return CName
}
func New(spaceId string, accountStatus spaceinfo.AccountStatus, aclHeadId string) SpaceStatus {
return &spaceStatus{
accountStatus: accountStatus,
spaceId: spaceId,
accountStatus: accountStatus,
spaceId: spaceId,
latestAclHeadId: aclHeadId,
}
}
func (s *spaceStatus) Init(a *app.App) (err error) {
s.techSpace = a.MustComponent(techspace.CName).(techspace.TechSpace)
s.statService, _ = a.Component(debugstat.CName).(debugstat.StatService)
if s.statService == nil {
s.statService = debugstat.NewNoOp()
}
s.statService.AddProvider(s)
return nil
}
func (s *spaceStatus) Run(ctx context.Context) (err error) {
return nil
}
func (s *spaceStatus) Close(ctx context.Context) (err error) {
s.statService.RemoveProvider(s)
return nil
}
@ -72,6 +111,15 @@ func (s *spaceStatus) UpdatePersistentStatus(ctx context.Context, status spacein
s.accountStatus = status
}
func (s *spaceStatus) UpdatePersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) {
s.accountStatus = info.AccountStatus
s.latestAclHeadId = info.AclHeadId
}
func (s *spaceStatus) LatestAclHeadId() string {
return s.latestAclHeadId
}
func (s *spaceStatus) SetRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
s.remoteStatus = status
return s.setCurrentLocalInfo(ctx)
@ -91,6 +139,20 @@ func (s *spaceStatus) SetLocalInfo(ctx context.Context, info spaceinfo.SpaceLoca
return s.setCurrentLocalInfo(ctx)
}
func (s *spaceStatus) SetPersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) (err error) {
if s.GetPersistentStatus() == info.AccountStatus {
return nil
}
if err = s.techSpace.SetPersistentInfo(ctx, info); err != nil {
return err
}
s.accountStatus = info.AccountStatus
if info.AclHeadId != "" {
s.latestAclHeadId = info.AclHeadId
}
return nil
}
func (s *spaceStatus) SetPersistentStatus(ctx context.Context, status spaceinfo.AccountStatus) (err error) {
if s.GetPersistentStatus() == status {
return nil
@ -116,3 +178,11 @@ func (s *spaceStatus) setCurrentLocalInfo(ctx context.Context) (err error) {
func (s *spaceStatus) SetAccessType(ctx context.Context, acc spaceinfo.AccessType) (err error) {
return s.techSpace.SetAccessType(ctx, s.spaceId, acc)
}
type spaceStatusStat struct {
SpaceId string `json:"spaceId"`
AccountStatus string `json:"accountStatus"`
LocalStatus string `json:"localStatus"`
RemoteStatus string `json:"remoteStatus"`
AclHeadId string `json:"aclHeadId"`
}

View file

@ -76,11 +76,11 @@ func (s *spaceController) SpaceId() string {
return addr.AnytypeMarketplaceWorkspace
}
func (s *spaceController) UpdateStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
return nil
}
func (s *spaceController) SetStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
return nil
}

View file

@ -53,7 +53,7 @@ func (s *spaceController) Start(ctx context.Context) (err error) {
err = s.loader.Start(ctx)
// This could happen for old accounts
if errors.Is(err, spaceloader.ErrSpaceNotExists) {
err = s.techSpace.SpaceViewCreate(ctx, s.spaceId, false, spaceinfo.AccountStatusUnknown)
err = s.techSpace.SpaceViewCreate(ctx, s.spaceId, false, spaceinfo.SpacePersistentInfo{AccountStatus: spaceinfo.AccountStatusUnknown})
if err != nil {
return
}
@ -89,17 +89,17 @@ func (s *spaceController) SpaceId() string {
func (s *spaceController) newLoader() loader.Loader {
return loader.New(s.app, loader.Params{
SpaceId: s.spaceId,
Status: spacestatus.New(s.spaceId, spaceinfo.AccountStatusUnknown),
Status: spacestatus.New(s.spaceId, spaceinfo.AccountStatusUnknown, ""),
StopIfMandatoryFail: true,
OwnerMetadata: s.metadata,
})
}
func (s *spaceController) UpdateStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
return nil
}
func (s *spaceController) SetStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
return nil
}

View file

@ -31,12 +31,12 @@ type spaceController struct {
func NewSpaceController(
spaceId string,
status spaceinfo.AccountStatus,
info spaceinfo.SpacePersistentInfo,
a *app.App) (spacecontroller.SpaceController, error) {
s := &spaceController{
spaceId: spaceId,
status: spacestatus.New(spaceId, status),
lastUpdatedStatus: status,
status: spacestatus.New(spaceId, info.AccountStatus, info.AclHeadId),
lastUpdatedStatus: info.AccountStatus,
app: a,
}
sm, err := mode.NewStateMachine(s, log.With(zap.String("spaceId", spaceId)))
@ -76,33 +76,33 @@ func (s *spaceController) Current() any {
return s.sm.GetProcess()
}
func (s *spaceController) SetStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
s.status.Lock()
err := s.status.SetPersistentStatus(ctx, status)
err := s.status.SetPersistentInfo(ctx, info)
if err != nil {
s.status.Unlock()
return err
}
s.status.Unlock()
return s.UpdateStatus(ctx, status)
return s.UpdateInfo(ctx, info)
}
func (s *spaceController) UpdateStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
func (s *spaceController) UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
s.status.Lock()
if s.lastUpdatedStatus == status || (s.lastUpdatedStatus == spaceinfo.AccountStatusDeleted && status == spaceinfo.AccountStatusRemoving) {
if s.lastUpdatedStatus == info.AccountStatus || (s.lastUpdatedStatus == spaceinfo.AccountStatusDeleted && info.AccountStatus == spaceinfo.AccountStatusRemoving) {
s.status.Unlock()
return nil
}
s.lastUpdatedStatus = status
s.lastUpdatedStatus = info.AccountStatus
s.status.Unlock()
updateStatus := func(mode mode.Mode) error {
s.status.Lock()
s.status.UpdatePersistentStatus(ctx, status)
s.status.UpdatePersistentInfo(ctx, info)
s.status.Unlock()
_, err := s.sm.ChangeMode(mode)
return err
}
switch status {
switch info.AccountStatus {
case spaceinfo.AccountStatusDeleted:
return updateStatus(mode.ModeOffloading)
case spaceinfo.AccountStatusJoining:

View file

@ -36,6 +36,26 @@ type spaceStatusMock struct {
persistentUpdater func(status spaceinfo.AccountStatus)
}
func (s *spaceStatusMock) Run(ctx context.Context) (err error) {
return
}
func (s *spaceStatusMock) Close(ctx context.Context) (err error) {
return
}
func (s *spaceStatusMock) LatestAclHeadId() string {
return ""
}
func (s *spaceStatusMock) UpdatePersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) {
s.UpdatePersistentStatus(ctx, info.AccountStatus)
}
func (s *spaceStatusMock) SetPersistentInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) (err error) {
return s.SetPersistentStatus(ctx, info.AccountStatus)
}
var _ spacestatus.SpaceStatus = (*spaceStatusMock)(nil)
func (s *spaceStatusMock) Init(a *app.App) (err error) {
@ -236,7 +256,9 @@ func newFixture(t *testing.T, startStatus spaceinfo.AccountStatus) *fixture {
}
s.persistentUpdater = func(status spaceinfo.AccountStatus) {
go func() {
err := controller.UpdateStatus(context.Background(), status)
err := controller.UpdateInfo(context.Background(), spaceinfo.SpacePersistentInfo{
AccountStatus: status,
})
require.NoError(t, err)
}()
}
@ -272,7 +294,9 @@ func TestSpaceController_LoadingDeleting(t *testing.T) {
err := fx.ctrl.Start(context.Background())
require.NoError(t, err)
require.Equal(t, mode.ModeLoading, fx.ctrl.Mode())
err = fx.ctrl.UpdateStatus(context.Background(), spaceinfo.AccountStatusDeleted)
err = fx.ctrl.UpdateInfo(context.Background(), spaceinfo.SpacePersistentInfo{
AccountStatus: spaceinfo.AccountStatusDeleted,
})
require.NoError(t, err)
fx.reg.Lock()
defer fx.reg.Unlock()
@ -289,7 +313,9 @@ func TestSpaceController_LoadingDeletingMultipleWaiters(t *testing.T) {
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
err := fx.ctrl.UpdateStatus(context.Background(), spaceinfo.AccountStatusDeleted)
err := fx.ctrl.UpdateInfo(context.Background(), spaceinfo.SpacePersistentInfo{
AccountStatus: spaceinfo.AccountStatusDeleted,
})
require.NoError(t, err)
wg.Done()
}()
@ -318,7 +344,9 @@ func TestSpaceController_DeletingInvalid(t *testing.T) {
err := fx.ctrl.Start(context.Background())
require.NoError(t, err)
require.Equal(t, mode.ModeOffloading, fx.ctrl.Mode())
err = fx.ctrl.UpdateStatus(context.Background(), spaceinfo.AccountStatusActive)
err = fx.ctrl.UpdateInfo(context.Background(), spaceinfo.SpacePersistentInfo{
AccountStatus: spaceinfo.AccountStatusActive,
})
require.Error(t, err)
fx.reg.Lock()
defer fx.reg.Unlock()

View file

@ -162,17 +162,17 @@ func (_c *MockSpaceController_Mode_Call) RunAndReturn(run func() mode.Mode) *Moc
return _c
}
// SetStatus provides a mock function with given fields: ctx, status
func (_m *MockSpaceController) SetStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
ret := _m.Called(ctx, status)
// SetInfo provides a mock function with given fields: ctx, info
func (_m *MockSpaceController) SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
ret := _m.Called(ctx, info)
if len(ret) == 0 {
panic("no return value specified for SetStatus")
panic("no return value specified for SetInfo")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, spaceinfo.AccountStatus) error); ok {
r0 = rf(ctx, status)
if rf, ok := ret.Get(0).(func(context.Context, spaceinfo.SpacePersistentInfo) error); ok {
r0 = rf(ctx, info)
} else {
r0 = ret.Error(0)
}
@ -180,31 +180,31 @@ func (_m *MockSpaceController) SetStatus(ctx context.Context, status spaceinfo.A
return r0
}
// MockSpaceController_SetStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetStatus'
type MockSpaceController_SetStatus_Call struct {
// MockSpaceController_SetInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetInfo'
type MockSpaceController_SetInfo_Call struct {
*mock.Call
}
// SetStatus is a helper method to define mock.On call
// SetInfo is a helper method to define mock.On call
// - ctx context.Context
// - status spaceinfo.AccountStatus
func (_e *MockSpaceController_Expecter) SetStatus(ctx interface{}, status interface{}) *MockSpaceController_SetStatus_Call {
return &MockSpaceController_SetStatus_Call{Call: _e.mock.On("SetStatus", ctx, status)}
// - info spaceinfo.SpacePersistentInfo
func (_e *MockSpaceController_Expecter) SetInfo(ctx interface{}, info interface{}) *MockSpaceController_SetInfo_Call {
return &MockSpaceController_SetInfo_Call{Call: _e.mock.On("SetInfo", ctx, info)}
}
func (_c *MockSpaceController_SetStatus_Call) Run(run func(ctx context.Context, status spaceinfo.AccountStatus)) *MockSpaceController_SetStatus_Call {
func (_c *MockSpaceController_SetInfo_Call) Run(run func(ctx context.Context, info spaceinfo.SpacePersistentInfo)) *MockSpaceController_SetInfo_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(spaceinfo.AccountStatus))
run(args[0].(context.Context), args[1].(spaceinfo.SpacePersistentInfo))
})
return _c
}
func (_c *MockSpaceController_SetStatus_Call) Return(_a0 error) *MockSpaceController_SetStatus_Call {
func (_c *MockSpaceController_SetInfo_Call) Return(_a0 error) *MockSpaceController_SetInfo_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockSpaceController_SetStatus_Call) RunAndReturn(run func(context.Context, spaceinfo.AccountStatus) error) *MockSpaceController_SetStatus_Call {
func (_c *MockSpaceController_SetInfo_Call) RunAndReturn(run func(context.Context, spaceinfo.SpacePersistentInfo) error) *MockSpaceController_SetInfo_Call {
_c.Call.Return(run)
return _c
}
@ -300,6 +300,53 @@ func (_c *MockSpaceController_Start_Call) RunAndReturn(run func(context.Context)
return _c
}
// UpdateInfo provides a mock function with given fields: ctx, info
func (_m *MockSpaceController) UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error {
ret := _m.Called(ctx, info)
if len(ret) == 0 {
panic("no return value specified for UpdateInfo")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, spaceinfo.SpacePersistentInfo) error); ok {
r0 = rf(ctx, info)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSpaceController_UpdateInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateInfo'
type MockSpaceController_UpdateInfo_Call struct {
*mock.Call
}
// UpdateInfo is a helper method to define mock.On call
// - ctx context.Context
// - info spaceinfo.SpacePersistentInfo
func (_e *MockSpaceController_Expecter) UpdateInfo(ctx interface{}, info interface{}) *MockSpaceController_UpdateInfo_Call {
return &MockSpaceController_UpdateInfo_Call{Call: _e.mock.On("UpdateInfo", ctx, info)}
}
func (_c *MockSpaceController_UpdateInfo_Call) Run(run func(ctx context.Context, info spaceinfo.SpacePersistentInfo)) *MockSpaceController_UpdateInfo_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(spaceinfo.SpacePersistentInfo))
})
return _c
}
func (_c *MockSpaceController_UpdateInfo_Call) Return(_a0 error) *MockSpaceController_UpdateInfo_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockSpaceController_UpdateInfo_Call) RunAndReturn(run func(context.Context, spaceinfo.SpacePersistentInfo) error) *MockSpaceController_UpdateInfo_Call {
_c.Call.Return(run)
return _c
}
// UpdateRemoteStatus provides a mock function with given fields: ctx, status
func (_m *MockSpaceController) UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error {
ret := _m.Called(ctx, status)
@ -347,53 +394,6 @@ func (_c *MockSpaceController_UpdateRemoteStatus_Call) RunAndReturn(run func(con
return _c
}
// UpdateStatus provides a mock function with given fields: ctx, status
func (_m *MockSpaceController) UpdateStatus(ctx context.Context, status spaceinfo.AccountStatus) error {
ret := _m.Called(ctx, status)
if len(ret) == 0 {
panic("no return value specified for UpdateStatus")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, spaceinfo.AccountStatus) error); ok {
r0 = rf(ctx, status)
} else {
r0 = ret.Error(0)
}
return r0
}
// MockSpaceController_UpdateStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateStatus'
type MockSpaceController_UpdateStatus_Call struct {
*mock.Call
}
// UpdateStatus is a helper method to define mock.On call
// - ctx context.Context
// - status spaceinfo.AccountStatus
func (_e *MockSpaceController_Expecter) UpdateStatus(ctx interface{}, status interface{}) *MockSpaceController_UpdateStatus_Call {
return &MockSpaceController_UpdateStatus_Call{Call: _e.mock.On("UpdateStatus", ctx, status)}
}
func (_c *MockSpaceController_UpdateStatus_Call) Run(run func(ctx context.Context, status spaceinfo.AccountStatus)) *MockSpaceController_UpdateStatus_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(spaceinfo.AccountStatus))
})
return _c
}
func (_c *MockSpaceController_UpdateStatus_Call) Return(_a0 error) *MockSpaceController_UpdateStatus_Call {
_c.Call.Return(_a0)
return _c
}
func (_c *MockSpaceController_UpdateStatus_Call) RunAndReturn(run func(context.Context, spaceinfo.AccountStatus) error) *MockSpaceController_UpdateStatus_Call {
_c.Call.Return(run)
return _c
}
// NewMockSpaceController creates a new instance of MockSpaceController. 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 NewMockSpaceController(t interface {

View file

@ -12,8 +12,8 @@ type SpaceController interface {
Start(ctx context.Context) error
Mode() mode.Mode
Current() any
UpdateStatus(ctx context.Context, status spaceinfo.AccountStatus) error
SetStatus(ctx context.Context, status spaceinfo.AccountStatus) error
UpdateInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error
SetInfo(ctx context.Context, info spaceinfo.SpacePersistentInfo) error
UpdateRemoteStatus(ctx context.Context, status spaceinfo.RemoteStatus) error
Close(ctx context.Context) error
}

View file

@ -6,6 +6,7 @@ import (
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/app/logger"
"github.com/anyproto/any-sync/commonspace/acl/aclwaiter"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"go.uber.org/zap"
"github.com/anyproto/anytype-heart/space/internal/components/spacestatus"
@ -29,17 +30,41 @@ type Params struct {
func New(app *app.App, params Params) Joiner {
child := app.ChildApp()
params.Status.Lock()
joinHeadId := params.Status.LatestAclHeadId()
params.Status.Unlock()
child.Register(params.Status).
Register(newStatusChanger()).
Register(aclwaiter.New(params.SpaceId, func() error {
params.Status.Lock()
defer params.Status.Unlock()
err := params.Status.SetPersistentStatus(context.Background(), spaceinfo.AccountStatusActive)
if err != nil {
params.Log.Error("failed to set persistent status", zap.Error(err))
}
return err
}))
Register(aclwaiter.New(params.SpaceId,
joinHeadId,
// onFinish
func(acl list.AclList) error {
params.Status.Lock()
defer params.Status.Unlock()
err := params.Status.SetPersistentInfo(context.Background(), spaceinfo.SpacePersistentInfo{
SpaceID: params.SpaceId,
AccountStatus: spaceinfo.AccountStatusActive,
AclHeadId: acl.Head().Id,
})
if err != nil {
params.Log.Error("failed to set persistent status", zap.Error(err))
}
return err
},
// onReject
func(acl list.AclList) error {
params.Status.Lock()
defer params.Status.Unlock()
err := params.Status.SetPersistentInfo(context.Background(), spaceinfo.SpacePersistentInfo{
SpaceID: params.SpaceId,
AccountStatus: spaceinfo.AccountStatusDeleted,
AclHeadId: acl.Head().Id,
})
if err != nil {
params.Log.Error("failed to set persistent status", zap.Error(err))
}
return err
}))
return &joiner{
app: child,
}

View file

@ -356,17 +356,17 @@ func (_c *MockTechSpace_SetPersistentInfo_Call) RunAndReturn(run func(context.Co
return _c
}
// SpaceViewCreate provides a mock function with given fields: ctx, spaceId, force, status
func (_m *MockTechSpace) SpaceViewCreate(ctx context.Context, spaceId string, force bool, status spaceinfo.AccountStatus) error {
ret := _m.Called(ctx, spaceId, force, status)
// SpaceViewCreate provides a mock function with given fields: ctx, spaceId, force, info
func (_m *MockTechSpace) SpaceViewCreate(ctx context.Context, spaceId string, force bool, info spaceinfo.SpacePersistentInfo) error {
ret := _m.Called(ctx, spaceId, force, info)
if len(ret) == 0 {
panic("no return value specified for SpaceViewCreate")
}
var r0 error
if rf, ok := ret.Get(0).(func(context.Context, string, bool, spaceinfo.AccountStatus) error); ok {
r0 = rf(ctx, spaceId, force, status)
if rf, ok := ret.Get(0).(func(context.Context, string, bool, spaceinfo.SpacePersistentInfo) error); ok {
r0 = rf(ctx, spaceId, force, info)
} else {
r0 = ret.Error(0)
}
@ -383,14 +383,14 @@ type MockTechSpace_SpaceViewCreate_Call struct {
// - ctx context.Context
// - spaceId string
// - force bool
// - status spaceinfo.AccountStatus
func (_e *MockTechSpace_Expecter) SpaceViewCreate(ctx interface{}, spaceId interface{}, force interface{}, status interface{}) *MockTechSpace_SpaceViewCreate_Call {
return &MockTechSpace_SpaceViewCreate_Call{Call: _e.mock.On("SpaceViewCreate", ctx, spaceId, force, status)}
// - info spaceinfo.SpacePersistentInfo
func (_e *MockTechSpace_Expecter) SpaceViewCreate(ctx interface{}, spaceId interface{}, force interface{}, info interface{}) *MockTechSpace_SpaceViewCreate_Call {
return &MockTechSpace_SpaceViewCreate_Call{Call: _e.mock.On("SpaceViewCreate", ctx, spaceId, force, info)}
}
func (_c *MockTechSpace_SpaceViewCreate_Call) Run(run func(ctx context.Context, spaceId string, force bool, status spaceinfo.AccountStatus)) *MockTechSpace_SpaceViewCreate_Call {
func (_c *MockTechSpace_SpaceViewCreate_Call) Run(run func(ctx context.Context, spaceId string, force bool, info spaceinfo.SpacePersistentInfo)) *MockTechSpace_SpaceViewCreate_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(string), args[2].(bool), args[3].(spaceinfo.AccountStatus))
run(args[0].(context.Context), args[1].(string), args[2].(bool), args[3].(spaceinfo.SpacePersistentInfo))
})
return _c
}
@ -400,7 +400,7 @@ func (_c *MockTechSpace_SpaceViewCreate_Call) Return(err error) *MockTechSpace_S
return _c
}
func (_c *MockTechSpace_SpaceViewCreate_Call) RunAndReturn(run func(context.Context, string, bool, spaceinfo.AccountStatus) error) *MockTechSpace_SpaceViewCreate_Call {
func (_c *MockTechSpace_SpaceViewCreate_Call) RunAndReturn(run func(context.Context, string, bool, spaceinfo.SpacePersistentInfo) error) *MockTechSpace_SpaceViewCreate_Call {
_c.Call.Return(run)
return _c
}

View file

@ -42,7 +42,7 @@ type TechSpace interface {
Close(ctx context.Context) (err error)
TechSpaceId() string
SpaceViewCreate(ctx context.Context, spaceId string, force bool, status spaceinfo.AccountStatus) (err error)
SpaceViewCreate(ctx context.Context, spaceId string, force bool, info spaceinfo.SpacePersistentInfo) (err error)
SpaceViewExists(ctx context.Context, spaceId string) (exists bool, err error)
SetLocalInfo(ctx context.Context, info spaceinfo.SpaceLocalInfo) (err error)
SetAccessType(ctx context.Context, spaceId string, acc spaceinfo.AccessType) (err error)
@ -136,9 +136,9 @@ func (s *techSpace) SetPersistentInfo(ctx context.Context, info spaceinfo.SpaceP
})
}
func (s *techSpace) SpaceViewCreate(ctx context.Context, spaceId string, force bool, status spaceinfo.AccountStatus) (err error) {
func (s *techSpace) SpaceViewCreate(ctx context.Context, spaceId string, force bool, info spaceinfo.SpacePersistentInfo) (err error) {
if force {
return s.spaceViewCreate(ctx, spaceId, status)
return s.spaceViewCreate(ctx, spaceId, info)
}
viewId, err := s.getViewIdLocked(ctx, spaceId)
if err != nil {
@ -146,7 +146,7 @@ func (s *techSpace) SpaceViewCreate(ctx context.Context, spaceId string, force b
}
_, err = s.objectCache.GetObject(ctx, viewId)
if err != nil { // TODO: check specific error
return s.spaceViewCreate(ctx, spaceId, status)
return s.spaceViewCreate(ctx, spaceId, info)
}
return ErrSpaceViewExists
}
@ -173,14 +173,17 @@ func (s *techSpace) SpaceViewId(spaceId string) (string, error) {
return s.getViewIdLocked(context.TODO(), spaceId)
}
func (s *techSpace) spaceViewCreate(ctx context.Context, spaceID string, status spaceinfo.AccountStatus) (err error) {
func (s *techSpace) spaceViewCreate(ctx context.Context, spaceID string, info spaceinfo.SpacePersistentInfo) (err error) {
uniqueKey, err := domain.NewUniqueKey(smartblock.SmartBlockTypeSpaceView, spaceID)
if err != nil {
return
}
initFunc := func(id string) *editorsb.InitContext {
st := state.NewDoc(id, nil).(*state.State)
st.SetDetail(bundle.RelationKeySpaceAccountStatus.String(), pbtypes.Int64(int64(status)))
st.SetDetail(bundle.RelationKeySpaceAccountStatus.String(), pbtypes.Int64(int64(info.AccountStatus)))
if info.AclHeadId != "" {
st.SetDetail(bundle.RelationKeyLatestAclHeadId.String(), pbtypes.String(info.AclHeadId))
}
return &editorsb.InitContext{Ctx: ctx, SpaceID: s.techCore.Id(), State: st}
}
_, err = s.objectCache.DeriveTreeObject(ctx, objectcache.TreeDerivationParams{

View file

@ -78,7 +78,7 @@ func TestTechSpace_SpaceViewCreate(t *testing.T) {
fx.objectCache.EXPECT().GetObject(ctx, viewId).Return(nil, fmt.Errorf("not found"))
fx.objectCache.EXPECT().DeriveTreeObject(ctx, mock.Anything).Return(view, nil)
require.NoError(t, fx.SpaceViewCreate(ctx, spaceId, false, spaceinfo.AccountStatusUnknown))
require.NoError(t, fx.SpaceViewCreate(ctx, spaceId, false, spaceinfo.SpacePersistentInfo{AccountStatus: spaceinfo.AccountStatusUnknown}))
})
t.Run("err spaceView exists", func(t *testing.T) {
@ -88,7 +88,7 @@ func TestTechSpace_SpaceViewCreate(t *testing.T) {
fx.expectDeriveTreePayload(viewId)
fx.objectCache.EXPECT().GetObject(ctx, viewId).Return(view, nil)
assert.EqualError(t, fx.SpaceViewCreate(ctx, spaceId, false, spaceinfo.AccountStatusUnknown), ErrSpaceViewExists.Error())
assert.EqualError(t, fx.SpaceViewCreate(ctx, spaceId, false, spaceinfo.SpacePersistentInfo{AccountStatus: spaceinfo.AccountStatusUnknown}), ErrSpaceViewExists.Error())
})
}

View file

@ -7,7 +7,7 @@ import (
"github.com/anyproto/anytype-heart/space/spaceinfo"
)
func (s *service) Join(ctx context.Context, id string) error {
func (s *service) Join(ctx context.Context, id, aclHeadId string) error {
s.mu.Lock()
waiter, exists := s.waiting[id]
if exists {
@ -20,7 +20,11 @@ func (s *service) Join(ctx context.Context, id string) error {
ctrl := s.spaceControllers[id]
s.mu.Unlock()
if ctrl.Mode() != mode.ModeJoining {
return ctrl.SetStatus(ctx, spaceinfo.AccountStatusJoining)
return ctrl.SetInfo(ctx, spaceinfo.SpacePersistentInfo{
SpaceID: id,
AccountStatus: spaceinfo.AccountStatusJoining,
AclHeadId: aclHeadId,
})
}
return nil
}
@ -29,7 +33,7 @@ func (s *service) Join(ctx context.Context, id string) error {
wait: wait,
}
s.mu.Unlock()
ctrl, err := s.factory.CreateInvitingSpace(ctx, id)
ctrl, err := s.factory.CreateInvitingSpace(ctx, id, aclHeadId)
if err != nil {
s.mu.Lock()
close(wait)
@ -46,3 +50,10 @@ func (s *service) Join(ctx context.Context, id string) error {
s.mu.Unlock()
return nil
}
func (s *service) CancelLeave(ctx context.Context, id string) error {
return s.techSpace.SetPersistentInfo(ctx, spaceinfo.SpacePersistentInfo{
SpaceID: id,
AccountStatus: spaceinfo.AccountStatusActive,
})
}

View file

@ -15,7 +15,7 @@ type controllerWaiter struct {
err error
}
func (s *service) startStatus(ctx context.Context, spaceId string, status spaceinfo.AccountStatus) (ctrl spacecontroller.SpaceController, err error) {
func (s *service) getStatus(ctx context.Context, spaceId string) (ctrl spacecontroller.SpaceController, err error) {
s.mu.Lock()
if ctrl, ok := s.spaceControllers[spaceId]; ok {
s.mu.Unlock()
@ -38,23 +38,50 @@ func (s *service) startStatus(ctx context.Context, spaceId string, status spacei
s.mu.Unlock()
return ctrl, nil
}
s.mu.Unlock()
return nil, ErrSpaceNotExists
}
func (s *service) startStatus(ctx context.Context, info spaceinfo.SpacePersistentInfo) (ctrl spacecontroller.SpaceController, err error) {
s.mu.Lock()
if ctrl, ok := s.spaceControllers[info.SpaceID]; ok {
s.mu.Unlock()
return ctrl, nil
}
if w, ok := s.waiting[info.SpaceID]; ok {
s.mu.Unlock()
select {
case <-w.wait:
case <-ctx.Done():
return nil, ctx.Err()
}
s.mu.Lock()
err := s.waiting[info.SpaceID].err
if err != nil {
s.mu.Unlock()
return nil, err
}
ctrl := s.spaceControllers[info.SpaceID]
s.mu.Unlock()
return ctrl, nil
}
wait := make(chan struct{})
s.waiting[spaceId] = controllerWaiter{
s.waiting[info.SpaceID] = controllerWaiter{
wait: wait,
}
s.mu.Unlock()
ctrl, err = s.factory.NewShareableSpace(ctx, spaceId, status)
ctrl, err = s.factory.NewShareableSpace(ctx, info.SpaceID, info)
s.mu.Lock()
close(wait)
if err != nil {
s.waiting[spaceId] = controllerWaiter{
s.waiting[info.SpaceID] = controllerWaiter{
wait: wait,
err: err,
}
s.mu.Unlock()
return nil, err
}
s.spaceControllers[spaceId] = ctrl
s.spaceControllers[info.SpaceID] = ctrl
s.mu.Unlock()
return ctrl, nil
}

Some files were not shown because too many files have changed in this diff Show more