From ae846cb19fc17571c575622b8d49b33640f24afb Mon Sep 17 00:00:00 2001 From: Monica Xu Date: Tue, 1 Dec 2020 18:33:39 -0500 Subject: [PATCH] sql: Added CREATE SEQUENCE AS option. Previously, unimplementedWithIssueDetail error was thrown when an AS option in CREATE SEQUENCE ... AS was encountered. Now we support the AS option for creating sequences which can take on values such as smallint/integer/bigint. Typically (i.e. in Postgres) the AS option allows users to specify an integer type, which dictates the min and max integer values a sequence can take on. Before this change, the only option value we supported was bigint/int8/int/integer, which corresponds to our default min and max values for sequences. NB: In postgres, `integer` corresponds to int4. In cockroach, we use `nakedIntType` which defaults to int8 but can be configured in the cluster settings. Release note (sql change): Added CREATE SEQUENCE AS option. --- docs/generated/sql/bnf/alter_sequence.bnf | 2 +- .../sql/bnf/create_sequence_stmt.bnf | 4 +- docs/generated/sql/bnf/stmt_block.bnf | 3 +- pkg/sql/catalog/descpb/structured.pb.go | 720 ++++++++++-------- pkg/sql/catalog/descpb/structured.proto | 4 +- .../logictest/testdata/logic_test/sequences | 79 +- pkg/sql/parser/parse_test.go | 2 - pkg/sql/parser/sql.y | 12 +- pkg/sql/parser/testdata/create_sequence | 32 + pkg/sql/sem/tree/create.go | 7 + pkg/sql/sequence.go | 81 +- pkg/sql/sequence_test.go | 138 ++++ pkg/sql/show_create_clauses.go | 3 + pkg/sql/show_test.go | 32 + 14 files changed, 768 insertions(+), 351 deletions(-) diff --git a/docs/generated/sql/bnf/alter_sequence.bnf b/docs/generated/sql/bnf/alter_sequence.bnf index 7a799093544a..cea2444c5462 100644 --- a/docs/generated/sql/bnf/alter_sequence.bnf +++ b/docs/generated/sql/bnf/alter_sequence.bnf @@ -1,5 +1,5 @@ alter_sequence_stmt ::= ( 'ALTER' 'SEQUENCE' sequence_name 'RENAME' 'TO' sequence_name | 'ALTER' 'SEQUENCE' 'IF' 'EXISTS' sequence_name 'RENAME' 'TO' sequence_name ) - | ( 'ALTER' 'SEQUENCE' sequence_name ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | 'ALTER' 'SEQUENCE' 'IF' 'EXISTS' sequence_name ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) ) + | ( 'ALTER' 'SEQUENCE' sequence_name ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | 'ALTER' 'SEQUENCE' 'IF' 'EXISTS' sequence_name ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) ) | ( 'ALTER' 'SEQUENCE' sequence_name 'SET' 'SCHEMA' schema_name | 'ALTER' 'SEQUENCE' 'IF' 'EXISTS' sequence_name 'SET' 'SCHEMA' schema_name ) | ( 'ALTER' 'SEQUENCE' sequence_name 'OWNER' 'TO' role_spec | 'ALTER' 'SEQUENCE' 'IF' 'EXISTS' sequence_name 'OWNER' 'TO' role_spec ) diff --git a/docs/generated/sql/bnf/create_sequence_stmt.bnf b/docs/generated/sql/bnf/create_sequence_stmt.bnf index af8975c963c4..f7da56d40299 100644 --- a/docs/generated/sql/bnf/create_sequence_stmt.bnf +++ b/docs/generated/sql/bnf/create_sequence_stmt.bnf @@ -1,3 +1,3 @@ create_sequence_stmt ::= - 'CREATE' opt_temp 'SEQUENCE' sequence_name ( ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | ) - | 'CREATE' opt_temp 'SEQUENCE' 'IF' 'NOT' 'EXISTS' sequence_name ( ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | ) + 'CREATE' opt_temp 'SEQUENCE' sequence_name ( ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | ) + | 'CREATE' opt_temp 'SEQUENCE' 'IF' 'NOT' 'EXISTS' sequence_name ( ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) ( ( ( 'AS' typename | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_name | 'CACHE' integer | 'INCREMENT' integer | 'INCREMENT' 'BY' integer | 'MINVALUE' integer | 'NO' 'MINVALUE' | 'MAXVALUE' integer | 'NO' 'MAXVALUE' | 'START' integer | 'START' 'WITH' integer | 'VIRTUAL' ) ) )* ) | ) diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index 0e2cc6146e9d..d861527faf65 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -2650,7 +2650,8 @@ alter_index_cmd ::= partition_by_index sequence_option_elem ::= - 'NO' 'CYCLE' + 'AS' typename + | 'NO' 'CYCLE' | 'OWNED' 'BY' 'NONE' | 'OWNED' 'BY' column_path | 'CACHE' signed_iconst64 diff --git a/pkg/sql/catalog/descpb/structured.pb.go b/pkg/sql/catalog/descpb/structured.pb.go index fbc16054987e..8a6802a9bc99 100644 --- a/pkg/sql/catalog/descpb/structured.pb.go +++ b/pkg/sql/catalog/descpb/structured.pb.go @@ -2781,6 +2781,9 @@ type TableDescriptor_SequenceOpts struct { // The number of values (which have already been created in KV) // that a node can cache locally. CacheSize int64 `protobuf:"varint,7,opt,name=cache_size,json=cacheSize" json:"cache_size"` + // AS option value for CREATE SEQUENCE, which specifies the default + // min and max values a sequence can take on. + AsIntegerType string `protobuf:"bytes,8,opt,name=as_integer_type,json=asIntegerType" json:"as_integer_type"` } func (m *TableDescriptor_SequenceOpts) Reset() { *m = TableDescriptor_SequenceOpts{} } @@ -3899,360 +3902,361 @@ func init() { } var fileDescriptor_12dcc21c3bcc9571 = []byte{ - // 5636 bytes of a gzipped FileDescriptorProto + // 5658 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3c, 0x4b, 0x73, 0x1c, 0xc7, 0x79, 0xd8, 0xf7, 0xee, 0xb7, 0xaf, 0x41, 0x13, 0x24, 0x57, 0xb0, 0x04, 0x80, 0x4b, 0x51, 0x82, 0x28, 0x09, 0xa4, 0x20, 0xd9, 0xa6, 0x24, 0xdb, 0xd1, 0xbe, 0x40, 0x2c, 0x09, 0xec, 0x42, 0x83, 0x05, 0x29, 0xda, 0x89, 0xc7, 0x83, 0x9d, 0xc6, 0x62, 0x84, 0xd9, 0x99, 0xe5, 0xcc, 0x2c, 0xc1, - 0x75, 0xe5, 0x90, 0x72, 0x2e, 0x39, 0x25, 0x39, 0xe5, 0x92, 0x72, 0x95, 0x93, 0x72, 0x25, 0xbe, - 0xb9, 0x5c, 0xa9, 0x4a, 0x6e, 0xbe, 0xc6, 0x47, 0xa7, 0x52, 0x95, 0xf2, 0x09, 0x95, 0xc0, 0x97, - 0xfc, 0x80, 0x1c, 0x52, 0x3a, 0xa5, 0xfa, 0x35, 0x8f, 0x7d, 0x40, 0x4b, 0x90, 0xf1, 0x41, 0x2a, - 0xcc, 0xd7, 0xdf, 0xf7, 0xf5, 0xd7, 0xdd, 0xdf, 0xbb, 0x7b, 0x09, 0x37, 0x9d, 0xa7, 0xc6, 0x9d, - 0xae, 0xea, 0xaa, 0x86, 0xd5, 0xbb, 0xa3, 0x61, 0xa7, 0x3b, 0x38, 0xbc, 0xe3, 0xb8, 0xf6, 0xb0, - 0xeb, 0x0e, 0x6d, 0xac, 0x6d, 0x0c, 0x6c, 0xcb, 0xb5, 0xd0, 0xd5, 0xae, 0xd5, 0x3d, 0xb1, 0x2d, - 0xb5, 0x7b, 0xbc, 0xe1, 0x3c, 0x35, 0xc8, 0x7f, 0x87, 0xaa, 0x83, 0x97, 0x4b, 0x43, 0x57, 0x37, - 0xee, 0x1c, 0x1b, 0xdd, 0x3b, 0xae, 0xde, 0xc7, 0x8e, 0xab, 0xf6, 0x07, 0x8c, 0x60, 0xb9, 0x3c, - 0x85, 0xeb, 0xc0, 0xd6, 0x9f, 0xe9, 0x06, 0xee, 0x61, 0x8e, 0x73, 0x95, 0xe0, 0xb8, 0xa3, 0x01, - 0x76, 0xd8, 0xff, 0x39, 0xf8, 0xb5, 0x1e, 0xb6, 0xee, 0xf4, 0xb0, 0xa5, 0x9b, 0x1a, 0x7e, 0x7e, - 0xa7, 0x6b, 0x99, 0x47, 0x7a, 0x8f, 0x0f, 0x2d, 0xf5, 0xac, 0x9e, 0x45, 0xff, 0xbc, 0x43, 0xfe, - 0x62, 0xd0, 0xf2, 0x4f, 0x12, 0x70, 0x65, 0xcb, 0xb2, 0xb1, 0xde, 0x33, 0x1f, 0xe2, 0x91, 0x8c, - 0x8f, 0xb0, 0x8d, 0xcd, 0x2e, 0x46, 0x6b, 0x90, 0x70, 0xd5, 0x43, 0x03, 0x97, 0x22, 0x6b, 0x91, - 0xf5, 0x7c, 0x15, 0x7e, 0x73, 0xb6, 0xba, 0xf0, 0xd5, 0xd9, 0x6a, 0xb4, 0x59, 0x97, 0xd9, 0x00, - 0xba, 0x05, 0x09, 0x3a, 0x4b, 0x29, 0x4a, 0x31, 0x8a, 0x1c, 0x23, 0xd5, 0x24, 0x40, 0x82, 0x46, - 0x47, 0x51, 0x09, 0xe2, 0xa6, 0xda, 0xc7, 0xa5, 0xd8, 0x5a, 0x64, 0x3d, 0x53, 0x8d, 0x13, 0x2c, - 0x99, 0x42, 0xd0, 0x43, 0x48, 0x3f, 0x53, 0x0d, 0x5d, 0xd3, 0xdd, 0x51, 0x29, 0xbe, 0x16, 0x59, - 0x2f, 0x6c, 0xbe, 0xb3, 0x31, 0x75, 0xab, 0x36, 0x6a, 0x96, 0xe9, 0xb8, 0xb6, 0xaa, 0x9b, 0xee, - 0x23, 0x4e, 0xc0, 0x19, 0x79, 0x0c, 0xd0, 0x5d, 0x58, 0x74, 0x8e, 0x55, 0x1b, 0x6b, 0xca, 0xc0, - 0xc6, 0x47, 0xfa, 0x73, 0xc5, 0xc0, 0x66, 0x29, 0xb1, 0x16, 0x59, 0x4f, 0x70, 0xd4, 0x22, 0x1b, - 0xde, 0xa3, 0xa3, 0x3b, 0xd8, 0x44, 0x1d, 0xc8, 0x58, 0xa6, 0xa2, 0x61, 0x03, 0xbb, 0xb8, 0x94, - 0xa4, 0xf3, 0x7f, 0x30, 0x63, 0xfe, 0x29, 0x1b, 0xb4, 0x51, 0xe9, 0xba, 0xba, 0x65, 0x0a, 0x39, - 0x2c, 0xb3, 0x4e, 0x19, 0x71, 0xae, 0xc3, 0x81, 0xa6, 0xba, 0xb8, 0x94, 0x7a, 0x69, 0xae, 0x07, - 0x94, 0x11, 0xda, 0x81, 0x44, 0x5f, 0x75, 0xbb, 0xc7, 0xa5, 0x34, 0xe5, 0x78, 0xf7, 0x05, 0x38, - 0xee, 0x12, 0x3a, 0xce, 0x90, 0x31, 0x29, 0x3f, 0x86, 0x24, 0x9b, 0x07, 0xe5, 0x21, 0xd3, 0x6a, - 0x2b, 0x95, 0x5a, 0xa7, 0xd9, 0x6e, 0x49, 0x0b, 0x28, 0x07, 0x69, 0xb9, 0xb1, 0xdf, 0x91, 0x9b, - 0xb5, 0x8e, 0x14, 0x21, 0x5f, 0xfb, 0x8d, 0x8e, 0xd2, 0x3a, 0xd8, 0xd9, 0x91, 0xa2, 0xa8, 0x08, - 0x59, 0xf2, 0x55, 0x6f, 0x6c, 0x55, 0x0e, 0x76, 0x3a, 0x52, 0x0c, 0x65, 0x21, 0x55, 0xab, 0xec, - 0xd7, 0x2a, 0xf5, 0x86, 0x14, 0x5f, 0x8e, 0xff, 0xe2, 0xe7, 0x2b, 0x0b, 0xe5, 0xbb, 0x90, 0xa0, - 0xd3, 0x21, 0x80, 0xe4, 0x7e, 0x73, 0x77, 0x6f, 0xa7, 0x21, 0x2d, 0xa0, 0x34, 0xc4, 0xb7, 0x08, - 0x8b, 0x08, 0xa1, 0xd8, 0xab, 0xc8, 0x9d, 0x66, 0x65, 0x47, 0x8a, 0x32, 0x8a, 0x4f, 0xe2, 0xff, - 0xfd, 0xb3, 0xd5, 0x48, 0xf9, 0xdf, 0x12, 0xb0, 0xe4, 0xcb, 0xee, 0x9f, 0x36, 0xaa, 0x41, 0xd1, - 0xb2, 0xf5, 0x9e, 0x6e, 0x2a, 0x54, 0xe7, 0x14, 0x5d, 0xe3, 0xfa, 0xf8, 0x0d, 0xb2, 0x9e, 0xf3, - 0xb3, 0xd5, 0x7c, 0x9b, 0x0e, 0x77, 0xc8, 0x68, 0xb3, 0xce, 0x15, 0x34, 0x6f, 0x05, 0x80, 0x1a, - 0x7a, 0x08, 0x8b, 0x9c, 0x49, 0xd7, 0x32, 0x86, 0x7d, 0x53, 0xd1, 0x35, 0xa7, 0x14, 0x5d, 0x8b, - 0xad, 0xe7, 0xab, 0xab, 0xe7, 0x67, 0xab, 0x45, 0xc6, 0xa2, 0x46, 0xc7, 0x9a, 0x75, 0xe7, 0xab, - 0xb3, 0xd5, 0xb4, 0xf8, 0x90, 0xf9, 0xf4, 0xfc, 0x5b, 0x73, 0xd0, 0x63, 0xb8, 0x6a, 0x8b, 0xbd, - 0xd5, 0x82, 0x0c, 0x63, 0x94, 0xe1, 0xcd, 0xf3, 0xb3, 0xd5, 0x2b, 0xde, 0xe6, 0x6b, 0xd3, 0x99, - 0x5e, 0xb1, 0xc7, 0x11, 0x34, 0x07, 0xb5, 0x21, 0x00, 0xf6, 0x97, 0x1b, 0xa7, 0xcb, 0x5d, 0xe5, - 0xcb, 0x5d, 0xf4, 0x59, 0x87, 0x97, 0xbc, 0x68, 0x8f, 0x0d, 0x68, 0x9e, 0xe1, 0x25, 0x2e, 0x34, - 0xbc, 0xe4, 0xcb, 0x1a, 0x5e, 0xc8, 0x8c, 0x52, 0xff, 0x2f, 0x66, 0x94, 0x7e, 0xe5, 0x66, 0x94, - 0x79, 0x05, 0x66, 0xc4, 0x74, 0xf7, 0x41, 0x3c, 0x0d, 0x52, 0xf6, 0x41, 0x3c, 0x9d, 0x95, 0x72, - 0x0f, 0xe2, 0xe9, 0x9c, 0x94, 0x7f, 0x10, 0x4f, 0xe7, 0xa5, 0x42, 0xf9, 0x6f, 0xa3, 0xf0, 0xfa, - 0x81, 0xa9, 0x3f, 0x1d, 0xe2, 0xc7, 0xba, 0x7b, 0x6c, 0x0d, 0x5d, 0xea, 0x17, 0x03, 0xba, 0x7d, - 0x17, 0xd2, 0x63, 0x4a, 0x7d, 0x95, 0x9f, 0x72, 0x2a, 0x7c, 0xb6, 0x29, 0x97, 0x9f, 0xe8, 0x3d, - 0x80, 0x09, 0x0d, 0x7e, 0xed, 0xfc, 0x6c, 0x35, 0x33, 0x5d, 0xcd, 0x32, 0x5d, 0x4f, 0xb9, 0xfe, - 0x40, 0x4e, 0xb8, 0x0c, 0x99, 0x81, 0x8d, 0x35, 0xbd, 0x4b, 0x4e, 0x2d, 0xa8, 0x77, 0x3e, 0x98, - 0x5b, 0xfc, 0x3f, 0xa4, 0x40, 0x62, 0x82, 0xd6, 0xb1, 0xd3, 0xb5, 0xf5, 0x81, 0x6b, 0xd9, 0x9e, - 0x94, 0x91, 0x09, 0x29, 0xdf, 0x82, 0xa8, 0xae, 0xf1, 0x40, 0x73, 0x8d, 0xef, 0x52, 0x94, 0x6e, - 0x90, 0xbf, 0xdc, 0xa8, 0xae, 0xa1, 0x0d, 0x88, 0x93, 0x68, 0x48, 0xd7, 0x99, 0xdd, 0x5c, 0x1e, - 0x5f, 0x09, 0xee, 0x6f, 0xb0, 0x60, 0xd9, 0x91, 0x29, 0x1e, 0x5a, 0x83, 0xb4, 0x39, 0x34, 0x0c, - 0x1a, 0xe8, 0xc8, 0xea, 0xd3, 0x62, 0x49, 0x02, 0x8a, 0x6e, 0x40, 0x4e, 0xc3, 0x47, 0xea, 0xd0, - 0x70, 0x15, 0xfc, 0x7c, 0x60, 0xb3, 0x55, 0xc9, 0x59, 0x0e, 0x6b, 0x3c, 0x1f, 0xd8, 0xe8, 0x4d, - 0x28, 0x78, 0xba, 0xca, 0x90, 0x10, 0x45, 0xca, 0x09, 0xbd, 0xa3, 0x58, 0xaf, 0x43, 0xf2, 0x58, - 0xd7, 0x34, 0x6c, 0x52, 0x93, 0x13, 0x13, 0x71, 0x18, 0x5a, 0x87, 0x9c, 0x6e, 0xaa, 0xdd, 0x2e, - 0x76, 0x1c, 0x9d, 0x08, 0xb3, 0x18, 0xc0, 0x09, 0x8d, 0xa0, 0xa7, 0xb0, 0xdc, 0xc3, 0x26, 0xb6, - 0x55, 0x17, 0x6b, 0x8a, 0xea, 0x28, 0xba, 0x86, 0x4d, 0x57, 0x77, 0x47, 0x0a, 0x5d, 0xf8, 0x15, - 0x7a, 0x84, 0x1b, 0x33, 0x8e, 0xf0, 0xbe, 0x20, 0xac, 0x38, 0x4d, 0x4e, 0xd6, 0x19, 0x0d, 0x30, - 0x9f, 0xe7, 0x7a, 0x6f, 0xfa, 0x30, 0xda, 0x83, 0x5b, 0xd3, 0xa7, 0x74, 0xf0, 0xd3, 0x21, 0xb1, - 0x0e, 0xc5, 0x1a, 0x10, 0x7b, 0x2b, 0x2d, 0xd1, 0x75, 0xdf, 0x98, 0xc2, 0x67, 0x9f, 0x63, 0xb6, - 0x29, 0x22, 0xda, 0x84, 0xc5, 0xa1, 0x83, 0x1d, 0x9f, 0x01, 0x51, 0x68, 0xa0, 0x0a, 0x9d, 0xe4, - 0x5a, 0x5f, 0x24, 0x08, 0x82, 0x8c, 0xe8, 0xf0, 0x26, 0x2c, 0x5a, 0xa7, 0xe6, 0x18, 0x4d, 0x2e, - 0x4c, 0x43, 0x10, 0x82, 0x34, 0x37, 0x20, 0xd7, 0xb5, 0xfa, 0x83, 0xa1, 0x38, 0x98, 0x2c, 0x3b, - 0x3d, 0x0e, 0xa3, 0xe7, 0xb2, 0x02, 0xa9, 0x67, 0xba, 0xed, 0x0e, 0x55, 0xa3, 0x24, 0x05, 0x36, - 0x5d, 0x00, 0xd1, 0x67, 0x20, 0x0d, 0x7a, 0x8a, 0xea, 0xba, 0xb6, 0x7e, 0x48, 0xf8, 0x98, 0xc3, - 0x7e, 0x29, 0x1f, 0x52, 0xc4, 0xc2, 0xde, 0xfd, 0x8a, 0x18, 0x6e, 0x0d, 0xfb, 0x72, 0x61, 0xd0, - 0x0b, 0x7e, 0xa3, 0x2d, 0x78, 0x43, 0x35, 0x5c, 0x6c, 0x8b, 0x68, 0x41, 0x0e, 0x4a, 0xd1, 0x4d, - 0x65, 0x60, 0x5b, 0x3d, 0x1b, 0x3b, 0x4e, 0xa9, 0x10, 0x98, 0xf7, 0x35, 0x8a, 0xca, 0x94, 0x9a, - 0x6c, 0x7e, 0xd3, 0xdc, 0xe3, 0x68, 0xe8, 0x07, 0x80, 0x9c, 0x91, 0xe3, 0xe2, 0xbe, 0x60, 0x74, - 0xa2, 0x9b, 0x5a, 0xa9, 0x48, 0x4f, 0xfc, 0xed, 0x19, 0x27, 0xbe, 0x4f, 0x09, 0x18, 0xbb, 0x87, - 0xba, 0xa9, 0xf1, 0x59, 0x24, 0x67, 0x0c, 0xee, 0x39, 0xb3, 0xb4, 0x94, 0x79, 0x10, 0x4f, 0x67, - 0x24, 0x78, 0x10, 0x4f, 0xa7, 0xa4, 0x74, 0xf9, 0x2f, 0xa3, 0x70, 0x8d, 0xa1, 0x6d, 0xa9, 0x7d, - 0xdd, 0x18, 0xbd, 0xac, 0xb9, 0x32, 0x2e, 0xdc, 0x5c, 0xe9, 0xf1, 0xd0, 0xa5, 0x10, 0x32, 0x16, - 0x43, 0xe9, 0xf1, 0x10, 0x58, 0x8b, 0x80, 0xc6, 0x7c, 0x5e, 0xfc, 0x05, 0x7c, 0x5e, 0x1b, 0x16, - 0x85, 0xe5, 0x7a, 0x1c, 0xa8, 0xf9, 0xe6, 0xab, 0x37, 0xb9, 0x4c, 0xc5, 0x3a, 0x43, 0x10, 0xe4, - 0xe1, 0xd0, 0xaf, 0x85, 0x06, 0xf9, 0x16, 0x95, 0xff, 0x25, 0x0a, 0x4b, 0x4d, 0xd3, 0xc5, 0xb6, - 0x81, 0xd5, 0x67, 0x38, 0xb0, 0x1d, 0x5f, 0x40, 0x46, 0x35, 0xbb, 0xd8, 0x71, 0x2d, 0xdb, 0x29, - 0x45, 0xd6, 0x62, 0xeb, 0xd9, 0xcd, 0x8f, 0x66, 0x9c, 0xca, 0x34, 0xfa, 0x8d, 0x0a, 0x27, 0x16, - 0x2e, 0xd3, 0x63, 0xb6, 0xfc, 0xeb, 0x08, 0xa4, 0xc5, 0xe8, 0x25, 0xc2, 0xc6, 0x37, 0x21, 0x4d, - 0x53, 0x71, 0xc5, 0x3b, 0x93, 0x65, 0x41, 0xc1, 0x73, 0xf5, 0x60, 0xda, 0x9e, 0xa2, 0xb8, 0x4d, - 0x0d, 0xd5, 0xa6, 0x65, 0xd4, 0x31, 0x4a, 0x7f, 0x5d, 0xec, 0xdf, 0x7e, 0x38, 0xa7, 0x9e, 0x48, - 0xb2, 0xd9, 0x9e, 0xf1, 0x9d, 0xfb, 0xe7, 0x08, 0x2c, 0x12, 0x02, 0x0d, 0x6b, 0x81, 0x6d, 0xbb, - 0x09, 0xa0, 0x3b, 0x8a, 0xc3, 0xe0, 0x74, 0x45, 0xc2, 0x14, 0x32, 0xba, 0xc3, 0xd1, 0x3d, 0x55, - 0x8b, 0x4e, 0xa8, 0xda, 0xc7, 0x90, 0xa7, 0xb4, 0xca, 0xe1, 0xb0, 0x7b, 0x82, 0x5d, 0x87, 0x4a, - 0x98, 0xa8, 0x2e, 0x71, 0x09, 0x73, 0x94, 0x43, 0x95, 0x8d, 0xc9, 0x39, 0x27, 0xf0, 0x35, 0xa1, - 0x7d, 0xf1, 0x09, 0xed, 0xe3, 0x82, 0xff, 0x32, 0x0e, 0xd7, 0xf6, 0x54, 0xdb, 0xd5, 0x89, 0xef, - 0xd2, 0xcd, 0x5e, 0x40, 0xfa, 0x5b, 0x90, 0x35, 0x87, 0xc2, 0x20, 0x1d, 0x7e, 0x20, 0x4c, 0x3e, - 0x30, 0x87, 0xdc, 0xc0, 0x1c, 0xf4, 0x2d, 0x58, 0x22, 0x68, 0x7a, 0x7f, 0x60, 0xe8, 0x5d, 0xdd, - 0xf5, 0xf0, 0xe3, 0x01, 0x7c, 0x64, 0x0e, 0xfb, 0x4d, 0x8e, 0x20, 0xe8, 0x76, 0x20, 0x6e, 0xe8, - 0x8e, 0x4b, 0x63, 0x7d, 0x76, 0x73, 0x73, 0x86, 0x3a, 0x4d, 0x97, 0x6d, 0x63, 0x47, 0x77, 0x5c, - 0xb1, 0x57, 0x84, 0x0b, 0x6a, 0x43, 0xc2, 0x56, 0xcd, 0x1e, 0xa6, 0x76, 0x96, 0xdd, 0xfc, 0xf0, - 0xc5, 0xd8, 0xc9, 0x84, 0x54, 0x64, 0x40, 0x94, 0xcf, 0xf2, 0x4f, 0x23, 0x10, 0x27, 0xb3, 0x5c, - 0xe0, 0x0a, 0xae, 0x41, 0xf2, 0x99, 0x6a, 0x0c, 0x31, 0xcb, 0x57, 0x72, 0x32, 0xff, 0x42, 0x7f, - 0x02, 0x45, 0x67, 0x78, 0x38, 0x08, 0x4c, 0xc5, 0x83, 0xf6, 0xfb, 0x2f, 0x24, 0x95, 0x57, 0xdc, - 0x85, 0x79, 0xb1, 0x83, 0x5b, 0x7e, 0x0a, 0x09, 0x2a, 0xf5, 0x05, 0xf2, 0xdd, 0x82, 0xc2, 0x91, - 0x6d, 0xf5, 0x15, 0xdd, 0xec, 0x1a, 0x43, 0x47, 0x7f, 0xc6, 0x72, 0x87, 0x9c, 0x9c, 0x27, 0xd0, - 0xa6, 0x00, 0x12, 0x5d, 0x71, 0x2d, 0x05, 0x3f, 0x17, 0x48, 0x51, 0x8a, 0x94, 0x75, 0xad, 0x86, - 0x00, 0x85, 0x54, 0xfd, 0xd7, 0x39, 0x28, 0x52, 0x83, 0x9a, 0xcb, 0x5d, 0xde, 0x0a, 0xb8, 0xcb, - 0xab, 0x21, 0x77, 0xe9, 0x59, 0x25, 0xf1, 0x96, 0xaf, 0x43, 0x72, 0x48, 0x13, 0x4a, 0x2a, 0xa2, - 0x97, 0x41, 0x30, 0x18, 0xba, 0x07, 0xa9, 0x67, 0xd8, 0x76, 0x48, 0x18, 0x46, 0x94, 0xd3, 0x0a, - 0x2f, 0xc8, 0xaf, 0x8d, 0x09, 0xf2, 0x88, 0x61, 0xc9, 0x02, 0x1d, 0xad, 0x83, 0x74, 0x82, 0x47, - 0xca, 0x14, 0x5b, 0x28, 0x9c, 0x90, 0x6a, 0xcc, 0x77, 0xc6, 0x1a, 0x5c, 0x0d, 0x60, 0x6a, 0xba, - 0x8d, 0x69, 0x9e, 0xed, 0x94, 0xd2, 0x6b, 0xb1, 0x0b, 0xf2, 0xe9, 0x31, 0x01, 0x36, 0xea, 0x82, - 0x50, 0xbe, 0xe2, 0x4d, 0xe0, 0xc1, 0x1c, 0xf4, 0x1e, 0x20, 0xe2, 0xe9, 0x70, 0x58, 0xa2, 0x04, - 0x95, 0x48, 0xa2, 0x23, 0x41, 0x99, 0xaa, 0x50, 0x08, 0xc8, 0x44, 0x82, 0x44, 0x92, 0x06, 0x89, - 0xd7, 0x89, 0xf5, 0x3f, 0x14, 0xec, 0xc7, 0xe3, 0x44, 0xce, 0x9b, 0x98, 0x84, 0x8a, 0x03, 0xb6, - 0x2e, 0x67, 0x78, 0x44, 0xfc, 0x5c, 0x80, 0x55, 0x8a, 0xb2, 0x2a, 0x9f, 0x9f, 0xad, 0xa2, 0x87, - 0x78, 0xb4, 0x4f, 0xc7, 0xa7, 0x33, 0x44, 0x27, 0x63, 0xe3, 0x9a, 0x83, 0xb6, 0x41, 0x0a, 0x2d, - 0x84, 0x70, 0x2c, 0x50, 0x8e, 0x2b, 0x24, 0x6d, 0xd8, 0xf7, 0x97, 0x32, 0xce, 0xad, 0x10, 0x58, - 0x26, 0xe1, 0xd4, 0x81, 0x25, 0x92, 0xb3, 0x58, 0x8e, 0xee, 0x86, 0xb8, 0xe5, 0x7d, 0xf9, 0x6a, - 0x62, 0x7c, 0x86, 0x7c, 0xdd, 0xb1, 0x71, 0xcd, 0x41, 0xfb, 0x90, 0x3d, 0x62, 0xa5, 0x8e, 0x72, - 0x82, 0x47, 0xb4, 0x28, 0xca, 0x6e, 0xde, 0x9e, 0xbf, 0x28, 0xaa, 0x26, 0x89, 0x8a, 0x95, 0x22, - 0x32, 0x1c, 0x79, 0x83, 0xe8, 0x31, 0xe4, 0x03, 0x75, 0xec, 0xe1, 0x88, 0xa6, 0x75, 0x97, 0x63, - 0x9b, 0xf3, 0x19, 0x55, 0x47, 0x68, 0x1f, 0x40, 0xf7, 0xe2, 0x26, 0xcd, 0xe4, 0xb2, 0x9b, 0xef, - 0xbe, 0x40, 0x80, 0xf5, 0xa5, 0xf5, 0xd9, 0xa0, 0x27, 0x50, 0xf0, 0xbf, 0xa8, 0xb8, 0xb9, 0x4b, - 0x8b, 0x9b, 0x0f, 0x70, 0xaa, 0x92, 0x8d, 0xc8, 0x85, 0xdc, 0x5b, 0xf1, 0xf2, 0xee, 0x2d, 0xc4, - 0x08, 0x35, 0x78, 0x91, 0x23, 0xd1, 0xcc, 0xef, 0xdd, 0x39, 0x8d, 0x2e, 0x90, 0xe8, 0xb3, 0xda, - 0xe7, 0x43, 0x40, 0x5d, 0x1b, 0xd3, 0x9c, 0x1e, 0x3f, 0x67, 0x61, 0xc7, 0x18, 0x85, 0x0a, 0x8f, - 0x45, 0x3e, 0xde, 0xf0, 0x86, 0xd1, 0x36, 0xe4, 0xb1, 0xd9, 0xb5, 0x34, 0xdd, 0xec, 0xf9, 0x05, - 0x07, 0x4f, 0xa8, 0xbe, 0x3a, 0x5b, 0xfd, 0xc6, 0xd8, 0xac, 0x0d, 0x8e, 0x4b, 0x26, 0x97, 0x73, - 0x38, 0xf0, 0x85, 0xb6, 0x21, 0x25, 0x82, 0xfe, 0x12, 0xdd, 0x99, 0xf5, 0x59, 0x29, 0xec, 0x78, - 0xca, 0x20, 0x32, 0x74, 0x4e, 0x4e, 0x8a, 0x38, 0x4d, 0x77, 0x48, 0xb2, 0xa3, 0x95, 0xae, 0x06, - 0x8b, 0x38, 0x01, 0x45, 0x35, 0x80, 0x1e, 0xb6, 0x14, 0xd6, 0x0e, 0x2d, 0x5d, 0xa3, 0xd3, 0xad, - 0x04, 0xa6, 0xeb, 0x61, 0x6b, 0x43, 0x34, 0x4d, 0x49, 0x9d, 0x7b, 0xa4, 0xf7, 0x44, 0x0e, 0xd2, - 0xc3, 0x16, 0x03, 0x84, 0x8b, 0xdb, 0xeb, 0x53, 0x8b, 0xdb, 0xf2, 0x0a, 0x64, 0x3c, 0x47, 0x86, - 0x52, 0x10, 0xab, 0xec, 0xd7, 0x58, 0x07, 0xac, 0xde, 0xd8, 0xaf, 0x49, 0x91, 0xf2, 0x0d, 0x88, - 0xd3, 0xc5, 0x67, 0x21, 0xb5, 0xd5, 0x96, 0x1f, 0x57, 0xe4, 0x3a, 0xeb, 0xba, 0x35, 0x5b, 0x8f, - 0x1a, 0x72, 0xa7, 0x51, 0x97, 0x44, 0x00, 0x39, 0x8b, 0x03, 0xf2, 0x0b, 0xee, 0x8e, 0xc5, 0x1b, - 0x18, 0x3d, 0x28, 0x76, 0x3d, 0x28, 0x3b, 0x80, 0xc8, 0x5a, 0x74, 0xbd, 0xb0, 0x79, 0xef, 0x6b, - 0x8b, 0x76, 0xc1, 0x23, 0x08, 0xf2, 0x55, 0xa2, 0xd0, 0x0d, 0x41, 0x03, 0x09, 0x57, 0x74, 0x2c, - 0x58, 0xc9, 0x90, 0xe8, 0x1e, 0xe3, 0xee, 0x09, 0x0f, 0xd7, 0xdf, 0x9a, 0x31, 0x31, 0xcd, 0x45, - 0x03, 0xea, 0x57, 0x23, 0x34, 0xfe, 0xd4, 0x22, 0x8f, 0xa0, 0xac, 0x90, 0x1c, 0x76, 0x44, 0xf1, - 0x0b, 0x6d, 0x7b, 0x5a, 0xa3, 0x50, 0xa4, 0x5c, 0x01, 0x3f, 0x74, 0x0f, 0x8a, 0xa6, 0xe5, 0x2a, - 0xa4, 0x90, 0xe7, 0x1e, 0x93, 0x16, 0xde, 0xf9, 0xaa, 0xc4, 0x75, 0xd5, 0xf7, 0x8d, 0x79, 0xd3, - 0x72, 0x5b, 0x43, 0xc3, 0x60, 0x00, 0xf4, 0x67, 0x11, 0x58, 0x65, 0x41, 0x55, 0x39, 0x65, 0xad, - 0x1b, 0x85, 0xe5, 0xcf, 0xfe, 0x1e, 0xd1, 0x46, 0xd7, 0xec, 0x0c, 0xea, 0xa2, 0xbe, 0x0f, 0x17, - 0xf5, 0xf5, 0xe1, 0x05, 0x38, 0xe5, 0x0e, 0x14, 0xc2, 0xc7, 0x84, 0x32, 0x90, 0xa8, 0x6d, 0x37, - 0x6a, 0x0f, 0xa5, 0x05, 0x54, 0x84, 0xec, 0x56, 0x5b, 0x6e, 0x34, 0xef, 0xb7, 0x94, 0x87, 0x8d, - 0x27, 0xac, 0x51, 0xdb, 0x6a, 0x7b, 0x8d, 0xda, 0x12, 0x2c, 0x1d, 0xb4, 0x9a, 0x9f, 0x1f, 0x34, - 0x94, 0xc7, 0xcd, 0xce, 0x76, 0xfb, 0xa0, 0xa3, 0x34, 0x5b, 0xf5, 0xc6, 0x17, 0x52, 0xcc, 0xab, - 0xf1, 0x12, 0x52, 0xb2, 0xfc, 0xef, 0x49, 0x28, 0xec, 0xd9, 0x7a, 0x5f, 0xb5, 0x47, 0x24, 0xb2, - 0x9d, 0xaa, 0x03, 0xf4, 0x19, 0x2c, 0x59, 0x06, 0xc9, 0xf6, 0x29, 0x54, 0xf1, 0x6a, 0x86, 0xf8, - 0xf4, 0xfe, 0xfe, 0xa2, 0x65, 0x68, 0x9c, 0x43, 0x93, 0x97, 0x0c, 0x9f, 0xc1, 0x92, 0x89, 0x4f, - 0x27, 0x39, 0x44, 0x66, 0x70, 0x30, 0xf1, 0xe9, 0x18, 0x87, 0xf7, 0x20, 0x4b, 0x64, 0xa0, 0x94, - 0x58, 0xf4, 0xb8, 0xb2, 0x41, 0x22, 0xb0, 0x0c, 0xad, 0xc9, 0x86, 0x09, 0x36, 0x99, 0x4f, 0x60, - 0xc7, 0xa6, 0x60, 0x9b, 0xf8, 0x54, 0x60, 0x7f, 0x0c, 0xd7, 0x26, 0xa5, 0x9b, 0x68, 0x91, 0x5e, - 0x19, 0x13, 0x8a, 0x64, 0x19, 0xe8, 0x4b, 0x58, 0x32, 0xac, 0xae, 0x6a, 0xe8, 0xee, 0x88, 0x7b, - 0x11, 0xc5, 0x39, 0x55, 0x07, 0x54, 0xa3, 0xb2, 0x33, 0x8d, 0x2f, 0xbc, 0xbf, 0x1b, 0x3b, 0x9c, - 0x03, 0xf3, 0x27, 0x04, 0x24, 0x23, 0x63, 0x02, 0xb6, 0xfc, 0x4f, 0x31, 0x40, 0x93, 0xa8, 0xe8, - 0x04, 0xae, 0x90, 0x9d, 0x19, 0x13, 0x83, 0x6e, 0x6d, 0x76, 0xf3, 0x9b, 0x73, 0x5a, 0x61, 0x98, - 0xaf, 0x70, 0xf3, 0x96, 0xa1, 0x85, 0x07, 0xc8, 0x64, 0x64, 0xab, 0xc6, 0x27, 0x8b, 0xbe, 0x82, - 0xc9, 0x4c, 0x7c, 0x3a, 0x36, 0x99, 0x0e, 0x6f, 0x90, 0xc9, 0x6c, 0xdc, 0xd3, 0x2d, 0x53, 0x35, - 0x94, 0xc3, 0x91, 0x62, 0x5b, 0xa7, 0x81, 0xa2, 0x9d, 0x15, 0x9d, 0xeb, 0xe7, 0x67, 0xab, 0xa5, - 0x16, 0x3e, 0x95, 0x39, 0x5e, 0x75, 0x24, 0x5b, 0xa7, 0x53, 0x2b, 0xf7, 0x92, 0x39, 0x1d, 0x4b, - 0x43, 0x32, 0xbc, 0x7d, 0xc1, 0x54, 0xa1, 0x46, 0x5f, 0x9c, 0xf5, 0xb2, 0xa6, 0xb3, 0xaa, 0xfb, - 0xed, 0xbf, 0x50, 0xde, 0xff, 0xcb, 0x08, 0xd0, 0x44, 0x6c, 0xe8, 0x8a, 0xd6, 0x3e, 0x3d, 0xbb, - 0x8f, 0x20, 0x4f, 0xa6, 0xf5, 0x57, 0x14, 0x99, 0xe1, 0x89, 0x88, 0x3a, 0x7b, 0xc2, 0x7e, 0x04, - 0x79, 0x72, 0xe2, 0x3e, 0x55, 0x74, 0x16, 0x95, 0x65, 0x78, 0x17, 0x09, 0xe8, 0x6d, 0xc8, 0xe9, - 0x26, 0x49, 0xed, 0x79, 0xcb, 0x2b, 0xd8, 0xf2, 0xcd, 0xf2, 0x11, 0x5f, 0xee, 0xf2, 0xaf, 0xa2, - 0x70, 0x7d, 0x57, 0x75, 0xb1, 0xad, 0xab, 0x86, 0xfe, 0x63, 0xac, 0x3d, 0xd2, 0xc9, 0x82, 0x8f, - 0x6c, 0xec, 0x1c, 0xa3, 0x2f, 0x60, 0x71, 0xc2, 0x60, 0xb8, 0xc2, 0xbd, 0x35, 0x5f, 0xd6, 0x21, - 0xca, 0xb3, 0x31, 0x9b, 0x42, 0xbb, 0x61, 0xc3, 0x65, 0xe5, 0xed, 0x8b, 0xf1, 0x0c, 0x5a, 0xf6, - 0x3d, 0x48, 0xa8, 0x8e, 0x62, 0x1d, 0xf1, 0x98, 0xf4, 0x46, 0x80, 0xd1, 0xd0, 0xd5, 0x8d, 0x8d, - 0x63, 0xa3, 0xbb, 0xd1, 0x11, 0x97, 0xac, 0x22, 0x9a, 0xa9, 0x4e, 0xfb, 0x08, 0xbd, 0x0f, 0x45, - 0xe7, 0xd8, 0x1a, 0x1a, 0x9a, 0x72, 0xa8, 0x76, 0x4f, 0x8e, 0x74, 0xc3, 0x08, 0xf5, 0x81, 0x0b, - 0x6c, 0xb0, 0xca, 0xc7, 0xf8, 0x9e, 0xfd, 0x55, 0x0a, 0x90, 0x2f, 0xcf, 0xee, 0xd0, 0x55, 0x69, - 0xbc, 0xaf, 0x40, 0x92, 0x07, 0x1a, 0xb6, 0x47, 0x6f, 0xcf, 0x8c, 0xc9, 0xe1, 0xbe, 0xf7, 0xf6, - 0x82, 0xcc, 0x09, 0xd1, 0xf7, 0x82, 0x77, 0xaa, 0x73, 0xef, 0xc8, 0xf6, 0x82, 0xb8, 0x6c, 0x7d, - 0x08, 0x10, 0x08, 0x52, 0x69, 0xca, 0xe4, 0x9d, 0xb9, 0x53, 0x83, 0xed, 0x05, 0x39, 0x40, 0x8e, - 0xda, 0x50, 0x18, 0x84, 0x3c, 0x18, 0xaf, 0x10, 0x6e, 0xcd, 0xe5, 0xee, 0xb6, 0x17, 0xe4, 0x31, - 0x72, 0xf4, 0x03, 0x40, 0xdd, 0x09, 0xe3, 0x28, 0xc1, 0xd7, 0x48, 0x39, 0x4e, 0xb0, 0xbd, 0x20, - 0x4f, 0x61, 0x83, 0xbe, 0x84, 0xeb, 0xfd, 0xe9, 0x7a, 0xcc, 0x6b, 0x85, 0x59, 0x4d, 0xf1, 0x19, - 0xda, 0xbf, 0xbd, 0x20, 0xcf, 0x62, 0x88, 0x1e, 0x42, 0xc2, 0x71, 0x49, 0x1a, 0x18, 0xa3, 0x29, - 0xf8, 0x9d, 0x19, 0x9c, 0x27, 0x75, 0x64, 0x63, 0x9f, 0x90, 0x89, 0xe4, 0x87, 0xf2, 0x40, 0x8f, - 0x21, 0xe3, 0x55, 0xd2, 0xfc, 0x0a, 0xe6, 0xc3, 0xf9, 0x19, 0x7a, 0xe9, 0xa6, 0x48, 0x46, 0x3d, - 0x5e, 0xa8, 0x02, 0xd9, 0x3e, 0x47, 0xf3, 0x5b, 0x9f, 0x6b, 0xbc, 0xbf, 0x00, 0x82, 0x03, 0xf5, - 0x9d, 0x81, 0x2f, 0x19, 0x04, 0x51, 0x93, 0xa6, 0xd6, 0xb6, 0x65, 0x18, 0xc4, 0x36, 0x68, 0xca, - 0xe3, 0xa5, 0xd6, 0x02, 0x5a, 0xfe, 0x0c, 0x12, 0x74, 0x4d, 0x24, 0xa5, 0x3d, 0x68, 0x3d, 0x6c, - 0xb5, 0x1f, 0xb7, 0x58, 0x8a, 0x52, 0x6f, 0xec, 0x34, 0x3a, 0x0d, 0xa5, 0xdd, 0xda, 0x21, 0x29, - 0xca, 0x6b, 0x70, 0x95, 0x03, 0x2a, 0xad, 0xba, 0xf2, 0x58, 0x6e, 0x8a, 0xa1, 0x68, 0x79, 0x3d, - 0x98, 0x33, 0xa7, 0x21, 0xde, 0x6a, 0xb7, 0x1a, 0xd2, 0x02, 0xcd, 0x9e, 0xeb, 0x75, 0x29, 0x42, - 0xb3, 0x67, 0xb9, 0xbd, 0x27, 0x45, 0x99, 0xf5, 0x55, 0x73, 0x00, 0x9a, 0xb7, 0x0f, 0x0f, 0xe2, - 0xe9, 0xa4, 0x94, 0x2a, 0xff, 0x63, 0x04, 0xd2, 0x24, 0x50, 0x37, 0xcd, 0x23, 0x0b, 0x7d, 0x08, - 0x99, 0x81, 0x6a, 0x63, 0xd3, 0xf5, 0x3d, 0xad, 0x68, 0x42, 0xa7, 0xf7, 0xe8, 0x80, 0xd7, 0x23, - 0x4d, 0x33, 0xc4, 0xa6, 0x86, 0xb6, 0x40, 0xe2, 0x44, 0x4e, 0xf7, 0x18, 0xf7, 0x55, 0x3f, 0xee, - 0xbc, 0xee, 0xb5, 0xf9, 0xe9, 0xf8, 0x3e, 0x1d, 0xf6, 0x38, 0x14, 0x06, 0x41, 0xe8, 0x05, 0x9d, - 0x4a, 0xee, 0x3b, 0xfe, 0xe6, 0x1d, 0x28, 0x8e, 0x05, 0xca, 0x0b, 0x3a, 0x43, 0x6b, 0xb4, 0x33, - 0x14, 0xf3, 0xfd, 0xbe, 0xd7, 0x19, 0x8a, 0xf2, 0xa6, 0xd0, 0x87, 0x7e, 0xdb, 0x87, 0x1c, 0x70, - 0xbc, 0xfa, 0x1a, 0x0f, 0x0f, 0x8b, 0x17, 0x74, 0x7c, 0xf6, 0x60, 0xb1, 0x6f, 0x69, 0xfa, 0x11, - 0x29, 0x5a, 0x88, 0x76, 0xb8, 0x7a, 0x1f, 0xf3, 0x94, 0x76, 0x2e, 0xdf, 0x29, 0x05, 0xa9, 0xc9, - 0x20, 0x6a, 0x41, 0x41, 0x23, 0x5e, 0x83, 0xd4, 0x85, 0xac, 0x5f, 0x73, 0x95, 0xfa, 0xf4, 0xd5, - 0x19, 0x9a, 0x2c, 0x0e, 0xcb, 0x2f, 0x9e, 0x05, 0x39, 0xeb, 0xea, 0x84, 0xce, 0x30, 0x3e, 0xe7, - 0x19, 0x1e, 0xc2, 0xf2, 0xd0, 0xc4, 0xcf, 0x07, 0x96, 0x83, 0x35, 0x65, 0xe2, 0x34, 0xd7, 0x29, - 0x97, 0x5b, 0x9c, 0xcb, 0xf5, 0x03, 0x81, 0x39, 0xf5, 0x58, 0xaf, 0x0f, 0xa7, 0x0e, 0x6b, 0xe8, - 0x3e, 0xa4, 0x44, 0xf3, 0x36, 0x4d, 0x57, 0x38, 0xaf, 0x97, 0x17, 0x55, 0x2b, 0xa7, 0x46, 0x5b, - 0x50, 0x30, 0xf1, 0xf3, 0xe0, 0xdd, 0x44, 0x26, 0x64, 0xa0, 0xb9, 0x16, 0x7e, 0x3e, 0xfd, 0x62, - 0x22, 0x67, 0xfa, 0x23, 0x1a, 0x6a, 0x43, 0xfa, 0x48, 0xed, 0xeb, 0x86, 0x8e, 0x9d, 0xd2, 0x35, - 0x2a, 0xd1, 0xfb, 0x17, 0x4a, 0x34, 0x7e, 0x8d, 0x23, 0x2c, 0x5a, 0x30, 0xf1, 0x04, 0xa3, 0x80, - 0x11, 0x11, 0xec, 0xfa, 0xa4, 0x60, 0xe2, 0x1a, 0x27, 0x74, 0xa5, 0x43, 0x05, 0xe3, 0x5f, 0x1a, - 0xfa, 0x1c, 0xf2, 0xe1, 0xcc, 0x01, 0x2e, 0x91, 0x39, 0xe4, 0x06, 0xc1, 0xb4, 0x61, 0x0b, 0x52, - 0x22, 0x65, 0xc8, 0x5e, 0x22, 0x65, 0x10, 0xc4, 0xa8, 0x4a, 0xf2, 0xb1, 0xe7, 0xae, 0x5f, 0xa0, - 0xe4, 0xfc, 0x8e, 0xe9, 0xf9, 0xd9, 0x6a, 0x96, 0xac, 0x70, 0xca, 0xd5, 0x48, 0xd6, 0xf4, 0xe0, - 0x1a, 0x7a, 0x00, 0xe0, 0xbd, 0xc9, 0x72, 0xe8, 0x8d, 0xe0, 0xec, 0xae, 0xd1, 0x9e, 0x40, 0xf4, - 0x45, 0x92, 0x03, 0xd4, 0x68, 0x17, 0x32, 0xc2, 0xe9, 0xb2, 0x0e, 0xe1, 0xec, 0x78, 0x38, 0x19, - 0x02, 0x84, 0xe3, 0xf7, 0x38, 0x90, 0x12, 0xdd, 0xc0, 0xaa, 0x83, 0x79, 0xcb, 0xe9, 0xde, 0x9c, - 0xf9, 0x3a, 0xd3, 0xf1, 0xda, 0xb1, 0x6a, 0xf6, 0xf0, 0x0e, 0xa1, 0xaf, 0x46, 0x4b, 0x11, 0x99, - 0xb1, 0x42, 0x2d, 0x90, 0xe8, 0x96, 0x05, 0x23, 0x8a, 0x44, 0x77, 0xed, 0x4d, 0xe1, 0x1f, 0xc9, - 0xae, 0xcd, 0x8c, 0x2a, 0x54, 0xa7, 0x76, 0xfd, 0xc8, 0xf2, 0x1d, 0x28, 0x1c, 0x59, 0x76, 0x5f, - 0x75, 0x15, 0xe1, 0xbe, 0x16, 0xfd, 0xfe, 0xf7, 0x57, 0x67, 0xab, 0xf9, 0x2d, 0x3a, 0x2a, 0x5c, - 0x57, 0xfe, 0x28, 0xf8, 0x89, 0xaa, 0x22, 0x00, 0xb3, 0xfb, 0xee, 0xb7, 0xbe, 0x76, 0xb3, 0xa6, - 0xc4, 0xdd, 0x77, 0xa1, 0x60, 0x1d, 0x1d, 0x19, 0xba, 0x89, 0x15, 0x1b, 0xab, 0x8e, 0x65, 0x96, - 0xde, 0x0a, 0xf8, 0xdf, 0x3c, 0x1f, 0x93, 0xe9, 0x10, 0x6a, 0x41, 0x92, 0xb6, 0x2a, 0x9c, 0xd2, - 0x12, 0x3d, 0x9e, 0x4b, 0xb6, 0x3d, 0x64, 0xce, 0x05, 0xdd, 0x04, 0x78, 0xa6, 0xe3, 0x53, 0xe5, - 0xe9, 0x10, 0xdb, 0xa3, 0x52, 0x29, 0xd8, 0x4d, 0x22, 0xf0, 0xcf, 0x09, 0x18, 0x7d, 0x0b, 0x96, - 0x74, 0x47, 0x09, 0x26, 0x21, 0x0a, 0x19, 0x2c, 0xbd, 0x13, 0x88, 0xc4, 0x48, 0x77, 0xc6, 0x13, - 0x18, 0xf4, 0x01, 0x64, 0x34, 0x3c, 0xc0, 0xa6, 0xe6, 0xb4, 0xcd, 0xd2, 0x6b, 0xb4, 0x28, 0xbe, - 0x72, 0x7e, 0xb6, 0x9a, 0xa9, 0x0b, 0x20, 0x77, 0x72, 0x3e, 0x16, 0xfa, 0x0c, 0x0a, 0xde, 0x47, - 0x67, 0x34, 0xc0, 0x4e, 0xe9, 0x7d, 0x4a, 0x57, 0x22, 0x07, 0x5b, 0x0f, 0x8d, 0x88, 0xc0, 0x17, - 0xc6, 0x47, 0x5f, 0x42, 0x8e, 0x41, 0xb0, 0xd6, 0x36, 0xab, 0xa3, 0xd2, 0x32, 0xdd, 0xa7, 0xbb, - 0x73, 0xee, 0x93, 0xdf, 0x4d, 0xf5, 0x6e, 0xee, 0xea, 0x01, 0x6e, 0x72, 0x88, 0x37, 0xfa, 0x63, - 0xc8, 0x09, 0x3d, 0x7c, 0x60, 0x1d, 0x3a, 0xa5, 0x6f, 0x5c, 0x78, 0x3d, 0x36, 0x3e, 0xd7, 0xae, - 0x4f, 0x2a, 0xbc, 0x4c, 0x90, 0x1b, 0xea, 0x00, 0x29, 0x20, 0x45, 0xe4, 0xe8, 0x52, 0x7b, 0x50, - 0xbe, 0xb4, 0x0e, 0x89, 0xca, 0x6f, 0xac, 0x45, 0xd6, 0x63, 0x5e, 0x4a, 0xb0, 0xd4, 0xc2, 0xa7, - 0x41, 0xab, 0x79, 0x60, 0x1d, 0x36, 0xeb, 0xf2, 0x92, 0x39, 0x09, 0xd5, 0xd0, 0x17, 0x90, 0x0f, - 0x3e, 0x97, 0x70, 0x4a, 0xaf, 0x5f, 0xd8, 0x42, 0x9a, 0x30, 0x4e, 0xff, 0x01, 0x85, 0x23, 0xe7, - 0x9c, 0xc0, 0x17, 0xba, 0x01, 0x19, 0xcd, 0xb6, 0x06, 0x2c, 0x8a, 0xbf, 0x41, 0x05, 0x14, 0x0d, - 0x50, 0xdb, 0x1a, 0xd0, 0xf0, 0xac, 0x40, 0xc1, 0xc6, 0x03, 0x43, 0xed, 0xe2, 0x3e, 0x09, 0x8a, - 0xd6, 0x51, 0x69, 0x85, 0xce, 0xbe, 0x39, 0xf7, 0xf1, 0x78, 0xc4, 0xc2, 0x3e, 0x02, 0xfc, 0xda, - 0x47, 0xe8, 0x00, 0x40, 0x1d, 0x6a, 0xba, 0xab, 0xf4, 0x2d, 0x0d, 0x97, 0x56, 0x2f, 0x7c, 0x5e, - 0x35, 0xce, 0xbc, 0x42, 0x08, 0x77, 0x2d, 0x0d, 0x7b, 0x37, 0xdf, 0x02, 0x80, 0x3e, 0x80, 0x2c, - 0x5d, 0x1a, 0xdf, 0xfd, 0x35, 0xba, 0xb8, 0x45, 0xbe, 0xfb, 0x99, 0xba, 0x6d, 0x0d, 0xd8, 0x96, - 0xd3, 0x0d, 0x60, 0xfb, 0xec, 0x40, 0xae, 0xd7, 0x55, 0x7c, 0x77, 0x7a, 0x83, 0xea, 0xc6, 0xa7, - 0x73, 0xca, 0x72, 0xbf, 0x36, 0xc5, 0xc1, 0x5e, 0x11, 0x71, 0xe1, 0x7e, 0x4d, 0xc0, 0x1c, 0x39, + 0x75, 0xe5, 0x90, 0x72, 0x2e, 0x39, 0x25, 0xb9, 0xa7, 0x5c, 0xe5, 0xb8, 0x5c, 0x89, 0x6f, 0x2e, + 0x57, 0xaa, 0x92, 0x9b, 0x4f, 0xa9, 0x8a, 0x8f, 0x4e, 0xa5, 0x2a, 0xe5, 0x13, 0x2a, 0x81, 0x2f, + 0xf9, 0x09, 0x29, 0x9d, 0x52, 0xfd, 0x9a, 0xc7, 0x3e, 0xa0, 0x25, 0xc8, 0xf8, 0x20, 0x15, 0xe6, + 0xeb, 0xef, 0xfb, 0xba, 0xfb, 0xeb, 0xef, 0xdd, 0xbd, 0x84, 0x9b, 0xce, 0x53, 0xe3, 0x4e, 0x57, + 0x75, 0x55, 0xc3, 0xea, 0xdd, 0xd1, 0xb0, 0xd3, 0x1d, 0x1c, 0xde, 0x71, 0x5c, 0x7b, 0xd8, 0x75, + 0x87, 0x36, 0xd6, 0x36, 0x06, 0xb6, 0xe5, 0x5a, 0xe8, 0x6a, 0xd7, 0xea, 0x9e, 0xd8, 0x96, 0xda, + 0x3d, 0xde, 0x70, 0x9e, 0x1a, 0xe4, 0xbf, 0x43, 0xd5, 0xc1, 0xcb, 0xa5, 0xa1, 0xab, 0x1b, 0x77, + 0x8e, 0x8d, 0xee, 0x1d, 0x57, 0xef, 0x63, 0xc7, 0x55, 0xfb, 0x03, 0x46, 0xb0, 0x5c, 0x9e, 0xc2, + 0x75, 0x60, 0xeb, 0xcf, 0x74, 0x03, 0xf7, 0x30, 0xc7, 0xb9, 0x4a, 0x70, 0xdc, 0xd1, 0x00, 0x3b, + 0xec, 0xff, 0x1c, 0xfc, 0x5a, 0x0f, 0x5b, 0x77, 0x7a, 0xd8, 0xd2, 0x4d, 0x0d, 0x3f, 0xbf, 0xd3, + 0xb5, 0xcc, 0x23, 0xbd, 0xc7, 0x87, 0x96, 0x7a, 0x56, 0xcf, 0xa2, 0x7f, 0xde, 0x21, 0x7f, 0x31, + 0x68, 0xf9, 0x27, 0x09, 0xb8, 0xb2, 0x65, 0xd9, 0x58, 0xef, 0x99, 0x0f, 0xf1, 0x48, 0xc6, 0x47, + 0xd8, 0xc6, 0x66, 0x17, 0xa3, 0x35, 0x48, 0xb8, 0xea, 0xa1, 0x81, 0x4b, 0x91, 0xb5, 0xc8, 0x7a, + 0xbe, 0x0a, 0xbf, 0x3d, 0x5b, 0x5d, 0xf8, 0xea, 0x6c, 0x35, 0xda, 0xac, 0xcb, 0x6c, 0x00, 0xdd, + 0x82, 0x04, 0x9d, 0xa5, 0x14, 0xa5, 0x18, 0x45, 0x8e, 0x91, 0x6a, 0x12, 0x20, 0x41, 0xa3, 0xa3, + 0xa8, 0x04, 0x71, 0x53, 0xed, 0xe3, 0x52, 0x6c, 0x2d, 0xb2, 0x9e, 0xa9, 0xc6, 0x09, 0x96, 0x4c, + 0x21, 0xe8, 0x21, 0xa4, 0x9f, 0xa9, 0x86, 0xae, 0xe9, 0xee, 0xa8, 0x14, 0x5f, 0x8b, 0xac, 0x17, + 0x36, 0xdf, 0xd9, 0x98, 0x2a, 0xaa, 0x8d, 0x9a, 0x65, 0x3a, 0xae, 0xad, 0xea, 0xa6, 0xfb, 0x88, + 0x13, 0x70, 0x46, 0x1e, 0x03, 0x74, 0x17, 0x16, 0x9d, 0x63, 0xd5, 0xc6, 0x9a, 0x32, 0xb0, 0xf1, + 0x91, 0xfe, 0x5c, 0x31, 0xb0, 0x59, 0x4a, 0xac, 0x45, 0xd6, 0x13, 0x1c, 0xb5, 0xc8, 0x86, 0xf7, + 0xe8, 0xe8, 0x0e, 0x36, 0x51, 0x07, 0x32, 0x96, 0xa9, 0x68, 0xd8, 0xc0, 0x2e, 0x2e, 0x25, 0xe9, + 0xfc, 0x1f, 0xcc, 0x98, 0x7f, 0x8a, 0x80, 0x36, 0x2a, 0x5d, 0x57, 0xb7, 0x4c, 0xb1, 0x0e, 0xcb, + 0xac, 0x53, 0x46, 0x9c, 0xeb, 0x70, 0xa0, 0xa9, 0x2e, 0x2e, 0xa5, 0x5e, 0x9a, 0xeb, 0x01, 0x65, + 0x84, 0x76, 0x20, 0xd1, 0x57, 0xdd, 0xee, 0x71, 0x29, 0x4d, 0x39, 0xde, 0x7d, 0x01, 0x8e, 0xbb, + 0x84, 0x8e, 0x33, 0x64, 0x4c, 0xca, 0x8f, 0x21, 0xc9, 0xe6, 0x41, 0x79, 0xc8, 0xb4, 0xda, 0x4a, + 0xa5, 0xd6, 0x69, 0xb6, 0x5b, 0xd2, 0x02, 0xca, 0x41, 0x5a, 0x6e, 0xec, 0x77, 0xe4, 0x66, 0xad, + 0x23, 0x45, 0xc8, 0xd7, 0x7e, 0xa3, 0xa3, 0xb4, 0x0e, 0x76, 0x76, 0xa4, 0x28, 0x2a, 0x42, 0x96, + 0x7c, 0xd5, 0x1b, 0x5b, 0x95, 0x83, 0x9d, 0x8e, 0x14, 0x43, 0x59, 0x48, 0xd5, 0x2a, 0xfb, 0xb5, + 0x4a, 0xbd, 0x21, 0xc5, 0x97, 0xe3, 0xbf, 0xfc, 0xc5, 0xca, 0x42, 0xf9, 0x2e, 0x24, 0xe8, 0x74, + 0x08, 0x20, 0xb9, 0xdf, 0xdc, 0xdd, 0xdb, 0x69, 0x48, 0x0b, 0x28, 0x0d, 0xf1, 0x2d, 0xc2, 0x22, + 0x42, 0x28, 0xf6, 0x2a, 0x72, 0xa7, 0x59, 0xd9, 0x91, 0xa2, 0x8c, 0xe2, 0x93, 0xf8, 0xff, 0xfc, + 0x6c, 0x35, 0x52, 0xfe, 0xf7, 0x04, 0x2c, 0xf9, 0x6b, 0xf7, 0x4f, 0x1b, 0xd5, 0xa0, 0x68, 0xd9, + 0x7a, 0x4f, 0x37, 0x15, 0xaa, 0x73, 0x8a, 0xae, 0x71, 0x7d, 0xfc, 0x06, 0xd9, 0xcf, 0xf9, 0xd9, + 0x6a, 0xbe, 0x4d, 0x87, 0x3b, 0x64, 0xb4, 0x59, 0xe7, 0x0a, 0x9a, 0xb7, 0x02, 0x40, 0x0d, 0x3d, + 0x84, 0x45, 0xce, 0xa4, 0x6b, 0x19, 0xc3, 0xbe, 0xa9, 0xe8, 0x9a, 0x53, 0x8a, 0xae, 0xc5, 0xd6, + 0xf3, 0xd5, 0xd5, 0xf3, 0xb3, 0xd5, 0x22, 0x63, 0x51, 0xa3, 0x63, 0xcd, 0xba, 0xf3, 0xd5, 0xd9, + 0x6a, 0x5a, 0x7c, 0xc8, 0x7c, 0x7a, 0xfe, 0xad, 0x39, 0xe8, 0x31, 0x5c, 0xb5, 0x85, 0x6c, 0xb5, + 0x20, 0xc3, 0x18, 0x65, 0x78, 0xf3, 0xfc, 0x6c, 0xf5, 0x8a, 0x27, 0x7c, 0x6d, 0x3a, 0xd3, 0x2b, + 0xf6, 0x38, 0x82, 0xe6, 0xa0, 0x36, 0x04, 0xc0, 0xfe, 0x76, 0xe3, 0x74, 0xbb, 0xab, 0x7c, 0xbb, + 0x8b, 0x3e, 0xeb, 0xf0, 0x96, 0x17, 0xed, 0xb1, 0x01, 0xcd, 0x33, 0xbc, 0xc4, 0x85, 0x86, 0x97, + 0x7c, 0x59, 0xc3, 0x0b, 0x99, 0x51, 0xea, 0xff, 0xc5, 0x8c, 0xd2, 0xaf, 0xdc, 0x8c, 0x32, 0xaf, + 0xc0, 0x8c, 0x98, 0xee, 0x3e, 0x88, 0xa7, 0x41, 0xca, 0x3e, 0x88, 0xa7, 0xb3, 0x52, 0xee, 0x41, + 0x3c, 0x9d, 0x93, 0xf2, 0x0f, 0xe2, 0xe9, 0xbc, 0x54, 0x28, 0xff, 0x5d, 0x14, 0x5e, 0x3f, 0x30, + 0xf5, 0xa7, 0x43, 0xfc, 0x58, 0x77, 0x8f, 0xad, 0xa1, 0x4b, 0xfd, 0x62, 0x40, 0xb7, 0xef, 0x42, + 0x7a, 0x4c, 0xa9, 0xaf, 0xf2, 0x53, 0x4e, 0x85, 0xcf, 0x36, 0xe5, 0xf2, 0x13, 0xbd, 0x07, 0x30, + 0xa1, 0xc1, 0xaf, 0x9d, 0x9f, 0xad, 0x66, 0xa6, 0xab, 0x59, 0xa6, 0xeb, 0x29, 0xd7, 0x1f, 0xc9, + 0x09, 0x97, 0x21, 0x33, 0xb0, 0xb1, 0xa6, 0x77, 0xc9, 0xa9, 0x05, 0xf5, 0xce, 0x07, 0x73, 0x8b, + 0xff, 0x87, 0x14, 0x48, 0x6c, 0xa1, 0x75, 0xec, 0x74, 0x6d, 0x7d, 0xe0, 0x5a, 0xb6, 0xb7, 0xca, + 0xc8, 0xc4, 0x2a, 0xdf, 0x82, 0xa8, 0xae, 0xf1, 0x40, 0x73, 0x8d, 0x4b, 0x29, 0x4a, 0x05, 0xe4, + 0x6f, 0x37, 0xaa, 0x6b, 0x68, 0x03, 0xe2, 0x24, 0x1a, 0xd2, 0x7d, 0x66, 0x37, 0x97, 0xc7, 0x77, + 0x82, 0xfb, 0x1b, 0x2c, 0x58, 0x76, 0x64, 0x8a, 0x87, 0xd6, 0x20, 0x6d, 0x0e, 0x0d, 0x83, 0x06, + 0x3a, 0xb2, 0xfb, 0xb4, 0xd8, 0x92, 0x80, 0xa2, 0x1b, 0x90, 0xd3, 0xf0, 0x91, 0x3a, 0x34, 0x5c, + 0x05, 0x3f, 0x1f, 0xd8, 0x6c, 0x57, 0x72, 0x96, 0xc3, 0x1a, 0xcf, 0x07, 0x36, 0x7a, 0x13, 0x0a, + 0x9e, 0xae, 0x32, 0x24, 0x44, 0x91, 0x72, 0x42, 0xef, 0x28, 0xd6, 0xeb, 0x90, 0x3c, 0xd6, 0x35, + 0x0d, 0x9b, 0xd4, 0xe4, 0xc4, 0x44, 0x1c, 0x86, 0xd6, 0x21, 0xa7, 0x9b, 0x6a, 0xb7, 0x8b, 0x1d, + 0x47, 0x27, 0x8b, 0x59, 0x0c, 0xe0, 0x84, 0x46, 0xd0, 0x53, 0x58, 0xee, 0x61, 0x13, 0xdb, 0xaa, + 0x8b, 0x35, 0x45, 0x75, 0x14, 0x5d, 0xc3, 0xa6, 0xab, 0xbb, 0x23, 0x85, 0x6e, 0xfc, 0x0a, 0x3d, + 0xc2, 0x8d, 0x19, 0x47, 0x78, 0x5f, 0x10, 0x56, 0x9c, 0x26, 0x27, 0xeb, 0x8c, 0x06, 0x98, 0xcf, + 0x73, 0xbd, 0x37, 0x7d, 0x18, 0xed, 0xc1, 0xad, 0xe9, 0x53, 0x3a, 0xf8, 0xe9, 0x90, 0x58, 0x87, + 0x62, 0x0d, 0x88, 0xbd, 0x95, 0x96, 0xe8, 0xbe, 0x6f, 0x4c, 0xe1, 0xb3, 0xcf, 0x31, 0xdb, 0x14, + 0x11, 0x6d, 0xc2, 0xe2, 0xd0, 0xc1, 0x8e, 0xcf, 0x80, 0x28, 0x34, 0x50, 0x85, 0x4e, 0x72, 0xad, + 0x2f, 0x12, 0x04, 0x41, 0x46, 0x74, 0x78, 0x13, 0x16, 0xad, 0x53, 0x73, 0x8c, 0x26, 0x17, 0xa6, + 0x21, 0x08, 0x41, 0x9a, 0x1b, 0x90, 0xeb, 0x5a, 0xfd, 0xc1, 0x50, 0x1c, 0x4c, 0x96, 0x9d, 0x1e, + 0x87, 0xd1, 0x73, 0x59, 0x81, 0xd4, 0x33, 0xdd, 0x76, 0x87, 0xaa, 0x51, 0x92, 0x02, 0x42, 0x17, + 0x40, 0xf4, 0x19, 0x48, 0x83, 0x9e, 0xa2, 0xba, 0xae, 0xad, 0x1f, 0x12, 0x3e, 0xe6, 0xb0, 0x5f, + 0xca, 0x87, 0x14, 0xb1, 0xb0, 0x77, 0xbf, 0x22, 0x86, 0x5b, 0xc3, 0xbe, 0x5c, 0x18, 0xf4, 0x82, + 0xdf, 0x68, 0x0b, 0xde, 0x50, 0x0d, 0x17, 0xdb, 0x22, 0x5a, 0x90, 0x83, 0x52, 0x74, 0x53, 0x19, + 0xd8, 0x56, 0xcf, 0xc6, 0x8e, 0x53, 0x2a, 0x04, 0xe6, 0x7d, 0x8d, 0xa2, 0x32, 0xa5, 0x26, 0xc2, + 0x6f, 0x9a, 0x7b, 0x1c, 0x0d, 0xfd, 0x00, 0x90, 0x33, 0x72, 0x5c, 0xdc, 0x17, 0x8c, 0x4e, 0x74, + 0x53, 0x2b, 0x15, 0xe9, 0x89, 0xbf, 0x3d, 0xe3, 0xc4, 0xf7, 0x29, 0x01, 0x63, 0xf7, 0x50, 0x37, + 0x35, 0x3e, 0x8b, 0xe4, 0x8c, 0xc1, 0x3d, 0x67, 0x96, 0x96, 0x32, 0x0f, 0xe2, 0xe9, 0x8c, 0x04, + 0x0f, 0xe2, 0xe9, 0x94, 0x94, 0x2e, 0xff, 0x75, 0x14, 0xae, 0x31, 0xb4, 0x2d, 0xb5, 0xaf, 0x1b, + 0xa3, 0x97, 0x35, 0x57, 0xc6, 0x85, 0x9b, 0x2b, 0x3d, 0x1e, 0xba, 0x15, 0x42, 0xc6, 0x62, 0x28, + 0x3d, 0x1e, 0x02, 0x6b, 0x11, 0xd0, 0x98, 0xcf, 0x8b, 0xbf, 0x80, 0xcf, 0x6b, 0xc3, 0xa2, 0xb0, + 0x5c, 0x8f, 0x03, 0x35, 0xdf, 0x7c, 0xf5, 0x26, 0x5f, 0x53, 0xb1, 0xce, 0x10, 0x04, 0x79, 0x38, + 0xf4, 0x6b, 0xa1, 0x41, 0x2e, 0xa2, 0xf2, 0xbf, 0x44, 0x61, 0xa9, 0x69, 0xba, 0xd8, 0x36, 0xb0, + 0xfa, 0x0c, 0x07, 0xc4, 0xf1, 0x05, 0x64, 0x54, 0xb3, 0x8b, 0x1d, 0xd7, 0xb2, 0x9d, 0x52, 0x64, + 0x2d, 0xb6, 0x9e, 0xdd, 0xfc, 0x68, 0xc6, 0xa9, 0x4c, 0xa3, 0xdf, 0xa8, 0x70, 0x62, 0xe1, 0x32, + 0x3d, 0x66, 0xcb, 0xbf, 0x89, 0x40, 0x5a, 0x8c, 0x5e, 0x22, 0x6c, 0x7c, 0x13, 0xd2, 0x34, 0x15, + 0x57, 0xbc, 0x33, 0x59, 0x16, 0x14, 0x3c, 0x57, 0x0f, 0xa6, 0xed, 0x29, 0x8a, 0xdb, 0xd4, 0x50, + 0x6d, 0x5a, 0x46, 0x1d, 0xa3, 0xf4, 0xd7, 0x85, 0xfc, 0xf6, 0xc3, 0x39, 0xf5, 0x44, 0x92, 0xcd, + 0x64, 0xc6, 0x25, 0xf7, 0xcf, 0x11, 0x58, 0x24, 0x04, 0x1a, 0xd6, 0x02, 0x62, 0xbb, 0x09, 0xa0, + 0x3b, 0x8a, 0xc3, 0xe0, 0x74, 0x47, 0xc2, 0x14, 0x32, 0xba, 0xc3, 0xd1, 0x3d, 0x55, 0x8b, 0x4e, + 0xa8, 0xda, 0xc7, 0x90, 0xa7, 0xb4, 0xca, 0xe1, 0xb0, 0x7b, 0x82, 0x5d, 0x87, 0xae, 0x30, 0x51, + 0x5d, 0xe2, 0x2b, 0xcc, 0x51, 0x0e, 0x55, 0x36, 0x26, 0xe7, 0x9c, 0xc0, 0xd7, 0x84, 0xf6, 0xc5, + 0x27, 0xb4, 0x8f, 0x2f, 0xfc, 0x57, 0x71, 0xb8, 0xb6, 0xa7, 0xda, 0xae, 0x4e, 0x7c, 0x97, 0x6e, + 0xf6, 0x02, 0xab, 0xbf, 0x05, 0x59, 0x73, 0x28, 0x0c, 0xd2, 0xe1, 0x07, 0xc2, 0xd6, 0x07, 0xe6, + 0x90, 0x1b, 0x98, 0x83, 0xbe, 0x05, 0x4b, 0x04, 0x4d, 0xef, 0x0f, 0x0c, 0xbd, 0xab, 0xbb, 0x1e, + 0x7e, 0x3c, 0x80, 0x8f, 0xcc, 0x61, 0xbf, 0xc9, 0x11, 0x04, 0xdd, 0x0e, 0xc4, 0x0d, 0xdd, 0x71, + 0x69, 0xac, 0xcf, 0x6e, 0x6e, 0xce, 0x50, 0xa7, 0xe9, 0x6b, 0xdb, 0xd8, 0xd1, 0x1d, 0x57, 0xc8, + 0x8a, 0x70, 0x41, 0x6d, 0x48, 0xd8, 0xaa, 0xd9, 0xc3, 0xd4, 0xce, 0xb2, 0x9b, 0x1f, 0xbe, 0x18, + 0x3b, 0x99, 0x90, 0x8a, 0x0c, 0x88, 0xf2, 0x59, 0xfe, 0x69, 0x04, 0xe2, 0x64, 0x96, 0x0b, 0x5c, + 0xc1, 0x35, 0x48, 0x3e, 0x53, 0x8d, 0x21, 0x66, 0xf9, 0x4a, 0x4e, 0xe6, 0x5f, 0xe8, 0xcf, 0xa0, + 0xe8, 0x0c, 0x0f, 0x07, 0x81, 0xa9, 0x78, 0xd0, 0x7e, 0xff, 0x85, 0x56, 0xe5, 0x15, 0x77, 0x61, + 0x5e, 0xec, 0xe0, 0x96, 0x9f, 0x42, 0x82, 0xae, 0xfa, 0x82, 0xf5, 0xdd, 0x82, 0xc2, 0x91, 0x6d, + 0xf5, 0x15, 0xdd, 0xec, 0x1a, 0x43, 0x47, 0x7f, 0xc6, 0x72, 0x87, 0x9c, 0x9c, 0x27, 0xd0, 0xa6, + 0x00, 0x12, 0x5d, 0x71, 0x2d, 0x05, 0x3f, 0x17, 0x48, 0x51, 0x8a, 0x94, 0x75, 0xad, 0x86, 0x00, + 0x85, 0x54, 0xfd, 0x37, 0x39, 0x28, 0x52, 0x83, 0x9a, 0xcb, 0x5d, 0xde, 0x0a, 0xb8, 0xcb, 0xab, + 0x21, 0x77, 0xe9, 0x59, 0x25, 0xf1, 0x96, 0xaf, 0x43, 0x72, 0x48, 0x13, 0x4a, 0xba, 0x44, 0x2f, + 0x83, 0x60, 0x30, 0x74, 0x0f, 0x52, 0xcf, 0xb0, 0xed, 0x90, 0x30, 0x8c, 0x28, 0xa7, 0x15, 0x5e, + 0x90, 0x5f, 0x1b, 0x5b, 0xc8, 0x23, 0x86, 0x25, 0x0b, 0x74, 0xb4, 0x0e, 0xd2, 0x09, 0x1e, 0x29, + 0x53, 0x6c, 0xa1, 0x70, 0x42, 0xaa, 0x31, 0xdf, 0x19, 0x6b, 0x70, 0x35, 0x80, 0xa9, 0xe9, 0x36, + 0xa6, 0x79, 0xb6, 0x53, 0x4a, 0xaf, 0xc5, 0x2e, 0xc8, 0xa7, 0xc7, 0x16, 0xb0, 0x51, 0x17, 0x84, + 0xf2, 0x15, 0x6f, 0x02, 0x0f, 0xe6, 0xa0, 0xf7, 0x00, 0x11, 0x4f, 0x87, 0xc3, 0x2b, 0x4a, 0xd0, + 0x15, 0x49, 0x74, 0x24, 0xb8, 0xa6, 0x2a, 0x14, 0x02, 0x6b, 0x22, 0x41, 0x22, 0x49, 0x83, 0xc4, + 0xeb, 0xc4, 0xfa, 0x1f, 0x0a, 0xf6, 0xe3, 0x71, 0x22, 0xe7, 0x4d, 0x4c, 0x42, 0xc5, 0x01, 0xdb, + 0x97, 0x33, 0x3c, 0x22, 0x7e, 0x2e, 0xc0, 0x2a, 0x45, 0x59, 0x95, 0xcf, 0xcf, 0x56, 0xd1, 0x43, + 0x3c, 0xda, 0xa7, 0xe3, 0xd3, 0x19, 0xa2, 0x93, 0xb1, 0x71, 0xcd, 0x41, 0xdb, 0x20, 0x85, 0x36, + 0x42, 0x38, 0x16, 0x28, 0xc7, 0x15, 0x92, 0x36, 0xec, 0xfb, 0x5b, 0x19, 0xe7, 0x56, 0x08, 0x6c, + 0x93, 0x70, 0xea, 0xc0, 0x12, 0xc9, 0x59, 0x2c, 0x47, 0x77, 0x43, 0xdc, 0xf2, 0xfe, 0xfa, 0x6a, + 0x62, 0x7c, 0xc6, 0xfa, 0xba, 0x63, 0xe3, 0x9a, 0x83, 0xf6, 0x21, 0x7b, 0xc4, 0x4a, 0x1d, 0xe5, + 0x04, 0x8f, 0x68, 0x51, 0x94, 0xdd, 0xbc, 0x3d, 0x7f, 0x51, 0x54, 0x4d, 0x12, 0x15, 0x2b, 0x45, + 0x64, 0x38, 0xf2, 0x06, 0xd1, 0x63, 0xc8, 0x07, 0xea, 0xd8, 0xc3, 0x11, 0x4d, 0xeb, 0x2e, 0xc7, + 0x36, 0xe7, 0x33, 0xaa, 0x8e, 0xd0, 0x3e, 0x80, 0xee, 0xc5, 0x4d, 0x9a, 0xc9, 0x65, 0x37, 0xdf, + 0x7d, 0x81, 0x00, 0xeb, 0xaf, 0xd6, 0x67, 0x83, 0x9e, 0x40, 0xc1, 0xff, 0xa2, 0xcb, 0xcd, 0x5d, + 0x7a, 0xb9, 0xf9, 0x00, 0xa7, 0x2a, 0x11, 0x44, 0x2e, 0xe4, 0xde, 0x8a, 0x97, 0x77, 0x6f, 0x21, + 0x46, 0xa8, 0xc1, 0x8b, 0x1c, 0x89, 0x66, 0x7e, 0xef, 0xce, 0x69, 0x74, 0x81, 0x44, 0x9f, 0xd5, + 0x3e, 0x1f, 0x02, 0xea, 0xda, 0x98, 0xe6, 0xf4, 0xf8, 0x39, 0x0b, 0x3b, 0xc6, 0x28, 0x54, 0x78, + 0x2c, 0xf2, 0xf1, 0x86, 0x37, 0x8c, 0xb6, 0x21, 0x8f, 0xcd, 0xae, 0xa5, 0xe9, 0x66, 0xcf, 0x2f, + 0x38, 0x78, 0x42, 0xf5, 0xd5, 0xd9, 0xea, 0x37, 0xc6, 0x66, 0x6d, 0x70, 0x5c, 0x32, 0xb9, 0x9c, + 0xc3, 0x81, 0x2f, 0xb4, 0x0d, 0x29, 0x11, 0xf4, 0x97, 0xa8, 0x64, 0xd6, 0x67, 0xa5, 0xb0, 0xe3, + 0x29, 0x83, 0xc8, 0xd0, 0x39, 0x39, 0x29, 0xe2, 0x34, 0xdd, 0x21, 0xc9, 0x8e, 0x56, 0xba, 0x1a, + 0x2c, 0xe2, 0x04, 0x14, 0xd5, 0x00, 0x7a, 0xd8, 0x52, 0x58, 0x3b, 0xb4, 0x74, 0x8d, 0x4e, 0xb7, + 0x12, 0x98, 0xae, 0x87, 0xad, 0x0d, 0xd1, 0x34, 0x25, 0x75, 0xee, 0x91, 0xde, 0x13, 0x39, 0x48, + 0x0f, 0x5b, 0x0c, 0x10, 0x2e, 0x6e, 0xaf, 0x4f, 0x2d, 0x6e, 0xcb, 0x2b, 0x90, 0xf1, 0x1c, 0x19, + 0x4a, 0x41, 0xac, 0xb2, 0x5f, 0x63, 0x1d, 0xb0, 0x7a, 0x63, 0xbf, 0x26, 0x45, 0xca, 0x37, 0x20, + 0x4e, 0x37, 0x9f, 0x85, 0xd4, 0x56, 0x5b, 0x7e, 0x5c, 0x91, 0xeb, 0xac, 0xeb, 0xd6, 0x6c, 0x3d, + 0x6a, 0xc8, 0x9d, 0x46, 0x5d, 0x12, 0x01, 0xe4, 0x2c, 0x0e, 0xc8, 0x2f, 0xb8, 0x3b, 0x16, 0x6f, + 0x60, 0xf4, 0xa0, 0xd8, 0xf5, 0xa0, 0xec, 0x00, 0x22, 0x6b, 0xd1, 0xf5, 0xc2, 0xe6, 0xbd, 0xaf, + 0x2d, 0xda, 0x05, 0x8f, 0x20, 0xc8, 0x57, 0x89, 0x42, 0x37, 0x04, 0x0d, 0x24, 0x5c, 0xd1, 0xb1, + 0x60, 0x25, 0x43, 0xa2, 0x7b, 0x8c, 0xbb, 0x27, 0x3c, 0x5c, 0x7f, 0x6b, 0xc6, 0xc4, 0x34, 0x17, + 0x0d, 0xa8, 0x5f, 0x8d, 0xd0, 0xf8, 0x53, 0x8b, 0x3c, 0x82, 0xb2, 0x42, 0x72, 0xd8, 0x11, 0xc5, + 0x2f, 0xb4, 0xed, 0x69, 0x8d, 0x42, 0x91, 0x72, 0x05, 0xfc, 0xd0, 0x3d, 0x28, 0x9a, 0x96, 0xab, + 0x90, 0x42, 0x9e, 0x7b, 0x4c, 0x5a, 0x78, 0xe7, 0xab, 0x12, 0xd7, 0x55, 0xdf, 0x37, 0xe6, 0x4d, + 0xcb, 0x6d, 0x0d, 0x0d, 0x83, 0x01, 0xd0, 0x5f, 0x44, 0x60, 0x95, 0x05, 0x55, 0xe5, 0x94, 0xb5, + 0x6e, 0x14, 0x96, 0x3f, 0xfb, 0x32, 0xa2, 0x8d, 0xae, 0xd9, 0x19, 0xd4, 0x45, 0x7d, 0x1f, 0xbe, + 0xd4, 0xd7, 0x87, 0x17, 0xe0, 0x94, 0x3b, 0x50, 0x08, 0x1f, 0x13, 0xca, 0x40, 0xa2, 0xb6, 0xdd, + 0xa8, 0x3d, 0x94, 0x16, 0x50, 0x11, 0xb2, 0x5b, 0x6d, 0xb9, 0xd1, 0xbc, 0xdf, 0x52, 0x1e, 0x36, + 0x9e, 0xb0, 0x46, 0x6d, 0xab, 0xed, 0x35, 0x6a, 0x4b, 0xb0, 0x74, 0xd0, 0x6a, 0x7e, 0x7e, 0xd0, + 0x50, 0x1e, 0x37, 0x3b, 0xdb, 0xed, 0x83, 0x8e, 0xd2, 0x6c, 0xd5, 0x1b, 0x5f, 0x48, 0x31, 0xaf, + 0xc6, 0x4b, 0x48, 0xc9, 0xf2, 0x7f, 0x24, 0xa1, 0xb0, 0x67, 0xeb, 0x7d, 0xd5, 0x1e, 0x91, 0xc8, + 0x76, 0xaa, 0x0e, 0xd0, 0x67, 0xb0, 0x64, 0x19, 0x24, 0xdb, 0xa7, 0x50, 0xc5, 0xab, 0x19, 0xe2, + 0xd3, 0xfb, 0xfb, 0x8b, 0x96, 0xa1, 0x71, 0x0e, 0x4d, 0x5e, 0x32, 0x7c, 0x06, 0x4b, 0x26, 0x3e, + 0x9d, 0xe4, 0x10, 0x99, 0xc1, 0xc1, 0xc4, 0xa7, 0x63, 0x1c, 0xde, 0x83, 0x2c, 0x59, 0x03, 0xa5, + 0xc4, 0xa2, 0xc7, 0x95, 0x0d, 0x12, 0x81, 0x65, 0x68, 0x4d, 0x36, 0x4c, 0xb0, 0xc9, 0x7c, 0x02, + 0x3b, 0x36, 0x05, 0xdb, 0xc4, 0xa7, 0x02, 0xfb, 0x63, 0xb8, 0x36, 0xb9, 0xba, 0x89, 0x16, 0xe9, + 0x95, 0xb1, 0x45, 0x91, 0x2c, 0x03, 0x7d, 0x09, 0x4b, 0x86, 0xd5, 0x55, 0x0d, 0xdd, 0x1d, 0x71, + 0x2f, 0xa2, 0x38, 0xa7, 0xea, 0x80, 0x6a, 0x54, 0x76, 0xa6, 0xf1, 0x85, 0xe5, 0xbb, 0xb1, 0xc3, + 0x39, 0x30, 0x7f, 0x42, 0x40, 0x32, 0x32, 0x26, 0x60, 0xcb, 0xff, 0x14, 0x03, 0x34, 0x89, 0x8a, + 0x4e, 0xe0, 0x0a, 0x91, 0xcc, 0xd8, 0x32, 0xa8, 0x68, 0xb3, 0x9b, 0xdf, 0x9c, 0xd3, 0x0a, 0xc3, + 0x7c, 0x85, 0x9b, 0xb7, 0x0c, 0x2d, 0x3c, 0x40, 0x26, 0x23, 0xa2, 0x1a, 0x9f, 0x2c, 0xfa, 0x0a, + 0x26, 0x33, 0xf1, 0xe9, 0xd8, 0x64, 0x3a, 0xbc, 0x41, 0x26, 0xb3, 0x71, 0x4f, 0xb7, 0x4c, 0xd5, + 0x50, 0x0e, 0x47, 0x8a, 0x6d, 0x9d, 0x06, 0x8a, 0x76, 0x56, 0x74, 0xae, 0x9f, 0x9f, 0xad, 0x96, + 0x5a, 0xf8, 0x54, 0xe6, 0x78, 0xd5, 0x91, 0x6c, 0x9d, 0x4e, 0xad, 0xdc, 0x4b, 0xe6, 0x74, 0x2c, + 0x0d, 0xc9, 0xf0, 0xf6, 0x05, 0x53, 0x85, 0x1a, 0x7d, 0x71, 0xd6, 0xcb, 0x9a, 0xce, 0xaa, 0xee, + 0xb7, 0xff, 0x42, 0x79, 0xff, 0xaf, 0x22, 0x40, 0x13, 0xb1, 0xa1, 0x2b, 0x5a, 0xfb, 0xf4, 0xec, + 0x3e, 0x82, 0x3c, 0x99, 0xd6, 0xdf, 0x51, 0x64, 0x86, 0x27, 0x22, 0xea, 0xec, 0x2d, 0xf6, 0x23, + 0xc8, 0x93, 0x13, 0xf7, 0xa9, 0xa2, 0xb3, 0xa8, 0x2c, 0xc3, 0xbb, 0x48, 0x40, 0x6f, 0x43, 0x4e, + 0x37, 0x49, 0x6a, 0xcf, 0x5b, 0x5e, 0xc1, 0x96, 0x6f, 0x96, 0x8f, 0xf8, 0xeb, 0x2e, 0xff, 0x3a, + 0x0a, 0xd7, 0x77, 0x55, 0x17, 0xdb, 0xba, 0x6a, 0xe8, 0x3f, 0xc6, 0xda, 0x23, 0x9d, 0x6c, 0xf8, + 0xc8, 0xc6, 0xce, 0x31, 0xfa, 0x02, 0x16, 0x27, 0x0c, 0x86, 0x2b, 0xdc, 0x5b, 0xf3, 0x65, 0x1d, + 0xa2, 0x3c, 0x1b, 0xb3, 0x29, 0xb4, 0x1b, 0x36, 0x5c, 0x56, 0xde, 0xbe, 0x18, 0xcf, 0xa0, 0x65, + 0xdf, 0x83, 0x84, 0xea, 0x28, 0xd6, 0x11, 0x8f, 0x49, 0x6f, 0x04, 0x18, 0x0d, 0x5d, 0xdd, 0xd8, + 0x38, 0x36, 0xba, 0x1b, 0x1d, 0x71, 0xc9, 0x2a, 0xa2, 0x99, 0xea, 0xb4, 0x8f, 0xd0, 0xfb, 0x50, + 0x74, 0x8e, 0xad, 0xa1, 0xa1, 0x29, 0x87, 0x6a, 0xf7, 0xe4, 0x48, 0x37, 0x8c, 0x50, 0x1f, 0xb8, + 0xc0, 0x06, 0xab, 0x7c, 0x8c, 0xcb, 0xec, 0x6f, 0x52, 0x80, 0xfc, 0xf5, 0xec, 0x0e, 0x5d, 0x95, + 0xc6, 0xfb, 0x0a, 0x24, 0x79, 0xa0, 0x61, 0x32, 0x7a, 0x7b, 0x66, 0x4c, 0x0e, 0xf7, 0xbd, 0xb7, + 0x17, 0x64, 0x4e, 0x88, 0xbe, 0x17, 0xbc, 0x53, 0x9d, 0x5b, 0x22, 0xdb, 0x0b, 0xe2, 0xb2, 0xf5, + 0x21, 0x40, 0x20, 0x48, 0xa5, 0x29, 0x93, 0x77, 0xe6, 0x4e, 0x0d, 0xb6, 0x17, 0xe4, 0x00, 0x39, + 0x6a, 0x43, 0x61, 0x10, 0xf2, 0x60, 0xbc, 0x42, 0xb8, 0x35, 0x97, 0xbb, 0xdb, 0x5e, 0x90, 0xc7, + 0xc8, 0xd1, 0x0f, 0x00, 0x75, 0x27, 0x8c, 0xa3, 0x04, 0x5f, 0xb3, 0xca, 0x71, 0x82, 0xed, 0x05, + 0x79, 0x0a, 0x1b, 0xf4, 0x25, 0x5c, 0xef, 0x4f, 0xd7, 0x63, 0x5e, 0x2b, 0xcc, 0x6a, 0x8a, 0xcf, + 0xd0, 0xfe, 0xed, 0x05, 0x79, 0x16, 0x43, 0xf4, 0x10, 0x12, 0x8e, 0x4b, 0xd2, 0xc0, 0x18, 0x4d, + 0xc1, 0xef, 0xcc, 0xe0, 0x3c, 0xa9, 0x23, 0x1b, 0xfb, 0x84, 0x4c, 0x24, 0x3f, 0x94, 0x07, 0x7a, + 0x0c, 0x19, 0xaf, 0x92, 0xe6, 0x57, 0x30, 0x1f, 0xce, 0xcf, 0xd0, 0x4b, 0x37, 0x45, 0x32, 0xea, + 0xf1, 0x42, 0x15, 0xc8, 0xf6, 0x39, 0x9a, 0xdf, 0xfa, 0x5c, 0xe3, 0xfd, 0x05, 0x10, 0x1c, 0xa8, + 0xef, 0x0c, 0x7c, 0xc9, 0x20, 0x88, 0x9a, 0x34, 0xb5, 0xb6, 0x2d, 0xc3, 0x20, 0xb6, 0x41, 0x53, + 0x1e, 0x2f, 0xb5, 0x16, 0xd0, 0xf2, 0x67, 0x90, 0xa0, 0x7b, 0x22, 0x29, 0xed, 0x41, 0xeb, 0x61, + 0xab, 0xfd, 0xb8, 0xc5, 0x52, 0x94, 0x7a, 0x63, 0xa7, 0xd1, 0x69, 0x28, 0xed, 0xd6, 0x0e, 0x49, + 0x51, 0x5e, 0x83, 0xab, 0x1c, 0x50, 0x69, 0xd5, 0x95, 0xc7, 0x72, 0x53, 0x0c, 0x45, 0xcb, 0xeb, + 0xc1, 0x9c, 0x39, 0x0d, 0xf1, 0x56, 0xbb, 0xd5, 0x90, 0x16, 0x68, 0xf6, 0x5c, 0xaf, 0x4b, 0x11, + 0x9a, 0x3d, 0xcb, 0xed, 0x3d, 0x29, 0xca, 0xac, 0xaf, 0x9a, 0x03, 0xd0, 0x3c, 0x39, 0x3c, 0x88, + 0xa7, 0x93, 0x52, 0xaa, 0xfc, 0x8f, 0x11, 0x48, 0x93, 0x40, 0xdd, 0x34, 0x8f, 0x2c, 0xf4, 0x21, + 0x64, 0x06, 0xaa, 0x8d, 0x4d, 0xd7, 0xf7, 0xb4, 0xa2, 0x09, 0x9d, 0xde, 0xa3, 0x03, 0x5e, 0x8f, + 0x34, 0xcd, 0x10, 0x9b, 0x1a, 0xda, 0x02, 0x89, 0x13, 0x39, 0xdd, 0x63, 0xdc, 0x57, 0xfd, 0xb8, + 0xf3, 0xba, 0xd7, 0xe6, 0xa7, 0xe3, 0xfb, 0x74, 0xd8, 0xe3, 0x50, 0x18, 0x04, 0xa1, 0x17, 0x74, + 0x2a, 0xb9, 0xef, 0xf8, 0xd7, 0x77, 0xa0, 0x38, 0x16, 0x28, 0x2f, 0xe8, 0x0c, 0xad, 0xd1, 0xce, + 0x50, 0xcc, 0xf7, 0xfb, 0x5e, 0x67, 0x28, 0xca, 0x9b, 0x42, 0x1f, 0xfa, 0x6d, 0x1f, 0x72, 0xc0, + 0xf1, 0xea, 0x6b, 0x3c, 0x3c, 0x2c, 0x5e, 0xd0, 0xf1, 0xd9, 0x83, 0xc5, 0xbe, 0xa5, 0xe9, 0x47, + 0xa4, 0x68, 0x21, 0xda, 0xe1, 0xea, 0x7d, 0xcc, 0x53, 0xda, 0xb9, 0x7c, 0xa7, 0x14, 0xa4, 0x26, + 0x83, 0xa8, 0x05, 0x05, 0x8d, 0x78, 0x0d, 0x52, 0x17, 0xb2, 0x7e, 0xcd, 0x55, 0xea, 0xd3, 0x57, + 0x67, 0x68, 0xb2, 0x38, 0x2c, 0xbf, 0x78, 0x16, 0xe4, 0xac, 0xab, 0x13, 0x3a, 0xc3, 0xf8, 0x9c, + 0x67, 0x78, 0x08, 0xcb, 0x43, 0x13, 0x3f, 0x1f, 0x58, 0x0e, 0xd6, 0x94, 0x89, 0xd3, 0x5c, 0xa7, + 0x5c, 0x6e, 0x71, 0x2e, 0xd7, 0x0f, 0x04, 0xe6, 0xd4, 0x63, 0xbd, 0x3e, 0x9c, 0x3a, 0xac, 0xa1, + 0xfb, 0x90, 0x12, 0xcd, 0xdb, 0x34, 0xdd, 0xe1, 0xbc, 0x5e, 0x5e, 0x54, 0xad, 0x9c, 0x1a, 0x6d, + 0x41, 0xc1, 0xc4, 0xcf, 0x83, 0x77, 0x13, 0x99, 0x90, 0x81, 0xe6, 0x5a, 0xf8, 0xf9, 0xf4, 0x8b, + 0x89, 0x9c, 0xe9, 0x8f, 0x68, 0xa8, 0x0d, 0xe9, 0x23, 0xb5, 0xaf, 0x1b, 0x3a, 0x76, 0x4a, 0xd7, + 0xe8, 0x8a, 0xde, 0xbf, 0x70, 0x45, 0xe3, 0xd7, 0x38, 0xc2, 0xa2, 0x05, 0x13, 0x6f, 0x61, 0x14, + 0x30, 0x22, 0x0b, 0xbb, 0x3e, 0xb9, 0x30, 0x71, 0x8d, 0x13, 0xba, 0xd2, 0xa1, 0x0b, 0xe3, 0x5f, + 0x1a, 0xfa, 0x1c, 0xf2, 0xe1, 0xcc, 0x01, 0x2e, 0x91, 0x39, 0xe4, 0x06, 0xc1, 0xb4, 0x61, 0x0b, + 0x52, 0x22, 0x65, 0xc8, 0x5e, 0x22, 0x65, 0x10, 0xc4, 0xa8, 0x4a, 0xf2, 0xb1, 0xe7, 0xae, 0x5f, + 0xa0, 0xe4, 0xfc, 0x8e, 0xe9, 0xf9, 0xd9, 0x6a, 0x96, 0xec, 0x70, 0xca, 0xd5, 0x48, 0xd6, 0xf4, + 0xe0, 0x1a, 0x7a, 0x00, 0xe0, 0xbd, 0xc9, 0x72, 0xe8, 0x8d, 0xe0, 0xec, 0xae, 0xd1, 0x9e, 0x40, + 0xf4, 0x97, 0x24, 0x07, 0xa8, 0xd1, 0x2e, 0x64, 0x84, 0xd3, 0x65, 0x1d, 0xc2, 0xd9, 0xf1, 0x70, + 0x32, 0x04, 0x08, 0xc7, 0xef, 0x71, 0x20, 0x25, 0xba, 0x81, 0x55, 0x07, 0xf3, 0x96, 0xd3, 0xbd, + 0x39, 0xf3, 0x75, 0xa6, 0xe3, 0xb5, 0x63, 0xd5, 0xec, 0xe1, 0x1d, 0x42, 0x5f, 0x8d, 0x96, 0x22, + 0x32, 0x63, 0x85, 0x5a, 0x20, 0x51, 0x91, 0x05, 0x23, 0x8a, 0x44, 0xa5, 0xf6, 0xa6, 0xf0, 0x8f, + 0x44, 0x6a, 0x33, 0xa3, 0x0a, 0xd5, 0xa9, 0x5d, 0x3f, 0xb2, 0x7c, 0x07, 0x0a, 0x47, 0x96, 0xdd, + 0x57, 0x5d, 0x45, 0xb8, 0xaf, 0x45, 0xbf, 0xff, 0xfd, 0xd5, 0xd9, 0x6a, 0x7e, 0x8b, 0x8e, 0x0a, + 0xd7, 0x95, 0x3f, 0x0a, 0x7e, 0xa2, 0xaa, 0x08, 0xc0, 0xec, 0xbe, 0xfb, 0xad, 0xaf, 0x15, 0xd6, + 0x94, 0xb8, 0xfb, 0x2e, 0x14, 0xac, 0xa3, 0x23, 0x43, 0x37, 0xb1, 0x62, 0x63, 0xd5, 0xb1, 0xcc, + 0xd2, 0x5b, 0x01, 0xff, 0x9b, 0xe7, 0x63, 0x32, 0x1d, 0x42, 0x2d, 0x48, 0xd2, 0x56, 0x85, 0x53, + 0x5a, 0xa2, 0xc7, 0x73, 0xc9, 0xb6, 0x87, 0xcc, 0xb9, 0xa0, 0x9b, 0x00, 0xcf, 0x74, 0x7c, 0xaa, + 0x3c, 0x1d, 0x62, 0x7b, 0x54, 0x2a, 0x05, 0xbb, 0x49, 0x04, 0xfe, 0x39, 0x01, 0xa3, 0x6f, 0xc1, + 0x92, 0xee, 0x28, 0xc1, 0x24, 0x44, 0x21, 0x83, 0xa5, 0x77, 0x02, 0x91, 0x18, 0xe9, 0xce, 0x78, + 0x02, 0x83, 0x3e, 0x80, 0x8c, 0x86, 0x07, 0xd8, 0xd4, 0x9c, 0xb6, 0x59, 0x7a, 0x8d, 0x16, 0xc5, + 0x57, 0xce, 0xcf, 0x56, 0x33, 0x75, 0x01, 0xe4, 0x4e, 0xce, 0xc7, 0x42, 0x9f, 0x41, 0xc1, 0xfb, + 0xe8, 0x8c, 0x06, 0xd8, 0x29, 0xbd, 0x4f, 0xe9, 0x4a, 0xe4, 0x60, 0xeb, 0xa1, 0x11, 0x11, 0xf8, + 0xc2, 0xf8, 0xe8, 0x4b, 0xc8, 0x31, 0x08, 0xd6, 0xda, 0x66, 0x75, 0x54, 0x5a, 0xa6, 0x72, 0xba, + 0x3b, 0xa7, 0x9c, 0xfc, 0x6e, 0xaa, 0x77, 0x73, 0x57, 0x0f, 0x70, 0x93, 0x43, 0xbc, 0xd1, 0x9f, + 0x42, 0x4e, 0xe8, 0xe1, 0x03, 0xeb, 0xd0, 0x29, 0x7d, 0xe3, 0xc2, 0xeb, 0xb1, 0xf1, 0xb9, 0x76, + 0x7d, 0x52, 0xe1, 0x65, 0x82, 0xdc, 0x50, 0x07, 0x48, 0x01, 0x29, 0x22, 0x47, 0x97, 0xda, 0x83, + 0xf2, 0xa5, 0x75, 0x48, 0x54, 0x7e, 0x63, 0x2d, 0xb2, 0x1e, 0xf3, 0x52, 0x82, 0xa5, 0x16, 0x3e, + 0x0d, 0x5a, 0xcd, 0x03, 0xeb, 0xb0, 0x59, 0x97, 0x97, 0xcc, 0x49, 0xa8, 0x86, 0xbe, 0x80, 0x7c, + 0xf0, 0xb9, 0x84, 0x53, 0x7a, 0xfd, 0xc2, 0x16, 0xd2, 0x84, 0x71, 0xfa, 0x0f, 0x28, 0x1c, 0x39, + 0xe7, 0x04, 0xbe, 0xd0, 0x0d, 0xc8, 0x68, 0xb6, 0x35, 0x60, 0x51, 0xfc, 0x0d, 0xba, 0x40, 0xd1, + 0x00, 0xb5, 0xad, 0x01, 0x0d, 0xcf, 0x0a, 0x14, 0x6c, 0x3c, 0x30, 0xd4, 0x2e, 0xee, 0x93, 0xa0, + 0x68, 0x1d, 0x95, 0x56, 0xe8, 0xec, 0x9b, 0x73, 0x1f, 0x8f, 0x47, 0x2c, 0xec, 0x23, 0xc0, 0xaf, + 0x7d, 0x84, 0x0e, 0x00, 0xd4, 0xa1, 0xa6, 0xbb, 0x4a, 0xdf, 0xd2, 0x70, 0x69, 0xf5, 0xc2, 0xe7, + 0x55, 0xe3, 0xcc, 0x2b, 0x84, 0x70, 0xd7, 0xd2, 0xb0, 0x77, 0xf3, 0x2d, 0x00, 0xe8, 0x03, 0xc8, + 0xd2, 0xad, 0x71, 0xe9, 0xaf, 0xd1, 0xcd, 0x2d, 0x72, 0xe9, 0x67, 0xea, 0xb6, 0x35, 0x60, 0x22, + 0xa7, 0x02, 0x60, 0x72, 0x76, 0x20, 0xd7, 0xeb, 0x2a, 0xbe, 0x3b, 0xbd, 0x41, 0x75, 0xe3, 0xd3, + 0x39, 0xd7, 0x72, 0xbf, 0x36, 0xc5, 0xc1, 0x5e, 0x11, 0x71, 0xe1, 0x7e, 0x4d, 0xc0, 0x1c, 0x39, 0xdb, 0xeb, 0x7a, 0x1f, 0xa4, 0xe8, 0x66, 0xbd, 0x72, 0x6e, 0xd0, 0xe5, 0x60, 0xd1, 0xcd, 0x46, 0x98, 0x49, 0xb7, 0x80, 0x37, 0xd5, 0x15, 0x5a, 0xb0, 0xb2, 0x33, 0xbb, 0x39, 0x7f, 0xe6, 0x55, 0x60, 0xd4, 0x15, 0xa7, 0x7d, 0x44, 0x0f, 0xb6, 0x0b, 0x39, 0x6b, 0xe8, 0x1e, 0x5a, 0x43, 0x53, - 0x53, 0x8e, 0x4e, 0x9c, 0xd2, 0x9b, 0x74, 0xb5, 0x2f, 0xd4, 0x3a, 0xf5, 0x56, 0xd7, 0xe6, 0x8c, + 0x53, 0x8e, 0x4e, 0x9c, 0xd2, 0x9b, 0x74, 0xb7, 0x2f, 0xd4, 0x3a, 0xf5, 0x76, 0xd7, 0xe6, 0x8c, 0xb6, 0x1e, 0x3a, 0x72, 0x56, 0x70, 0xdd, 0x3a, 0x71, 0xd0, 0x8f, 0x20, 0xab, 0x9b, 0xfe, 0x1c, 0xb7, 0x5e, 0x7c, 0x0e, 0x24, 0xaa, 0x8e, 0xa6, 0xe9, 0x4d, 0x01, 0x9c, 0x27, 0x99, 0xe1, 0x27, 0x11, 0x58, 0xfb, 0x9a, 0x96, 0xab, 0x53, 0x7a, 0xf7, 0xc2, 0x5b, 0xeb, 0x39, 0x7a, 0xae, 0x6f, 0x5c, 0xd4, 0x73, 0x75, 0x50, 0x19, 0x32, 0x2e, 0xee, 0x0f, 0x2c, 0x5b, 0xb5, 0x47, 0xa5, 0xb7, 0x83, 0x0f, 0x11, 0x3c, 0x30, 0xfa, 0x21, 0x14, 0xc7, 0x9b, 0x62, 0xb7, 0x5f, 0xa2, 0x29, 0x26, 0x17, 0xc2, 0x0d, 0x40, 0xb4, 0x41, 0xcb, 0x10, 0x76, 0xd7, 0xa3, 0xa8, 0x86, 0xa1, 0x1c, 0x8e, - 0x4a, 0xef, 0x05, 0x1b, 0x12, 0xde, 0x68, 0xc5, 0x30, 0xaa, 0xa3, 0xe5, 0x5f, 0x44, 0x60, 0x71, - 0x22, 0x6e, 0xa3, 0x1f, 0x42, 0xca, 0xb4, 0xb4, 0xc0, 0x13, 0x91, 0x06, 0xdf, 0xff, 0x64, 0xcb, - 0xd2, 0xd8, 0x0b, 0x91, 0x0f, 0x7b, 0xba, 0x7b, 0x3c, 0x3c, 0xdc, 0xe8, 0x5a, 0xfd, 0x3b, 0x9e, - 0xe4, 0xda, 0xa1, 0xff, 0xf7, 0x9d, 0xc1, 0x49, 0xef, 0x0e, 0xfd, 0x6b, 0x70, 0xb8, 0xc1, 0xc8, + 0x4a, 0xef, 0x05, 0x1b, 0x12, 0xde, 0x68, 0xc5, 0x30, 0xaa, 0xa3, 0xe5, 0x5f, 0x46, 0x60, 0x71, + 0x22, 0x6e, 0xa3, 0x1f, 0x42, 0xca, 0xb4, 0xb4, 0xc0, 0x13, 0x91, 0x06, 0x97, 0x7f, 0xb2, 0x65, + 0x69, 0xec, 0x85, 0xc8, 0x87, 0x3d, 0xdd, 0x3d, 0x1e, 0x1e, 0x6e, 0x74, 0xad, 0xfe, 0x1d, 0x6f, + 0xe5, 0xda, 0xa1, 0xff, 0xf7, 0x9d, 0xc1, 0x49, 0xef, 0x0e, 0xfd, 0x6b, 0x70, 0xb8, 0xc1, 0xc8, 0xe4, 0x24, 0xe1, 0xda, 0xd4, 0xd0, 0xfb, 0x50, 0xc4, 0xcf, 0x07, 0xba, 0x1d, 0xa8, 0x1e, 0xa2, - 0x01, 0xbf, 0x53, 0xf0, 0x07, 0x89, 0x92, 0xf2, 0xcb, 0xf8, 0x5f, 0x45, 0xa1, 0x38, 0x16, 0x0e, + 0x01, 0xbf, 0x53, 0xf0, 0x07, 0x89, 0x92, 0xf2, 0xcb, 0xf8, 0x5f, 0x47, 0xa1, 0x38, 0x16, 0x0e, 0x49, 0xe5, 0x43, 0x9b, 0x54, 0xa1, 0xca, 0x87, 0x40, 0x2e, 0x78, 0xf1, 0x11, 0x7c, 0xb1, 0x18, 0x7b, 0xd9, 0x17, 0x8b, 0xe1, 0xe7, 0x45, 0x89, 0x17, 0x78, 0x5e, 0xf4, 0x31, 0x5c, 0xd3, 0x1d, 0xc5, 0xb4, 0x4c, 0x71, 0xc5, 0xe0, 0xb5, 0x5d, 0x82, 0xef, 0xfb, 0xae, 0xe8, 0x4e, 0xcb, 0x32, - 0xd9, 0xe5, 0x82, 0xb7, 0x6a, 0xff, 0x29, 0x60, 0x6a, 0xf2, 0x29, 0xa0, 0xd7, 0xa5, 0x8f, 0x4b, - 0x89, 0xe5, 0x7f, 0x8d, 0x40, 0x26, 0xf8, 0x26, 0x3f, 0x1a, 0xee, 0x1d, 0x4e, 0x54, 0x83, 0x97, - 0x7c, 0xea, 0x13, 0xde, 0x85, 0xd8, 0x0b, 0xec, 0xc2, 0x0d, 0x48, 0x1c, 0x8e, 0x44, 0x8d, 0x96, - 0xae, 0xe6, 0xf8, 0x6c, 0xf1, 0x2a, 0xa9, 0x07, 0xe2, 0x87, 0x23, 0xf1, 0x6c, 0x6a, 0xf9, 0x4f, - 0x21, 0x1b, 0x88, 0xbb, 0xe3, 0xbd, 0x89, 0xc8, 0x25, 0x7a, 0x13, 0x6f, 0x42, 0x92, 0x87, 0x05, - 0xa6, 0x7b, 0x79, 0x4e, 0x9d, 0x60, 0x21, 0x21, 0xf1, 0x25, 0x09, 0x07, 0x7c, 0xf6, 0xff, 0x89, - 0x41, 0x2e, 0x18, 0x41, 0x89, 0xad, 0xeb, 0x66, 0xd7, 0xa6, 0xe1, 0x8b, 0xce, 0x1e, 0xf3, 0x1e, - 0x1d, 0x09, 0x30, 0x89, 0xab, 0x7d, 0xdd, 0x54, 0xe8, 0x83, 0x95, 0x90, 0x7e, 0xa7, 0xfb, 0xba, - 0xf9, 0x88, 0x40, 0x29, 0x8a, 0xfa, 0x9c, 0xa3, 0xc4, 0x42, 0x28, 0xea, 0x73, 0x86, 0xb2, 0x4c, - 0x53, 0x55, 0xdb, 0xa5, 0x3b, 0x14, 0x0b, 0xa4, 0xa0, 0xb6, 0x1b, 0x7c, 0x7b, 0x98, 0x98, 0xf6, - 0xf6, 0xd0, 0x84, 0x82, 0x9f, 0x33, 0x9c, 0x9a, 0xd8, 0xe6, 0x17, 0x0e, 0x95, 0x4b, 0x24, 0x0d, - 0xfe, 0x07, 0x61, 0x24, 0xa2, 0xb8, 0x13, 0x04, 0x92, 0xac, 0xb4, 0xab, 0x76, 0x8f, 0xb1, 0xe2, - 0xe8, 0x3f, 0x66, 0x0d, 0x01, 0x6f, 0x5b, 0x28, 0x7c, 0x5f, 0xff, 0x31, 0x5e, 0xfe, 0xfb, 0x08, - 0xe4, 0x43, 0xbc, 0x50, 0x13, 0x8a, 0x54, 0xba, 0x89, 0x06, 0xf7, 0x0d, 0xef, 0x95, 0x3e, 0x19, - 0x9e, 0x5a, 0xcc, 0xe6, 0xad, 0xc0, 0x90, 0x46, 0xf2, 0x50, 0xc6, 0xca, 0x7b, 0xe3, 0x16, 0x56, - 0xe3, 0x1c, 0xe5, 0x14, 0x7e, 0xe8, 0x96, 0xb3, 0x7c, 0x98, 0x16, 0x6c, 0xc7, 0x2f, 0x9b, 0x90, - 0x0d, 0x64, 0x2e, 0x73, 0xd8, 0xcf, 0xb7, 0x21, 0xee, 0x79, 0xb3, 0x79, 0xfb, 0xc8, 0xae, 0xef, - 0xe2, 0x7e, 0x16, 0x81, 0xa5, 0x69, 0x19, 0x44, 0xc8, 0x2e, 0x99, 0xb6, 0xcd, 0x65, 0x97, 0x37, - 0x83, 0x99, 0x1d, 0xd3, 0x40, 0xd1, 0x2f, 0xf1, 0x73, 0xbb, 0xb7, 0x3c, 0x3b, 0x60, 0x0a, 0x58, - 0x0c, 0xd9, 0x01, 0xa9, 0xe0, 0x82, 0x96, 0xf0, 0x1f, 0x31, 0x28, 0x8c, 0xdd, 0xbf, 0x3c, 0x82, - 0x64, 0xcf, 0xb0, 0x0e, 0x55, 0x83, 0xf7, 0xad, 0xbf, 0x73, 0xa9, 0x50, 0xb6, 0x71, 0x9f, 0xf2, - 0xd8, 0x5e, 0x90, 0x39, 0x37, 0xe4, 0xc0, 0x62, 0xf0, 0xa2, 0x85, 0xfd, 0x9c, 0x88, 0xed, 0x6c, - 0xe3, 0x72, 0x53, 0xf8, 0x37, 0x31, 0x14, 0x71, 0x7b, 0x41, 0x2e, 0xda, 0x61, 0x10, 0xea, 0x43, - 0x71, 0xec, 0x76, 0x87, 0x5f, 0x0a, 0xd4, 0x5e, 0x76, 0x4a, 0xd9, 0x3a, 0xdd, 0xa6, 0x79, 0x6f, - 0x00, 0xb0, 0xfc, 0x47, 0x50, 0x1c, 0x13, 0x8a, 0x9c, 0x07, 0xc3, 0xe1, 0x51, 0xad, 0x40, 0x7c, - 0x18, 0x43, 0x6a, 0xa9, 0x7d, 0x2c, 0xf3, 0x51, 0x7e, 0x1e, 0xb7, 0x20, 0x1f, 0x9a, 0x02, 0x15, - 0x20, 0xaa, 0xb2, 0x87, 0x84, 0x19, 0x39, 0xaa, 0xf2, 0x27, 0x88, 0xcb, 0x05, 0x48, 0xb2, 0xfd, - 0x0d, 0xea, 0x77, 0x15, 0x20, 0x2d, 0xf2, 0x87, 0xf2, 0x3a, 0x64, 0xbc, 0x44, 0x1a, 0xe5, 0x20, - 0x5d, 0x6f, 0xee, 0x57, 0xaa, 0x3b, 0x8d, 0xba, 0xb4, 0x80, 0xf2, 0x90, 0x91, 0x1b, 0x95, 0x3a, - 0xed, 0xba, 0x4a, 0x91, 0x4f, 0xd2, 0x7f, 0xf1, 0xb3, 0xd5, 0x08, 0x0f, 0x32, 0x49, 0x29, 0xf5, - 0x20, 0x9e, 0x46, 0xd2, 0x95, 0xf2, 0x9f, 0x03, 0xa0, 0xba, 0xea, 0xaa, 0x64, 0x53, 0x5e, 0xa0, - 0x37, 0x19, 0xbd, 0xc0, 0x9a, 0xa6, 0xb6, 0x19, 0xe3, 0x2f, 0xd3, 0x66, 0xbc, 0x54, 0xb7, 0x73, - 0xb2, 0x37, 0x99, 0x7c, 0xa9, 0xde, 0x64, 0xb8, 0xf3, 0x13, 0x7b, 0xa9, 0xce, 0xcf, 0x23, 0x48, - 0xb1, 0x3a, 0x93, 0xbd, 0x35, 0x9b, 0xdd, 0x58, 0x98, 0x3c, 0x1a, 0xde, 0xaf, 0x71, 0x1a, 0xa6, - 0x6b, 0x8f, 0xbc, 0x37, 0x31, 0x0c, 0xe6, 0x37, 0x48, 0xd2, 0xaf, 0xb2, 0x41, 0x92, 0x99, 0xdd, - 0x20, 0xf9, 0x01, 0x70, 0xcb, 0x10, 0x69, 0x31, 0x5c, 0xf8, 0x3c, 0x64, 0xca, 0x72, 0x98, 0x19, - 0xf0, 0xbc, 0x38, 0x67, 0x07, 0xbe, 0xd0, 0x8f, 0x00, 0x89, 0xbb, 0xd9, 0xc0, 0xce, 0xb3, 0x6b, - 0x9d, 0x0f, 0x66, 0x2e, 0x8d, 0x12, 0x4c, 0x3b, 0x00, 0xf1, 0x2e, 0xdc, 0x1b, 0x73, 0x96, 0x1f, - 0x01, 0xf0, 0x16, 0xaf, 0x79, 0x64, 0xcd, 0x11, 0x28, 0xd6, 0x20, 0x45, 0x1c, 0xf0, 0x00, 0x33, - 0x0b, 0x48, 0x7b, 0xba, 0x22, 0xc0, 0xdc, 0x6e, 0x07, 0x90, 0x0b, 0x1e, 0x13, 0x92, 0x20, 0x76, - 0x82, 0x47, 0xdc, 0xbc, 0xc9, 0x9f, 0xe8, 0x01, 0x24, 0xfc, 0x0c, 0x63, 0xf6, 0x93, 0xf1, 0x99, - 0xe7, 0x4f, 0x04, 0x96, 0x19, 0x8b, 0x4f, 0xa2, 0xf7, 0x68, 0x9a, 0x9d, 0x0b, 0x6e, 0x25, 0x6a, - 0x41, 0xde, 0x19, 0xda, 0xcf, 0xf4, 0x67, 0xaa, 0xa1, 0xf4, 0x2c, 0xd5, 0xa0, 0x13, 0x15, 0x36, - 0x6f, 0xce, 0x7a, 0x6e, 0xc5, 0x71, 0xef, 0x5b, 0xaa, 0x21, 0xda, 0x23, 0x4e, 0x00, 0x86, 0x3e, - 0xf6, 0xae, 0x05, 0xf9, 0x3d, 0x3a, 0xbf, 0x62, 0x46, 0xdc, 0x14, 0x83, 0xbe, 0x4e, 0x74, 0x80, - 0x19, 0x88, 0x44, 0x77, 0xae, 0x24, 0x98, 0x3e, 0x87, 0x16, 0xad, 0x7d, 0x2f, 0xba, 0x33, 0xbc, - 0x86, 0x39, 0xec, 0xfb, 0xd1, 0xdd, 0xf6, 0x61, 0x1a, 0xda, 0x86, 0x8c, 0x17, 0xcf, 0xa9, 0x0b, - 0x28, 0x6c, 0xbe, 0x79, 0xc1, 0x8e, 0xed, 0x8d, 0x75, 0x2d, 0x7c, 0x62, 0x2f, 0xcd, 0x8e, 0x48, - 0x51, 0xdf, 0x23, 0x96, 0xff, 0x37, 0x07, 0x85, 0xce, 0x68, 0x30, 0xcd, 0x03, 0xc6, 0x66, 0x78, - 0xc0, 0xf8, 0x7c, 0xb7, 0x33, 0x99, 0x97, 0xbb, 0x9d, 0x81, 0x57, 0x7b, 0x3b, 0x93, 0x7d, 0x85, - 0x1e, 0xb0, 0xf0, 0x52, 0x1e, 0xf0, 0x95, 0xdd, 0xd6, 0x45, 0x2f, 0x71, 0x5b, 0xf7, 0x5d, 0xc8, - 0xab, 0xb6, 0xad, 0x8e, 0xf8, 0x6f, 0x72, 0x34, 0xea, 0x2e, 0xf3, 0xec, 0x94, 0xce, 0xcf, 0x56, - 0xb3, 0x15, 0x32, 0x48, 0x7f, 0x86, 0x23, 0x38, 0x64, 0x55, 0x0f, 0xa4, 0xf9, 0x5e, 0x36, 0xff, - 0x2a, 0xbd, 0x6c, 0x71, 0xb6, 0x97, 0xad, 0x43, 0x9c, 0xfe, 0xe8, 0x87, 0x69, 0xfe, 0xac, 0x2d, - 0x0f, 0x2b, 0xf0, 0x46, 0xe0, 0x77, 0x3f, 0x94, 0x1a, 0xfd, 0x08, 0x96, 0xc5, 0xcb, 0x5a, 0xa2, - 0x11, 0xfe, 0x6d, 0x6a, 0xe0, 0x27, 0x55, 0xe5, 0xf3, 0xb3, 0xd5, 0x92, 0xec, 0x63, 0xf9, 0xfc, - 0x58, 0x35, 0x48, 0xf6, 0xa2, 0x64, 0x4f, 0x1d, 0xd7, 0x1c, 0xf4, 0x04, 0x72, 0xd4, 0xc2, 0xfb, - 0xb8, 0x7f, 0x88, 0x6d, 0x11, 0x70, 0xef, 0xce, 0x27, 0x2f, 0x31, 0xf5, 0x5d, 0x4a, 0x28, 0x3a, - 0x68, 0xd8, 0x83, 0x38, 0xe8, 0x2e, 0x24, 0x54, 0x43, 0xa7, 0xf1, 0xf2, 0xeb, 0x7e, 0xe3, 0xc7, - 0x10, 0xd9, 0x8b, 0xe4, 0x60, 0x68, 0x92, 0x2e, 0xee, 0x7d, 0x86, 0xa5, 0x99, 0x1d, 0x96, 0x96, - 0x7f, 0x1a, 0x03, 0xf0, 0x85, 0x45, 0xdf, 0x86, 0xeb, 0x83, 0xe3, 0x91, 0xa3, 0x77, 0x55, 0x43, - 0xb1, 0xf1, 0xc0, 0xc6, 0x0e, 0x36, 0x59, 0xfe, 0x4f, 0xf5, 0x3a, 0x27, 0x5f, 0x13, 0xc3, 0x72, - 0x68, 0x14, 0x7d, 0x0a, 0xd7, 0x0c, 0xab, 0x37, 0x8d, 0x2e, 0xd8, 0xfd, 0xb8, 0xca, 0x71, 0xc6, - 0x88, 0x55, 0x52, 0xb3, 0x0d, 0xd4, 0x43, 0xdd, 0xf0, 0x1b, 0x22, 0x9f, 0xbe, 0xe8, 0x46, 0x6f, - 0xd4, 0x3c, 0x16, 0xe2, 0x79, 0x8d, 0xcf, 0x14, 0xfd, 0x70, 0xf2, 0x85, 0xc2, 0x27, 0x2f, 0x3c, - 0xc3, 0xec, 0x87, 0x0a, 0xe5, 0x37, 0x01, 0xfc, 0xf9, 0xe9, 0xc5, 0xff, 0xce, 0x8e, 0x9f, 0xb6, - 0xf2, 0x27, 0x04, 0xe5, 0xdb, 0x5f, 0xf3, 0x4e, 0x00, 0x20, 0x29, 0x37, 0x76, 0xdb, 0x8f, 0x1a, - 0xe2, 0xa5, 0xc0, 0x72, 0x7b, 0x2c, 0x12, 0x4e, 0x46, 0xae, 0xc8, 0x9c, 0x91, 0x8b, 0x5f, 0xde, - 0x7f, 0x0e, 0x71, 0x62, 0x4c, 0x64, 0xf6, 0x46, 0xeb, 0x60, 0x57, 0x5a, 0x40, 0x19, 0x48, 0x54, - 0x76, 0x9a, 0x95, 0x7d, 0x29, 0x82, 0x96, 0x40, 0xda, 0x3d, 0xd8, 0xe9, 0x34, 0xe5, 0xc6, 0xfd, - 0x66, 0xbb, 0xa5, 0x50, 0x84, 0x28, 0x5a, 0x81, 0xe5, 0x0e, 0xc9, 0xc3, 0x95, 0xe6, 0xee, 0xde, - 0x4e, 0xb3, 0xd6, 0xec, 0x28, 0x72, 0xa3, 0xd6, 0x96, 0xeb, 0x4a, 0xe7, 0xc9, 0x5e, 0x43, 0x8a, - 0x05, 0x42, 0xcf, 0xdf, 0xc5, 0x41, 0x62, 0x8e, 0x69, 0x4a, 0xf0, 0x89, 0x5e, 0xe2, 0x69, 0xc0, - 0x1f, 0x3c, 0x07, 0x9c, 0x1a, 0xb8, 0x12, 0xaf, 0x28, 0xdf, 0x4f, 0xbe, 0x44, 0xbe, 0x9f, 0x7a, - 0x75, 0x6f, 0x11, 0xe6, 0x8d, 0x50, 0xe1, 0x10, 0x19, 0x7f, 0x99, 0x10, 0x19, 0xd0, 0x91, 0x9f, - 0x47, 0x01, 0x02, 0xda, 0xf1, 0xbd, 0xe0, 0x3f, 0xd2, 0x31, 0xfb, 0x36, 0x7c, 0xac, 0xc4, 0xdd, - 0x5e, 0x10, 0xff, 0x84, 0xc7, 0x7d, 0x48, 0x6b, 0x3c, 0xaf, 0xe4, 0xe9, 0xe7, 0x3b, 0x73, 0xa7, - 0x9f, 0xdb, 0x0b, 0xb2, 0x47, 0x8c, 0x3e, 0x0d, 0xfd, 0xee, 0xfa, 0xd6, 0x5c, 0xce, 0x61, 0x5b, - 0xfc, 0x10, 0xa1, 0x02, 0x49, 0x16, 0xc5, 0xf9, 0x36, 0xcd, 0xfc, 0x2d, 0xeb, 0x98, 0x71, 0x6c, - 0x2f, 0xc8, 0x9c, 0x90, 0x97, 0xc3, 0x29, 0x48, 0x0c, 0x4d, 0xdd, 0x32, 0x6f, 0xcb, 0xc1, 0xc7, - 0xf3, 0xa2, 0xf7, 0x4b, 0xfc, 0x09, 0xfd, 0x5b, 0x75, 0xb1, 0xc6, 0xde, 0x28, 0x1d, 0x98, 0xcf, - 0x3c, 0x40, 0x04, 0x15, 0x00, 0xf8, 0xb8, 0x6e, 0xf6, 0xa4, 0x28, 0x2d, 0xa2, 0x49, 0x32, 0x4f, - 0xbe, 0x62, 0xb7, 0xbf, 0x0b, 0xd2, 0xf8, 0x8f, 0x69, 0x03, 0x5e, 0x68, 0x11, 0xf2, 0xbb, 0x8f, - 0x6a, 0xb5, 0x4e, 0x73, 0xb7, 0xb1, 0xdf, 0xa9, 0xec, 0xee, 0xb1, 0x57, 0xd9, 0xd4, 0xf2, 0xdb, - 0xcd, 0xba, 0x14, 0xbd, 0x7d, 0x08, 0xd7, 0x67, 0xfc, 0xfa, 0x1a, 0x5d, 0x87, 0x2b, 0xad, 0x76, - 0x47, 0x69, 0xd6, 0x1b, 0xad, 0x4e, 0xb3, 0xf3, 0x44, 0xa9, 0xb5, 0x77, 0x0e, 0x76, 0x5b, 0xd2, - 0x02, 0xf1, 0x28, 0xf7, 0x1b, 0xad, 0x86, 0x5c, 0xe9, 0x34, 0xea, 0x4a, 0x65, 0xe7, 0x71, 0xe5, - 0x09, 0xf1, 0x33, 0x25, 0x58, 0xf2, 0xa1, 0xd5, 0x27, 0xde, 0xbf, 0xc8, 0x11, 0xbd, 0xfd, 0x5d, - 0x28, 0x8e, 0x19, 0x33, 0x71, 0x8a, 0x7b, 0x07, 0xd5, 0x9d, 0x66, 0x6d, 0xea, 0x8b, 0x2a, 0x94, - 0x85, 0x54, 0x7b, 0x6b, 0x6b, 0xa7, 0xd9, 0x6a, 0x48, 0xb1, 0xdb, 0x1f, 0x41, 0x2e, 0x98, 0xfc, - 0x23, 0x09, 0x72, 0xdf, 0x6f, 0xb7, 0x1a, 0xca, 0x56, 0xa5, 0xb9, 0x73, 0x20, 0x93, 0x55, 0x22, - 0x28, 0x70, 0xef, 0x26, 0x60, 0x91, 0xdb, 0xef, 0x41, 0x3e, 0x94, 0x69, 0x13, 0x9e, 0x42, 0xa4, - 0x05, 0xb2, 0xa7, 0xe2, 0x5f, 0x14, 0x69, 0xd4, 0xa5, 0x48, 0x75, 0xfd, 0x37, 0xff, 0xb5, 0xb2, - 0xf0, 0x9b, 0xf3, 0x95, 0xc8, 0x6f, 0xcf, 0x57, 0x22, 0xbf, 0x3b, 0x5f, 0x89, 0xfc, 0xe7, 0xf9, - 0x4a, 0xe4, 0xaf, 0x7f, 0xbf, 0xb2, 0xf0, 0xdb, 0xdf, 0xaf, 0x2c, 0xfc, 0xee, 0xf7, 0x2b, 0x0b, - 0xdf, 0x4f, 0xb2, 0x7f, 0xf0, 0xe6, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x26, 0xc4, 0x63, 0xb0, - 0x5b, 0x47, 0x00, 0x00, + 0xd9, 0xe5, 0x82, 0xb7, 0x6b, 0xff, 0x29, 0x60, 0x6a, 0xf2, 0x29, 0xa0, 0xd7, 0xa5, 0x8f, 0x4b, + 0x89, 0xe5, 0x7f, 0x8b, 0x40, 0x26, 0xf8, 0x26, 0x3f, 0x1a, 0xee, 0x1d, 0x4e, 0x54, 0x83, 0x97, + 0x7c, 0xea, 0x13, 0x96, 0x42, 0xec, 0x05, 0xa4, 0x70, 0x03, 0x12, 0x87, 0x23, 0x51, 0xa3, 0xa5, + 0xab, 0x39, 0x3e, 0x5b, 0xbc, 0x4a, 0xea, 0x81, 0xf8, 0xe1, 0x48, 0x3c, 0x9b, 0x5a, 0xfe, 0x73, + 0xc8, 0x06, 0xe2, 0xee, 0x78, 0x6f, 0x22, 0x72, 0x89, 0xde, 0xc4, 0x9b, 0x90, 0xe4, 0x61, 0x81, + 0xe9, 0x5e, 0x9e, 0x53, 0x27, 0x58, 0x48, 0x48, 0x7c, 0x49, 0xc2, 0x01, 0x9f, 0xfd, 0xe7, 0x71, + 0xc8, 0x05, 0x23, 0x28, 0xb1, 0x75, 0xdd, 0xec, 0xda, 0x34, 0x7c, 0xd1, 0xd9, 0x63, 0xde, 0xa3, + 0x23, 0x01, 0x26, 0x71, 0xb5, 0xaf, 0x9b, 0x0a, 0x7d, 0xb0, 0x12, 0xd2, 0xef, 0x74, 0x5f, 0x37, + 0x1f, 0x11, 0x28, 0x45, 0x51, 0x9f, 0x73, 0x94, 0x58, 0x08, 0x45, 0x7d, 0xce, 0x50, 0x96, 0x69, + 0xaa, 0x6a, 0xbb, 0x54, 0x42, 0xb1, 0x40, 0x0a, 0x6a, 0xbb, 0xc1, 0xb7, 0x87, 0x89, 0x69, 0x6f, + 0x0f, 0x4d, 0x28, 0xf8, 0x39, 0xc3, 0xa9, 0x89, 0x6d, 0x7e, 0xe1, 0x50, 0xb9, 0x44, 0xd2, 0xe0, + 0x7f, 0x10, 0x46, 0x22, 0x8a, 0x3b, 0x41, 0x20, 0xc9, 0x4a, 0xbb, 0x6a, 0xf7, 0x18, 0x2b, 0x8e, + 0xfe, 0x63, 0xd6, 0x10, 0xf0, 0xc4, 0x42, 0xe1, 0xfb, 0xfa, 0x8f, 0x31, 0x7a, 0x0f, 0x8a, 0xaa, + 0xa3, 0xe8, 0xa6, 0x8b, 0x7b, 0xd8, 0x66, 0x77, 0x90, 0xe9, 0x60, 0xe2, 0xac, 0x3a, 0x4d, 0x36, + 0x46, 0xf2, 0xc2, 0xe5, 0x9f, 0x47, 0x20, 0x1f, 0x9a, 0x19, 0x35, 0xa1, 0x48, 0xf7, 0x32, 0xd1, + 0x0e, 0xbf, 0xe1, 0xbd, 0xe9, 0x27, 0xc3, 0x53, 0x4b, 0xdf, 0xbc, 0x15, 0x18, 0xd2, 0x48, 0xd6, + 0xca, 0x58, 0x79, 0x2f, 0xe2, 0xc2, 0x4a, 0x9f, 0xa3, 0x9c, 0xc2, 0xcf, 0xe2, 0x72, 0x96, 0x0f, + 0xd3, 0x82, 0xcd, 0xfb, 0x65, 0x13, 0xb2, 0x81, 0x3c, 0x67, 0x0e, 0x6b, 0xfb, 0x36, 0xc4, 0x3d, + 0xdf, 0x37, 0x6f, 0xd7, 0xd9, 0xf5, 0x1d, 0xe2, 0xcf, 0x22, 0xb0, 0x34, 0x2d, 0xdf, 0x08, 0x59, + 0x31, 0xd3, 0xcd, 0xb9, 0xac, 0xf8, 0x66, 0x30, 0x0f, 0x64, 0xfa, 0x2a, 0xba, 0x2b, 0x7e, 0x26, + 0xf8, 0x96, 0x67, 0x35, 0x4c, 0x5d, 0x8b, 0x21, 0xab, 0x21, 0xf5, 0x5e, 0xd0, 0x6e, 0xfe, 0x33, + 0x06, 0x85, 0xb1, 0xdb, 0x9a, 0x47, 0x90, 0xec, 0x19, 0xd6, 0xa1, 0x6a, 0xf0, 0x2e, 0xf7, 0x77, + 0x2e, 0x15, 0xf8, 0x36, 0xee, 0x53, 0x1e, 0xdb, 0x0b, 0x32, 0xe7, 0x86, 0x1c, 0x58, 0x0c, 0x5e, + 0xcb, 0xb0, 0x1f, 0x1f, 0x31, 0xc9, 0x36, 0x2e, 0x37, 0x85, 0x7f, 0x6f, 0x43, 0x11, 0xb7, 0x17, + 0xe4, 0xa2, 0x1d, 0x06, 0xa1, 0x3e, 0x14, 0xc7, 0xee, 0x82, 0xf8, 0x15, 0x42, 0xed, 0x65, 0xa7, + 0x94, 0xad, 0xd3, 0x6d, 0x9a, 0x25, 0x07, 0x00, 0xcb, 0x7f, 0x02, 0xc5, 0xb1, 0x45, 0x91, 0xf3, + 0x60, 0x38, 0x3c, 0x06, 0x16, 0x88, 0xc7, 0x63, 0x48, 0x2d, 0xb5, 0x8f, 0x65, 0x3e, 0xca, 0xcf, + 0xe3, 0x16, 0xe4, 0x43, 0x53, 0xa0, 0x02, 0x44, 0x55, 0xf6, 0xec, 0x30, 0x23, 0x47, 0x55, 0xfe, + 0x60, 0x71, 0xb9, 0x00, 0x49, 0x26, 0xdf, 0xa0, 0x7e, 0x57, 0x01, 0xd2, 0x22, 0xdb, 0x28, 0xaf, + 0x43, 0xc6, 0x4b, 0xbb, 0x51, 0x0e, 0xd2, 0xf5, 0xe6, 0x7e, 0xa5, 0xba, 0xd3, 0xa8, 0x4b, 0x0b, + 0x28, 0x0f, 0x19, 0xb9, 0x51, 0xa9, 0xd3, 0x1e, 0xad, 0x14, 0xf9, 0x24, 0xfd, 0x57, 0x3f, 0x5b, + 0x8d, 0xf0, 0x90, 0x94, 0x94, 0x52, 0x0f, 0xe2, 0x69, 0x24, 0x5d, 0x29, 0xff, 0x25, 0x00, 0xaa, + 0xab, 0xae, 0x4a, 0x84, 0xf2, 0x02, 0x9d, 0xcc, 0xe8, 0x05, 0xd6, 0x34, 0xb5, 0x29, 0x19, 0x7f, + 0x99, 0xa6, 0xe4, 0xa5, 0x7a, 0xa3, 0x93, 0x9d, 0xcc, 0xe4, 0x4b, 0x75, 0x32, 0xc3, 0x7d, 0xa2, + 0xd8, 0x4b, 0xf5, 0x89, 0x1e, 0x41, 0x8a, 0x55, 0xa5, 0xec, 0x65, 0xda, 0xec, 0x36, 0xc4, 0xe4, + 0xd1, 0xf0, 0xee, 0x8e, 0xd3, 0x30, 0x5d, 0x7b, 0xe4, 0xbd, 0xa0, 0x61, 0x30, 0xbf, 0x9d, 0x92, + 0x7e, 0x95, 0xed, 0x94, 0xcc, 0xec, 0x76, 0xca, 0x0f, 0x80, 0x5b, 0x86, 0x48, 0xa2, 0xe1, 0xc2, + 0xc7, 0x24, 0x53, 0xb6, 0xc3, 0xcc, 0x80, 0x67, 0xd1, 0x39, 0x3b, 0xf0, 0x85, 0x7e, 0x04, 0x48, + 0xdc, 0xe4, 0x06, 0x24, 0xcf, 0x2e, 0x81, 0x3e, 0x98, 0xb9, 0x35, 0x4a, 0x30, 0xed, 0x00, 0xc4, + 0x2b, 0x72, 0x6f, 0xcc, 0x59, 0x7e, 0x04, 0xc0, 0x1b, 0xc2, 0xe6, 0x91, 0x35, 0x47, 0xa0, 0x58, + 0x83, 0x14, 0x71, 0xc0, 0x03, 0xcc, 0x2c, 0x20, 0xed, 0xe9, 0x8a, 0x00, 0x73, 0xbb, 0x1d, 0x40, + 0x2e, 0x78, 0x4c, 0x48, 0x82, 0xd8, 0x09, 0x1e, 0x71, 0xf3, 0x26, 0x7f, 0xa2, 0x07, 0x90, 0xf0, + 0xf3, 0x91, 0xd9, 0x0f, 0xcc, 0x67, 0x9e, 0x3f, 0x59, 0xb0, 0xcc, 0x58, 0x7c, 0x12, 0xbd, 0x47, + 0x93, 0xf2, 0x5c, 0x50, 0x94, 0xa8, 0x05, 0x79, 0x67, 0x68, 0x3f, 0xd3, 0x9f, 0xa9, 0x86, 0xd2, + 0xb3, 0x54, 0x83, 0x4e, 0x54, 0xd8, 0xbc, 0x39, 0xeb, 0x71, 0x16, 0xc7, 0xbd, 0x6f, 0xa9, 0x86, + 0x68, 0xa6, 0x38, 0x01, 0x18, 0xfa, 0xd8, 0xbb, 0x44, 0xe4, 0xb7, 0xee, 0xfc, 0x42, 0x1a, 0x71, + 0x53, 0x0c, 0xfa, 0x3a, 0xd1, 0x2f, 0x66, 0x20, 0x12, 0xdd, 0xb9, 0x92, 0x60, 0xfa, 0x78, 0x5a, + 0x5c, 0x04, 0x78, 0xd1, 0x9d, 0xe1, 0x35, 0xcc, 0x61, 0xdf, 0x8f, 0xee, 0xb6, 0x0f, 0xd3, 0xd0, + 0x36, 0x64, 0xbc, 0x78, 0x4e, 0x5d, 0x40, 0x61, 0xf3, 0xcd, 0x0b, 0x24, 0xb6, 0x37, 0xd6, 0xe3, + 0xf0, 0x89, 0xbd, 0xa4, 0x3c, 0x22, 0x45, 0x7d, 0x8f, 0x58, 0xfe, 0xdf, 0x1c, 0x14, 0x48, 0x96, + 0x33, 0xc5, 0x03, 0xc6, 0x66, 0x78, 0xc0, 0xf8, 0x7c, 0x77, 0x39, 0x99, 0x97, 0xbb, 0xcb, 0x81, + 0x57, 0x7b, 0x97, 0x93, 0x7d, 0x85, 0x1e, 0xb0, 0xf0, 0x52, 0x1e, 0xf0, 0x95, 0xdd, 0xed, 0x45, + 0x2f, 0x71, 0xb7, 0xf7, 0x5d, 0xc8, 0xab, 0xb6, 0xad, 0x8e, 0xf8, 0x2f, 0x78, 0x34, 0xea, 0x2e, + 0xf3, 0xec, 0x94, 0xce, 0xcf, 0x56, 0xb3, 0x15, 0x32, 0x48, 0x7f, 0xb4, 0x23, 0x38, 0x64, 0x55, + 0x0f, 0xa4, 0xf9, 0x5e, 0x36, 0xff, 0x2a, 0xbd, 0x6c, 0x71, 0xb6, 0x97, 0xad, 0x43, 0x9c, 0xfe, + 0x44, 0x88, 0x69, 0xfe, 0x2c, 0x91, 0x87, 0x15, 0x78, 0x23, 0xf0, 0x2b, 0x21, 0x4a, 0x8d, 0x7e, + 0x04, 0xcb, 0xe2, 0x1d, 0x2e, 0xd1, 0x08, 0xff, 0xee, 0x35, 0xf0, 0x03, 0xac, 0xf2, 0xf9, 0xd9, + 0x6a, 0x49, 0xf6, 0xb1, 0x7c, 0x7e, 0xac, 0x76, 0x24, 0xb2, 0x28, 0xd9, 0x53, 0xc7, 0x35, 0x07, + 0x3d, 0x81, 0x1c, 0xb5, 0xf0, 0x3e, 0xee, 0x1f, 0x62, 0x5b, 0x04, 0xdc, 0xbb, 0xf3, 0xad, 0x97, + 0x98, 0xfa, 0x2e, 0x25, 0x14, 0xfd, 0x36, 0xec, 0x41, 0x1c, 0x74, 0x17, 0x12, 0xaa, 0xa1, 0xd3, + 0x78, 0xf9, 0x75, 0xbf, 0x08, 0x64, 0x88, 0xec, 0xfd, 0x72, 0x30, 0x34, 0x49, 0x17, 0x77, 0x4a, + 0xc3, 0xab, 0x99, 0x1d, 0x96, 0x96, 0x7f, 0x1a, 0x03, 0xf0, 0x17, 0x8b, 0xbe, 0x0d, 0xd7, 0x07, + 0xc7, 0x23, 0x47, 0xef, 0xaa, 0x86, 0x62, 0xe3, 0x81, 0x8d, 0x1d, 0x6c, 0xb2, 0xfc, 0x9f, 0xea, + 0x75, 0x4e, 0xbe, 0x26, 0x86, 0xe5, 0xd0, 0x28, 0xfa, 0x14, 0xae, 0x19, 0x56, 0x6f, 0x1a, 0x5d, + 0xb0, 0x57, 0x72, 0x95, 0xe3, 0x8c, 0x11, 0xab, 0xa4, 0xc2, 0x1b, 0xa8, 0x87, 0xba, 0xe1, 0xb7, + 0x4f, 0x3e, 0x7d, 0x51, 0x41, 0x6f, 0xd4, 0x3c, 0x16, 0xe2, 0x31, 0x8e, 0xcf, 0x14, 0xfd, 0x70, + 0xf2, 0x3d, 0xc3, 0x27, 0x2f, 0x3c, 0xc3, 0xec, 0x67, 0x0d, 0xe5, 0x37, 0x01, 0xfc, 0xf9, 0xe9, + 0x33, 0x81, 0x9d, 0x1d, 0x3f, 0x6d, 0xe5, 0x0f, 0x0e, 0xca, 0xb7, 0xbf, 0xe6, 0x55, 0x01, 0x40, + 0x52, 0x6e, 0xec, 0xb6, 0x1f, 0x35, 0xc4, 0xbb, 0x82, 0xe5, 0xf6, 0x58, 0x24, 0x9c, 0x8c, 0x5c, + 0x91, 0x39, 0x23, 0x17, 0xbf, 0xea, 0xff, 0x1c, 0xe2, 0xc4, 0x98, 0xc8, 0xec, 0x8d, 0xd6, 0xc1, + 0xae, 0xb4, 0x80, 0x32, 0x90, 0xa8, 0xec, 0x34, 0x2b, 0xfb, 0x52, 0x04, 0x2d, 0x81, 0xb4, 0x7b, + 0xb0, 0xd3, 0x69, 0xca, 0x8d, 0xfb, 0xcd, 0x76, 0x4b, 0xa1, 0x08, 0x51, 0xb4, 0x02, 0xcb, 0x1d, + 0x92, 0x87, 0x2b, 0xcd, 0xdd, 0xbd, 0x9d, 0x66, 0xad, 0xd9, 0x51, 0xe4, 0x46, 0xad, 0x2d, 0xd7, + 0x95, 0xce, 0x93, 0xbd, 0x86, 0x14, 0x0b, 0x84, 0x9e, 0xbf, 0x8f, 0x83, 0xc4, 0x1c, 0xd3, 0x94, + 0xe0, 0x13, 0xbd, 0xc4, 0x43, 0x82, 0x3f, 0x7a, 0x0e, 0x38, 0x35, 0x70, 0x25, 0x5e, 0x51, 0xbe, + 0x9f, 0x7c, 0x89, 0x7c, 0x3f, 0xf5, 0xea, 0x5e, 0x2e, 0xcc, 0x1b, 0xa1, 0xc2, 0x21, 0x32, 0xfe, + 0x32, 0x21, 0x32, 0xa0, 0x23, 0xbf, 0x88, 0x02, 0x04, 0xb4, 0xe3, 0x7b, 0xc1, 0x7f, 0xd2, 0x63, + 0xf6, 0xdd, 0xf9, 0x58, 0x89, 0xbb, 0xbd, 0x20, 0xfe, 0xc1, 0x8f, 0xfb, 0x90, 0xd6, 0x78, 0x5e, + 0xc9, 0xd3, 0xcf, 0x77, 0xe6, 0x4e, 0x3f, 0xb7, 0x17, 0x64, 0x8f, 0x18, 0x7d, 0x1a, 0xfa, 0x95, + 0xf6, 0xad, 0xb9, 0x9c, 0xc3, 0xb6, 0xf8, 0xd9, 0x42, 0x05, 0x92, 0x2c, 0x8a, 0x73, 0x31, 0xcd, + 0xfc, 0xe5, 0xeb, 0x98, 0x71, 0x6c, 0x2f, 0xc8, 0x9c, 0x90, 0x97, 0xc3, 0x29, 0x48, 0x0c, 0x4d, + 0xdd, 0x32, 0x6f, 0xcb, 0xc1, 0xa7, 0xf6, 0xa2, 0x53, 0x4c, 0xfc, 0x09, 0xfd, 0x5b, 0x75, 0xb1, + 0xc6, 0x5e, 0x34, 0x1d, 0x98, 0xcf, 0x3c, 0x40, 0x04, 0x15, 0x00, 0xf8, 0xb8, 0x6e, 0xf6, 0xa4, + 0x28, 0x2d, 0xa2, 0x49, 0x32, 0x4f, 0xbe, 0x62, 0xb7, 0xbf, 0x0b, 0xd2, 0xf8, 0x4f, 0x6f, 0x03, + 0x5e, 0x68, 0x11, 0xf2, 0xbb, 0x8f, 0x6a, 0xb5, 0x4e, 0x73, 0xb7, 0xb1, 0xdf, 0xa9, 0xec, 0xee, + 0xb1, 0x37, 0xdc, 0xd4, 0xf2, 0xdb, 0xcd, 0xba, 0x14, 0xbd, 0x7d, 0x08, 0xd7, 0x67, 0xfc, 0x56, + 0x1b, 0x5d, 0x87, 0x2b, 0xad, 0x76, 0x47, 0x69, 0xd6, 0x1b, 0xad, 0x4e, 0xb3, 0xf3, 0x44, 0xa9, + 0xb5, 0x77, 0x0e, 0x76, 0x5b, 0xd2, 0x02, 0xf1, 0x28, 0xf7, 0x1b, 0xad, 0x86, 0x5c, 0xe9, 0x34, + 0xea, 0x4a, 0x65, 0xe7, 0x71, 0xe5, 0x09, 0xf1, 0x33, 0x25, 0x58, 0xf2, 0xa1, 0xd5, 0x27, 0xde, + 0xbf, 0xdf, 0x11, 0xbd, 0xfd, 0x5d, 0x28, 0x8e, 0x19, 0x33, 0x71, 0x8a, 0x7b, 0x07, 0xd5, 0x9d, + 0x66, 0x6d, 0xea, 0xfb, 0x2b, 0x94, 0x85, 0x54, 0x7b, 0x6b, 0x6b, 0xa7, 0xd9, 0x6a, 0x48, 0xb1, + 0xdb, 0x1f, 0x41, 0x2e, 0x98, 0xfc, 0x23, 0x09, 0x72, 0xdf, 0x6f, 0xb7, 0x1a, 0xca, 0x56, 0xa5, + 0xb9, 0x73, 0x20, 0x93, 0x5d, 0x22, 0x28, 0x70, 0xef, 0x26, 0x60, 0x91, 0xdb, 0xef, 0x41, 0x3e, + 0x94, 0x69, 0x13, 0x9e, 0x62, 0x49, 0x0b, 0x44, 0xa6, 0xe2, 0xdf, 0x1f, 0x69, 0xd4, 0xa5, 0x48, + 0x75, 0xfd, 0xb7, 0xff, 0xbd, 0xb2, 0xf0, 0xdb, 0xf3, 0x95, 0xc8, 0xef, 0xce, 0x57, 0x22, 0xbf, + 0x3f, 0x5f, 0x89, 0xfc, 0xd7, 0xf9, 0x4a, 0xe4, 0x6f, 0xff, 0xb0, 0xb2, 0xf0, 0xbb, 0x3f, 0xac, + 0x2c, 0xfc, 0xfe, 0x0f, 0x2b, 0x0b, 0xdf, 0x4f, 0xb2, 0x7f, 0x1e, 0xe7, 0xff, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x1f, 0x55, 0x83, 0x25, 0x89, 0x47, 0x00, 0x00, } func (this *ForeignKeyReference) Equal(that interface{}) bool { @@ -5704,6 +5708,9 @@ func (this *TableDescriptor_SequenceOpts) Equal(that interface{}) bool { if this.CacheSize != that1.CacheSize { return false } + if this.AsIntegerType != that1.AsIntegerType { + return false + } return true } func (this *TableDescriptor_SequenceOpts_SequenceOwner) Equal(that interface{}) bool { @@ -8354,6 +8361,11 @@ func (m *TableDescriptor_SequenceOpts) MarshalToSizedBuffer(dAtA []byte) (int, e _ = i var l int _ = l + i -= len(m.AsIntegerType) + copy(dAtA[i:], m.AsIntegerType) + i = encodeVarintStructured(dAtA, i, uint64(len(m.AsIntegerType))) + i-- + dAtA[i] = 0x42 i = encodeVarintStructured(dAtA, i, uint64(m.CacheSize)) i-- dAtA[i] = 0x38 @@ -10020,6 +10032,8 @@ func (m *TableDescriptor_SequenceOpts) Size() (n int) { l = m.SequenceOwner.Size() n += 1 + l + sovStructured(uint64(l)) n += 1 + sovStructured(uint64(m.CacheSize)) + l = len(m.AsIntegerType) + n += 1 + l + sovStructured(uint64(l)) return n } @@ -17278,6 +17292,38 @@ func (m *TableDescriptor_SequenceOpts) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AsIntegerType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStructured + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStructured + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStructured + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AsIntegerType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStructured(dAtA[iNdEx:]) diff --git a/pkg/sql/catalog/descpb/structured.proto b/pkg/sql/catalog/descpb/structured.proto index 24d3f08d1e04..ff2404b18a32 100644 --- a/pkg/sql/catalog/descpb/structured.proto +++ b/pkg/sql/catalog/descpb/structured.proto @@ -1095,10 +1095,12 @@ message TableDescriptor { } optional SequenceOwner sequence_owner = 6 [(gogoproto.nullable) = false]; - // The number of values (which have already been created in KV) // that a node can cache locally. optional int64 cache_size = 7 [(gogoproto.nullable) = false]; + // AS option value for CREATE SEQUENCE, which specifies the default + // min and max values a sequence can take on. + optional string as_integer_type = 8 [(gogoproto.nullable) = false]; } // The presence of sequence_opts indicates that this descriptor is for a sequence. diff --git a/pkg/sql/logictest/testdata/logic_test/sequences b/pkg/sql/logictest/testdata/logic_test/sequences index baf95e02587a..10bb355abf3f 100644 --- a/pkg/sql/logictest/testdata/logic_test/sequences +++ b/pkg/sql/logictest/testdata/logic_test/sequences @@ -114,10 +114,6 @@ CREATE SEQUENCE zero_test INCREMENT 0 statement ok CREATE SEQUENCE high_minvalue_test MINVALUE 5 -# Test unimplemented syntax. -statement error at or near "EOF": syntax error: unimplemented -CREATE SEQUENCE err_test AS INT2 - # Verify validation of START vs MINVALUE/MAXVALUE. statement error pgcode 22023 START value \(11\) cannot be greater than MAXVALUE \(10\) @@ -1894,3 +1890,78 @@ query I SELECT nextval('seq_txn') ---- 612 + +# Verify CREATE SEQUENCE ... AS works as expected. +statement ok +CREATE SEQUENCE seqas_0 AS smallint + +statement ok +CREATE SEQUENCE seqas_1 AS int4 + +statement ok +CREATE SEQUENCE seqas_2 AS bigint + +statement ok +CREATE SEQUENCE public.seqas_3 AS int2 START WITH -4 INCREMENT BY -3 + +query TT colnames +SHOW CREATE SEQUENCE seqas_3 +---- +table_name create_statement +seqas_3 CREATE SEQUENCE public.seqas_3 AS INT2 MINVALUE -32768 MAXVALUE -1 INCREMENT -3 START -4 + +statement ok +CREATE SEQUENCE seqas_4 AS integer + +query TT colnames +SHOW CREATE SEQUENCE seqas_4 +---- +table_name create_statement +seqas_4 CREATE SEQUENCE public.seqas_4 AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1 + +statement ok +CREATE SEQUENCE seqas_5 AS int8 + +statement error pgcode 22023 pq: MAXVALUE \(2000000\) must be less than \(32767\) for type INT2 +CREATE SEQUENCE public.seqas_6 AS smallint MAXVALUE 2000000 + +statement error pgcode 22023 pq: MINVALUE \(-2000000\) must be greater than \(-32768\) for type INT2 +CREATE SEQUENCE public.seqas_7 AS smallint MINVALUE -2000000 + +statement error pgcode 22023 pq: MINVALUE \(-9999999999999999\) must be greater than \(-2147483648\) for type INT4 +CREATE SEQUENCE seqas_8 as int4 INCREMENT BY -1 MINVALUE -9999999999999999; + +statement ok +SET default_int_size=4 + +statement ok +CREATE SEQUENCE seqas_9 AS integer + +query TT colnames +SHOW CREATE SEQUENCE seqas_9 +---- +table_name create_statement +seqas_9 CREATE SEQUENCE public.seqas_9 AS INT4 MINVALUE 1 MAXVALUE 2147483647 INCREMENT 1 START 1 + +statement ok +ALTER SEQUENCE seqas_9 AS smallint + +query TT colnames +SHOW CREATE SEQUENCE seqas_9 +---- +table_name create_statement +seqas_9 CREATE SEQUENCE public.seqas_9 AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1 + +statement ok +CREATE SEQUENCE seqas_10 +AS integer +START WITH 1 +INCREMENT BY 1 +MAXVALUE 9001 +CACHE 1 + +query TT colnames +SHOW CREATE SEQUENCE seqas_10 +---- +table_name create_statement +seqas_10 CREATE SEQUENCE public.seqas_10 AS INT4 MINVALUE 1 MAXVALUE 9001 INCREMENT 1 START 1 diff --git a/pkg/sql/parser/parse_test.go b/pkg/sql/parser/parse_test.go index 1202e2f4c854..8c428b7fba23 100644 --- a/pkg/sql/parser/parse_test.go +++ b/pkg/sql/parser/parse_test.go @@ -478,8 +478,6 @@ func TestUnimplementedSyntax(t *testing.T) { {`CREATE TEMP TABLE IF NOT EXISTS b AS SELECT a FROM a ON COMMIT DROP`, 46556, `drop`, ``}, {`CREATE TEMP TABLE IF NOT EXISTS b AS SELECT a FROM a ON COMMIT DELETE ROWS`, 46556, `delete rows`, ``}, - {`CREATE SEQUENCE a AS DOUBLE PRECISION`, 25110, `FLOAT8`, ``}, - {`CREATE RECURSIVE VIEW a AS SELECT b`, 0, `create recursive view`, ``}, {`CREATE TYPE a AS (b)`, 27792, ``, ``}, diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index 3215dc3faff1..f5b62b343256 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -1630,6 +1630,7 @@ alter_view_stmt: // %Category: DDL // %Text: // ALTER SEQUENCE [IF EXISTS] +// [AS ] // [INCREMENT ] // [MINVALUE | NO MINVALUE] // [MAXVALUE | NO MAXVALUE] @@ -7259,6 +7260,7 @@ reference_action: // %Category: DDL // %Text: // CREATE [TEMPORARY | TEMP] SEQUENCE +// [AS ] // [INCREMENT ] // [MINVALUE | NO MINVALUE] // [MAXVALUE | NO MAXVALUE] @@ -7298,7 +7300,15 @@ sequence_option_list: | sequence_option_list sequence_option_elem { $$.val = append($1.seqOpts(), $2.seqOpt()) } sequence_option_elem: - AS typename { return unimplementedWithIssueDetail(sqllex, 25110, $2.typeReference().SQLString()) } + AS typename { + // Valid option values must be integer types (ex. int2, bigint) + parsedType := $2.colType() + if parsedType.Family() != types.IntFamily { + sqllex.Error(fmt.Sprintf("invalid integer type: %q", $2)) + return 1 + } + $$.val = tree.SequenceOption{Name: tree.SeqOptAs, AsIntegerType: parsedType} + } | CYCLE { /* SKIP DOC */ $$.val = tree.SequenceOption{Name: tree.SeqOptCycle} } | NO CYCLE { $$.val = tree.SequenceOption{Name: tree.SeqOptNoCycle} } diff --git a/pkg/sql/parser/testdata/create_sequence b/pkg/sql/parser/testdata/create_sequence index 7a084515d90f..a39867ff5a91 100644 --- a/pkg/sql/parser/testdata/create_sequence +++ b/pkg/sql/parser/testdata/create_sequence @@ -173,3 +173,35 @@ CREATE SEQUENCE a OWNED BY NONE CREATE SEQUENCE a OWNED BY NONE -- fully parenthesized CREATE SEQUENCE a OWNED BY NONE -- literals removed CREATE SEQUENCE _ OWNED BY NONE -- identifiers removed + +parse +CREATE SEQUENCE a AS integer +---- +CREATE SEQUENCE a AS INT8 -- normalized! +CREATE SEQUENCE a AS INT8 -- fully parenthesized +CREATE SEQUENCE a AS INT8 -- literals removed +CREATE SEQUENCE _ AS INT8 -- identifiers removed + +parse +CREATE SEQUENCE a AS int +---- +CREATE SEQUENCE a AS INT8 -- normalized! +CREATE SEQUENCE a AS INT8 -- fully parenthesized +CREATE SEQUENCE a AS INT8 -- literals removed +CREATE SEQUENCE _ AS INT8 -- identifiers removed + +parse +CREATE SEQUENCE a AS bigint +---- +CREATE SEQUENCE a AS INT8 -- normalized! +CREATE SEQUENCE a AS INT8 -- fully parenthesized +CREATE SEQUENCE a AS INT8 -- literals removed +CREATE SEQUENCE _ AS INT8 -- identifiers removed + +parse +CREATE SEQUENCE a AS smallint +---- +CREATE SEQUENCE a AS INT2 -- normalized! +CREATE SEQUENCE a AS INT2 -- fully parenthesized +CREATE SEQUENCE a AS INT2 -- literals removed +CREATE SEQUENCE _ AS INT2 -- identifiers removed diff --git a/pkg/sql/sem/tree/create.go b/pkg/sql/sem/tree/create.go index 4bff09dcf945..e4b9769f2512 100644 --- a/pkg/sql/sem/tree/create.go +++ b/pkg/sql/sem/tree/create.go @@ -1588,6 +1588,10 @@ func (node *SequenceOptions) Format(ctx *FmtCtx) { option := &(*node)[i] ctx.WriteByte(' ') switch option.Name { + case SeqOptAs: + ctx.WriteString(option.Name) + ctx.WriteByte(' ') + ctx.WriteString(option.AsIntegerType.SQLString()) case SeqOptCycle, SeqOptNoCycle: ctx.WriteString(option.Name) case SeqOptCache: @@ -1662,6 +1666,9 @@ func (node *SequenceOptions) Format(ctx *FmtCtx) { type SequenceOption struct { Name string + // AsIntegerType specifies default min and max values of a sequence. + AsIntegerType *types.T + IntVal *int64 OptionalWord bool diff --git a/pkg/sql/sequence.go b/pkg/sql/sequence.go index eedbd3f5ae63..13aa750fdc4a 100644 --- a/pkg/sql/sequence.go +++ b/pkg/sql/sequence.go @@ -32,6 +32,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/sem/builtins" "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" "github.com/cockroachdb/cockroach/pkg/sql/sqlerrors" + "github.com/cockroachdb/cockroach/pkg/sql/types" "github.com/cockroachdb/cockroach/pkg/util/errorutil/unimplemented" "github.com/cockroachdb/cockroach/pkg/util/log" "github.com/cockroachdb/errors" @@ -362,6 +363,55 @@ func readOnlyError(s string) error { "cannot execute %s in a read-only transaction", s) } +func setSequenceIntegerBounds( + opts *descpb.TableDescriptor_SequenceOpts, + integerType *types.T, + isAscending bool, + lowerIntBound *int64, + upperIntBound *int64, +) error { + opts.MinValue = math.MinInt64 + opts.MaxValue = math.MaxInt64 + + if isAscending { + opts.MinValue = 1 + + switch integerType { + case types.Int2: + opts.MaxValue = math.MaxInt16 + *upperIntBound = math.MaxInt16 + *lowerIntBound = math.MinInt16 + case types.Int4: + opts.MaxValue = math.MaxInt32 + *upperIntBound = math.MaxInt32 + *lowerIntBound = math.MinInt32 + case types.Int: + // Do nothing, it's the default. + default: + return pgerror.Newf(pgcode.InvalidParameterValue, + "CREATE SEQUENCE option AS received type %s, must be integer", integerType) + } + } else { + opts.MaxValue = -1 + switch integerType { + case types.Int2: + opts.MinValue = math.MinInt16 + *upperIntBound = math.MaxInt16 + *lowerIntBound = math.MinInt16 + case types.Int4: + opts.MinValue = math.MinInt32 + *upperIntBound = math.MaxInt32 + *lowerIntBound = math.MinInt32 + case types.Int: + // Do nothing, it's the default. + default: + return pgerror.Newf(pgcode.InvalidParameterValue, + "CREATE SEQUENCE option AS received type %s, must be integer", integerType) + } + } + return nil +} + // assignSequenceOptions moves options from the AST node to the sequence options descriptor, // starting with defaults and overriding them with user-provided options. func assignSequenceOptions( @@ -372,11 +422,21 @@ func assignSequenceOptions( sequenceID descpb.ID, sequenceParentID descpb.ID, ) error { - // All other defaults are dependent on the value of increment, - // i.e. whether the sequence is ascending or descending. + + // Set the default integer type of a sequence. + var integerType = types.Int + var upperIntBound = int64(math.MaxInt64) + var lowerIntBound = int64(math.MinInt64) + + // All other defaults are dependent on the value of increment + // and the AS integerType. (i.e. whether the sequence is ascending + // or descending, bigint vs. smallint) for _, option := range optsNode { if option.Name == tree.SeqOptIncrement { opts.Increment = *option.IntVal + } else if option.Name == tree.SeqOptAs { + integerType = option.AsIntegerType + opts.AsIntegerType = integerType.SQLString() } } if opts.Increment == 0 { @@ -400,6 +460,13 @@ func assignSequenceOptions( opts.CacheSize = 1 } + // Set default MINVALUE and MAXVALUE if AS option value for integer type is specified. + if opts.AsIntegerType != "" { + if err := setSequenceIntegerBounds(opts, integerType, isAscending, &lowerIntBound, &upperIntBound); err != nil { + return err + } + } + // Fill in all other options. optionsSeen := map[string]bool{} for _, option := range optsNode { @@ -429,11 +496,21 @@ func assignSequenceOptions( // A value of nil represents the user explicitly saying `NO MINVALUE`. if option.IntVal != nil { opts.MinValue = *option.IntVal + if *option.IntVal < lowerIntBound { + return pgerror.Newf(pgcode.InvalidParameterValue, + "MINVALUE (%d) must be greater than (%d) for type %s", + *option.IntVal, lowerIntBound, integerType.SQLString()) + } } case tree.SeqOptMaxValue: // A value of nil represents the user explicitly saying `NO MAXVALUE`. if option.IntVal != nil { opts.MaxValue = *option.IntVal + if *option.IntVal > upperIntBound { + return pgerror.Newf(pgcode.InvalidParameterValue, + "MAXVALUE (%d) must be less than (%d) for type %s", + *option.IntVal, upperIntBound, integerType.SQLString()) + } } case tree.SeqOptStart: opts.Start = *option.IntVal diff --git a/pkg/sql/sequence_test.go b/pkg/sql/sequence_test.go index 6333f68350f3..e44c1b2d605c 100644 --- a/pkg/sql/sequence_test.go +++ b/pkg/sql/sequence_test.go @@ -24,6 +24,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/catalog" "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkeys" "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" + "github.com/cockroachdb/cockroach/pkg/sql/tests" "github.com/cockroachdb/cockroach/pkg/testutils/serverutils" "github.com/cockroachdb/cockroach/pkg/testutils/sqlutils" "github.com/cockroachdb/cockroach/pkg/testutils/testcluster" @@ -828,3 +829,140 @@ func breakOwnershipMapping( ) require.NoError(t, err) } + +func TestSequenceAsOption(t *testing.T) { + defer leaktest.AfterTest(t)() + defer log.Scope(t).Close(t) + + ctx := context.Background() + params, _ := tests.CreateTestServerParams() + s, sqlDBRaw, _ := serverutils.StartServer(t, params) + sqlDB := sqlutils.MakeSQLRunner(sqlDBRaw) + defer s.Stopper().Stop(ctx) + + tests := []struct { + name string + data string + verifyQuery string + err string + expected [][]string + }{ + { + name: "as integer", + data: ` + CREATE SEQUENCE public.a_seq AS integer + START WITH 2 + INCREMENT BY 1 + MINVALUE 0 + MAXVALUE 234567 + CACHE 1;`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + expected: [][]string{{ + "a_seq", `CREATE SEQUENCE public.a_seq AS INT8 MINVALUE 0 MAXVALUE 234567 INCREMENT 1 START 2`, + }}, + }, + { + name: "as smallint desc", + data: ` + CREATE SEQUENCE public.a_seq AS smallint + START WITH -4 + INCREMENT BY -3`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + expected: [][]string{{ + "a_seq", `CREATE SEQUENCE public.a_seq AS INT2 MINVALUE -32768 MAXVALUE -1 INCREMENT -3 START -4`, + }}, + }, + { + name: "start value out of bounds", + data: ` + CREATE SEQUENCE public.a_seq AS smallint + START WITH 45678 + INCREMENT BY 1;`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + err: `START value`, + }, + { + name: "invalid syntax string", + data: ` + CREATE SEQUENCE public.a_seq + AS string + START WITH 1 + INCREMENT BY 1 + CACHE 1;`, + err: `syntax error`, + }, + { + name: "min out of inttype bounds", + data: ` + CREATE SEQUENCE public.a_seq + AS smallint + START WITH 1 + INCREMENT BY 1 + MINVALUE -1000000 + CACHE 1;`, + err: `must be greater than`, + }, + { + name: "max out of inttype bounds", + data: ` + CREATE SEQUENCE public.a_seq + AS smallint + START WITH 1 + INCREMENT BY 1 + MAXVALUE 123456 + CACHE 1;`, + err: `must be less than`, + }, + { + name: `MAXINT overrides integer type default max`, + data: `CREATE SEQUENCE public.a_seq + AS integer + START WITH 1 + INCREMENT BY 1 + MAXVALUE 9001 + CACHE 1;`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + expected: [][]string{{ + "a_seq", `CREATE SEQUENCE public.a_seq AS INT8 MINVALUE 1 MAXVALUE 9001 INCREMENT 1 START 1`, + }}, + }, + { + name: `alter sequence`, + data: `CREATE SEQUENCE public.a_seq AS integer; + ALTER SEQUENCE public.a_seq AS smallint`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + expected: [][]string{{ + "a_seq", `CREATE SEQUENCE public.a_seq AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1`, + }}, + }, + { + name: `alter sequence desc`, + data: `CREATE SEQUENCE public.a_seq AS integer; + ALTER SEQUENCE public.a_seq AS smallint INCREMENT -1`, + verifyQuery: `SHOW CREATE SEQUENCE a_seq`, + expected: [][]string{{ + "a_seq", `CREATE SEQUENCE public.a_seq AS INT2 MINVALUE -32768 MAXVALUE -1 INCREMENT -1 START -1`, + }}, + }, + } + for _, test := range tests { + + t.Run(test.name, func(t *testing.T) { + // Set up clean testing environment. + sqlDB.Exec(t, `DROP SEQUENCE IF EXISTS a_seq`) + query := test.data + + if test.err != "" { + sqlDB.ExpectErr(t, test.err, query) + sqlDB.ExpectErr(t, `relation "a_seq" does not exist`, `DROP SEQUENCE a_seq`) + + } else { + + // Verify expected behavior of CREATE SEQUENCE AS option. + sqlDB.Exec(t, query) + sqlDB.CheckQueryResults(t, test.verifyQuery, test.expected) + sqlDB.Exec(t, `DROP SEQUENCE a_seq`) + } + }) + } +} diff --git a/pkg/sql/show_create_clauses.go b/pkg/sql/show_create_clauses.go index dcf8dd220f03..07e668f61814 100644 --- a/pkg/sql/show_create_clauses.go +++ b/pkg/sql/show_create_clauses.go @@ -344,6 +344,9 @@ func ShowCreateSequence( f.WriteString("SEQUENCE ") f.FormatNode(tn) opts := desc.GetSequenceOpts() + if opts.AsIntegerType != "" { + f.Printf(" AS %s", opts.AsIntegerType) + } f.Printf(" MINVALUE %d", opts.MinValue) f.Printf(" MAXVALUE %d", opts.MaxValue) f.Printf(" INCREMENT %d", opts.Increment) diff --git a/pkg/sql/show_test.go b/pkg/sql/show_test.go index 739422750312..2c3b1a5edcf4 100644 --- a/pkg/sql/show_test.go +++ b/pkg/sql/show_test.go @@ -416,6 +416,38 @@ func TestShowCreateSequence(t *testing.T) { `CREATE SEQUENCE %s INCREMENT 5 MAXVALUE 10000 START 10 MINVALUE 0 CACHE 10`, `CREATE SEQUENCE public.%s MINVALUE 0 MAXVALUE 10000 INCREMENT 5 START 10 CACHE 10`, }, + { + `CREATE SEQUENCE %s AS smallint`, + `CREATE SEQUENCE public.%s AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1`, + }, + { + `CREATE SEQUENCE %s AS int2`, + `CREATE SEQUENCE public.%s AS INT2 MINVALUE 1 MAXVALUE 32767 INCREMENT 1 START 1`, + }, + // Int type is determined by `default_int_size` in cluster settings. Default is int8. + { + `CREATE SEQUENCE %s AS int`, + `CREATE SEQUENCE public.%s AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1`, + }, + { + `CREATE SEQUENCE %s AS bigint`, + `CREATE SEQUENCE public.%s AS INT8 MINVALUE 1 MAXVALUE 9223372036854775807 INCREMENT 1 START 1`, + }, + // Override int/bigint's max value with user configured max value. + { + `CREATE SEQUENCE %s AS integer MINVALUE -5 MAXVALUE 9001`, + `CREATE SEQUENCE public.%s AS INT8 MINVALUE -5 MAXVALUE 9001 INCREMENT 1 START -5`, + }, + { + ` + CREATE SEQUENCE %s AS integer + START WITH -20000 + INCREMENT BY -1 + MINVALUE -20000 + MAXVALUE 0 + CACHE 1;`, + `CREATE SEQUENCE public.%s AS INT8 MINVALUE -20000 MAXVALUE 0 INCREMENT -1 START -20000`, + }, } for i, test := range tests { t.Run(fmt.Sprint(i), func(t *testing.T) {