diff --git a/.github/workflows/parser-regen.yml b/.github/workflows/parser-regen.yml new file mode 100644 index 000000000..5204e00a3 --- /dev/null +++ b/.github/workflows/parser-regen.yml @@ -0,0 +1,27 @@ +name: parser-regen +on: + push: + tags: + - v* + branches: + - master + - main + pull_request: +permissions: + contents: read +jobs: + regen: + name: generated parser matches grammar + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v7.0.0 + with: + go-version: "1.26.6" + - name: Checkout code + uses: actions/checkout@v7 + - name: Regenerate parser from grammar + run: | + rm -f pkg/parser/parser.go pkg/parser/hintparser.go + make -C pkg/parser + - name: Verify generated files match the checked-in ones + run: git diff --exit-code diff --git a/.gitignore b/.gitignore index d19acf335..e9f21b927 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ lint-error.logs .goose bin/ +genkeyword +bin/ +y.output +pkg/parser/goyacc/goyacc diff --git a/AGENTS.md b/AGENTS.md index 7adc7c9b6..b71a053fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -165,7 +165,7 @@ pkg/ table/ → Chunking strategies (optimistic, composite, multi) checksum/ → Post-copy data verification (CRC32 + BIT_XOR) dbconn/ → MySQL connection management, TLS, retries, locking, kill logic - statement/ → SQL parsing via TiDB parser (ALTER, CREATE, DROP, RENAME) + statement/ → SQL parsing via pkg/parser (ALTER, CREATE, DROP, RENAME) lint/ → Static analysis framework for schemas and DDL (built-in linters) fmt/ → Schema file formatter (canonicalize CREATE TABLE .sql files) throttler/ → Rate limiting interface (noop, mock, replica-lag based) @@ -224,9 +224,9 @@ Three chunker implementations: - **MultiChunker** — wraps multiple child chunkers for multi-table operations ### `pkg/statement` -Uses the [TiDB parser](https://github.com/pingcap/tidb/tree/master/pkg/parser) for SQL parsing. If a DDL cannot be parsed by TiDB, Spirit cannot execute it. `create_table.go` provides structured `CREATE TABLE` parsing (the `CreateTable` struct and its parse/diff methods). +Uses [pkg/parser](pkg/parser/README.md) (Spirit's MySQL-only fork of the TiDB parser) for SQL parsing. If a DDL cannot be parsed, Spirit cannot execute it. `create_table.go` provides structured `CREATE TABLE` parsing (the `CreateTable` struct and its parse/diff methods). -**Normalization pipeline:** MySQL rewrites many constructs when it stores a table (inline `PRIMARY KEY`/`UNIQUE` → table-level, column `CHECK` hoisted to table-level, `int(11)` → `int`, the legacy `BINARY` attribute → a `_bin` collation). To stop a hand-written schema from diffing spuriously against a live `SHOW CREATE TABLE`, `ParseCreateTable` runs a registry of **normalization rules** over the parsed `CreateTable` before returning it. Each rule is a `Normalizer` (`normalize.go`) that self-registers via `init()` in its own `normalize_*.go` file and rewrites the struct's fields in place (never `Raw`). Rules run after the struct is fully parsed, so they are order-independent. Consequence: `CreateTable.Diff` **assumes normalized input**. The TiDB parser already folds most type *aliases* (`BOOL`→`tinyint(1)`, `SERIAL`→`bigint unsigned … UNIQUE`, `INTEGER`→`int`), so rules only handle what the parser leaves alone. See `pkg/statement/README.md` for the full concept and rule list. +**Normalization pipeline:** MySQL rewrites many constructs when it stores a table (inline `PRIMARY KEY`/`UNIQUE` → table-level, column `CHECK` hoisted to table-level, `int(11)` → `int`, the legacy `BINARY` attribute → a `_bin` collation). To stop a hand-written schema from diffing spuriously against a live `SHOW CREATE TABLE`, `ParseCreateTable` runs a registry of **normalization rules** over the parsed `CreateTable` before returning it. Each rule is a `Normalizer` (`normalize.go`) that self-registers via `init()` in its own `normalize_*.go` file and rewrites the struct's fields in place (never `Raw`). Rules run after the struct is fully parsed, so they are order-independent. Consequence: `CreateTable.Diff` **assumes normalized input**. The parser already folds most type *aliases* (`BOOL`→`tinyint(1)`, `SERIAL`→`bigint unsigned … UNIQUE`, `INTEGER`→`int`), so rules only handle what the parser leaves alone. See `pkg/statement/README.md` for the full concept and rule list. ### `pkg/lint` Built-in linters auto-register via `init()`. Each linter is in its own file (`lint_.go`). To add a new linter, create a new file following the existing pattern and implement the `Linter` interface from `linter.go`. @@ -308,8 +308,8 @@ Normalization canonicalizes a parsed `CreateTable` so a user-written schema matc 3. Mutate the **structured** fields of `CreateTable` (`Columns`, `Indexes`, …) and return the same instance — never touch `Raw` 4. Keep the rule order-independent (it runs after the struct is fully parsed) and follow an existing rule (e.g., `normalize_integer_display_width.go`) -### Working with the TiDB parser -All SQL parsing goes through `pkg/statement/`. Do not parse SQL manually. The `Statement` type wraps parsed DDL and provides safety analysis methods. +### Working with the parser +All SQL parsing goes through `pkg/statement/` (built on `pkg/parser`, Spirit's fork of the TiDB parser). Do not parse SQL manually. The `Statement` type wraps parsed DDL and provides safety analysis methods. ### Database connections Always use `pkg/dbconn` for MySQL connections. Never create raw `sql.Open()` calls in production code (test utilities are the exception). The `DBConn` type handles retries, TLS, and connection pooling. diff --git a/README.md b/README.md index 06e42f509..a10cf74ae 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ Writing a new data migration tool is scary, since bugs have real consequences (d We have also tried to balance making Spirit _as fast as possible_ while still being safe to run on production systems that are running existing workloads. Sometimes this means spirit might venture into creating slow downs in application performance. If it does, please file an issue and help us make improvements. -We make extensive use of the TiDB parser. If a DDL statement can not be parsed by TiDB, it will not be possible to execute it. Usually this is not a problem, but there can be [edge-cases](https://github.com/pingcap/tidb/issues/54700). +We make extensive use of a SQL parser (see [pkg/parser](pkg/parser/README.md), a MySQL-only fork of the TiDB parser). If a DDL statement cannot be parsed, it will not be possible to execute it. Usually this is not a problem, but there can be edge-cases with unusual syntax. ## Development diff --git a/go.mod b/go.mod index 2c6e1fe81..0e893abe8 100644 --- a/go.mod +++ b/go.mod @@ -8,11 +8,10 @@ require ( github.com/go-mysql-org/go-mysql v1.16.1-0.20260731133054-6f853f178dc3 github.com/go-sql-driver/mysql v1.10.0 github.com/google/uuid v1.6.0 - github.com/pingcap/errors v0.11.5-0.20260310054046-9c8b3586e4b2 - github.com/pingcap/tidb/pkg/parser v0.0.0-20260504140133-511dba1dbe17 github.com/stretchr/testify v1.11.1 go.uber.org/goleak v1.3.0 golang.org/x/sync v0.22.0 + golang.org/x/text v0.36.0 ) require ( @@ -21,17 +20,15 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/goccy/go-json v0.10.6 // indirect github.com/klauspost/compress v1.18.6 // indirect - github.com/pingcap/failpoint v0.0.0-20260406204437-bbc9d102c19e // indirect + github.com/pingcap/errors v0.11.5-0.20260310054046-9c8b3586e4b2 // indirect github.com/pingcap/log v1.1.1-0.20260227082333-572e590d08f1 // indirect + github.com/pingcap/tidb/pkg/parser v0.0.0-20260504140133-511dba1dbe17 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/shopspring/decimal v1.4.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.28.0 // indirect - golang.org/x/text v0.36.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -replace github.com/pingcap/tidb/pkg/parser => github.com/block/tidb/pkg/parser v0.0.0-20260506200501-e528fd979fc8 diff --git a/go.sum b/go.sum index bca56e9e1..4b704c301 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,6 @@ github.com/alecthomas/kong v1.16.0 h1:g92/kUxBcdcTPOM79yE63viJgtcp5dNyrB3/O2cjYT github.com/alecthomas/kong v1.16.0/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I= github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs= github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/block/tidb/pkg/parser v0.0.0-20260506200501-e528fd979fc8 h1:+OfdTacrEyjlqcRUpBFX9uJ6ROBq6cUjwY4DClhnsdU= -github.com/block/tidb/pkg/parser v0.0.0-20260506200501-e528fd979fc8/go.mod h1:zDLDsfNBU5+L6T4J9/OgWAHc/WZvMUjbpgHqQ/t3yKo= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -36,10 +34,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/pingcap/errors v0.11.5-0.20260310054046-9c8b3586e4b2 h1:cLgCk5mwDG9lDH+dPK8TmEliTjyGJwwKN0qevWAl8IY= github.com/pingcap/errors v0.11.5-0.20260310054046-9c8b3586e4b2/go.mod h1:ktAJCA9lxrHHjVyVl2pKJFvzBnq2eZbb+CUOjBRPlXo= -github.com/pingcap/failpoint v0.0.0-20260406204437-bbc9d102c19e h1:il8go9El5o10EyPmalSG6Lg3zu2rtkq7c2wbRwBmdwo= -github.com/pingcap/failpoint v0.0.0-20260406204437-bbc9d102c19e/go.mod h1:jimwlLpI/XtwQdlZML15HS+j4rirvwZM0GLY07wwgOo= github.com/pingcap/log v1.1.1-0.20260227082333-572e590d08f1 h1:A2bEfgSb7hLwR9mxDszgGKweF+xY9YoTDG+8RjdFjDE= github.com/pingcap/log v1.1.1-0.20260227082333-572e590d08f1/go.mod h1:pxfz2oJfAuhwrb3/rcLqD//GS/5gRP4gD022iP3cEO0= +github.com/pingcap/tidb/pkg/parser v0.0.0-20260504140133-511dba1dbe17 h1:cfAVPis6GP6lxQgm1WGaNGi4rVXTB4KDvYf96LjqRCM= +github.com/pingcap/tidb/pkg/parser v0.0.0-20260504140133-511dba1dbe17/go.mod h1:zDLDsfNBU5+L6T4J9/OgWAHc/WZvMUjbpgHqQ/t3yKo= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/pkg/change/utils.go b/pkg/change/utils.go index bfe2219ce..39a4c91ba 100644 --- a/pkg/change/utils.go +++ b/pkg/change/utils.go @@ -5,12 +5,11 @@ import ( "database/sql" "fmt" + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/table" "github.com/block/spirit/pkg/utils" "github.com/go-mysql-org/go-mysql/replication" - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" ) func encodeSchemaTable(schema, table string) string { diff --git a/pkg/dbconn/sqlescape/utils.go b/pkg/dbconn/sqlescape/utils.go index a2b51b714..b6c2db763 100644 --- a/pkg/dbconn/sqlescape/utils.go +++ b/pkg/dbconn/sqlescape/utils.go @@ -17,13 +17,12 @@ package sqlescape import ( "encoding/json" + "fmt" "io" "reflect" "strconv" "strings" "time" - - "github.com/pingcap/errors" ) func reserveBuffer(buf []byte, appendSize int) []byte { @@ -143,20 +142,20 @@ func escapeSQL(sql string, args ...any) ([]byte, error) { switch ch { case 'n': if argPos >= len(args) { - return nil, errors.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) + return nil, fmt.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) } arg := args[argPos] argPos++ v, ok := arg.(string) if !ok { - return nil, errors.Errorf("expect a string identifier, got %v", arg) + return nil, fmt.Errorf("expect a string identifier, got %v", arg) } buf = appendEscapedIdentifier(buf, v) i++ // skip specifier case '?': if argPos >= len(args) { - return nil, errors.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) + return nil, fmt.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) } arg := args[argPos] argPos++ @@ -254,14 +253,14 @@ func escapeSQL(sql string, args ...any) ([]byte, error) { case reflect.String: buf = appendSQLArgString(buf, reflect.ValueOf(arg).String()) default: - return nil, errors.Errorf("unsupported %d-th argument: %v", argPos, arg) + return nil, fmt.Errorf("unsupported %d-th argument: %v", argPos, arg) } } } i++ // skip specifier case 'r': if argPos >= len(args) { - return nil, errors.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) + return nil, fmt.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) } arg := args[argPos] argPos++ @@ -271,7 +270,7 @@ func escapeSQL(sql string, args ...any) ([]byte, error) { // A plain string is rejected on purpose: the RawSQL conversion // at the call site is the explicit, greppable assertion that // this text is safe to splice verbatim. - return nil, errors.Errorf("expect sqlescape.RawSQL for %%r, got %T", arg) + return nil, fmt.Errorf("expect sqlescape.RawSQL for %%r, got %T", arg) } // Spliced verbatim: buf is never re-scanned, so %-sequences inside // v (e.g. COMMENT '100%new') are data, not format specifiers. diff --git a/pkg/fmt/fmt.go b/pkg/fmt/fmt.go index 1913c6612..459928a23 100644 --- a/pkg/fmt/fmt.go +++ b/pkg/fmt/fmt.go @@ -23,9 +23,9 @@ import ( "path/filepath" "strings" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" _ "github.com/go-sql-driver/mysql" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" "github.com/block/spirit/pkg/dbconn/sqlescape" "github.com/block/spirit/pkg/statement" diff --git a/pkg/lint/lint.go b/pkg/lint/lint.go index 335bb50ca..1139cb2cc 100644 --- a/pkg/lint/lint.go +++ b/pkg/lint/lint.go @@ -62,8 +62,8 @@ import ( "maps" "os" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) // Config holds linter configuration @@ -332,8 +332,6 @@ func AlterTableTypeToString(tp ast.AlterTableType) string { return "ALTER INDEX INVISIBLE" case ast.AlterTableOrderByColumns: return "ORDER BY" - case ast.AlterTableSetTiFlashReplica: - return "SET TIFLASH REPLICA" default: return fmt.Sprintf("ALTER TABLE (type %d)", tp) } diff --git a/pkg/lint/lint_allow_charset.go b/pkg/lint/lint_allow_charset.go index fd4a48f81..43e45bcaf 100644 --- a/pkg/lint/lint_allow_charset.go +++ b/pkg/lint/lint_allow_charset.go @@ -5,8 +5,8 @@ import ( "slices" "strings" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) func init() { diff --git a/pkg/lint/lint_auto_inc_capacity.go b/pkg/lint/lint_auto_inc_capacity.go index ee317728e..3d79590bc 100644 --- a/pkg/lint/lint_auto_inc_capacity.go +++ b/pkg/lint/lint_auto_inc_capacity.go @@ -6,8 +6,8 @@ import ( "strconv" "strings" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/mysql" ) func init() { diff --git a/pkg/lint/lint_datetime_index_position.go b/pkg/lint/lint_datetime_index_position.go index dd085db5a..14845bfa7 100644 --- a/pkg/lint/lint_datetime_index_position.go +++ b/pkg/lint/lint_datetime_index_position.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/mysql" ) type DatetimeIndexPositionLinter struct{} diff --git a/pkg/lint/lint_has_float.go b/pkg/lint/lint_has_float.go index a68a8687a..9a830e3f0 100644 --- a/pkg/lint/lint_has_float.go +++ b/pkg/lint/lint_has_float.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/mysql" ) type HasFloatLinter struct{} diff --git a/pkg/lint/lint_has_timestamp.go b/pkg/lint/lint_has_timestamp.go index b6eb66b50..e55bb3dc7 100644 --- a/pkg/lint/lint_has_timestamp.go +++ b/pkg/lint/lint_has_timestamp.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/mysql" ) type HasTimestampLinter struct{} diff --git a/pkg/lint/lint_index_visibility.go b/pkg/lint/lint_index_visibility.go index 0974149de..5161fc4ad 100644 --- a/pkg/lint/lint_index_visibility.go +++ b/pkg/lint/lint_index_visibility.go @@ -5,8 +5,8 @@ import ( "slices" "strings" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) func init() { diff --git a/pkg/lint/lint_invisible_index.go b/pkg/lint/lint_invisible_index.go index d92379eae..e3fd09c32 100644 --- a/pkg/lint/lint_invisible_index.go +++ b/pkg/lint/lint_invisible_index.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) func init() { diff --git a/pkg/lint/lint_primary_key_type.go b/pkg/lint/lint_primary_key_type.go index 44aab1185..711b5a722 100644 --- a/pkg/lint/lint_primary_key_type.go +++ b/pkg/lint/lint_primary_key_type.go @@ -6,8 +6,8 @@ import ( "slices" "strings" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/mysql" ) func init() { diff --git a/pkg/lint/lint_rename_column.go b/pkg/lint/lint_rename_column.go index 5508f6ee4..06e40327a 100644 --- a/pkg/lint/lint_rename_column.go +++ b/pkg/lint/lint_rename_column.go @@ -3,8 +3,8 @@ package lint import ( "fmt" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) // RenameColumnLinter detects column renames in ALTER TABLE statements. diff --git a/pkg/lint/lint_unsafe.go b/pkg/lint/lint_unsafe.go index ea91f16aa..35dbd5306 100644 --- a/pkg/lint/lint_unsafe.go +++ b/pkg/lint/lint_unsafe.go @@ -4,8 +4,8 @@ import ( "fmt" "github.com/block/spirit/pkg/dbconn/sqlescape" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" ) type UnsafeLinter struct { diff --git a/pkg/lint/lint_zero_date.go b/pkg/lint/lint_zero_date.go index 7adaf5aa9..252466398 100644 --- a/pkg/lint/lint_zero_date.go +++ b/pkg/lint/lint_zero_date.go @@ -4,10 +4,10 @@ import ( "fmt" "strings" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" - "github.com/pingcap/tidb/pkg/parser/mysql" ) type ZeroDateLinter struct{} @@ -64,10 +64,20 @@ func (l *ZeroDateLinter) checkColumnZeroDate(column *ast.ColumnDef, tableName st nullable = true case ast.ColumnOptionDefaultValue: if option.Expr != nil { + // Unwrap the expression-default parentheses so + // DEFAULT ('0000-00-00') is inspected like DEFAULT '0000-00-00'. + expr := option.Expr + for { + paren, ok := expr.(*ast.ParenthesesExpr) + if !ok { + break + } + expr = paren.Expr + } // Extract default value from expression using Restore var sb strings.Builder rCtx := format.NewRestoreCtx(format.DefaultRestoreFlags|format.RestoreStringWithoutCharset, &sb) - err := option.Expr.Restore(rCtx) + err := expr.Restore(rCtx) if err == nil { val := sb.String() // Remove surrounding quotes if present for string literals diff --git a/pkg/lint/post_state.go b/pkg/lint/post_state.go index eb1eb4a38..1f2546c32 100644 --- a/pkg/lint/post_state.go +++ b/pkg/lint/post_state.go @@ -5,9 +5,9 @@ import ( "slices" "strings" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/types" "github.com/block/spirit/pkg/statement" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/types" ) // PostState returns a deterministic post-state view of the schema: the existing diff --git a/pkg/migration/check/dropadd.go b/pkg/migration/check/dropadd.go index 1ac9cfe99..527bdb3b1 100644 --- a/pkg/migration/check/dropadd.go +++ b/pkg/migration/check/dropadd.go @@ -6,8 +6,7 @@ import ( "fmt" "log/slog" - "github.com/pingcap/tidb/pkg/parser/ast" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/ast" ) // Not tagged ScopeStatement: MySQL's native DDL, which Spirit attempts before diff --git a/pkg/migration/check/enumreorder.go b/pkg/migration/check/enumreorder.go index 2ac61e56b..5a5cf424c 100644 --- a/pkg/migration/check/enumreorder.go +++ b/pkg/migration/check/enumreorder.go @@ -5,8 +5,7 @@ import ( "fmt" "log/slog" - "github.com/pingcap/tidb/pkg/parser/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/mysql" ) func init() { diff --git a/pkg/migration/check/enumreorder_test.go b/pkg/migration/check/enumreorder_test.go index d8550d644..e9039f8cd 100644 --- a/pkg/migration/check/enumreorder_test.go +++ b/pkg/migration/check/enumreorder_test.go @@ -10,7 +10,6 @@ import ( "github.com/block/spirit/pkg/testutils" "github.com/block/spirit/pkg/utils" _ "github.com/go-sql-driver/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" "github.com/stretchr/testify/require" ) diff --git a/pkg/migration/check/enumsetremoval.go b/pkg/migration/check/enumsetremoval.go index 62e8e8cd5..9fbaf60d2 100644 --- a/pkg/migration/check/enumsetremoval.go +++ b/pkg/migration/check/enumsetremoval.go @@ -5,8 +5,7 @@ import ( "fmt" "log/slog" - "github.com/pingcap/tidb/pkg/parser/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/mysql" ) func init() { diff --git a/pkg/migration/check/enumsetremoval_test.go b/pkg/migration/check/enumsetremoval_test.go index 2dd917f38..d3515f8b0 100644 --- a/pkg/migration/check/enumsetremoval_test.go +++ b/pkg/migration/check/enumsetremoval_test.go @@ -10,7 +10,6 @@ import ( "github.com/block/spirit/pkg/testutils" "github.com/block/spirit/pkg/utils" _ "github.com/go-sql-driver/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" "github.com/stretchr/testify/require" ) diff --git a/pkg/migration/check/enumsetutil.go b/pkg/migration/check/enumsetutil.go index 85f8013f0..585a81ba2 100644 --- a/pkg/migration/check/enumsetutil.go +++ b/pkg/migration/check/enumsetutil.go @@ -5,8 +5,8 @@ import ( "log/slog" "strings" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/mysql" ) // requireCurrentColumnTypes reports whether Resources carries the table metadata diff --git a/pkg/migration/check/foreignkey.go b/pkg/migration/check/foreignkey.go index 1ba28fddc..2c6506f5f 100644 --- a/pkg/migration/check/foreignkey.go +++ b/pkg/migration/check/foreignkey.go @@ -5,9 +5,8 @@ import ( "errors" "log/slog" + "github.com/block/spirit/pkg/parser/ast" "github.com/block/spirit/pkg/utils" - "github.com/pingcap/tidb/pkg/parser/ast" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" ) func init() { diff --git a/pkg/migration/check/primarykey.go b/pkg/migration/check/primarykey.go index b7780bce6..17f99b57f 100644 --- a/pkg/migration/check/primarykey.go +++ b/pkg/migration/check/primarykey.go @@ -5,8 +5,7 @@ import ( "errors" "log/slog" - "github.com/pingcap/tidb/pkg/parser/ast" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/ast" ) func init() { diff --git a/pkg/migration/check/rename.go b/pkg/migration/check/rename.go index 73577efe3..3b6efbdf5 100644 --- a/pkg/migration/check/rename.go +++ b/pkg/migration/check/rename.go @@ -7,8 +7,7 @@ import ( "log/slog" "strings" - "github.com/pingcap/tidb/pkg/parser/ast" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/ast" ) // Not tagged ScopeStatement: renames are metadata-only, so MySQL's native DDL, diff --git a/pkg/migration/check/rename_test.go b/pkg/migration/check/rename_test.go index 67278e2ae..8480ff152 100644 --- a/pkg/migration/check/rename_test.go +++ b/pkg/migration/check/rename_test.go @@ -6,7 +6,6 @@ import ( "github.com/block/spirit/pkg/statement" "github.com/block/spirit/pkg/table" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" "github.com/stretchr/testify/require" ) diff --git a/pkg/migration/check/setreorder.go b/pkg/migration/check/setreorder.go index 7987314bf..9295b53fa 100644 --- a/pkg/migration/check/setreorder.go +++ b/pkg/migration/check/setreorder.go @@ -5,8 +5,7 @@ import ( "fmt" "log/slog" - "github.com/pingcap/tidb/pkg/parser/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/mysql" ) func init() { diff --git a/pkg/migration/check/setreorder_test.go b/pkg/migration/check/setreorder_test.go index 0c60fd89a..71636e2f2 100644 --- a/pkg/migration/check/setreorder_test.go +++ b/pkg/migration/check/setreorder_test.go @@ -10,7 +10,6 @@ import ( "github.com/block/spirit/pkg/testutils" "github.com/block/spirit/pkg/utils" _ "github.com/go-sql-driver/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" "github.com/stretchr/testify/require" ) diff --git a/pkg/migration/migration.go b/pkg/migration/migration.go index 838a95405..2c3201647 100644 --- a/pkg/migration/migration.go +++ b/pkg/migration/migration.go @@ -12,10 +12,10 @@ import ( "github.com/block/spirit/pkg/checksum" "github.com/block/spirit/pkg/dbconn/sqlescape" "github.com/block/spirit/pkg/migration/check" + "github.com/block/spirit/pkg/parser" "github.com/block/spirit/pkg/statement" "github.com/block/spirit/pkg/table" "github.com/block/spirit/pkg/utils" - "github.com/pingcap/tidb/pkg/parser" ) // defaultWriteThreads must match the `default:"4"` kong tag on diff --git a/pkg/migration/migration_test.go b/pkg/migration/migration_test.go index 20aaef654..755095bdb 100644 --- a/pkg/migration/migration_test.go +++ b/pkg/migration/migration_test.go @@ -18,7 +18,6 @@ import ( "github.com/block/spirit/pkg/testutils" "github.com/go-sql-driver/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" "github.com/stretchr/testify/require" "go.uber.org/goleak" ) diff --git a/pkg/migration/singleversion_test.go b/pkg/migration/singleversion_test.go index 6983e03b6..99734e67a 100644 --- a/pkg/migration/singleversion_test.go +++ b/pkg/migration/singleversion_test.go @@ -46,33 +46,38 @@ func TestUniqueOnNonUniqueData(t *testing.T) { } // TestUnparsableStatements tests that the behavior is expected in cases -// where we know the TiDB parser does not support the statement. We document -// that we require the TiDB parser to parse the statement for it to execute, +// where we know the parser does not support the statement. We document +// that we require the parser to parse the statement for it to execute, // which feels like a reasonable limitation based on its capabilities. -// Example TiDB bug: https://github.com/pingcap/tidb/issues/54700 +// The parser fork in pkg/parser removes limitations the TiDB parser had +// (e.g. https://github.com/pingcap/tidb/issues/57768, fixed here as +// https://github.com/block/spirit/issues/542), so this also covers cases +// that used to be unparsable and now work. func TestUnparsableStatements(t *testing.T) { t.Parallel() - // CREATE TABLE with BLOB DEFAULT — TiDB parser doesn't support this but MySQL does. + // CREATE TABLE with an expression default on a BLOB column. m := NewTestMigration(t, WithStatement(`CREATE TABLE t1parse (id int not null primary key auto_increment, b BLOB DEFAULT ('abc'))`)) require.NoError(t, m.Run()) - // ALTER TABLE with BLOB DEFAULT via --statement — fails because TiDB parser rejects it. + // ALTER TABLE with BLOB DEFAULT via --statement. This used to fail with + // Error 1101 because the TiDB parser restored DEFAULT ('abc') as the + // bare literal DEFAULT 'abc' (issue #542); the parser fork preserves + // the parentheses, so it now works. m = NewTestMigration(t, WithStatement("ALTER TABLE t1parse ADD COLUMN c BLOB DEFAULT ('abc')")) - err := m.Run() - require.Error(t, err) - require.ErrorContains(t, err, "can't have a default value") + require.NoError(t, m.Run()) - // ALTER TABLE with BLOB DEFAULT via the legacy --table/--alter path — works - // because the alter clause is executed verbatim, bypassing the parser - // restore limitation (issue #542). Dies with the legacy path. + // The same thing via the legacy --table/--alter path (this path always + // worked: the alter clause is executed verbatim, without a parser round + // trip). Adds c2 since the --statement run above already added c. + // Dies with the legacy path. m = NewTestMigration(t) m.Table = "t1parse" - m.Alter = "ADD COLUMN c BLOB DEFAULT ('abc')" + m.Alter = "ADD COLUMN c2 BLOB DEFAULT ('abc')" require.NoError(t, m.Run()) // CREATE TRIGGER — not supported. m = NewTestMigration(t, WithStatement("CREATE TRIGGER ins_sum BEFORE INSERT ON t1parse FOR EACH ROW SET @sum = @sum + NEW.b;")) - err = m.Run() + err := m.Run() require.Error(t, err) require.ErrorContains(t, err, "line 1 column 14 near \"TRIGGER") diff --git a/pkg/parser/LICENSE b/pkg/parser/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/pkg/parser/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/pkg/parser/Makefile b/pkg/parser/Makefile new file mode 100644 index 000000000..119a513bf --- /dev/null +++ b/pkg/parser/Makefile @@ -0,0 +1,29 @@ +.PHONY: all parser clean + +all: fmt parser + +parser: parser.go hintparser.go + +%arser.go: prefix = $(@:parser.go=) +%arser.go: %arser.y bin/goyacc + @echo "bin/goyacc -o $@ -p yy$(prefix) -t $(prefix)Parser $<" + @bin/goyacc -o $@ -p yy$(prefix) -t $(prefix)Parser $< || ( rm -f $@ && echo 'Please check y.output for more information' && exit 1 ) + @rm -f y.output + +%arser_golden.y: %arser.y + @bin/goyacc -fmt -fmtout $@ $< + @(git diff --no-index --exit-code $< $@ && rm $@) || (mv $@ $< && >&2 echo "formatted $<" && exit 1) + +# goyacc is a nested Go module (its own go.mod) so its modernc.org +# dependencies stay out of spirit's module graph. +bin/goyacc: goyacc/*.go + go build -C goyacc -o ../bin/goyacc . + +fmt: bin/goyacc parser_golden.y hintparser_golden.y + @echo "gofmt (simplify)" + @gofmt -s -l -w . 2>&1 | awk '{print} END{if(NR>0) {exit 1}}' + +clean: + go clean -i ./... + rm -rf *.out + rm -f parser.go hintparser.go diff --git a/pkg/parser/README.md b/pkg/parser/README.md new file mode 100644 index 000000000..89d7c2817 --- /dev/null +++ b/pkg/parser/README.md @@ -0,0 +1,124 @@ +# Parser + +A MySQL-compatible SQL parser, used by Spirit to parse DDL and understand +schemas. + +This package is a hard fork of the +[TiDB parser](https://github.com/pingcap/tidb/tree/master/pkg/parser) +(`github.com/pingcap/tidb/pkg/parser`), taken from upstream master as of +May 2026 (via `block/tidb@e528fd979fc8`, which added spatial type/index +support). We are grateful to PingCAP and the TiDB contributors for +building and maintaining an excellent MySQL-compatible parser for over a +decade — and for accepting many of our compatibility fixes upstream over +the years. The fork retains their Apache-2.0 license and copyright +headers. + +## Why fork? + +Spirit only needs to parse the MySQL dialect, and only cares about the +syntax a schema-change tool encounters. TiDB's parser necessarily carries +TiDB-specific extensions (TiDB system functions, hints, `ADMIN`/`BRIE` +statements, syntax bound to TiKV/TiFlash concepts) and some MariaDB +syntax. Forking lets us: + +- strip everything that is not MySQL, so what remains is auditable + against the MySQL manual; +- add the functionality we need quickly, without waiting on an upstream + release cadence; +- keep Spirit's dependency graph small (the parser no longer drags in + `pingcap/*` modules, `zap`, or their transitive dependencies). + +## What changed relative to upstream + +- **MySQL-only surface.** TiDB-specific statements, keywords, system + functions, optimizer hints, and MariaDB syntax (e.g. `SYSTEM_TIME` + partitioning, `ILIKE`, `FLUSH CLIENT_ERRORS_SUMMARY`) are removed. + The reserved-word set now matches MySQL 8.0 (see + [Testing](#testing-against-real-mysql)). +- **Smaller charset catalog.** Only the encodings the lexer actually + transforms remain (utf8/utf8mb4, ascii, latin1, binary); other charset + names are still recognized in DDL but are not transcoded. Custom + charset registration was removed. +- **Modern Go, stdlib errors.** The `terror`/`pingcap/errors` machinery + was replaced with plain wrapped errors (`errors.Is`/`As` work as + expected); `zap` logging was removed; the code passes this repo's + `golangci-lint` configuration. +- **Dead weight removed.** The legacy `Format(io.Writer)` pretty-printer, + the `driver` indirection, keyword-listing generators, and APIs unused + by Spirit are deleted. `deadcode -test ./...` reports only + interface-conformance markers. +- **Upstream fixes ported.** MySQL-compatibility fixes that landed in + TiDB after the fork base are ported when relevant (e.g. the parser + depth DoS guard, `INSERT ... AS row_alias`, dual-password syntax, + `SET_VAR` decimal hints, and `GROUP_CONCAT` separator charset + handling), as is the opt-in + `format.RestoreSkipRedundantParentheses` restore flag, which lets + expression `Restore` drop parentheses that MySQL's precedence and + associativity rules make unnecessary (`a + (b * c)` restores as + `a + b * c`; `a - (b - c)` keeps its parentheses). Spirit uses it to + canonicalize CHECK-constraint and generated-column expressions. +- **Fixes beyond upstream.** Parenthesized default values keep their + parentheses through a parse/restore round trip (`DEFAULT ('{}')` is an + ast.ParenthesesExpr): MySQL 8.0.13+ treats `DEFAULT ('{}')` and + `DEFAULT '{}'` as different DDL, and BLOB/TEXT/JSON/GEOMETRY columns + only accept the parenthesized form. The upstream parser still restores + both to the bare form (pingcap/tidb#57768). Keyword-named functions + also parse in DEFAULT expressions (`DEFAULT (point(0,0))` — the MySQL + manual's own expression-default example; upstream special-cases only + REPLACE), and the spatial constructors (`linestring()`, `polygon()`, + `multipoint()`, ...) parse as function calls in every expression + context — as keyword tokens they previously only worked as column + types (block/spirit#1128). + +The AST (`ast` package), `format` restore machinery, `charset`, `mysql` +constants, `opcode`, and `types` packages keep their upstream shapes, so +code written against the TiDB parser API generally ports with an import +change. + +## Usage + +```go +import ( + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" +) + +p := parser.New() +stmts, warns, err := p.ParseSQL("ALTER TABLE t1 ADD COLUMN b INT") +_ = warns +if err != nil { + // handle parse error +} +alter := stmts[0].(*ast.AlterTableStmt) +``` + +## Regenerating the parser + +`parser.go` and `hintparser.go` are generated from `parser.y` and +`hintparser.y` by [goyacc](https://gitlab.com/cznic/goyacc). After +editing a `.y` file: + +```bash +cd pkg/parser +make parser +``` + +The build fails if the grammar introduces shift/reduce or reduce/reduce +conflicts. Generated files are checked in; the `parser-regen` CI job +deletes them, regenerates from the grammar, and fails on any diff, so a +`.y` edit cannot ship without its regenerated output. + +## Testing against real MySQL + +Most tests run offline. One additional suite compares the grammar's +reserved-word set against a live MySQL server: + +```bash +MYSQL_DSN="user:pass@tcp(127.0.0.1:3306)/" \ + go test -tags reserved_words_test -run TestCompareReservedWordsWithMySQL ./pkg/parser +``` + +## License + +Apache License 2.0, same as the upstream TiDB parser. See the LICENSE +file at the repository root and the per-file copyright headers. diff --git a/pkg/parser/ast/ast.go b/pkg/parser/ast/ast.go new file mode 100644 index 000000000..6ed9b6e01 --- /dev/null +++ b/pkg/parser/ast/ast.go @@ -0,0 +1,114 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package ast is the abstract syntax tree parsed from a SQL statement by parser. +// It can be analysed and transformed by optimizer. +package ast + +import ( + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/types" +) + +// Node is the basic element of the AST. +// Interfaces embed Node should have 'Node' name suffix. +type Node interface { + // Restore returns the sql text from ast tree + Restore(ctx *format.RestoreCtx) error + // Accept accepts Visitor to visit itself. + // The returned node should replace original node. + // ok returns false to stop visiting. + // + // Implementation of this method should first call visitor.Enter, + // assign the returned node to its method receiver, if skipChildren returns true, + // children should be skipped. Otherwise, call its children in particular order that + // later elements depends on former elements. Finally, return visitor.Leave. + Accept(v Visitor) (node Node, ok bool) + // Text returns the utf8 encoding text of the element. + Text() string + // OriginalText returns the original text of the element. + OriginalText() string + // SetText sets original text to the Node. + SetText(enc charset.Encoding, text string) + // SetOriginTextPosition set the start offset of this node in the origin text. + // Only be called when `parser.lexer.skipPositionRecording` equals to false. + SetOriginTextPosition(offset int) + // OriginTextPosition get the start offset of this node in the origin text. + OriginTextPosition() int +} + +// Flags indicates whether an expression contains certain types of expression. +// ExprNode is a node that can be evaluated. +// Name of implementations should have 'Expr' suffix. +type ExprNode interface { + // Node is embedded in ExprNode. + Node + // SetType sets evaluation type to the expression. + SetType(tp *types.FieldType) + // GetType gets the evaluation type of the expression. + GetType() *types.FieldType +} + +// OptBinary is used for parser. +type OptBinary struct { + IsBinary bool + Charset string +} + +// FuncNode represents function call expression node. +type FuncNode interface { + ExprNode + functionExpression() +} + +// StmtNode represents statement node. +// Name of implementations should have 'Stmt' suffix. +type StmtNode interface { + Node + statement() +} + +// DDLNode represents DDL statement node. +type DDLNode interface { + StmtNode + ddlStatement() +} + +// DMLNode represents DML statement node. +type DMLNode interface { + StmtNode + dmlStatement() +} + +// ResultSetNode interface has a ResultFields property, represents a Node that returns result set. +// Implementations include SelectStmt, SubqueryExpr, TableSource, TableName, Join and SetOprStmt. +type ResultSetNode interface { + Node + + resultSet() +} + +// Visitor visits a Node. +type Visitor interface { + // Enter is called before children nodes are visited. + // The returned node must be the same type as the input node n. + // skipChildren returns true means children nodes should be skipped, + // this is useful when work is done in Enter and there is no need to visit children. + Enter(n Node) (node Node, skipChildren bool) + // Leave is called after children nodes have been visited. + // The returned node's type can be different from the input node if it is a ExprNode, + // Non-expression node must be the same type as the input node n. + // ok returns false to stop visiting. + Leave(n Node) (node Node, ok bool) +} diff --git a/pkg/parser/ast/base.go b/pkg/parser/ast/base.go new file mode 100644 index 000000000..ce81f0cf7 --- /dev/null +++ b/pkg/parser/ast/base.go @@ -0,0 +1,429 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "bytes" + "sync" + "unicode" + "unicode/utf8" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/types" + "github.com/block/spirit/pkg/parser/util" +) + +const hexDigits = "0123456789abcdef" + +// node is the struct implements Node interface except for Accept method. +// Node implementations should embed it in. +type node struct { + utf8Text string + enc charset.Encoding + noBackslashEscapes bool + once *sync.Once + + text string + offset int +} + +// SetOriginTextPosition implements Node interface. +func (n *node) SetOriginTextPosition(offset int) { + n.offset = offset +} + +// OriginTextPosition implements Node interface. +func (n *node) OriginTextPosition() int { + return n.offset +} + +// SetText implements Node interface. +func (n *node) SetText(enc charset.Encoding, text string) { + n.enc = enc + n.text = text + n.once = &sync.Once{} +} + +// SetNoBackslashEscapes marks that the SQL mode NO_BACKSLASH_ESCAPES was active +// when this node was parsed, so backslash is not treated as an escape character +// in string literals +func (n *node) SetNoBackslashEscapes(val bool) { + if n.noBackslashEscapes == val { + return + } + n.noBackslashEscapes = val + if n.once != nil { + n.once = &sync.Once{} + } +} + +// Text implements Node interface. +func (n *node) Text() string { + if n.once == nil { + return n.text + } + n.once.Do(func() { + if n.enc == nil { + n.utf8Text = n.text + return + } + n.utf8Text = convertBinaryStringLiterals(n.text, n.enc, n.noBackslashEscapes) + }) + return n.utf8Text +} + +// OriginalText implements Node interface. +func (n *node) OriginalText() string { + return n.text +} + +func isPrintable(s []byte) bool { + for len(s) > 0 { + r, size := utf8.DecodeRune(s) + if r == utf8.RuneError && size <= 1 { + return false + } + if unicode.IsControl(r) { + return false + } + s = s[size:] + } + return true +} + +func isIdentChar(b byte) bool { + return b == '_' || + (b >= '0' && b <= '9') || + (b >= 'a' && b <= 'z') || + (b >= 'A' && b <= 'Z') +} + +// needsSpaceBeforeHexLiteral returns true when replacing a quoted string with a +// hex literal would otherwise merge with a preceding identifier-like token +// (e.g. "_binary'...'" -> "_binary0x..."), producing invalid SQL. +func needsSpaceBeforeHexLiteral(utf8Text []byte, quoteStart int) bool { + if quoteStart <= 0 { + return false + } + return isIdentChar(utf8Text[quoteStart-1]) +} + +// convertBinaryStringLiterals processes raw SQL text, converting non-printable +// single- or double-quoted string literals to 0x hex literals and decoding +// everything else to UTF-8. +// +// The function first transforms the entire text to UTF-8 and then scans the +// UTF-8 result for string literal boundaries. This avoids ambiguity in +// encodings whose multibyte sequences can contain ASCII-range bytes (e.g. +// 0x5C backslash) as trail bytes — UTF-8 never reuses ASCII byte values in +// multibyte sequences, so quote and backslash detection is always correct. +// +// A parallel index into the original byte sequence is maintained so that +// non-printable strings can be hex-encoded from their original bytes. +// Quote bytes (0x22, 0x27) are below the trail-byte range of all supported +// multibyte encodings, so finding them in the original text is always safe. +func convertBinaryStringLiterals(text string, enc charset.Encoding, noBackslashEscapes bool) string { + src := charset.HackSlice(text) + + // Fast path: if no quotes, just transform the whole thing. + if bytes.IndexByte(src, '\'') < 0 && bytes.IndexByte(src, '"') < 0 { + result, _ := enc.Transform(nil, src, charset.OpDecodeReplace) + return charset.HackString(result) + } + + // Transform entire text to UTF-8 for safe scanning. + utf8Text, _ := enc.Transform(nil, src, charset.OpDecodeReplace) + + var buf *bytes.Buffer + lastCopiedIdx := 0 // tracks position in utf8Text for output assembly + origIdx := 0 // tracks position in src (original bytes) + i := 0 // scan position in utf8Text + + for i < len(utf8Text) { + // Skip SQL comments so that quote characters inside comments are not + // mistaken for string-literal boundaries. + if skipped := skipComment(utf8Text, src, &i, &origIdx); skipped { + continue + } + + if utf8Text[i] != '\'' && utf8Text[i] != '"' { + i++ + continue + } + + utf8QuoteStart := i + quote := utf8Text[i] + i++ + + // Find the corresponding opening quote in the original text. + origQuoteStart := advanceOrigTo(src, &origIdx, quote) + if origQuoteStart < 0 { + break + } + + // Find closing quote in UTF-8 text, keeping origIdx in sync. + terminated := false + var origQuoteEnd int + findClose: + for i < len(utf8Text) { + ch := utf8Text[i] + switch { + case ch == quote: + i++ + origClose := advanceOrigTo(src, &origIdx, quote) + if origClose < 0 { + break findClose + } + if i >= len(utf8Text) || utf8Text[i] != quote { + // Closing quote. + terminated = true + origQuoteEnd = origClose + 1 + break findClose + } + // Doubled quote escape — advance past second quote in original. + i++ + if advanceOrigTo(src, &origIdx, quote) < 0 { + break findClose + } + case ch == '\\' && !noBackslashEscapes && i+1 < len(utf8Text): + nextCh := utf8Text[i+1] + i += 2 + // If the escaped character is a quote byte, advance origIdx + // past the corresponding quote in the original text so the + // pairing stays in sync. + if nextCh == '\'' || nextCh == '"' { + if advanceOrigTo(src, &origIdx, nextCh) < 0 { + break findClose + } + } + default: + i++ + } + } + + if !terminated { + continue + } + + // Check printability by decoding the original string content. + // OpDecode returns an error if the bytes are invalid in the source encoding; + // isPrintable then rejects control characters in the decoded UTF-8. + decoded, err := enc.Transform(nil, src[origQuoteStart+1:origQuoteEnd-1], charset.OpDecode) + if err == nil && isPrintable(decoded) { + continue + } + + // Non-printable: extract content from original bytes and hex-encode. + var content []byte + j := origQuoteStart + 1 + origEnd := origQuoteEnd - 1 + for j < origEnd { + ch := src[j] + switch { + case ch == quote: + j++ + if j < origEnd && src[j] == quote { + content = append(content, quote) + j++ + } + case ch == '\\' && !noBackslashEscapes && j+1 < origEnd: + j++ + content = append(content, util.UnescapeChar(src[j])...) + j++ + default: + content = append(content, ch) + j++ + } + } + + // Lazy-allocate output buffer on first binary string found. + if buf == nil { + buf = &bytes.Buffer{} + buf.Grow(len(utf8Text)) + } + + buf.Write(utf8Text[lastCopiedIdx:utf8QuoteStart]) + if needsSpaceBeforeHexLiteral(utf8Text, utf8QuoteStart) { + buf.WriteByte(' ') + } + buf.WriteString("0x") + for _, b := range content { + buf.WriteByte(hexDigits[b>>4]) + buf.WriteByte(hexDigits[b&0xf]) + } + lastCopiedIdx = i + } + + if buf == nil { + return charset.HackString(utf8Text) + } + + if lastCopiedIdx < len(utf8Text) { + buf.Write(utf8Text[lastCopiedIdx:]) + } + return buf.String() +} + +// skipComment checks whether the current position in utf8Text is the start of +// a SQL comment. If so it advances *i past the comment in utf8Text and returns +// true. While scanning the comment bytes, it also advances *origIdx past any +// quote bytes (' or ") found inside the comment so that the dual-index pairing +// used by the caller for string-literal matching stays correct. Bytes that are +// not quote characters do NOT advance *origIdx. +// +// Recognised comment forms: +// - "--" followed by Unicode whitespace or end-of-input: line comment to EOL +// (matches lexer startWithDash which uses unicode.IsSpace) +// - "#": line comment to EOL +// - "/*" ... "*/": block comment, UNLESS the opener is "/*!" or "/*+" +// which are MySQL executable/hint comments whose content is parsed as SQL +// +// TiDB-specific "/*T!" and MariaDB "/*M!" comments are always skipped here +// because their executability depends on runtime feature gates that are not +// available in the ast package. This is conservative: string literals inside +// an actually-executed /*T![feature] block will not be hex-encoded by this +// fallback path, but the primary litRange path handles them correctly. +func skipComment(utf8Text, src []byte, i, origIdx *int) bool { + pos := *i + ch := utf8Text[pos] + + // -- line comment (MySQL requires whitespace after --, checked via + // unicode.IsSpace to match the lexer's startWithDash predicate). + if ch == '-' && pos+1 < len(utf8Text) && utf8Text[pos+1] == '-' { + if pos+2 >= len(utf8Text) || unicode.IsSpace(rune(utf8Text[pos+2])) { + skipToEOL(utf8Text, src, i, origIdx) + return true + } + } + + // # line comment + if ch == '#' { + skipToEOL(utf8Text, src, i, origIdx) + return true + } + + // /* */ block comment — only /*! and /*+ are executable (MySQL syntax). + if ch == '/' && pos+1 < len(utf8Text) && utf8Text[pos+1] == '*' { + if pos+2 < len(utf8Text) { + next := utf8Text[pos+2] + if next == '!' || next == '+' { + // MySQL version comment or optimizer hint — content is SQL. + return false + } + } + skipToBlockEnd(utf8Text, src, i, origIdx) + return true + } + + return false +} + +// skipToEOL advances *i to past the newline (or EOF) and advances *origIdx +// past any quote bytes encountered along the way, in a single pass. +func skipToEOL(utf8Text, src []byte, i, origIdx *int) { + for *i < len(utf8Text) { + ch := utf8Text[*i] + if ch == '\'' || ch == '"' { + advanceOrigTo(src, origIdx, ch) + } + *i++ + if ch == '\n' { + return + } + } +} + +// skipToBlockEnd advances *i past the closing "*/" (or EOF) and advances +// *origIdx past any quote bytes encountered along the way, in a single pass. +func skipToBlockEnd(utf8Text, src []byte, i, origIdx *int) { + // Skip past the opening "/*". + *i += 2 + for *i < len(utf8Text) { + ch := utf8Text[*i] + if ch == '\'' || ch == '"' { + advanceOrigTo(src, origIdx, ch) + } + if ch == '*' && *i+1 < len(utf8Text) && utf8Text[*i+1] == '/' { + *i += 2 // skip past "*/" + return + } + *i++ + } +} + +// advanceOrigTo scans src from *idx forward until it finds a byte equal to b. +// It returns the position of that byte and advances *idx past it, or returns -1 +// if not found. +func advanceOrigTo(src []byte, idx *int, b byte) int { + for *idx < len(src) { + if src[*idx] == b { + pos := *idx + *idx++ + return pos + } + *idx++ + } + return -1 +} + +// stmtNode implements StmtNode interface. +// Statement implementations should embed it in. +type stmtNode struct { + node +} + +// statement implements StmtNode interface. +func (sn *stmtNode) statement() {} + +// ddlNode implements DDLNode interface. +// DDL implementations should embed it in. +type ddlNode struct { + stmtNode +} + +// ddlStatement implements DDLNode interface. +func (dn *ddlNode) ddlStatement() {} + +// dmlNode is the struct implements DMLNode interface. +// DML implementations should embed it in. +type dmlNode struct { + stmtNode +} + +// dmlStatement implements DMLNode interface. +func (dn *dmlNode) dmlStatement() {} + +// exprNode is the struct implements Expression interface. +// Expression implementations should embed it in. +type exprNode struct { + node + Type types.FieldType +} + +// SetType implements ExprNode interface. +func (en *exprNode) SetType(tp *types.FieldType) { + en.Type = *tp +} + +// GetType implements ExprNode interface. +func (en *exprNode) GetType() *types.FieldType { + return &en.Type +} + +type funcNode struct { + exprNode +} + +// functionExpression implements FunctionNode interface. +func (fn *funcNode) functionExpression() {} diff --git a/pkg/parser/ast/base_test.go b/pkg/parser/ast/base_test.go new file mode 100644 index 000000000..fa2324550 --- /dev/null +++ b/pkg/parser/ast/base_test.go @@ -0,0 +1,320 @@ +// Copyright 2022 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package ast is the abstract syntax tree parsed from a SQL statement by parser. +// It can be analysed and transformed by optimizer. +package ast + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/stretchr/testify/require" +) + +func TestNodeSetText(t *testing.T) { + n := &node{} + tests := []struct { + text string + enc charset.Encoding + expectUTF8Text string + expectText string + }{ + {"你好", nil, "你好", "你好"}, + {"你好", charset.EncodingUTF8Impl, "你好", "你好"}, + } + for _, tt := range tests { + n.SetText(tt.enc, tt.text) + require.Equal(t, tt.expectUTF8Text, n.Text()) + require.Equal(t, tt.expectText, n.OriginalText()) + } +} + +func TestBinaryStringLiteralConversion(t *testing.T) { + n := &node{} + + // UTF-8 printable strings — should all pass through unchanged + printableTests := []struct { + name string + text string + want string + }{ + {"single-quoted", "SELECT 'hello world'", "SELECT 'hello world'"}, + {"double-quoted", "SELECT \"hello world\"", "SELECT \"hello world\""}, + {"_binary prefix", "SELECT _binary 'hello world'", "SELECT _binary 'hello world'"}, + {"_utf8 prefix", "SELECT _utf8'hello world'", "SELECT _utf8'hello world'"}, + {"_utf8mb4 prefix", "SELECT _utf8mb4'hello world'", "SELECT _utf8mb4'hello world'"}, + {"N prefix", "SELECT N'hello world'", "SELECT N'hello world'"}, + {"escaped '' inside", "SELECT 'it''s here'", "SELECT 'it''s here'"}, + {"escaped \\' inside", "SELECT 'it\\'s here'", "SELECT 'it\\'s here'"}, + {"escaped \"\" inside", "SELECT \"say \"\"hi\"\"\"", "SELECT \"say \"\"hi\"\"\""}, + {"backtick inside string", "SELECT 'has `backtick` inside'", "SELECT 'has `backtick` inside'"}, + {"_binary word inside string", "SELECT 'the word _binary appears'", "SELECT 'the word _binary appears'"}, + {"backslash content", "SELECT 'path\\\\to\\\\file'", "SELECT 'path\\\\to\\\\file'"}, + } + for _, tt := range printableTests { + n.SetText(charset.EncodingUTF8Impl, tt.text) + require.Equal(t, tt.want, n.Text(), tt.name) + } + + // Binary (non-printable) strings — should convert to 0x hex literals + binaryTests := []struct { + name string + text string + want string + }{ + {"single-quoted", "SELECT '\xd2\xe4\xa6\xb8'", "SELECT 0xd2e4a6b8"}, + {"double-quoted", "SELECT \"\xd2\xe4\xa6\xb8\"", "SELECT 0xd2e4a6b8"}, + {"_binary prefix preserved", "SELECT _binary '\xd2\xe4\xa6\xb8'", "SELECT _binary 0xd2e4a6b8"}, + {"_binary prefix without space", "SELECT _binary'\x01'", "SELECT _binary 0x01"}, + {"_utf8 prefix without space", "SELECT _utf8'\x01'", "SELECT _utf8 0x01"}, + {"_utf8mb4 prefix without space", "SELECT _utf8mb4'\x01'", "SELECT _utf8mb4 0x01"}, + {"escaped '' inside", "SELECT '\xd2''\xe4'", "SELECT 0xd227e4"}, + {"escaped \\' inside", "SELECT '\xd2\\'\xe4'", "SELECT 0xd227e4"}, + {"escaped \"\" inside", "SELECT \"\xd2\"\"\xe4\"", "SELECT 0xd222e4"}, + {"backtick inside binary", "SELECT '\xd2`\xe4'", "SELECT 0xd260e4"}, + {"mixed binary and text args", "SELECT '\xd2\xe4', 'hello', _binary '\xa1\xb2'", "SELECT 0xd2e4, 'hello', _binary 0xa1b2"}, + + // Truncated/invalid UTF-8 sequences + {"truncated 4-byte utf8", "SELECT '\xf0\x9f\x98'", "SELECT 0xf09f98"}, + {"invalid continuation byte", "SELECT '\x80\x81'", "SELECT 0x8081"}, + + // Control characters + {"NUL byte", "SELECT '\x00'", "SELECT 0x00"}, + {"mixed control and text", "SELECT 'hello\x00world'", "SELECT 0x68656c6c6f00776f726c64"}, + {"multiple control chars", "SELECT '\x01\x02\x03\x04\x05'", "SELECT 0x0102030405"}, + } + for _, tt := range binaryTests { + n.SetText(charset.EncodingUTF8Impl, tt.text) + require.Equal(t, tt.want, n.Text(), tt.name) + } +} + +func TestBinaryStringLiteralSkipsComments(t *testing.T) { + n := &node{} + + tests := []struct { + name string + text string + want string + }{ + // -- line comments with quotes must not corrupt the SQL + { + "-- with apostrophe", + "-- don't do this\nSELECT 'hello' FROM t", + "-- don't do this\nSELECT 'hello' FROM t", + }, + { + "-- with commented-out SQL (even quotes)", + "-- SELECT * FROM t WHERE name='John'\nSELECT 1", + "-- SELECT * FROM t WHERE name='John'\nSELECT 1", + }, + { + "-- double-quote in comment", + "-- see table \"users\"\nSELECT \"bar\" FROM t", + "-- see table \"users\"\nSELECT \"bar\" FROM t", + }, + { + "-- at end of input", + "SELECT 1 -- don't", + "SELECT 1 -- don't", + }, + { + "-- quote at end of comment line", + "-- ending with '\nSELECT 'hello'", + "-- ending with '\nSELECT 'hello'", + }, + { + "-- without space is NOT a comment", + "SELECT 1 --1", + "SELECT 1 --1", + }, + // # line comments + { + "# with apostrophe", + "# user's config\nSELECT 'value' FROM t", + "# user's config\nSELECT 'value' FROM t", + }, + // /* */ block comments + { + "block comment with apostrophe", + "/* it's a test */ SELECT 'value' FROM t", + "/* it's a test */ SELECT 'value' FROM t", + }, + { + "multi-line block comment with quote", + "/*\n * don't modify\n */ SELECT 'value' FROM t", + "/*\n * don't modify\n */ SELECT 'value' FROM t", + }, + // -- with form-feed and vertical-tab (unicode.IsSpace matches these) + { + "-- with form-feed after dashes", + "--\f don't\nSELECT 'hello' FROM t", + "--\f don't\nSELECT 'hello' FROM t", + }, + { + "-- with vertical-tab after dashes", + "--\v don't\nSELECT 'hello' FROM t", + "--\v don't\nSELECT 'hello' FROM t", + }, + // Executable comments must NOT be skipped (quotes inside are SQL) + { + "/*! executable - binary inside", + "/*!80000 SELECT '\xd2\xe4' */", + "/*!80000 SELECT 0xd2e4 */", + }, + { + "/*+ hint - binary inside", + "/*+ SET_VAR(charset='\xd2\xe4') */ SELECT 1", + "/*+ SET_VAR(charset=0xd2e4) */ SELECT 1", + }, + // /*T! and /*M! are skipped as comments (conservative: can't check feature gates from ast) + { + "/*T! skipped as comment", + "/*T![unsupported] don't */ SELECT 'hello' FROM t", + "/*T![unsupported] don't */ SELECT 'hello' FROM t", + }, + { + "/*M! skipped as comment", + "/*M! don't */ SELECT 'hello' FROM t", + "/*M! don't */ SELECT 'hello' FROM t", + }, + // Real-world CDC case + { + "CREATE VIEW with comment quote", + "-- (don't use parenthesis)\n\nCREATE OR REPLACE VIEW v AS SELECT 'Attribute' AS t FROM t1 UNION ALL SELECT 'Reference' AS t FROM t2", + "-- (don't use parenthesis)\n\nCREATE OR REPLACE VIEW v AS SELECT 'Attribute' AS t FROM t1 UNION ALL SELECT 'Reference' AS t FROM t2", + }, + // Binary string after comment still gets hex-encoded + { + "comment + binary string", + "-- don't\nSELECT '\xd2\xe4' FROM t", + "-- don't\nSELECT 0xd2e4 FROM t", + }, + } + for _, tt := range tests { + n.SetText(charset.EncodingUTF8Impl, tt.text) + require.Equal(t, tt.want, n.Text(), tt.name) + } +} + +func TestBinaryStringLiteralNoBackslashEscapes(t *testing.T) { + n := &node{} + + n.SetText(charset.EncodingUTF8Impl, "SELECT '\\n'") + n.SetNoBackslashEscapes(true) + require.Equal(t, "SELECT '\\n'", n.Text(), "NO_BACKSLASH_ESCAPES literal \\n") + + n.SetText(charset.EncodingUTF8Impl, "SELECT '\\' , 'after'") + n.SetNoBackslashEscapes(true) + require.Equal(t, "SELECT '\\' , 'after'", n.Text(), "NO_BACKSLASH_ESCAPES quote boundary") + + n.SetText(charset.EncodingUTF8Impl, "SELECT '\xd2\xe4'") + n.SetNoBackslashEscapes(true) + require.Equal(t, "SELECT 0xd2e4", n.Text(), "NO_BACKSLASH_ESCAPES binary") +} + +func buildBinaryClause() string { + return "c1 = _binary '\xd2\xe4\xa6\xb8\xc1\xf3\xe5\xd7\xa9\xb2\xc4\xd6\xe8\xf1\xa3\xb5'" +} + +func buildPrintableClause() string { + return "c1 = 'hello world'" +} + +func buildNoQuotesClause() string { + return "c1 = 12345" +} + +func buildMixedQuery(n int) string { + var b strings.Builder + b.WriteString("SELECT * FROM t1 WHERE ") + for i := range n { + if i > 0 { + b.WriteString(" OR ") + } + if i%2 == 0 { + b.WriteString(buildBinaryClause()) + } else { + b.WriteString(buildPrintableClause()) + } + } + return b.String() +} + +func buildQuery(clause string, n int) string { + var b strings.Builder + b.WriteString("SELECT * FROM t1 WHERE ") + for i := range n { + if i > 0 { + b.WriteString(" OR ") + } + b.WriteString(clause) + } + return b.String() +} + +func BenchmarkConvertBinaryStringLiterals(b *testing.B) { + enc := charset.EncodingUTF8Impl + + noQuotesShort := buildQuery(buildNoQuotesClause(), 1) + noQuotesLong := buildQuery(buildNoQuotesClause(), 200) + printableShort := buildQuery(buildPrintableClause(), 1) + printableLong := buildQuery(buildPrintableClause(), 200) + binaryShort := buildQuery(buildBinaryClause(), 1) + binaryLong := buildQuery(buildBinaryClause(), 200) + mixedShort := buildMixedQuery(2) + mixedLong := buildMixedQuery(200) + + b.Run("NoQuotes/Short", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(noQuotesShort, enc, false) + } + }) + b.Run("NoQuotes/Long", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(noQuotesLong, enc, false) + } + }) + b.Run("Printable/Short", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(printableShort, enc, false) + } + }) + b.Run("Printable/Long", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(printableLong, enc, false) + } + }) + b.Run("Binary/Short", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(binaryShort, enc, false) + } + }) + b.Run("Binary/Long", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(binaryLong, enc, false) + } + }) + b.Run("Mixed/Short", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(mixedShort, enc, false) + } + }) + b.Run("Mixed/Long", func(b *testing.B) { + for i := 0; i < b.N; i++ { + convertBinaryStringLiterals(mixedLong, enc, false) + } + }) +} diff --git a/pkg/parser/ast/datum.go b/pkg/parser/ast/datum.go new file mode 100644 index 000000000..9dfc426c2 --- /dev/null +++ b/pkg/parser/ast/datum.go @@ -0,0 +1,479 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "bytes" + "encoding/hex" + "fmt" + "math" + "strconv" + "strings" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/types" +) + +// Kind constants. +const ( + KindNull byte = 0 + KindInt64 byte = 1 + KindUint64 byte = 2 + KindFloat32 byte = 3 + KindFloat64 byte = 4 + KindString byte = 5 + KindBytes byte = 6 + KindBinaryLiteral byte = 7 // Used for BIT / HEX literals. + KindMysqlDecimal byte = 8 + KindMysqlDuration byte = 9 + KindMysqlEnum byte = 10 + KindMysqlBit byte = 11 // Used for BIT table column values. + KindMysqlSet byte = 12 + KindMysqlTime byte = 13 + KindInterface byte = 14 + KindMinNotNull byte = 15 + KindMaxValue byte = 16 + KindRaw byte = 17 + KindMysqlJSON byte = 18 +) + +// Datum is a data box holds different kind of data. +// It has better performance and is easier to use than `interface{}`. +type Datum struct { + k byte // datum kind. + i int64 // i can hold int64 uint64 float64 values. + b []byte // b can hold string or []byte values. + x any // x hold all other types. +} + +// Kind gets the kind of the datum. +func (d *Datum) Kind() byte { + return d.k +} + +// GetInt64 gets int64 value. +func (d *Datum) GetInt64() int64 { + return d.i +} + +// SetInt64 sets int64 value. +func (d *Datum) SetInt64(i int64) { + d.k = KindInt64 + d.i = i +} + +// GetUint64 gets uint64 value. +func (d *Datum) GetUint64() uint64 { + return uint64(d.i) +} + +// SetUint64 sets uint64 value. +func (d *Datum) SetUint64(i uint64) { + d.k = KindUint64 + d.i = int64(i) +} + +// GetFloat64 gets float64 value. +func (d *Datum) GetFloat64() float64 { + return math.Float64frombits(uint64(d.i)) +} + +// SetFloat64 sets float64 value. +func (d *Datum) SetFloat64(f float64) { + d.k = KindFloat64 + d.i = int64(math.Float64bits(f)) +} + +// GetFloat32 gets float32 value. +func (d *Datum) GetFloat32() float32 { + return float32(math.Float64frombits(uint64(d.i))) +} + +// SetFloat32 sets float32 value. +func (d *Datum) SetFloat32(f float32) { + d.k = KindFloat32 + d.i = int64(math.Float64bits(float64(f))) +} + +// GetString gets string value. +func (d *Datum) GetString() string { + return string(d.b) +} + +// SetString sets string value. +func (d *Datum) SetString(s string) { + d.k = KindString + d.b = []byte(s) +} + +// GetBytes gets bytes value. +func (d *Datum) GetBytes() []byte { + return d.b +} + +// SetBytes sets bytes value to datum. +func (d *Datum) SetBytes(b []byte) { + d.k = KindBytes + d.b = b +} + +// SetBytesAsString sets bytes value to datum as string type. +func (d *Datum) SetBytesAsString(b []byte) { + d.k = KindString + d.b = b +} + +// GetInterface gets interface value. +func (d *Datum) GetInterface() any { + return d.x +} + +// SetInterface sets interface to datum. +func (d *Datum) SetInterface(x any) { + d.k = KindInterface + d.x = x +} + +// SetNull sets datum to nil. +func (d *Datum) SetNull() { + d.k = KindNull + d.x = nil +} + +// GetBinaryLiteral gets Bit value +func (d *Datum) GetBinaryLiteral() BinaryLiteral { + return d.b +} + +// SetBinaryLiteral sets Bit value +func (d *Datum) SetBinaryLiteral(b BinaryLiteral) { + d.k = KindBinaryLiteral + d.b = b +} + +// GetMysqlDecimal gets decimal value +func (d *Datum) GetMysqlDecimal() *MyDecimal { + return d.x.(*MyDecimal) +} + +// SetMysqlDecimal sets decimal value +func (d *Datum) SetMysqlDecimal(b *MyDecimal) { + d.k = KindMysqlDecimal + d.x = b +} + +// GetValue gets the value of the datum of any kind. +func (d *Datum) GetValue() any { + switch d.k { + case KindInt64: + return d.GetInt64() + case KindUint64: + return d.GetUint64() + case KindFloat32: + return d.GetFloat32() + case KindFloat64: + return d.GetFloat64() + case KindString: + return d.GetString() + case KindBytes: + return d.GetBytes() + case KindMysqlDecimal: + return d.GetMysqlDecimal() + case KindBinaryLiteral, KindMysqlBit: + return d.GetBinaryLiteral() + default: + return d.GetInterface() + } +} + +// SetValue sets any kind of value. +func (d *Datum) SetValue(val any) { + switch x := val.(type) { + case nil: + d.SetNull() + case bool: + if x { + d.SetInt64(1) + } else { + d.SetInt64(0) + } + case int: + d.SetInt64(int64(x)) + case int64: + d.SetInt64(x) + case uint64: + d.SetUint64(x) + case float32: + d.SetFloat32(x) + case float64: + d.SetFloat64(x) + case string: + d.SetString(x) + case []byte: + d.SetBytes(x) + case *MyDecimal: + d.SetMysqlDecimal(x) + case BinaryLiteral: + d.SetBinaryLiteral(x) + case BitLiteral: // Store as BinaryLiteral for Bit and Hex literals + d.SetBinaryLiteral(BinaryLiteral(x)) + case HexLiteral: + d.SetBinaryLiteral(BinaryLiteral(x)) + default: + d.SetInterface(x) + } +} + +// BinaryLiteral is the internal type for storing bit / hex literal type. +type BinaryLiteral []byte + +// BitLiteral is the bit literal type. +type BitLiteral BinaryLiteral + +// HexLiteral is the hex literal type. +type HexLiteral BinaryLiteral + +// ZeroBinaryLiteral is a BinaryLiteral literal with zero value. +var ZeroBinaryLiteral = BinaryLiteral{} + +// String implements fmt.Stringer interface. +func (b BinaryLiteral) String() string { + if len(b) == 0 { + return "" + } + return "0x" + hex.EncodeToString(b) +} + +// ToString returns the string representation for the literal. +func (b BinaryLiteral) ToString() string { + return string(b) +} + +// ToBitLiteralString returns the bit literal representation for the literal. +func (b BinaryLiteral) ToBitLiteralString(trimLeadingZero bool) string { + if len(b) == 0 { + return "b''" + } + var buf bytes.Buffer + for _, data := range b { + fmt.Fprintf(&buf, "%08b", data) + } + ret := buf.Bytes() + if trimLeadingZero { + ret = bytes.TrimLeft(ret, "0") + if len(ret) == 0 { + ret = []byte{'0'} + } + } + return fmt.Sprintf("b'%s'", string(ret)) +} + +// ParseBitStr parses bit string. +// The string format can be b'val', B'val' or 0bval, val must be 0 or 1. +// See https://dev.mysql.com/doc/refman/5.7/en/bit-value-literals.html +func ParseBitStr(s string) (BinaryLiteral, error) { + if len(s) == 0 { + return nil, fmt.Errorf("invalid empty string for parsing bit type") + } + + switch { + case s[0] == 'b' || s[0] == 'B': + // format is b'val' or B'val' + s = strings.Trim(s[1:], "'") + case strings.HasPrefix(s, "0b"): + s = s[2:] + default: + // here means format is not b'val', B'val' or 0bval. + return nil, fmt.Errorf("invalid bit type format %s", s) + } + + if len(s) == 0 { + return ZeroBinaryLiteral, nil + } + + alignedLength := (len(s) + 7) &^ 7 + s = ("00000000" + s)[len(s)+8-alignedLength:] // Pad with zero (slice from `-alignedLength`) + byteLength := len(s) >> 3 + buf := make([]byte, byteLength) + + for i := range byteLength { + strPosition := i << 3 + val, err := strconv.ParseUint(s[strPosition:strPosition+8], 2, 8) + if err != nil { + return nil, err + } + buf[i] = byte(val) + } + + return buf, nil +} + +// NewBitLiteral parses bit string as BitLiteral type. +func NewBitLiteral(s string) (BitLiteral, error) { + b, err := ParseBitStr(s) + if err != nil { + return BitLiteral{}, err + } + return BitLiteral(b), nil +} + +// ToString returns the string representation for the literal. +func (b BitLiteral) ToString() string { + return BinaryLiteral(b).ToString() +} + +// ParseHexStr parses hexadecimal string literal. +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func ParseHexStr(s string) (BinaryLiteral, error) { + if len(s) == 0 { + return nil, fmt.Errorf("invalid empty string for parsing hexadecimal literal") + } + + switch { + case s[0] == 'x' || s[0] == 'X': + // format is x'val' or X'val' + s = strings.Trim(s[1:], "'") + if len(s)%2 != 0 { + return nil, fmt.Errorf("invalid hexadecimal format, must even numbers, but %d", len(s)) + } + case strings.HasPrefix(s, "0x"): + s = s[2:] + default: + // here means format is not x'val', X'val' or 0xval. + return nil, fmt.Errorf("invalid hexadecimal format %s", s) + } + + if len(s) == 0 { + return ZeroBinaryLiteral, nil + } + + if len(s)%2 != 0 { + s = "0" + s + } + buf, err := hex.DecodeString(s) + if err != nil { + return nil, err + } + return buf, nil +} + +// NewHexLiteral parses hexadecimal string as HexLiteral type. +func NewHexLiteral(s string) (HexLiteral, error) { + h, err := ParseHexStr(s) + if err != nil { + return HexLiteral{}, err + } + return HexLiteral(h), nil +} + +// ToString returns the string representation for the literal. +func (b HexLiteral) ToString() string { + return BinaryLiteral(b).ToString() +} + +// SetBinChsClnFlag sets charset, collation as 'binary' and adds binaryFlag to FieldType. +func SetBinChsClnFlag(ft *types.FieldType) { + ft.SetCharset(charset.CharsetBin) + ft.SetCollate(charset.CollationBin) + ft.AddFlag(mysql.BinaryFlag) +} + +// DefaultFsp is the default digit of fractional seconds part. +// MySQL use 0 as the default Fsp. +const DefaultFsp = int8(0) + +// DefaultTypeForValue returns the default FieldType for the value. +func DefaultTypeForValue(value any, tp *types.FieldType, charset string, collate string) { + switch x := value.(type) { + case nil: + tp.SetType(mysql.TypeNull) + tp.SetFlen(0) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + case bool: + tp.SetType(mysql.TypeLonglong) + tp.SetFlen(1) + tp.SetDecimal(0) + tp.AddFlag(mysql.IsBooleanFlag) + SetBinChsClnFlag(tp) + case int: + tp.SetType(mysql.TypeLonglong) + tp.SetFlen(StrLenOfInt64Fast(int64(x))) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + case int64: + tp.SetType(mysql.TypeLonglong) + tp.SetFlen(StrLenOfInt64Fast(x)) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + case uint64: + tp.SetType(mysql.TypeLonglong) + tp.AddFlag(mysql.UnsignedFlag) + tp.SetFlen(StrLenOfUint64Fast(x)) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + case string: + tp.SetType(mysql.TypeVarString) + // TODO: tp.flen should be len(x) * 3 (max bytes length of CharsetUTF8) + tp.SetFlen(len(x)) + tp.SetDecimal(types.UnspecifiedLength) + tp.SetCharset(charset) + tp.SetCollate(collate) + case float32: + tp.SetType(mysql.TypeFloat) + s := strconv.FormatFloat(float64(x), 'f', -1, 32) + tp.SetFlen(len(s)) + tp.SetDecimal(types.UnspecifiedLength) + SetBinChsClnFlag(tp) + case float64: + tp.SetType(mysql.TypeDouble) + s := strconv.FormatFloat(x, 'f', -1, 64) + tp.SetFlen(len(s)) + tp.SetDecimal(types.UnspecifiedLength) + SetBinChsClnFlag(tp) + case []byte: + tp.SetType(mysql.TypeBlob) + tp.SetFlen(len(x)) + tp.SetDecimal(types.UnspecifiedLength) + SetBinChsClnFlag(tp) + case BitLiteral: + tp.SetType(mysql.TypeVarString) + tp.SetFlen(len(x)) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + case HexLiteral: + tp.SetType(mysql.TypeVarString) + tp.SetFlen(len(x) * 3) + tp.SetDecimal(0) + tp.AddFlag(mysql.UnsignedFlag) + SetBinChsClnFlag(tp) + case BinaryLiteral: + tp.SetType(mysql.TypeBit) + tp.SetFlen(len(x) * 8) + tp.SetDecimal(0) + SetBinChsClnFlag(tp) + tp.DelFlag(mysql.BinaryFlag) + tp.AddFlag(mysql.UnsignedFlag) + case *MyDecimal: + tp.SetType(mysql.TypeNewDecimal) + tp.SetFlen(len(x.ToString())) + tp.SetDecimal(int(x.digitsFrac)) + SetBinChsClnFlag(tp) + default: + tp.SetType(mysql.TypeUnspecified) + tp.SetFlen(types.UnspecifiedLength) + tp.SetDecimal(types.UnspecifiedLength) + } +} diff --git a/pkg/parser/ast/datum_helper.go b/pkg/parser/ast/datum_helper.go new file mode 100644 index 000000000..6949a3759 --- /dev/null +++ b/pkg/parser/ast/datum_helper.go @@ -0,0 +1,70 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "math" +) + +func isSpace(c byte) bool { + return c == ' ' || c == '\t' +} + +func isDigit(c byte) bool { + return c >= '0' && c <= '9' +} + +func myMin(a, b int) int { + if a < b { + return a + } + return b +} + +func pow10(x int) int32 { + return int32(math.Pow10(x)) +} + +func absInt64(n int64) int64 { + y := n >> 63 + return (n ^ y) - y +} + +// uintSizeTable is used as a table to do comparison to get uint length is faster than doing loop on division with 10 +var uintSizeTable = [21]uint64{ + 0, // redundant 0 here, so to make function StrLenOfUint64Fast to count from 1 and return i directly + 9, 99, 999, 9999, 99999, + 999999, 9999999, 99999999, 999999999, 9999999999, + 99999999999, 999999999999, 9999999999999, 99999999999999, 999999999999999, + 9999999999999999, 99999999999999999, 999999999999999999, 9999999999999999999, + math.MaxUint64, +} // math.MaxUint64 is 18446744073709551615 and it has 20 digits + +// StrLenOfUint64Fast efficiently calculate the string character lengths of an uint64 as input +func StrLenOfUint64Fast(x uint64) int { + for i := 1; ; i++ { + if x <= uintSizeTable[i] { + return i + } + } +} + +// StrLenOfInt64Fast efficiently calculate the string character lengths of an int64 as input +func StrLenOfInt64Fast(x int64) int { + size := 0 + if x < 0 { + size = 1 // add "-" sign on the length count + } + return size + StrLenOfUint64Fast(uint64(absInt64(x))) +} diff --git a/pkg/parser/ast/ddl.go b/pkg/parser/ast/ddl.go new file mode 100644 index 000000000..4b2b89418 --- /dev/null +++ b/pkg/parser/ast/ddl.go @@ -0,0 +1,3409 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "errors" + "fmt" + + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/types" +) + +var ( + _ DDLNode = &AlterTableStmt{} + _ DDLNode = &CreateDatabaseStmt{} + _ DDLNode = &CreateIndexStmt{} + _ DDLNode = &CreateTableStmt{} + _ DDLNode = &CreateViewStmt{} + _ DDLNode = &DropDatabaseStmt{} + _ DDLNode = &DropIndexStmt{} + _ DDLNode = &DropTableStmt{} + _ DDLNode = &OptimizeTableStmt{} + _ DDLNode = &RenameTableStmt{} + _ DDLNode = &TruncateTableStmt{} + + _ Node = &AlterTableSpec{} + _ Node = &ColumnDef{} + _ Node = &ColumnOption{} + _ Node = &ColumnPosition{} + _ Node = &Constraint{} + _ Node = &IndexPartSpecification{} + _ Node = &ReferenceDef{} +) + +// NullString represents a string that may be nil. +type NullString struct { + String string + Empty bool // Empty is true if String is empty backtick. +} + +// DatabaseOptionType is the type for database options. +type DatabaseOptionType int + +// Database option types. +const ( + DatabaseOptionNone DatabaseOptionType = iota + DatabaseOptionCharset + DatabaseOptionCollate + DatabaseOptionEncryption + DatabaseOptionReadOnly +) + +// DatabaseOption represents database option. +type DatabaseOption struct { + Tp DatabaseOptionType + Value string + UintValue uint64 +} + +// Restore implements Node interface. +func (n *DatabaseOption) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { //nolint:exhaustive + case DatabaseOptionCharset: + ctx.WriteKeyWord("CHARACTER SET") + ctx.WritePlain(" = ") + ctx.WritePlain(n.Value) + case DatabaseOptionCollate: + ctx.WriteKeyWord("COLLATE") + ctx.WritePlain(" = ") + ctx.WritePlain(n.Value) + case DatabaseOptionEncryption: + ctx.WriteKeyWord("ENCRYPTION") + ctx.WritePlain(" = ") + ctx.WriteString(n.Value) + case DatabaseOptionReadOnly: + ctx.WriteKeyWord("READ ONLY") + ctx.WritePlain(" = ") + if n.Value != "" { + ctx.WriteKeyWord(n.Value) // DEFAULT + } else { + ctx.WritePlainf("%d", n.UintValue) + } + default: + return fmt.Errorf("invalid DatabaseOptionType: %d", n.Tp) + } + return nil +} + +// CreateDatabaseStmt is a statement to create a database. +// See https://dev.mysql.com/doc/refman/5.7/en/create-database.html +type CreateDatabaseStmt struct { + ddlNode + + IfNotExists bool + Name CIStr + Options []*DatabaseOption +} + +// Restore implements Node interface. +func (n *CreateDatabaseStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE DATABASE ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.Name.O) + for i, option := range n.Options { + ctx.WritePlain(" ") + err := option.Restore(ctx) + if err != nil { + return fmt.Errorf("an error occurred while splicing CreateDatabaseStmt DatabaseOption: [%v]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateDatabaseStmt) + return v.Leave(n) +} + +// AlterDatabaseStmt is a statement to change the structure of a database. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-database.html +type AlterDatabaseStmt struct { + ddlNode + + Name CIStr + AlterDefaultDatabase bool + Options []*DatabaseOption +} + +// Restore implements Node interface. +func (n *AlterDatabaseStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER DATABASE") + if !n.AlterDefaultDatabase { + ctx.WritePlain(" ") + ctx.WriteName(n.Name.O) + } + for i, option := range n.Options { + ctx.WritePlain(" ") + err := option.Restore(ctx) + if err != nil { + return fmt.Errorf("an error occurred while splicing AlterDatabaseStmt DatabaseOption: [%v]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterDatabaseStmt) + return v.Leave(n) +} + +// DropDatabaseStmt is a statement to drop a database and all tables in the database. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-database.html +type DropDatabaseStmt struct { + ddlNode + + IfExists bool + Name CIStr +} + +// Restore implements Node interface. +func (n *DropDatabaseStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP DATABASE ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WriteName(n.Name.O) + return nil +} + +// Accept implements Node Accept interface. +func (n *DropDatabaseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropDatabaseStmt) + return v.Leave(n) +} + +// IndexPartSpecifications is used for parsing index column name or index expression from SQL. +type IndexPartSpecification struct { + node + + Column *ColumnName + Length int + // Order is parsed but should be ignored because MySQL v5.7 doesn't support it. + Desc bool + Expr ExprNode +} + +// Restore implements Node interface. +func (n *IndexPartSpecification) Restore(ctx *format.RestoreCtx) error { + if n.Expr != nil { + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing IndexPartSpecifications: %w", err) + } + ctx.WritePlain(")") + if n.Desc { + ctx.WritePlain(" DESC") + } + return nil + } + if err := n.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing IndexPartSpecifications: %w", err) + } + if n.Length > 0 { + ctx.WritePlainf("(%d)", n.Length) + } + if n.Desc { + ctx.WritePlain(" DESC") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexPartSpecification) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexPartSpecification) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) + } + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + return v.Leave(n) +} + +// MatchType is the type for reference match type. +type MatchType int + +// match type +const ( + MatchNone MatchType = iota + MatchFull + MatchPartial + MatchSimple +) + +// ReferenceDef is used for parsing foreign key reference option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html +type ReferenceDef struct { + node + + Table *TableName + IndexPartSpecifications []*IndexPartSpecification + OnDelete *OnDeleteOpt + OnUpdate *OnUpdateOpt + Match MatchType +} + +// Restore implements Node interface. +func (n *ReferenceDef) Restore(ctx *format.RestoreCtx) error { + if n.Table != nil { + ctx.WriteKeyWord("REFERENCES ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ReferenceDef: %w", err) + } + } + + if n.IndexPartSpecifications != nil { + ctx.WritePlain("(") + for i, indexColNames := range n.IndexPartSpecifications { + if i > 0 { + ctx.WritePlain(", ") + } + if err := indexColNames.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing IndexPartSpecifications: [%v]: %w", i, err) + } + } + ctx.WritePlain(")") + } + + if n.Match != MatchNone { + ctx.WriteKeyWord(" MATCH ") + switch n.Match { //nolint:exhaustive + case MatchFull: + ctx.WriteKeyWord("FULL") + case MatchPartial: + ctx.WriteKeyWord("PARTIAL") + case MatchSimple: + ctx.WriteKeyWord("SIMPLE") + } + } + if n.OnDelete.ReferOpt != ReferOptionNoOption { + ctx.WritePlain(" ") + if err := n.OnDelete.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing OnDelete: %w", err) + } + } + if n.OnUpdate.ReferOpt != ReferOptionNoOption { + ctx.WritePlain(" ") + if err := n.OnUpdate.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing OnUpdate: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ReferenceDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ReferenceDef) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + for i, val := range n.IndexPartSpecifications { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.IndexPartSpecifications[i] = node.(*IndexPartSpecification) + } + onDelete, ok := n.OnDelete.Accept(v) + if !ok { + return n, false + } + n.OnDelete = onDelete.(*OnDeleteOpt) + onUpdate, ok := n.OnUpdate.Accept(v) + if !ok { + return n, false + } + n.OnUpdate = onUpdate.(*OnUpdateOpt) + return v.Leave(n) +} + +// OnDeleteOpt is used for optional on delete clause. +type OnDeleteOpt struct { + node + ReferOpt ReferOptionType +} + +// Restore implements Node interface. +func (n *OnDeleteOpt) Restore(ctx *format.RestoreCtx) error { + if n.ReferOpt != ReferOptionNoOption { + ctx.WriteKeyWord("ON DELETE ") + ctx.WriteKeyWord(n.ReferOpt.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnDeleteOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnDeleteOpt) + return v.Leave(n) +} + +// OnUpdateOpt is used for optional on update clause. +type OnUpdateOpt struct { + node + ReferOpt ReferOptionType +} + +// Restore implements Node interface. +func (n *OnUpdateOpt) Restore(ctx *format.RestoreCtx) error { + if n.ReferOpt != ReferOptionNoOption { + ctx.WriteKeyWord("ON UPDATE ") + ctx.WriteKeyWord(n.ReferOpt.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnUpdateOpt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnUpdateOpt) + return v.Leave(n) +} + +// ColumnOptionType is the type for ColumnOption. +type ColumnOptionType int + +// ColumnOption types. +const ( + ColumnOptionNoOption ColumnOptionType = iota + ColumnOptionPrimaryKey + ColumnOptionNotNull + ColumnOptionAutoIncrement + ColumnOptionDefaultValue + ColumnOptionUniqKey + ColumnOptionNull + ColumnOptionOnUpdate // For Timestamp and Datetime only. + ColumnOptionComment + ColumnOptionGenerated + ColumnOptionReference + ColumnOptionCollate + ColumnOptionCheck + ColumnOptionColumnFormat + ColumnOptionStorage + ColumnOptionSecondaryEngineAttribute + ColumnOptionSrid +) + +var ( + invalidOptionForGeneratedColumn = map[ColumnOptionType]string{ + ColumnOptionAutoIncrement: "AUTO_INCREMENT", + ColumnOptionOnUpdate: "ON UPDATE", + ColumnOptionDefaultValue: "DEFAULT", + } +) + +// ColumnOptionList stores column options. +type ColumnOptionList struct { + HasCollateOption bool + Options []*ColumnOption +} + +// ColumnOption is used for parsing column constraint info from SQL. +type ColumnOption struct { + node + + Tp ColumnOptionType + // Expr is used for ColumnOptionDefaultValue/ColumnOptionOnUpdateColumnOptionGenerated. + // For ColumnOptionDefaultValue or ColumnOptionOnUpdate, it's the target value. + // For ColumnOptionGenerated, it's the target expression. + Expr ExprNode + // Stored is only for ColumnOptionGenerated, default is false. + Stored bool + // Refer is used for foreign key. + Refer *ReferenceDef + StrValue string + // Enforced is only for Check, default is true. + Enforced bool + // Name is only used for Check Constraint name. + ConstraintName string + SecondaryEngineAttr string + Srid uint32 +} + +// Restore implements Node interface. +func (n *ColumnOption) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { + case ColumnOptionNoOption: + return nil + case ColumnOptionPrimaryKey: + ctx.WriteKeyWord("PRIMARY KEY") + case ColumnOptionNotNull: + ctx.WriteKeyWord("NOT NULL") + case ColumnOptionAutoIncrement: + ctx.WriteKeyWord("AUTO_INCREMENT") + case ColumnOptionDefaultValue: + ctx.WriteKeyWord("DEFAULT ") + printOuterParentheses := false + if funcCallExpr, ok := n.Expr.(*FuncCallExpr); ok { + if name := funcCallExpr.FnName.L; name != CurrentTimestamp { + printOuterParentheses = true + } + } + if _, ok := n.Expr.(*ColumnNameExpr); ok { + printOuterParentheses = true + } + if printOuterParentheses { + ctx.WritePlain("(") + } + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnOption DefaultValue Expr: %w", err) + } + if printOuterParentheses { + ctx.WritePlain(")") + } + case ColumnOptionUniqKey: + ctx.WriteKeyWord("UNIQUE KEY") + if n.StrValue == "Global" { + ctx.WriteKeyWord(" GLOBAL") + } + case ColumnOptionNull: + ctx.WriteKeyWord("NULL") + case ColumnOptionOnUpdate: + ctx.WriteKeyWord("ON UPDATE ") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnOption ON UPDATE Expr: %w", err) + } + case ColumnOptionComment: + ctx.WriteKeyWord("COMMENT ") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnOption COMMENT Expr: %w", err) + } + case ColumnOptionGenerated: + ctx.WriteKeyWord("GENERATED ALWAYS AS") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnOption GENERATED ALWAYS Expr: %w", err) + } + ctx.WritePlain(")") + if n.Stored { + ctx.WriteKeyWord(" STORED") + } else { + ctx.WriteKeyWord(" VIRTUAL") + } + case ColumnOptionReference: + if err := n.Refer.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnOption ReferenceDef: %w", err) + } + case ColumnOptionCollate: + if n.StrValue == "" { + return errors.New("empty ColumnOption COLLATE") + } + ctx.WriteKeyWord("COLLATE ") + ctx.WritePlain(n.StrValue) + case ColumnOptionCheck: + if n.ConstraintName != "" { + ctx.WriteKeyWord("CONSTRAINT ") + ctx.WriteName(n.ConstraintName) + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("CHECK") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return err + } + ctx.WritePlain(")") + if n.Enforced { + ctx.WriteKeyWord(" ENFORCED") + } else { + ctx.WriteKeyWord(" NOT ENFORCED") + } + case ColumnOptionColumnFormat: + ctx.WriteKeyWord("COLUMN_FORMAT ") + ctx.WriteKeyWord(n.StrValue) + case ColumnOptionStorage: + ctx.WriteKeyWord("STORAGE ") + ctx.WriteKeyWord(n.StrValue) + case ColumnOptionSecondaryEngineAttribute: + ctx.WriteKeyWord("SECONDARY_ENGINE_ATTRIBUTE") + ctx.WritePlain(" = ") + ctx.WriteString(n.StrValue) + case ColumnOptionSrid: + ctx.WritePlainf("/*!80003 SRID %d */", n.Srid) + default: + return errors.New("an error occurred while splicing ColumnOption") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnOption) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// IndexVisibility is the option for index visibility. +type IndexVisibility int + +// IndexVisibility options. +const ( + IndexVisibilityDefault IndexVisibility = iota + IndexVisibilityVisible + IndexVisibilityInvisible +) + +// IndexOption is the index options. +// +// KEY_BLOCK_SIZE [=] value +// | index_type +// | WITH PARSER parser_name +// | COMMENT 'string' +// | GLOBAL +// +// See http://dev.mysql.com/doc/refman/5.7/en/create-table.html +// with the addition of Global Index +type IndexOption struct { + node + + KeyBlockSize uint64 + Tp IndexType + Comment string + ParserName CIStr + Visibility IndexVisibility + SecondaryEngineAttr string +} + +// IsEmpty is true if only default options are given +// and it should not be added to the output +func (n *IndexOption) IsEmpty() bool { + if n.KeyBlockSize > 0 || + n.Tp != IndexTypeInvalid || + len(n.ParserName.O) > 0 || + n.Comment != "" || + n.Visibility != IndexVisibilityDefault || + len(n.SecondaryEngineAttr) > 0 { + return false + } + return true +} + +// Restore implements Node interface. +func (n *IndexOption) Restore(ctx *format.RestoreCtx) error { + hasPrevOption := false + + if n.KeyBlockSize > 0 { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("KEY_BLOCK_SIZE") + ctx.WritePlainf("=%d", n.KeyBlockSize) + hasPrevOption = true + } + + if n.Tp != IndexTypeInvalid { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("USING ") + ctx.WritePlain(n.Tp.String()) + hasPrevOption = true + } + + if len(n.ParserName.O) > 0 { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("WITH PARSER ") + ctx.WriteName(n.ParserName.O) + hasPrevOption = true + } + + if n.Comment != "" { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("COMMENT ") + ctx.WriteString(n.Comment) + hasPrevOption = true + } + + if n.Visibility != IndexVisibilityDefault { + if hasPrevOption { + ctx.WritePlain(" ") + } + switch n.Visibility { //nolint:exhaustive + case IndexVisibilityVisible: + ctx.WriteKeyWord("VISIBLE") + case IndexVisibilityInvisible: + ctx.WriteKeyWord("INVISIBLE") + } + hasPrevOption = true + } + + if n.SecondaryEngineAttr != "" { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("SECONDARY_ENGINE_ATTRIBUTE") + ctx.WritePlain(" = ") + ctx.WriteString(n.SecondaryEngineAttr) + // If a new option is added after, set hasPrevOption = true here. + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexOption) + return v.Leave(n) +} + +// ConstraintType is the type for Constraint. +type ConstraintType int + +// ConstraintTypes +const ( + ConstraintNoConstraint ConstraintType = iota + ConstraintPrimaryKey + ConstraintKey + ConstraintIndex + ConstraintUniq + ConstraintUniqKey + ConstraintUniqIndex + ConstraintForeignKey + // ConstraintFulltext is only used in AST. + // It will be rewritten into ConstraintIndex after preprocessor phase. + ConstraintFulltext + ConstraintCheck + ConstraintSpatial +) + +// Constraint is constraint for table definition. +type Constraint struct { + node + + Tp ConstraintType + Name string + + Keys []*IndexPartSpecification // Used for PRIMARY KEY, UNIQUE, ...... + + Refer *ReferenceDef // Used for foreign key. + + Option *IndexOption // Index Options + + Expr ExprNode // Used for Check + + Enforced bool // Used for Check + + InColumn bool // Used for Check + + InColumnName string // Used for Check + IsEmptyIndex bool // Used for Check +} + +// Restore implements Node interface. +func (n *Constraint) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { //nolint:exhaustive + case ConstraintNoConstraint: + return nil + case ConstraintPrimaryKey: + ctx.WriteKeyWord("PRIMARY KEY") + case ConstraintKey: + ctx.WriteKeyWord("KEY") + case ConstraintIndex: + ctx.WriteKeyWord("INDEX") + case ConstraintUniq: + ctx.WriteKeyWord("UNIQUE") + case ConstraintUniqKey: + ctx.WriteKeyWord("UNIQUE KEY") + case ConstraintUniqIndex: + ctx.WriteKeyWord("UNIQUE INDEX") + case ConstraintFulltext: + ctx.WriteKeyWord("FULLTEXT") + case ConstraintSpatial: + ctx.WriteKeyWord("SPATIAL") + case ConstraintCheck: + if n.Name != "" { + ctx.WriteKeyWord("CONSTRAINT ") + ctx.WriteName(n.Name) + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("CHECK") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return err + } + ctx.WritePlain(") ") + if n.Enforced { + ctx.WriteKeyWord("ENFORCED") + } else { + ctx.WriteKeyWord("NOT ENFORCED") + } + return nil + } + + if n.Tp == ConstraintForeignKey { + ctx.WriteKeyWord("CONSTRAINT ") + if n.Name != "" { + ctx.WriteName(n.Name) + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("FOREIGN KEY ") + } else if n.Name != "" || n.IsEmptyIndex { + ctx.WritePlain(" ") + ctx.WriteName(n.Name) + } + + ctx.WritePlain("(") + for i, keys := range n.Keys { + if i > 0 { + ctx.WritePlain(", ") + } + if err := keys.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing Constraint Keys: [%v]: %w", i, err) + } + } + ctx.WritePlain(")") + + if n.Refer != nil { + ctx.WritePlain(" ") + if err := n.Refer.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing Constraint Refer: %w", err) + } + } + + if n.Option != nil && !n.Option.IsEmpty() { + ctx.WritePlain(" ") + if err := n.Option.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing Constraint Option: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *Constraint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Constraint) + for i, val := range n.Keys { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Keys[i] = node.(*IndexPartSpecification) + } + if n.Refer != nil { + node, ok := n.Refer.Accept(v) + if !ok { + return n, false + } + n.Refer = node.(*ReferenceDef) + } + if n.Option != nil { + node, ok := n.Option.Accept(v) + if !ok { + return n, false + } + n.Option = node.(*IndexOption) + } + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +// ColumnDef is used for parsing column definition from SQL. +type ColumnDef struct { + node + + Name *ColumnName + Tp *types.FieldType + Options []*ColumnOption +} + +// Restore implements Node interface. +func (n *ColumnDef) Restore(ctx *format.RestoreCtx) error { + if err := n.Name.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnDef Name: %w", err) + } + if n.Tp != nil { + ctx.WritePlain(" ") + if err := n.Tp.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnDef Type: %w", err) + } + } + for i, options := range n.Options { + ctx.WritePlain(" ") + if err := options.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing ColumnDef ColumnOption: [%v]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnDef) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnDef) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + for i, val := range n.Options { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*ColumnOption) + } + return v.Leave(n) +} + +// Validate checks if a column definition is legal. +// For example, generated column definitions that contain such +// column options as `ON UPDATE`, `AUTO_INCREMENT`, `DEFAULT` +// are illegal. +func (n *ColumnDef) Validate() error { + generatedCol := false + var illegalOpt4gc string + for _, opt := range n.Options { + if opt.Tp == ColumnOptionGenerated { + generatedCol = true + } + msg, found := invalidOptionForGeneratedColumn[opt.Tp] + if found { + illegalOpt4gc = msg + } + } + if generatedCol && illegalOpt4gc != "" { + return ErrWrongUsage.GenByArgs(illegalOpt4gc, "generated column") + } + return nil +} + +type TemporaryKeyword int + +const ( + TemporaryNone TemporaryKeyword = iota + TemporaryGlobal + TemporaryLocal +) + +// CreateTableStmt is a statement to create a table. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table.html +type CreateTableStmt struct { + ddlNode + + IfNotExists bool + TemporaryKeyword + // Meanless when TemporaryKeyword is not TemporaryGlobal. + // ON COMMIT DELETE ROWS => true + // ON COMMIT PRESERVE ROW => false + OnCommitDelete bool + Table *TableName + ReferTable *TableName + Cols []*ColumnDef + Constraints []*Constraint + Options []*TableOption + Partition *PartitionOptions + OnDuplicate OnDuplicateKeyHandlingType + Select ResultSetNode +} + +// Restore implements Node interface. +func (n *CreateTableStmt) Restore(ctx *format.RestoreCtx) error { + switch n.TemporaryKeyword { + case TemporaryNone: + ctx.WriteKeyWord("CREATE TABLE ") + case TemporaryGlobal: + ctx.WriteKeyWord("CREATE GLOBAL TEMPORARY TABLE ") + case TemporaryLocal: + ctx.WriteKeyWord("CREATE TEMPORARY TABLE ") + } + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt Table: %w", err) + } + + if n.ReferTable != nil { + ctx.WriteKeyWord(" LIKE ") + if err := n.ReferTable.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt ReferTable: %w", err) + } + } + lenCols := len(n.Cols) + lenConstraints := len(n.Constraints) + if lenCols+lenConstraints > 0 { + ctx.WritePlain(" (") + for i, col := range n.Cols { + if i > 0 { + ctx.WritePlain(",") + } + if err := col.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt ColumnDef: [%v]: %w", i, err) + } + } + for i, constraint := range n.Constraints { + if i > 0 || lenCols >= 1 { + ctx.WritePlain(",") + } + if err := constraint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt Constraints: [%v]: %w", i, err) + } + } + ctx.WritePlain(")") + } + + for i, option := range n.Options { + ctx.WritePlain(" ") + if err := option.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt TableOption: [%v]: %w", i, err) + } + } + + if n.Partition != nil { + ctx.WritePlain(" ") + if err := n.Partition.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt Partition: %w", err) + } + } + + if n.Select != nil { + switch n.OnDuplicate { + case OnDuplicateKeyHandlingError: + ctx.WriteKeyWord(" AS ") + case OnDuplicateKeyHandlingIgnore: + ctx.WriteKeyWord(" IGNORE AS ") + case OnDuplicateKeyHandlingReplace: + ctx.WriteKeyWord(" REPLACE AS ") + } + + if err := n.Select.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing CreateTableStmt Select: %w", err) + } + } + + if n.TemporaryKeyword == TemporaryGlobal { + if n.OnCommitDelete { + ctx.WriteKeyWord(" ON COMMIT DELETE ROWS") + } else { + ctx.WriteKeyWord(" ON COMMIT PRESERVE ROWS") + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.ReferTable != nil { + node, ok = n.ReferTable.Accept(v) + if !ok { + return n, false + } + n.ReferTable = node.(*TableName) + } + for i, val := range n.Cols { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnDef) + } + for i, val := range n.Constraints { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Constraints[i] = node.(*Constraint) + } + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + if n.Partition != nil { + node, ok := n.Partition.Accept(v) + if !ok { + return n, false + } + n.Partition = node.(*PartitionOptions) + } + for i, option := range n.Options { + node, ok = option.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*TableOption) + } + + return v.Leave(n) +} + +// DropTableStmt is a statement to drop one or more tables. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-table.html +type DropTableStmt struct { + ddlNode + + IfExists bool + Tables []*TableName + IsView bool + TemporaryKeyword // make sense ONLY if/when IsView == false +} + +// Restore implements Node interface. +func (n *DropTableStmt) Restore(ctx *format.RestoreCtx) error { + if n.IsView { + ctx.WriteKeyWord("DROP VIEW ") + } else { + switch n.TemporaryKeyword { + case TemporaryNone: + ctx.WriteKeyWord("DROP TABLE ") + case TemporaryGlobal: + ctx.WriteKeyWord("DROP GLOBAL TEMPORARY TABLE ") + case TemporaryLocal: + ctx.WriteKeyWord("DROP TEMPORARY TABLE ") + } + } + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + + for index, table := range n.Tables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DropTableStmt.Tables[%d]: %w", index, err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DropTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropTableStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +type OptimizeTableStmt struct { + ddlNode + + NoWriteToBinLog bool + Tables []*TableName +} + +func (n *OptimizeTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("OPTIMIZE ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WriteKeyWord("TABLE ") + + for index, table := range n.Tables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore OptimizeTableStmt.Tables[%d]: %w", index, err) + } + } + return nil +} + +func (n *OptimizeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OptimizeTableStmt) + return v.Leave(n) +} + +// RepairTableStmt is a statement to repair tables. +// See https://dev.mysql.com/doc/refman/8.4/en/repair-table.html +type RepairTableStmt struct { + ddlNode + + NoWriteToBinLog bool + Tables []*TableName + Quick bool + Extended bool + UseFrm bool +} + +// Restore implements Node interface. +func (n *RepairTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("REPAIR ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WriteKeyWord("TABLE ") + for index, table := range n.Tables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RepairTableStmt.Tables[%d]: %w", index, err) + } + } + if n.Quick { + ctx.WriteKeyWord(" QUICK") + } + if n.Extended { + ctx.WriteKeyWord(" EXTENDED") + } + if n.UseFrm { + ctx.WriteKeyWord(" USE_FRM") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RepairTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RepairTableStmt) + for i, val := range n.Tables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// RenameTableStmt is a statement to rename a table. +// See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html +type RenameTableStmt struct { + ddlNode + + TableToTables []*TableToTable +} + +// Restore implements Node interface. +func (n *RenameTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("RENAME TABLE ") + for index, table2table := range n.TableToTables { + if index != 0 { + ctx.WritePlain(", ") + } + if err := table2table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RenameTableStmt.TableToTables: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RenameTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RenameTableStmt) + + for i, t := range n.TableToTables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.TableToTables[i] = node.(*TableToTable) + } + + return v.Leave(n) +} + +// TableToTable represents renaming old table to new table used in RenameTableStmt. +type TableToTable struct { + node + OldTable *TableName + NewTable *TableName +} + +// Restore implements Node interface. +func (n *TableToTable) Restore(ctx *format.RestoreCtx) error { + if err := n.OldTable.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TableToTable.OldTable: %w", err) + } + ctx.WriteKeyWord(" TO ") + if err := n.NewTable.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TableToTable.NewTable: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TableToTable) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableToTable) + node, ok := n.OldTable.Accept(v) + if !ok { + return n, false + } + n.OldTable = node.(*TableName) + node, ok = n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + return v.Leave(n) +} + +// CreateViewStmt is a statement to create a View. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type CreateViewStmt struct { + ddlNode + + OrReplace bool + ViewName *TableName + Cols []CIStr + Select StmtNode + SchemaCols []CIStr + Algorithm ViewAlgorithm + Definer *auth.UserIdentity + Security ViewSecurity + CheckOption ViewCheckOption +} + +// Restore implements Node interface. +func (n *CreateViewStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + if n.OrReplace { + ctx.WriteKeyWord("OR REPLACE ") + } + ctx.WriteKeyWord("ALGORITHM") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.Algorithm.String()) + ctx.WriteKeyWord(" DEFINER") + ctx.WritePlain(" = ") + + // todo Use n.Definer.Restore(ctx) to replace this part + if n.Definer.CurrentUser { + ctx.WriteKeyWord("current_user") + } else { + ctx.WriteName(n.Definer.Username) + if n.Definer.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(n.Definer.Hostname) + } + } + + ctx.WriteKeyWord(" SQL SECURITY ") + ctx.WriteKeyWord(n.Security.String()) + ctx.WriteKeyWord(" VIEW ") + + if err := n.ViewName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while create CreateViewStmt.ViewName: %w", err) + } + + for i, col := range n.Cols { + if i == 0 { + ctx.WritePlain(" (") + } else { + ctx.WritePlain(",") + } + ctx.WriteName(col.O) + if i == len(n.Cols)-1 { + ctx.WritePlain(")") + } + } + + ctx.WriteKeyWord(" AS ") + + if err := n.Select.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while create CreateViewStmt.Select: %w", err) + } + + if n.CheckOption != CheckOptionCascaded { + ctx.WriteKeyWord(" WITH ") + ctx.WriteKeyWord(n.CheckOption.String()) + ctx.WriteKeyWord(" CHECK OPTION") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateViewStmt) + node, ok := n.ViewName.Accept(v) + if !ok { + return n, false + } + n.ViewName = node.(*TableName) + selnode, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = selnode.(StmtNode) + return v.Leave(n) +} + +// AlterViewStmt is a statement to alter a View. +// See https://dev.mysql.com/doc/refman/8.4/en/alter-view.html +type AlterViewStmt struct { + ddlNode + + ViewName *TableName + Cols []CIStr + Select StmtNode + Algorithm ViewAlgorithm + Definer *auth.UserIdentity + Security ViewSecurity + CheckOption ViewCheckOption +} + +// Restore implements Node interface. +func (n *AlterViewStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER ") + ctx.WriteKeyWord("ALGORITHM") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.Algorithm.String()) + ctx.WriteKeyWord(" DEFINER") + ctx.WritePlain(" = ") + if n.Definer.CurrentUser { + ctx.WriteKeyWord("current_user") + } else { + ctx.WriteName(n.Definer.Username) + if n.Definer.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(n.Definer.Hostname) + } + } + ctx.WriteKeyWord(" SQL SECURITY ") + ctx.WriteKeyWord(n.Security.String()) + ctx.WriteKeyWord(" VIEW ") + if err := n.ViewName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterViewStmt.ViewName: %w", err) + } + for i, col := range n.Cols { + if i == 0 { + ctx.WritePlain(" (") + } else { + ctx.WritePlain(",") + } + ctx.WriteName(col.O) + if i == len(n.Cols)-1 { + ctx.WritePlain(")") + } + } + ctx.WriteKeyWord(" AS ") + if err := n.Select.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterViewStmt.Select: %w", err) + } + if n.CheckOption != CheckOptionCascaded { + ctx.WriteKeyWord(" WITH ") + ctx.WriteKeyWord(n.CheckOption.String()) + ctx.WriteKeyWord(" CHECK OPTION") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterViewStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterViewStmt) + node, ok := n.ViewName.Accept(v) + if !ok { + return n, false + } + n.ViewName = node.(*TableName) + selnode, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = selnode.(StmtNode) + return v.Leave(n) +} + +// SRSAttributeType is the attribute kind in CREATE SPATIAL REFERENCE SYSTEM. +type SRSAttributeType int + +// SRS attribute types. +const ( + SRSAttrName SRSAttributeType = iota + SRSAttrDefinition + SRSAttrOrganization + SRSAttrDescription +) + +// SRSAttribute is one attribute of CREATE SPATIAL REFERENCE SYSTEM. +type SRSAttribute struct { + Tp SRSAttributeType + Value string + OrgID uint64 // ORGANIZATION ... IDENTIFIED BY +} + +// Restore implements Node interface. +func (n *SRSAttribute) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { + case SRSAttrName: + ctx.WriteKeyWord("NAME ") + case SRSAttrDefinition: + ctx.WriteKeyWord("DEFINITION ") + case SRSAttrOrganization: + ctx.WriteKeyWord("ORGANIZATION ") + case SRSAttrDescription: + ctx.WriteKeyWord("DESCRIPTION ") + default: + return fmt.Errorf("invalid SRSAttributeType: %d", n.Tp) + } + ctx.WriteString(n.Value) + if n.Tp == SRSAttrOrganization { + ctx.WriteKeyWord(" IDENTIFIED BY ") + ctx.WritePlainf("%d", n.OrgID) + } + return nil +} + +// CreateSpatialRefSysStmt is a statement to create a spatial reference system. +// See https://dev.mysql.com/doc/refman/8.4/en/create-spatial-reference-system.html +type CreateSpatialRefSysStmt struct { + ddlNode + + OrReplace bool + IfNotExists bool + SRID uint64 + Attributes []*SRSAttribute +} + +// Restore implements Node interface. +func (n *CreateSpatialRefSysStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + if n.OrReplace { + ctx.WriteKeyWord("OR REPLACE ") + } + ctx.WriteKeyWord("SPATIAL REFERENCE SYSTEM ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WritePlainf("%d", n.SRID) + for i, attr := range n.Attributes { + ctx.WritePlain(" ") + if err := attr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateSpatialRefSysStmt.Attributes[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateSpatialRefSysStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateSpatialRefSysStmt) + return v.Leave(n) +} + +// DropSpatialRefSysStmt is a statement to drop a spatial reference system. +// See https://dev.mysql.com/doc/refman/8.4/en/drop-spatial-reference-system.html +type DropSpatialRefSysStmt struct { + ddlNode + + IfExists bool + SRID uint64 +} + +// Restore implements Node interface. +func (n *DropSpatialRefSysStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP SPATIAL REFERENCE SYSTEM ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + ctx.WritePlainf("%d", n.SRID) + return nil +} + +// Accept implements Node Accept interface. +func (n *DropSpatialRefSysStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropSpatialRefSysStmt) + return v.Leave(n) +} + +// IndexLockAndAlgorithm stores the algorithm option and the lock option. +type IndexLockAndAlgorithm struct { + node + + LockTp LockType + AlgorithmTp AlgorithmType +} + +// Restore implements Node interface. +func (n *IndexLockAndAlgorithm) Restore(ctx *format.RestoreCtx) error { + hasPrevOption := false + if n.AlgorithmTp != AlgorithmTypeDefault { + ctx.WriteKeyWord("ALGORITHM") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.AlgorithmTp.String()) + hasPrevOption = true + } + + if n.LockTp != LockTypeDefault { + if hasPrevOption { + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("LOCK") + ctx.WritePlain(" = ") + ctx.WriteKeyWord(n.LockTp.String()) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IndexLockAndAlgorithm) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IndexLockAndAlgorithm) + return v.Leave(n) +} + +// IndexKeyType is the type for index key. +type IndexKeyType int + +// Index key types. +const ( + IndexKeyTypeNone IndexKeyType = iota + IndexKeyTypeUnique + IndexKeyTypeSpatial + // IndexKeyTypeFulltext is only used in AST. + // It will be rewritten into IndexKeyTypeFulltext after preprocessor phase. + IndexKeyTypeFulltext +) + +// CreateIndexStmt is a statement to create an index. +// See https://dev.mysql.com/doc/refman/5.7/en/create-index.html +type CreateIndexStmt struct { + ddlNode + + IndexName string + Table *TableName + IndexPartSpecifications []*IndexPartSpecification + IndexOption *IndexOption + KeyType IndexKeyType + LockAlg *IndexLockAndAlgorithm +} + +// Restore implements Node interface. +func (n *CreateIndexStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + switch n.KeyType { //nolint:exhaustive + case IndexKeyTypeUnique: + ctx.WriteKeyWord("UNIQUE ") + case IndexKeyTypeSpatial: + ctx.WriteKeyWord("SPATIAL ") + case IndexKeyTypeFulltext: + ctx.WriteKeyWord("FULLTEXT ") + } + ctx.WriteKeyWord("INDEX ") + ctx.WriteName(n.IndexName) + ctx.WriteKeyWord(" ON ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateIndexStmt.Table: %w", err) + } + + ctx.WritePlain(" (") + for i, indexColName := range n.IndexPartSpecifications { + if i != 0 { + ctx.WritePlain(", ") + } + if err := indexColName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateIndexStmt.IndexPartSpecifications: [%v]: %w", i, err) + } + } + ctx.WritePlain(")") + + if n.IndexOption != nil && !n.IndexOption.IsEmpty() { + ctx.WritePlain(" ") + if err := n.IndexOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateIndexStmt.IndexOption: %w", err) + } + } + + if n.LockAlg != nil { + ctx.WritePlain(" ") + if err := n.LockAlg.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateIndexStmt.LockAlg: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.IndexPartSpecifications { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.IndexPartSpecifications[i] = node.(*IndexPartSpecification) + } + if n.IndexOption != nil { + node, ok := n.IndexOption.Accept(v) + if !ok { + return n, false + } + n.IndexOption = node.(*IndexOption) + } + if n.LockAlg != nil { + node, ok := n.LockAlg.Accept(v) + if !ok { + return n, false + } + n.LockAlg = node.(*IndexLockAndAlgorithm) + } + return v.Leave(n) +} + +// DropIndexStmt is a statement to drop the index. +// See https://dev.mysql.com/doc/refman/5.7/en/drop-index.html +type DropIndexStmt struct { + ddlNode + + IndexName string + Table *TableName + LockAlg *IndexLockAndAlgorithm +} + +// Restore implements Node interface. +func (n *DropIndexStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP INDEX ") + ctx.WriteName(n.IndexName) + ctx.WriteKeyWord(" ON ") + + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while add index: %w", err) + } + + if n.LockAlg != nil { + ctx.WritePlain(" ") + if err := n.LockAlg.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateIndexStmt.LockAlg: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DropIndexStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropIndexStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + if n.LockAlg != nil { + node, ok := n.LockAlg.Accept(v) + if !ok { + return n, false + } + n.LockAlg = node.(*IndexLockAndAlgorithm) + } + return v.Leave(n) +} + +// LockTablesStmt is a statement to lock tables. +type LockTablesStmt struct { + ddlNode + + TableLocks []TableLock +} + +// TableLock contains the table name and lock type. +type TableLock struct { + Table *TableName + Type TableLockType +} + +// Accept implements Node Accept interface. +func (n *LockTablesStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LockTablesStmt) + for i := range n.TableLocks { + node, ok := n.TableLocks[i].Table.Accept(v) + if !ok { + return n, false + } + n.TableLocks[i].Table = node.(*TableName) + } + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *LockTablesStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("LOCK TABLES ") + for i, tl := range n.TableLocks { + if i != 0 { + ctx.WritePlain(", ") + } + if err := tl.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while add index: %w", err) + } + ctx.WriteKeyWord(" " + tl.Type.String()) + } + return nil +} + +// UnlockTablesStmt is a statement to unlock tables. +type UnlockTablesStmt struct { + ddlNode +} + +// Accept implements Node Accept interface. +func (n *UnlockTablesStmt) Accept(v Visitor) (Node, bool) { + _, _ = v.Enter(n) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *UnlockTablesStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("UNLOCK TABLES") + return nil +} + +type StatsOptionType int + +const ( + StatsOptionBuckets StatsOptionType = 0x5000 + iota + StatsOptionTopN + StatsOptionColsChoice + StatsOptionColList + StatsOptionSampleRate +) + +// TableOptionType is the type for TableOption +type TableOptionType int + +// TableOption types. +const ( + TableOptionNone TableOptionType = iota + TableOptionEngine + TableOptionCharset + TableOptionCollate + TableOptionAutoIdCache //nolint:revive + TableOptionAutoIncrement + TableOptionComment + TableOptionAvgRowLength + TableOptionCheckSum + TableOptionCompression + TableOptionConnection + TableOptionPassword + TableOptionKeyBlockSize + TableOptionMaxRows + TableOptionMinRows + TableOptionDelayKeyWrite + TableOptionRowFormat + TableOptionStatsPersistent + TableOptionStatsAutoRecalc + TableOptionPackKeys + TableOptionTablespace + TableOptionNodegroup + TableOptionDataDirectory + TableOptionIndexDirectory + TableOptionStorageMedia + TableOptionStatsSamplePages + TableOptionSecondaryEngine + TableOptionSecondaryEngineNull + TableOptionInsertMethod + TableOptionUnion + TableOptionEncryption + TableOptionEngineAttribute + TableOptionSecondaryEngineAttribute + TableOptionAutoextendSize +) + +// RowFormat types +const ( + RowFormatDefault uint64 = iota + 1 + RowFormatDynamic + RowFormatFixed + RowFormatCompressed + RowFormatRedundant + RowFormatCompact +) + +// OnDuplicateKeyHandlingType is the option that handle unique key values in 'CREATE TABLE ... SELECT' or `LOAD DATA`. +// See https://dev.mysql.com/doc/refman/5.7/en/create-table-select.html +// See https://dev.mysql.com/doc/refman/5.7/en/load-data.html +type OnDuplicateKeyHandlingType int + +// OnDuplicateKeyHandling types +const ( + OnDuplicateKeyHandlingError OnDuplicateKeyHandlingType = iota + OnDuplicateKeyHandlingIgnore + OnDuplicateKeyHandlingReplace +) + +const ( + TableOptionCharsetWithoutConvertTo uint64 = 0 + TableOptionCharsetWithConvertTo uint64 = 1 +) + +const ( + // TableAffinityLevelNone means no affinity. + TableAffinityLevelNone = "none" + // TableAffinityLevelTable means table-level affinity. + TableAffinityLevelTable = "table" + // TableAffinityLevelPartition means partition-level affinity. + TableAffinityLevelPartition = "partition" +) + +// TableOption is used for parsing table option from SQL. +type TableOption struct { + node + Tp TableOptionType + Default bool + StrValue string + UintValue uint64 + BoolValue bool + TimeUnitValue *TimeUnitExpr + Value *ValueExpr + TableNames []*TableName + ColumnName *ColumnName +} + +func (n *TableOption) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { //nolint:exhaustive + case TableOptionEngine: + ctx.WriteKeyWord("ENGINE ") + ctx.WritePlain("= ") + if n.StrValue != "" { + ctx.WritePlain(n.StrValue) + } else { + ctx.WritePlain("''") + } + case TableOptionCharset: + if n.UintValue == TableOptionCharsetWithConvertTo { + ctx.WriteKeyWord("CONVERT TO ") + } else { + ctx.WriteKeyWord("DEFAULT ") + } + ctx.WriteKeyWord("CHARACTER SET ") + if n.UintValue == TableOptionCharsetWithoutConvertTo { + ctx.WriteKeyWord("= ") + } + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WriteKeyWord(n.StrValue) + } + case TableOptionCollate: + ctx.WriteKeyWord("DEFAULT COLLATE ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionAutoIncrement: + ctx.WriteKeyWord("AUTO_INCREMENT ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionComment: + ctx.WriteKeyWord("COMMENT ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionAvgRowLength: + ctx.WriteKeyWord("AVG_ROW_LENGTH ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionCheckSum: + ctx.WriteKeyWord("CHECKSUM ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionCompression: + ctx.WriteKeyWord("COMPRESSION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionConnection: + ctx.WriteKeyWord("CONNECTION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionPassword: + ctx.WriteKeyWord("PASSWORD ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionKeyBlockSize: + ctx.WriteKeyWord("KEY_BLOCK_SIZE ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionMaxRows: + ctx.WriteKeyWord("MAX_ROWS ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionMinRows: + ctx.WriteKeyWord("MIN_ROWS ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionDelayKeyWrite: + ctx.WriteKeyWord("DELAY_KEY_WRITE ") + ctx.WritePlain("= ") + ctx.WritePlainf("%d", n.UintValue) + case TableOptionRowFormat: + ctx.WriteKeyWord("ROW_FORMAT ") + ctx.WritePlain("= ") + switch n.UintValue { + case RowFormatDefault: + ctx.WriteKeyWord("DEFAULT") + case RowFormatDynamic: + ctx.WriteKeyWord("DYNAMIC") + case RowFormatFixed: + ctx.WriteKeyWord("FIXED") + case RowFormatCompressed: + ctx.WriteKeyWord("COMPRESSED") + case RowFormatRedundant: + ctx.WriteKeyWord("REDUNDANT") + case RowFormatCompact: + ctx.WriteKeyWord("COMPACT") + default: + return fmt.Errorf("invalid TableOption: TableOptionRowFormat: %d", n.UintValue) + } + case TableOptionStatsPersistent: + // TODO: not support + ctx.WriteKeyWord("STATS_PERSISTENT ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("DEFAULT") + ctx.WritePlain(" /* TableOptionStatsPersistent is not supported */ ") + case TableOptionStatsAutoRecalc: + ctx.WriteKeyWord("STATS_AUTO_RECALC ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionPackKeys: + // TODO: not support + ctx.WriteKeyWord("PACK_KEYS ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("DEFAULT") + ctx.WritePlain(" /* TableOptionPackKeys is not supported */ ") + case TableOptionTablespace: + ctx.WriteKeyWord("TABLESPACE ") + ctx.WritePlain("= ") + ctx.WriteName(n.StrValue) + case TableOptionNodegroup: + ctx.WriteKeyWord("NODEGROUP ") + ctx.WritePlainf("= %d", n.UintValue) + case TableOptionDataDirectory: + ctx.WriteKeyWord("DATA DIRECTORY ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionIndexDirectory: + ctx.WriteKeyWord("INDEX DIRECTORY ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionStorageMedia: + ctx.WriteKeyWord("STORAGE ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionStatsSamplePages: + ctx.WriteKeyWord("STATS_SAMPLE_PAGES ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionSecondaryEngine: + ctx.WriteKeyWord("SECONDARY_ENGINE ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionSecondaryEngineNull: + ctx.WriteKeyWord("SECONDARY_ENGINE ") + ctx.WritePlain("= ") + ctx.WriteKeyWord("NULL") + case TableOptionSecondaryEngineAttribute: + ctx.WriteKeyWord("SECONDARY_ENGINE_ATTRIBUTE ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionInsertMethod: + ctx.WriteKeyWord("INSERT_METHOD ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.StrValue) + case TableOptionUnion: + ctx.WriteKeyWord("UNION ") + ctx.WritePlain("= (") + for i, tableName := range n.TableNames { + if i != 0 { + ctx.WritePlain(",") + } + if err := tableName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing TableOption.TableNames: %w", err) + } + } + ctx.WritePlain(")") + case TableOptionEncryption: + ctx.WriteKeyWord("ENCRYPTION ") + ctx.WritePlain("= ") + ctx.WriteString(n.StrValue) + case TableOptionAutoextendSize: + ctx.WriteKeyWord("AUTOEXTEND_SIZE ") + ctx.WritePlain("= ") + ctx.WritePlain(n.StrValue) // e.g. '4M' + + default: + return fmt.Errorf("invalid TableOption: %d", n.Tp) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TableOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableOption) + if n.Value != nil { + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(*ValueExpr) + } + if n.TimeUnitValue != nil { + node, ok := n.TimeUnitValue.Accept(v) + if !ok { + return n, false + } + n.TimeUnitValue = node.(*TimeUnitExpr) + } + return v.Leave(n) +} + +// ColumnPositionType is the type for ColumnPosition. +type ColumnPositionType int + +// ColumnPosition Types +const ( + ColumnPositionNone ColumnPositionType = iota + ColumnPositionFirst + ColumnPositionAfter +) + +// ColumnPosition represent the position of the newly added column +type ColumnPosition struct { + node + // Tp is either ColumnPositionNone, ColumnPositionFirst or ColumnPositionAfter. + Tp ColumnPositionType + // RelativeColumn is the column the newly added column after if type is ColumnPositionAfter + RelativeColumn *ColumnName +} + +// Restore implements Node interface. +func (n *ColumnPosition) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { + case ColumnPositionNone: + // do nothing + case ColumnPositionFirst: + ctx.WriteKeyWord("FIRST") + case ColumnPositionAfter: + ctx.WriteKeyWord("AFTER ") + if err := n.RelativeColumn.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ColumnPosition.RelativeColumn: %w", err) + } + default: + return fmt.Errorf("invalid ColumnPositionType: %d", n.Tp) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnPosition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnPosition) + if n.RelativeColumn != nil { + node, ok := n.RelativeColumn.Accept(v) + if !ok { + return n, false + } + n.RelativeColumn = node.(*ColumnName) + } + return v.Leave(n) +} + +// AlterTableType is the type for AlterTableSpec. +type AlterTableType int + +// AlterTable types. +const ( + AlterTableOption AlterTableType = iota + 1 + AlterTableAddColumns + AlterTableAddConstraint + AlterTableDropColumn + AlterTableDropPrimaryKey + AlterTableDropIndex + AlterTableDropForeignKey + AlterTableModifyColumn + AlterTableChangeColumn + AlterTableRenameColumn + AlterTableRenameTable + AlterTableAlterColumn + AlterTableLock + AlterTableAlgorithm + AlterTableRenameIndex + AlterTableForce + AlterTableAddPartitions + AlterTableCoalescePartitions + AlterTableDropPartition + AlterTableTruncatePartition + AlterTablePartition + AlterTableEnableKeys + AlterTableDisableKeys + AlterTableRemovePartitioning + AlterTableWithValidation + AlterTableWithoutValidation + AlterTableSecondaryLoad + AlterTableSecondaryUnload + AlterTableRebuildPartition + AlterTableReorganizePartition + AlterTableCheckPartitions + AlterTableExchangePartition + AlterTableOptimizePartition + AlterTableRepairPartition + AlterTableImportPartitionTablespace + AlterTableDiscardPartitionTablespace + AlterTableAlterCheck + AlterTableDropCheck + AlterTableImportTablespace + AlterTableDiscardTablespace + AlterTableIndexInvisible + // TODO: Add more actions + AlterTableOrderByColumns +) + +// LockType is the type for AlterTableSpec. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-concurrency +type LockType byte + +func (n LockType) String() string { + switch n { + case LockTypeNone: + return "NONE" + case LockTypeDefault: + return "DEFAULT" + case LockTypeShared: + return "SHARED" + case LockTypeExclusive: + return "EXCLUSIVE" + } + return "" +} + +// Lock Types. +const ( + LockTypeNone LockType = iota + 1 + LockTypeDefault + LockTypeShared + LockTypeExclusive +) + +// AlgorithmType is the algorithm of the DDL operations. +// See https://dev.mysql.com/doc/refman/8.0/en/alter-table.html#alter-table-performance. +type AlgorithmType byte + +// DDL algorithms. +const ( + AlgorithmTypeDefault AlgorithmType = iota + AlgorithmTypeCopy + AlgorithmTypeInplace + AlgorithmTypeInstant +) + +func (a AlgorithmType) String() string { + switch a { + case AlgorithmTypeDefault: + return "DEFAULT" + case AlgorithmTypeCopy: + return "COPY" + case AlgorithmTypeInplace: + return "INPLACE" + case AlgorithmTypeInstant: + return "INSTANT" + default: + return "DEFAULT" + } +} + +// AlterTableSpec represents alter table specification. +type AlterTableSpec struct { + node + + NoWriteToBinlog bool + OnAllPartitions bool + + Tp AlterTableType + Name string + IndexName CIStr + Constraint *Constraint + Options []*TableOption + OrderByList []*AlterOrderItem + NewTable *TableName + NewColumns []*ColumnDef + NewConstraints []*Constraint + OldColumnName *ColumnName + NewColumnName *ColumnName + Position *ColumnPosition + LockType LockType + Algorithm AlgorithmType + Comment string + FromKey CIStr + ToKey CIStr + Partition *PartitionOptions + PartitionNames []CIStr + PartDefinitions []*PartitionDefinition + WithValidation bool + Num uint64 + Visibility IndexVisibility +} + +// AlterOrderItem represents an item in order by at alter table stmt. +type AlterOrderItem struct { + node + Column *ColumnName + Desc bool +} + +// Restore implements Node interface. +func (n *AlterOrderItem) Restore(ctx *format.RestoreCtx) error { + if err := n.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterOrderItem.Column: %w", err) + } + if n.Desc { + ctx.WriteKeyWord(" DESC") + } + return nil +} + +// Restore implements Node interface. +func (n *AlterTableSpec) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { //nolint:exhaustive + case AlterTableOption: + switch { + case len(n.Options) == 2 && n.Options[0].Tp == TableOptionCharset && n.Options[1].Tp == TableOptionCollate: + if n.Options[0].UintValue == TableOptionCharsetWithConvertTo { + ctx.WriteKeyWord("CONVERT TO ") + } + ctx.WriteKeyWord("CHARACTER SET ") + if n.Options[0].Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WriteKeyWord(n.Options[0].StrValue) + } + ctx.WriteKeyWord(" COLLATE ") + ctx.WriteKeyWord(n.Options[1].StrValue) + case n.Options[0].Tp == TableOptionCharset && n.Options[0].Default: + if n.Options[0].UintValue == TableOptionCharsetWithConvertTo { + ctx.WriteKeyWord("CONVERT TO ") + } + ctx.WriteKeyWord("CHARACTER SET DEFAULT") + default: + for i, opt := range n.Options { + if i != 0 { + ctx.WritePlain(" ") + } + if err := opt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Options[%d]: %w", i, err) + } + } + } + case AlterTableAddColumns: + ctx.WriteKeyWord("ADD COLUMN ") + if n.Position != nil && len(n.NewColumns) == 1 { + if err := n.NewColumns[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[%d]: %w", 0, err) + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Position: %w", err) + } + } else { + lenCols := len(n.NewColumns) + ctx.WritePlain("(") + for i, col := range n.NewColumns { + if i != 0 { + ctx.WritePlain(", ") + } + if err := col.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[%d]: %w", i, err) + } + } + for i, constraint := range n.NewConstraints { + if i != 0 || lenCols >= 1 { + ctx.WritePlain(", ") + } + if err := constraint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewConstraints[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + case AlterTableAddConstraint: + ctx.WriteKeyWord("ADD ") + if err := n.Constraint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Constraint: %w", err) + } + case AlterTableDropColumn: + ctx.WriteKeyWord("DROP COLUMN ") + if err := n.OldColumnName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.OldColumnName: %w", err) + } + // TODO: RestrictOrCascadeOpt not support + case AlterTableDropPrimaryKey: + ctx.WriteKeyWord("DROP PRIMARY KEY") + case AlterTableDropIndex: + ctx.WriteKeyWord("DROP INDEX ") + ctx.WriteName(n.Name) + case AlterTableDropForeignKey: + ctx.WriteKeyWord("DROP FOREIGN KEY ") + ctx.WriteName(n.Name) + case AlterTableModifyColumn: + ctx.WriteKeyWord("MODIFY COLUMN ") + if err := n.NewColumns[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[0]: %w", err) + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Position: %w", err) + } + case AlterTableChangeColumn: + ctx.WriteKeyWord("CHANGE COLUMN ") + if err := n.OldColumnName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.OldColumnName: %w", err) + } + ctx.WritePlain(" ") + if err := n.NewColumns[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[0]: %w", err) + } + if n.Position.Tp != ColumnPositionNone { + ctx.WritePlain(" ") + } + if err := n.Position.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Position: %w", err) + } + case AlterTableRenameColumn: + ctx.WriteKeyWord("RENAME COLUMN ") + if err := n.OldColumnName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.OldColumnName: %w", err) + } + ctx.WriteKeyWord(" TO ") + if err := n.NewColumnName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumnName: %w", err) + } + case AlterTableRenameTable: + ctx.WriteKeyWord("RENAME AS ") + if err := n.NewTable.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewTable: %w", err) + } + case AlterTableAlterColumn: + ctx.WriteKeyWord("ALTER COLUMN ") + if err := n.NewColumns[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[0]: %w", err) + } + if len(n.NewColumns[0].Options) == 1 { + ctx.WriteKeyWord("SET DEFAULT ") + expr := n.NewColumns[0].Options[0].Expr + switch expr.(type) { + case *ValueExpr, *ParenthesesExpr: + // Literals restore bare. A ParenthesesExpr prints its own + // parentheses: the grammar preserves them to keep expression + // defaults (SET DEFAULT ('{}')) distinct from literal + // defaults (SET DEFAULT '{}'). + if err := expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr: %w", err) + } + default: + // A programmatically built AST may hold a bare expression; + // MySQL requires parentheses around non-literal defaults. + ctx.WritePlain("(") + if err := expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewColumns[0].Options[0].Expr: %w", err) + } + ctx.WritePlain(")") + } + } else { + ctx.WriteKeyWord(" DROP DEFAULT") + } + case AlterTableLock: + ctx.WriteKeyWord("LOCK ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.LockType.String()) + case AlterTableOrderByColumns: + ctx.WriteKeyWord("ORDER BY ") + for i, alterOrderItem := range n.OrderByList { + if i != 0 { + ctx.WritePlain(",") + } + if err := alterOrderItem.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.OrderByList[%d]: %w", i, err) + } + } + case AlterTableAlgorithm: + ctx.WriteKeyWord("ALGORITHM ") + ctx.WritePlain("= ") + ctx.WriteKeyWord(n.Algorithm.String()) + case AlterTableRenameIndex: + ctx.WriteKeyWord("RENAME INDEX ") + ctx.WriteName(n.FromKey.O) + ctx.WriteKeyWord(" TO ") + ctx.WriteName(n.ToKey.O) + case AlterTableForce: + // TODO: not support + ctx.WriteKeyWord("FORCE") + ctx.WritePlain(" /* AlterTableForce is not supported */ ") + case AlterTableAddPartitions: + ctx.WriteKeyWord("ADD PARTITION") + if n.NoWriteToBinlog { + ctx.WriteKeyWord(" NO_WRITE_TO_BINLOG") + } + if n.PartDefinitions != nil { + ctx.WritePlain(" (") + for i, def := range n.PartDefinitions { + if i != 0 { + ctx.WritePlain(", ") + } + if err := def.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.PartDefinitions[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } else if n.Num != 0 { + ctx.WriteKeyWord(" PARTITIONS ") + ctx.WritePlainf("%d", n.Num) + } + case AlterTableCoalescePartitions: + ctx.WriteKeyWord("COALESCE PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WritePlainf("%d", n.Num) + case AlterTableDropPartition: + ctx.WriteKeyWord("DROP PARTITION ") + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableTruncatePartition: + ctx.WriteKeyWord("TRUNCATE PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableCheckPartitions: + ctx.WriteKeyWord("CHECK PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableOptimizePartition: + ctx.WriteKeyWord("OPTIMIZE PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableRepairPartition: + ctx.WriteKeyWord("REPAIR PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableImportPartitionTablespace: + ctx.WriteKeyWord("IMPORT PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + } else { + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + } + ctx.WriteKeyWord(" TABLESPACE") + case AlterTableDiscardPartitionTablespace: + ctx.WriteKeyWord("DISCARD PARTITION ") + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + } else { + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + } + ctx.WriteKeyWord(" TABLESPACE") + case AlterTablePartition: + if err := n.Partition.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.Partition: %w", err) + } + case AlterTableEnableKeys: + ctx.WriteKeyWord("ENABLE KEYS") + case AlterTableDisableKeys: + ctx.WriteKeyWord("DISABLE KEYS") + case AlterTableRemovePartitioning: + ctx.WriteKeyWord("REMOVE PARTITIONING") + case AlterTableWithValidation: + ctx.WriteKeyWord("WITH VALIDATION") + case AlterTableWithoutValidation: + ctx.WriteKeyWord("WITHOUT VALIDATION") + case AlterTableRebuildPartition: + ctx.WriteKeyWord("REBUILD PARTITION ") + if n.NoWriteToBinlog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + if n.OnAllPartitions { + ctx.WriteKeyWord("ALL") + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(name.O) + } + case AlterTableReorganizePartition: + ctx.WriteKeyWord("REORGANIZE PARTITION") + if n.NoWriteToBinlog { + ctx.WriteKeyWord(" NO_WRITE_TO_BINLOG") + } + if n.OnAllPartitions { + return nil + } + for i, name := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } else { + ctx.WritePlain(" ") + } + ctx.WriteName(name.O) + } + ctx.WriteKeyWord(" INTO ") + if n.PartDefinitions != nil { + ctx.WritePlain("(") + for i, def := range n.PartDefinitions { + if i != 0 { + ctx.WritePlain(", ") + } + if err := def.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.PartDefinitions[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + case AlterTableExchangePartition: + ctx.WriteKeyWord("EXCHANGE PARTITION ") + ctx.WriteName(n.PartitionNames[0].O) + ctx.WriteKeyWord(" WITH TABLE ") + if err := n.NewTable.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableSpec.NewTable: %w", err) + } + if !n.WithValidation { + ctx.WriteKeyWord(" WITHOUT VALIDATION") + } + case AlterTableSecondaryLoad: + ctx.WriteKeyWord("SECONDARY_LOAD") + case AlterTableSecondaryUnload: + ctx.WriteKeyWord("SECONDARY_UNLOAD") + case AlterTableAlterCheck: + ctx.WriteKeyWord("ALTER CHECK ") + ctx.WriteName(n.Constraint.Name) + if !n.Constraint.Enforced { + ctx.WriteKeyWord(" NOT") + } + ctx.WriteKeyWord(" ENFORCED") + case AlterTableDropCheck: + ctx.WriteKeyWord("DROP CHECK ") + ctx.WriteName(n.Constraint.Name) + case AlterTableImportTablespace: + ctx.WriteKeyWord("IMPORT TABLESPACE") + case AlterTableDiscardTablespace: + ctx.WriteKeyWord("DISCARD TABLESPACE") + case AlterTableIndexInvisible: + ctx.WriteKeyWord("ALTER INDEX ") + ctx.WriteName(n.IndexName.O) + switch n.Visibility { //nolint:exhaustive + case IndexVisibilityVisible: + ctx.WriteKeyWord(" VISIBLE") + case IndexVisibilityInvisible: + ctx.WriteKeyWord(" INVISIBLE") + } + default: + // TODO: not support + ctx.WritePlainf(" /* AlterTableType(%d) is not supported */ ", n.Tp) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableSpec) + if n.Constraint != nil { + node, ok := n.Constraint.Accept(v) + if !ok { + return n, false + } + n.Constraint = node.(*Constraint) + } + if n.NewTable != nil { + node, ok := n.NewTable.Accept(v) + if !ok { + return n, false + } + n.NewTable = node.(*TableName) + } + for i, col := range n.NewColumns { + node, ok := col.Accept(v) + if !ok { + return n, false + } + n.NewColumns[i] = node.(*ColumnDef) + } + for i, constraint := range n.NewConstraints { + node, ok := constraint.Accept(v) + if !ok { + return n, false + } + n.NewConstraints[i] = node.(*Constraint) + } + if n.OldColumnName != nil { + node, ok := n.OldColumnName.Accept(v) + if !ok { + return n, false + } + n.OldColumnName = node.(*ColumnName) + } + if n.Position != nil { + node, ok := n.Position.Accept(v) + if !ok { + return n, false + } + n.Position = node.(*ColumnPosition) + } + if n.Partition != nil { + node, ok := n.Partition.Accept(v) + if !ok { + return n, false + } + n.Partition = node.(*PartitionOptions) + } + for i, option := range n.Options { + node, ok := option.Accept(v) + if !ok { + return n, false + } + n.Options[i] = node.(*TableOption) + } + for _, def := range n.PartDefinitions { + if !def.acceptInPlace(v) { + return n, false + } + } + return v.Leave(n) +} + +// AlterTableStmt is a statement to change the structure of a table. +// See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html +type AlterTableStmt struct { + ddlNode + + Table *TableName + Specs []*AlterTableSpec +} + +// Restore implements Node interface. +func (n *AlterTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableStmt.Table: %w", err) + } + specs := n.Specs + for i, spec := range specs { + if i == 0 || spec.Tp == AlterTablePartition || spec.Tp == AlterTableRemovePartitioning || spec.Tp == AlterTableImportTablespace || spec.Tp == AlterTableDiscardTablespace { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + if err := spec.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterTableStmt.Specs[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + for i, val := range n.Specs { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.Specs[i] = node.(*AlterTableSpec) + } + return v.Leave(n) +} + +// TruncateTableStmt is a statement to empty a table completely. +// See https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html +type TruncateTableStmt struct { + ddlNode + + Table *TableName +} + +// Restore implements Node interface. +func (n *TruncateTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("TRUNCATE TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TruncateTableStmt.Table: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TruncateTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TruncateTableStmt) + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + return v.Leave(n) +} + +var ( + ErrNoParts = mysql.NewStdErr("ddl", mysql.ErrNoParts) + ErrPartitionColumnList = mysql.NewStdErr("ddl", mysql.ErrPartitionColumnList) + ErrPartitionRequiresValues = mysql.NewStdErr("ddl", mysql.ErrPartitionRequiresValues) + ErrPartitionsMustBeDefined = mysql.NewStdErr("ddl", mysql.ErrPartitionsMustBeDefined) + ErrPartitionWrongNoPart = mysql.NewStdErr("ddl", mysql.ErrPartitionWrongNoPart) + ErrPartitionWrongNoSubpart = mysql.NewStdErr("ddl", mysql.ErrPartitionWrongNoSubpart) + ErrPartitionWrongValues = mysql.NewStdErr("ddl", mysql.ErrPartitionWrongValues) + ErrRowSinglePartitionField = mysql.NewStdErr("ddl", mysql.ErrRowSinglePartitionField) + ErrSubpartition = mysql.NewStdErr("ddl", mysql.ErrSubpartition) + ErrTooManyValues = mysql.NewStdErr("ddl", mysql.ErrTooManyValues) + ErrUnknownCharacterSet = mysql.NewStdErr("ddl", mysql.ErrUnknownCharacterSet) + ErrCoalescePartitionNoPartition = mysql.NewStdErr("ddl", mysql.ErrCoalescePartitionNoPartition) + ErrWrongUsage = mysql.NewStdErr("ddl", mysql.ErrWrongUsage) +) + +type SubPartitionDefinition struct { + Name CIStr + Options []*TableOption +} + +func (spd *SubPartitionDefinition) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SUBPARTITION ") + ctx.WriteName(spd.Name.O) + for i, opt := range spd.Options { + ctx.WritePlain(" ") + if err := opt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SubPartitionDefinition.Options[%d]: %w", i, err) + } + } + return nil +} + +type PartitionDefinitionClause interface { + restore(ctx *format.RestoreCtx) error + acceptInPlace(v Visitor) bool + // Validate checks if the clause is consistent with the given options. + // `pt` can be 0 and `columns` can be -1 to skip checking the clause against + // the partition type or number of columns in the expression list. + Validate(pt PartitionType, columns int) error +} + +type PartitionDefinitionClauseNone struct{} + +func (*PartitionDefinitionClauseNone) restore(_ *format.RestoreCtx) error { + return nil +} + +func (*PartitionDefinitionClauseNone) acceptInPlace(_ Visitor) bool { + return true +} + +func (*PartitionDefinitionClauseNone) Validate(pt PartitionType, _ int) error { + switch pt { //nolint:exhaustive + case 0: + case PartitionTypeRange: + return ErrPartitionRequiresValues.GenByArgs("RANGE", "LESS THAN") + case PartitionTypeList: + return ErrPartitionRequiresValues.GenByArgs("LIST", "IN") + } + return nil +} + +type PartitionDefinitionClauseLessThan struct { + Exprs []ExprNode +} + +func (n *PartitionDefinitionClauseLessThan) restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(" VALUES LESS THAN ") + ctx.WritePlain("(") + for i, expr := range n.Exprs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinitionClauseLessThan.Exprs[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + return nil +} + +func (n *PartitionDefinitionClauseLessThan) acceptInPlace(v Visitor) bool { + for i, expr := range n.Exprs { + newExpr, ok := expr.Accept(v) + if !ok { + return false + } + n.Exprs[i] = newExpr.(ExprNode) + } + return true +} + +func (n *PartitionDefinitionClauseLessThan) Validate(pt PartitionType, columns int) error { + switch pt { //nolint:exhaustive + case PartitionTypeRange, 0: + default: + return ErrPartitionWrongValues.GenByArgs("RANGE", "LESS THAN") + } + + switch { + case columns == 0 && len(n.Exprs) != 1: + return ErrTooManyValues.GenByArgs("RANGE") + case columns > 0 && len(n.Exprs) != columns: + return ErrPartitionColumnList + } + return nil +} + +type PartitionDefinitionClauseIn struct { + Values [][]ExprNode +} + +func (n *PartitionDefinitionClauseIn) restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(" VALUES IN ") + ctx.WritePlain("(") + for i, valList := range n.Values { + if i != 0 { + ctx.WritePlain(", ") + } + if len(valList) == 1 { + if err := valList[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinitionClauseIn.Values[%d][0]: %w", i, err) + } + } else { + ctx.WritePlain("(") + for j, val := range valList { + if j != 0 { + ctx.WritePlain(", ") + } + if err := val.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinitionClauseIn.Values[%d][%d]: %w", i, j, err) + } + } + ctx.WritePlain(")") + } + } + ctx.WritePlain(")") + return nil +} + +func (n *PartitionDefinitionClauseIn) acceptInPlace(v Visitor) bool { + for _, valList := range n.Values { + for j, val := range valList { + newVal, ok := val.Accept(v) + if !ok { + return false + } + valList[j] = newVal.(ExprNode) + } + } + return true +} + +func (n *PartitionDefinitionClauseIn) Validate(pt PartitionType, columns int) error { + switch pt { //nolint:exhaustive + case PartitionTypeList, 0: + default: + return ErrPartitionWrongValues.GenByArgs("LIST", "IN") + } + + if len(n.Values) == 0 { + return nil + } + + expectedColCount := len(n.Values[0]) + for _, val := range n.Values[1:] { + if len(val) != expectedColCount { + return ErrPartitionColumnList + } + } + + switch { + case columns == 0 && expectedColCount != 1: + return ErrRowSinglePartitionField + case columns > 0 && expectedColCount != columns: + if len(n.Values) == 1 && expectedColCount == 1 { + if _, ok := n.Values[0][0].(*DefaultExpr); ok { + // Only one value, which is DEFAULT, which is OK + return nil + } + } + return ErrPartitionColumnList + } + return nil +} + +// PartitionDefinition defines a single partition. +type PartitionDefinition struct { + Name CIStr + Clause PartitionDefinitionClause + Options []*TableOption + Sub []*SubPartitionDefinition +} + +// Comment returns the comment option given to this definition. +// The second return value indicates if the comment option exists. +func (n *PartitionDefinition) Comment() (string, bool) { + for _, opt := range n.Options { + if opt.Tp == TableOptionComment { + return opt.StrValue, true + } + } + return "", false +} + +func (n *PartitionDefinition) acceptInPlace(v Visitor) bool { + return n.Clause.acceptInPlace(v) +} + +// Restore implements Node interface. +func (n *PartitionDefinition) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("PARTITION ") + ctx.WriteName(n.Name.O) + + if err := n.Clause.restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinition.Clause: %w", err) + } + + for i, opt := range n.Options { + ctx.WritePlain(" ") + if err := opt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinition.Options[%d]: %w", i, err) + } + } + + if len(n.Sub) > 0 { + ctx.WritePlain(" (") + for i, spd := range n.Sub { + if i != 0 { + ctx.WritePlain(",") + } + if err := spd.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionDefinition.Sub[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + + return nil +} + +// PartitionMethod describes how partitions or subpartitions are constructed. +type PartitionMethod struct { + // To be able to get original text and replace the syntactic sugar with generated + // partition definitions + node + // Tp is the type of the partition function + Tp PartitionType + // Linear is a modifier to the HASH and KEY type for choosing a different + // algorithm + Linear bool + // Expr is an expression used as argument of HASH, RANGE AND LIST types + Expr ExprNode + // ColumnNames is a list of column names used as argument of KEY, + // RANGE COLUMNS and LIST COLUMNS types + ColumnNames []*ColumnName + + // Num is the number of (sub)partitions required by the method. + Num uint64 + + // KeyAlgorithm is the optional hash algorithm type for `PARTITION BY [LINEAR] KEY` syntax. + KeyAlgorithm *PartitionKeyAlgorithm +} + +type PartitionKeyAlgorithm struct { + Type uint64 +} + +// Restore implements the Node interface +func (n *PartitionMethod) Restore(ctx *format.RestoreCtx) error { + if n.Linear { + ctx.WriteKeyWord("LINEAR ") + } + ctx.WriteKeyWord(n.Tp.String()) + + if n.KeyAlgorithm != nil { + ctx.WriteKeyWord(" ALGORITHM") + ctx.WritePlainf(" = %d", n.KeyAlgorithm.Type) + } + + switch { + case n.Expr != nil: + ctx.WritePlain(" (") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionMethod.Expr: %w", err) + } + ctx.WritePlain(")") + + default: + if n.Tp == PartitionTypeRange || n.Tp == PartitionTypeList { + ctx.WriteKeyWord(" COLUMNS") + } + ctx.WritePlain(" (") + for i, col := range n.ColumnNames { + if i > 0 { + ctx.WritePlain(",") + } + if err := col.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing PartitionMethod.ColumnName[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + + return nil +} + +// acceptInPlace is like Node.Accept but does not allow replacing the node itself. +func (n *PartitionMethod) acceptInPlace(v Visitor) bool { + if n.Expr != nil { + expr, ok := n.Expr.Accept(v) + if !ok { + return false + } + n.Expr = expr.(ExprNode) + } + for i, colName := range n.ColumnNames { + newColName, ok := colName.Accept(v) + if !ok { + return false + } + n.ColumnNames[i] = newColName.(*ColumnName) + } + return true +} + +// PartitionOptions specifies the partition options. +type PartitionOptions struct { + PartitionMethod + Sub *PartitionMethod + Definitions []*PartitionDefinition +} + +// Validate checks if the partition is well-formed. +func (n *PartitionOptions) Validate() error { + // if both a partition list and the partition numbers are specified, their values must match + if n.Num != 0 && len(n.Definitions) != 0 && n.Num != uint64(len(n.Definitions)) { + return ErrPartitionWrongNoPart + } + // now check the subpartition count + if len(n.Definitions) > 0 { + // ensure the subpartition count for every partitions are the same + // then normalize n.Num and n.Sub.Num so equality comparison works. + n.Num = uint64(len(n.Definitions)) + + subDefCount := len(n.Definitions[0].Sub) + for _, pd := range n.Definitions[1:] { + if len(pd.Sub) != subDefCount { + return ErrPartitionWrongNoSubpart + } + } + if n.Sub != nil { + if n.Sub.Num != 0 && subDefCount != 0 && n.Sub.Num != uint64(subDefCount) { + return ErrPartitionWrongNoSubpart + } + if subDefCount != 0 { + n.Sub.Num = uint64(subDefCount) + } + } else if subDefCount != 0 { + return ErrSubpartition + } + } + + switch n.Tp { //nolint:exhaustive + case PartitionTypeHash, PartitionTypeKey: + if n.Num == 0 { + n.Num = 1 + } + case PartitionTypeRange, PartitionTypeList: + if len(n.Definitions) == 0 { + return ErrPartitionsMustBeDefined.GenByArgs(n.Tp) + } + } + + for _, pd := range n.Definitions { + // ensure the partition definition types match the methods, + // e.g. RANGE partitions only allows VALUES LESS THAN + if err := pd.Clause.Validate(n.Tp, len(n.ColumnNames)); err != nil { + return err + } + } + + return nil +} + +func (n *PartitionOptions) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("PARTITION BY ") + if err := n.PartitionMethod.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionOptions.PartitionMethod: %w", err) + } + + if n.Num > 0 && len(n.Definitions) == 0 { + ctx.WriteKeyWord(" PARTITIONS ") + ctx.WritePlainf("%d", n.Num) + } + + if n.Sub != nil { + ctx.WriteKeyWord(" SUBPARTITION BY ") + if err := n.Sub.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionOptions.Sub: %w", err) + } + if n.Sub.Num > 0 { + ctx.WriteKeyWord(" SUBPARTITIONS ") + ctx.WritePlainf("%d", n.Sub.Num) + } + } + + if len(n.Definitions) > 0 { + ctx.WritePlain(" (") + for i, def := range n.Definitions { + if i > 0 { + ctx.WritePlain(",") + } + if err := def.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionOptions.Definitions[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + + return nil +} + +func (n *PartitionOptions) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*PartitionOptions) + if !n.acceptInPlace(v) { + return n, false + } + if n.Sub != nil && !n.Sub.acceptInPlace(v) { + return n, false + } + for _, def := range n.Definitions { + if !def.acceptInPlace(v) { + return n, false + } + } + return v.Leave(n) +} diff --git a/pkg/parser/ast/dml.go b/pkg/parser/ast/dml.go new file mode 100644 index 000000000..75ce111b0 --- /dev/null +++ b/pkg/parser/ast/dml.go @@ -0,0 +1,3344 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "errors" + "fmt" + "strings" + + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" +) + +var ( + _ DMLNode = &DeleteStmt{} + _ DMLNode = &InsertStmt{} + _ DMLNode = &SetOprStmt{} + _ DMLNode = &UpdateStmt{} + _ DMLNode = &SelectStmt{} + _ DMLNode = &CallStmt{} + _ DMLNode = &ShowStmt{} + _ DMLNode = &LoadDataStmt{} + + _ Node = &Assignment{} + _ Node = &ByItem{} + _ Node = &FieldList{} + _ Node = &GroupByClause{} + _ Node = &HavingClause{} + _ Node = &Join{} + _ Node = &Limit{} + _ Node = &OnCondition{} + _ Node = &OrderByClause{} + _ Node = &SelectField{} + _ Node = &TableName{} + _ Node = &TableRefsClause{} + _ Node = &TableSource{} + _ Node = &SetOprSelectList{} + _ Node = &WildCardField{} + _ Node = &WindowSpec{} + _ Node = &PartitionByClause{} + _ Node = &FrameClause{} + _ Node = &FrameBound{} +) + +// JoinType is join type, including cross/left/right/full. +type JoinType int + +const ( + // CrossJoin is cross join type. + CrossJoin JoinType = iota + 1 + // LeftJoin is left Join type. + LeftJoin + // RightJoin is right Join type. + RightJoin +) + +// Join represents table join. +type Join struct { + node + + // Left table can be TableSource or JoinNode. + Left ResultSetNode + // Right table can be TableSource or JoinNode or nil. + Right ResultSetNode + // Tp represents join type. + Tp JoinType + // On represents join on condition. + On *OnCondition + // Using represents join using clause. + Using []*ColumnName + // NaturalJoin represents join is natural join. + NaturalJoin bool + // StraightJoin represents a straight join. + StraightJoin bool + ExplicitParens bool +} + +func (*Join) resultSet() {} + +// NewCrossJoin builds a cross join without `on` or `using` clause. +// If the right child is a join tree, we need to handle it differently to make the precedence get right. +// Here is the example: t1 join t2 join t3 +// +// JOIN ON t2.a = t3.a +// t1 join / \ +// t2 t3 +// +// (left) (right) +// +// We can not build it directly to: +// +// JOIN +// / \ +// t1 JOIN ON t2.a = t3.a +// / \ +// t2 t3 +// +// The precedence would be t1 join (t2 join t3 on t2.a=t3.a), not (t1 join t2) join t3 on t2.a=t3.a +// We need to find the left-most child of the right child, and build a cross join of the left-hand side +// of the left child(t1), and the right hand side with the original left-most child of the right child(t2). +// +// JOIN t2.a = t3.a +// / \ +// JOIN t3 +// / \ +// t1 t2 +// +// Besides, if the right handle side join tree's join type is right join and has explicit parentheses, we need to rewrite it to left join. +// So t1 join t2 right join t3 would be rewrite to t1 join t3 left join t2. +// If not, t1 join (t2 right join t3) would be (t1 join t2) right join t3. After rewrite the right join to left join. +// We get (t1 join t3) left join t2, the semantics is correct. +func NewCrossJoin(left, right ResultSetNode) (n *Join) { + rj, ok := right.(*Join) + // don't break the explicit parents name scope constraints. + // this kind of join re-order can be done in logical-phase after the name resolution. + if !ok || rj.Right == nil || rj.ExplicitParens { + return &Join{Left: left, Right: right, Tp: CrossJoin} + } + + var leftMostLeafFatherOfRight = rj + // Walk down the right hand side. + for { + if leftMostLeafFatherOfRight.Tp == RightJoin && leftMostLeafFatherOfRight.ExplicitParens { + // Rewrite right join to left join. + leftMostLeafFatherOfRight.Right, leftMostLeafFatherOfRight.Left = leftMostLeafFatherOfRight.Left, leftMostLeafFatherOfRight.Right + leftMostLeafFatherOfRight.Tp = LeftJoin + } + leftChild := leftMostLeafFatherOfRight.Left + join, ok := leftChild.(*Join) + if !ok || join.Right == nil { + break + } + leftMostLeafFatherOfRight = join + } + + newCrossJoin := &Join{Left: left, Right: leftMostLeafFatherOfRight.Left, Tp: CrossJoin} + leftMostLeafFatherOfRight.Left = newCrossJoin + return rj +} + +// Restore implements Node interface. +func (n *Join) Restore(ctx *format.RestoreCtx) error { + useCommaJoin := false + _, leftIsJoin := n.Left.(*Join) + + if leftIsJoin && n.Left.(*Join).Right == nil { + if ts, ok := n.Left.(*Join).Left.(*TableSource); ok { + switch ts.Source.(type) { + case *SelectStmt, *SetOprStmt: + useCommaJoin = true + } + } + } + + if leftIsJoin && !useCommaJoin { + ctx.WritePlain("(") + } + if err := n.Left.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Join.Left: %w", err) + } + if leftIsJoin && !useCommaJoin { + ctx.WritePlain(")") + } + if n.Right == nil { + return nil + } + if n.NaturalJoin { + ctx.WriteKeyWord(" NATURAL") + } + switch n.Tp { //nolint:exhaustive + case LeftJoin: + ctx.WriteKeyWord(" LEFT") + case RightJoin: + ctx.WriteKeyWord(" RIGHT") + } + if n.StraightJoin { + ctx.WriteKeyWord(" STRAIGHT_JOIN ") + } else { + if useCommaJoin { + ctx.WritePlain(", ") + } else { + ctx.WriteKeyWord(" JOIN ") + } + } + _, rightIsJoin := n.Right.(*Join) + if rightIsJoin { + ctx.WritePlain("(") + } + if err := n.Right.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Join.Right: %w", err) + } + if rightIsJoin { + ctx.WritePlain(")") + } + + if n.On != nil { + ctx.WritePlain(" ") + if err := n.On.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Join.On: %w", err) + } + } + if len(n.Using) != 0 { + ctx.WriteKeyWord(" USING ") + ctx.WritePlain("(") + for i, v := range n.Using { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Join.Using: %w", err) + } + } + ctx.WritePlain(")") + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *Join) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Join) + node, ok := n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ResultSetNode) + if n.Right != nil { + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ResultSetNode) + } + if n.On != nil { + node, ok = n.On.Accept(v) + if !ok { + return n, false + } + n.On = node.(*OnCondition) + } + for i, col := range n.Using { + node, ok = col.Accept(v) + if !ok { + return n, false + } + n.Using[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// TableName represents a table name. +type TableName struct { + node + + Schema CIStr + Name CIStr + + IndexHints []*IndexHint + PartitionNames []CIStr + // IsAlias is true if this table name is an alias. + // sometime, we need to distinguish the table name is an alias or not. + // for example ```delete tt1 from t1 tt1,(select max(id) id from t2)tt2 where tt1.id<=tt2.id``` + // ```tt1``` is a alias name. so we need to set IsAlias to true and restore the table name without database name. + IsAlias bool +} + +func (*TableName) resultSet() {} + +// Restore implements Node interface. +func (n *TableName) restoreName(ctx *format.RestoreCtx) { + if !ctx.Flags.HasWithoutSchemaNameFlag() { + // restore db name + if n.Schema.String() != "" { + ctx.WriteName(n.Schema.String()) + ctx.WritePlain(".") + } else if ctx.DefaultDB != "" && !n.IsAlias { + // Try CTE, for a CTE table name, we shouldn't write the database name. + if !ctx.IsCTETableName(n.Name.L) { + ctx.WriteName(ctx.DefaultDB) + ctx.WritePlain(".") + } + } + } + // restore table name + ctx.WriteName(n.Name.String()) +} + +func (n *TableName) restorePartitions(ctx *format.RestoreCtx) { + if len(n.PartitionNames) > 0 { + ctx.WriteKeyWord(" PARTITION") + ctx.WritePlain("(") + for i, v := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(v.String()) + } + ctx.WritePlain(")") + } +} + +func (n *TableName) restoreIndexHints(ctx *format.RestoreCtx) error { + for _, value := range n.IndexHints { + ctx.WritePlain(" ") + if err := value.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while splicing IndexHints: %w", err) + } + } + return nil +} + +func (n *TableName) Restore(ctx *format.RestoreCtx) error { + n.restoreName(ctx) + n.restorePartitions(ctx) + if err := n.restoreIndexHints(ctx); err != nil { + return err + } + return nil +} + +// IndexHintType is the type for index hint use, ignore or force. +type IndexHintType int + +// IndexHintUseType values. +const ( + HintUse IndexHintType = iota + 1 + HintIgnore + HintForce + HintOrderIndex + HintNoOrderIndex +) + +// IndexHintScope is the type for index hint for join, order by or group by. +type IndexHintScope int + +// Index hint scopes. +const ( + HintForScan IndexHintScope = iota + 1 + HintForJoin + HintForOrderBy + HintForGroupBy +) + +// IndexHint represents a hint for optimizer to use/ignore/force for join/order by/group by. +type IndexHint struct { + IndexNames []CIStr + HintType IndexHintType + HintScope IndexHintScope +} + +// IndexHint Restore (The const field uses switch to facilitate understanding) +func (n *IndexHint) Restore(ctx *format.RestoreCtx) error { + indexHintType := "" + switch n.HintType { + case HintUse: + indexHintType = "USE INDEX" + case HintIgnore: + indexHintType = "IGNORE INDEX" + case HintForce: + indexHintType = "FORCE INDEX" + case HintOrderIndex: + indexHintType = "ORDER INDEX" + case HintNoOrderIndex: + indexHintType = "NO ORDER INDEX" + default: // Prevent accidents + return errors.New("IndexHintType has an error while matching") + } + + indexHintScope := "" + switch n.HintScope { + case HintForScan: + indexHintScope = "" + case HintForJoin: + indexHintScope = " FOR JOIN" + case HintForOrderBy: + indexHintScope = " FOR ORDER BY" + case HintForGroupBy: + indexHintScope = " FOR GROUP BY" + default: // Prevent accidents + return errors.New("IndexHintScope has an error while matching") + } + ctx.WriteKeyWord(indexHintType) + ctx.WriteKeyWord(indexHintScope) + ctx.WritePlain(" (") + for i, value := range n.IndexNames { + if i > 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(value.O) + } + ctx.WritePlain(")") + + return nil +} + +// Accept implements Node Accept interface. +func (n *TableName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableName) + return v.Leave(n) +} + +// DeleteTableList is the tablelist used in delete statement multi-table mode. +type DeleteTableList struct { + node + Tables []*TableName +} + +// Restore implements Node interface. +func (n *DeleteTableList) Restore(ctx *format.RestoreCtx) error { + for i, t := range n.Tables { + if i != 0 { + ctx.WritePlain(",") + } + if err := t.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteTableList.Tables[%v]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DeleteTableList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeleteTableList) + if n != nil { + for i, t := range n.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + } + return v.Leave(n) +} + +// OnCondition represents JOIN on condition. +type OnCondition struct { + node + + Expr ExprNode +} + +// Restore implements Node interface. +func (n *OnCondition) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ON ") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore OnCondition.Expr: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OnCondition) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OnCondition) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TableSource represents table source with a name. +type TableSource struct { + node + + // Source is the source of the data, can be a TableName, + // a SelectStmt, a SetOprStmt, or a JoinNode. + Source ResultSetNode + + // AsName is the alias name of the table source. + AsName CIStr + + // Lateral indicates whether this is a LATERAL derived table. + // MySQL 8.0+ syntax: FROM t1, LATERAL (SELECT ...) AS dt + // LATERAL allows the derived table to reference columns from tables to its left. + Lateral bool + + // ColumnNames is the optional column alias list for derived tables. + // e.g. LATERAL (SELECT ...) AS dt(c1, c2) + ColumnNames []CIStr +} + +func (*TableSource) resultSet() {} + +// Restore implements Node interface. +func (n *TableSource) Restore(ctx *format.RestoreCtx) error { + // Validate AST invariants before emitting any SQL. + // Source can be TableName, SelectStmt, SetOprStmt, or JoinNode (parenthesized join). + // LATERAL and ColumnNames are only valid on derived tables (SelectStmt, SetOprStmt); + // TableName and JoinNode are both excluded. + isDerived := false + switch n.Source.(type) { + case *SelectStmt, *SetOprStmt: + isDerived = true + } + if n.Lateral && !isDerived { + return errors.New("LATERAL cannot be applied to a table name, only to derived tables") + } + if len(n.ColumnNames) > 0 && !isDerived { + return errors.New("column alias list cannot be applied to a table name") + } + if len(n.ColumnNames) > 0 && n.AsName.String() == "" { + return errors.New("column list provided without alias for derived table") + } + + needParen := false + switch n.Source.(type) { + case *SelectStmt, *SetOprStmt: + needParen = true + } + + // Output LATERAL keyword if this is a LATERAL derived table + if n.Lateral { + ctx.WriteKeyWord("LATERAL ") + } + + if tn, tnCase := n.Source.(*TableName); tnCase { + if needParen { + ctx.WritePlain("(") + } + + tn.restoreName(ctx) + tn.restorePartitions(ctx) + + if asName := n.AsName.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + } + + if err := tn.restoreIndexHints(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TableSource.Source.(*TableName).IndexHints: %w", err) + } + + if needParen { + ctx.WritePlain(")") + } + } else { + if needParen { + ctx.WritePlain("(") + } + if err := n.Source.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TableSource.Source: %w", err) + } + if needParen { + ctx.WritePlain(")") + } + if asName := n.AsName.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + if len(n.ColumnNames) > 0 { + ctx.WritePlain("(") + for i, col := range n.ColumnNames { + if i > 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(col.String()) + } + ctx.WritePlain(")") + } + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *TableSource) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableSource) + node, ok := n.Source.Accept(v) + if !ok { + return n, false + } + n.Source = node.(ResultSetNode) + return v.Leave(n) +} + +// SelectLockType is the lock type for SelectStmt. +type SelectLockType int + +// Select lock types. +const ( + SelectLockNone SelectLockType = iota + SelectLockForUpdate + SelectLockForShare + SelectLockForUpdateNoWait + SelectLockForUpdateWaitN + SelectLockForShareNoWait + SelectLockForUpdateSkipLocked + SelectLockForShareSkipLocked +) + +type SelectLockInfo struct { + LockType SelectLockType + WaitSec uint64 + Tables []*TableName +} + +// String implements fmt.Stringer. +func (n SelectLockType) String() string { + switch n { + case SelectLockNone: + return "none" + case SelectLockForUpdate: + return "for update" + case SelectLockForShare: + return "for share" + case SelectLockForUpdateNoWait: + return "for update nowait" + case SelectLockForUpdateWaitN: + return "for update wait" + case SelectLockForShareNoWait: + return "for share nowait" + case SelectLockForUpdateSkipLocked: + return "for update skip locked" + case SelectLockForShareSkipLocked: + return "for share skip locked" + } + return "unsupported select lock type" +} + +// WildCardField is a special type of select field content. +type WildCardField struct { + node + + Table CIStr + Schema CIStr +} + +// Restore implements Node interface. +func (n *WildCardField) Restore(ctx *format.RestoreCtx) error { + if schema := n.Schema.String(); schema != "" { + ctx.WriteName(schema) + ctx.WritePlain(".") + } + if table := n.Table.String(); table != "" { + ctx.WriteName(table) + ctx.WritePlain(".") + } + ctx.WritePlain("*") + return nil +} + +// Accept implements Node Accept interface. +func (n *WildCardField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WildCardField) + return v.Leave(n) +} + +// SelectField represents fields in select statement. +// There are two type of select field: wildcard +// and expression with optional alias name. +type SelectField struct { + node + + // Offset is used to get original text. + Offset int + // WildCard is not nil, Expr will be nil. + WildCard *WildCardField + // Expr is not nil, WildCard will be nil. + Expr ExprNode + // AsName is alias name for Expr. + AsName CIStr + // Auxiliary stands for if this field is auxiliary. + // When we add a Field into SelectField list which is used for having/orderby clause but the field is not in select clause, + // we should set its Auxiliary to true. Then the TrimExec will trim the field. + Auxiliary bool + AuxiliaryColInAgg bool + AuxiliaryColInOrderBy bool +} + +// Restore implements Node interface. +func (n *SelectField) Restore(ctx *format.RestoreCtx) error { + if n.WildCard != nil { + if err := n.WildCard.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectField.WildCard: %w", err) + } + } + if n.Expr != nil { + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectField.Expr: %w", err) + } + } + if asName := n.AsName.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SelectField) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SelectField) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +func (n *SelectField) Match(col *ColumnNameExpr, ignoreAsName bool) bool { + // if col specify a table name, resolve from table source directly. + if col.Name.Table.L == "" { + if n.AsName.L == "" || ignoreAsName { + if curCol, isCol := n.Expr.(*ColumnNameExpr); isCol { + return curCol.Name.Name.L == col.Name.Name.L + } else if _, isFunc := n.Expr.(*FuncCallExpr); isFunc { + // Fix issue 7331 + // If there are some function calls in SelectField, we check if + // ColumnNameExpr in GroupByClause matches one of these function calls. + // Example: select concat(k1,k2) from t group by `concat(k1,k2)`, + // `concat(k1,k2)` matches with function call concat(k1, k2). + return strings.ToLower(n.Text()) == col.Name.Name.L + } + // a expression without as name can't be matched. + return false + } + return n.AsName.L == col.Name.Name.L + } + return false +} + +// FieldList represents field list in select statement. +type FieldList struct { + node + + Fields []*SelectField +} + +// Restore implements Node interface. +func (n *FieldList) Restore(ctx *format.RestoreCtx) error { + for i, v := range n.Fields { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FieldList.Fields[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FieldList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FieldList) + for i, val := range n.Fields { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Fields[i] = node.(*SelectField) + } + return v.Leave(n) +} + +// TableRefsClause represents table references clause in dml statement. +type TableRefsClause struct { + node + + TableRefs *Join +} + +// Restore implements Node interface. +func (n *TableRefsClause) Restore(ctx *format.RestoreCtx) error { + if err := n.TableRefs.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TableRefsClause.TableRefs: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *TableRefsClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableRefsClause) + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*Join) + return v.Leave(n) +} + +// ByItem represents an item in order by or group by. +type ByItem struct { + node + + Expr ExprNode + Desc bool + NullOrder bool +} + +// Restore implements Node interface. +func (n *ByItem) Restore(ctx *format.RestoreCtx) error { + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ByItem.Expr: %w", err) + } + if n.Desc { + ctx.WriteKeyWord(" DESC") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ByItem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ByItem) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// GroupByClause represents group by clause. +type GroupByClause struct { + node + Items []*ByItem + Rollup bool +} + +// Restore implements Node interface. +func (n *GroupByClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("GROUP BY ") + for i, v := range n.Items { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GroupByClause.Items[%d]: %w", i, err) + } + } + if n.Rollup { + ctx.WriteKeyWord(" WITH ROLLUP") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *GroupByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GroupByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// HavingClause represents having clause. +type HavingClause struct { + node + Expr ExprNode +} + +// Restore implements Node interface. +func (n *HavingClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("HAVING ") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore HavingClause.Expr: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *HavingClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*HavingClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// OrderByClause represents order by clause. +type OrderByClause struct { + node + Items []*ByItem + ForUnion bool +} + +// Restore implements Node interface. +func (n *OrderByClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ORDER BY ") + for i, item := range n.Items { + if i != 0 { + ctx.WritePlain(",") + } + if err := item.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore OrderByClause.Items[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *OrderByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*OrderByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +type SelectStmtKind uint8 + +const ( + SelectStmtKindSelect SelectStmtKind = iota + SelectStmtKindTable + SelectStmtKindValues +) + +func (s *SelectStmtKind) String() string { + switch *s { + case SelectStmtKindSelect: + return "SELECT" + case SelectStmtKindTable: + return "TABLE" + case SelectStmtKindValues: + return "VALUES" + } + return "" +} + +type CommonTableExpression struct { + node + + Name CIStr + Query *SubqueryExpr + ColNameList []CIStr + IsRecursive bool + + // Record how many consumers the current cte has + ConsumerCount int +} + +// Restore implements Node interface +func (c *CommonTableExpression) Restore(ctx *format.RestoreCtx) error { + ctx.WriteName(c.Name.String()) + if c.IsRecursive { + // If the CTE is recursive, we should make it visible for the CTE's query. + // Otherwise, we should put it to stack after building the CTE's query. + ctx.RecordCTEName(c.Name.L) + } + if len(c.ColNameList) > 0 { + ctx.WritePlain(" (") + for j, name := range c.ColNameList { + if j != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(name.String()) + } + ctx.WritePlain(")") + } + ctx.WriteKeyWord(" AS ") + err := c.Query.Restore(ctx) + if err != nil { + return err + } + if !c.IsRecursive { + ctx.RecordCTEName(c.Name.L) + } + return nil +} + +// Accept implements Node interface +func (c *CommonTableExpression) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(c) + if skipChildren { + return v.Leave(newNode) + } + + node, ok := c.Query.Accept(v) + if !ok { + return c, false + } + c.Query = node.(*SubqueryExpr) + return v.Leave(c) +} + +type WithClause struct { + node + + IsRecursive bool + CTEs []*CommonTableExpression +} + +// SelectStmt represents the select query node. +// See https://dev.mysql.com/doc/refman/5.7/en/select.html +type SelectStmt struct { + dmlNode + + // SelectStmtOpts wraps around select hints and switches. + *SelectStmtOpts + // Distinct represents whether the select has distinct option. + Distinct bool + // From is the from clause of the query. + From *TableRefsClause + // Where is the where clause in select statement. + Where ExprNode + // Fields is the select expression list. + Fields *FieldList + // GroupBy is the group by expression list. + GroupBy *GroupByClause + // Having is the having condition. + Having *HavingClause + // WindowSpecs is the window specification list. + WindowSpecs []WindowSpec + // OrderBy is the ordering expression list. + OrderBy *OrderByClause + // Limit is the limit clause. + Limit *Limit + // LockInfo is the lock type + LockInfo *SelectLockInfo + // TableHints represents the table level Optimizer Hint for join type + TableHints []*TableOptimizerHint + // IsInBraces indicates whether it's a stmt in brace. + IsInBraces bool + // WithBeforeBraces indicates whether stmt's with clause is before the brace. + // It's used to distinguish (with xxx select xxx) and with xxx (select xxx) + WithBeforeBraces bool + // QueryBlockOffset indicates the order of this SelectStmt if counted from left to right in the sql text. + QueryBlockOffset int + // SelectIntoOpt is the select-into option. + SelectIntoOpt *SelectIntoOption + // AfterSetOperator indicates the SelectStmt after which type of set operator + AfterSetOperator *SetOprType + // Kind refer to three kind of statement: SelectStmt, TableStmt and ValuesStmt + Kind SelectStmtKind + // Lists is filled only when Kind == SelectStmtKindValues + Lists []*RowExpr + With *WithClause + // AsViewSchema indicates if this stmt provides the schema for the view. It is only used when creating the view + AsViewSchema bool +} + +func (*SelectStmt) resultSet() {} + +func (n *WithClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("WITH ") + if n.IsRecursive { + ctx.WriteKeyWord("RECURSIVE ") + } + for i, cte := range n.CTEs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := cte.Restore(ctx); err != nil { + return err + } + } + ctx.WritePlain(" ") + return nil +} + +func (n *WithClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + for _, cte := range n.CTEs { + if _, ok := cte.Accept(v); !ok { + return n, false + } + } + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *SelectStmt) Restore(ctx *format.RestoreCtx) error { + if n.WithBeforeBraces { + defer ctx.RestoreCTEFunc()() + err := n.With.Restore(ctx) + if err != nil { + return err + } + } + if n.IsInBraces { + ctx.WritePlain("(") + defer func() { + ctx.WritePlain(")") + }() + } + if !n.WithBeforeBraces && n.With != nil { + defer ctx.RestoreCTEFunc()() + err := n.With.Restore(ctx) + if err != nil { + return err + } + } + + ctx.WriteKeyWord(n.Kind.String()) + ctx.WritePlain(" ") + switch n.Kind { + case SelectStmtKindSelect: + if n.Priority > 0 { + ctx.WriteKeyWord(mysql.Priority2Str[n.Priority]) + ctx.WritePlain(" ") + } + + if n.SQLSmallResult { + ctx.WriteKeyWord("SQL_SMALL_RESULT ") + } + + if n.SQLBigResult { + ctx.WriteKeyWord("SQL_BIG_RESULT ") + } + + if n.SQLBufferResult { + ctx.WriteKeyWord("SQL_BUFFER_RESULT ") + } + + if !n.SQLCache { + ctx.WriteKeyWord("SQL_NO_CACHE ") + } + + if n.CalcFoundRows { + ctx.WriteKeyWord("SQL_CALC_FOUND_ROWS ") + } + + if len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if i != 0 { + ctx.WritePlain(" ") + } + if err := tableHint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.TableHints[%d]: %w", i, err) + } + } + ctx.WritePlain("*/ ") + } + + if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } else if n.ExplicitAll { + ctx.WriteKeyWord("ALL ") + } + if n.StraightJoin { + ctx.WriteKeyWord("STRAIGHT_JOIN ") + } + if n.Fields != nil { + for i, field := range n.Fields.Fields { + if i != 0 { + ctx.WritePlain(",") + } + if err := field.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.Fields[%d]: %w", i, err) + } + } + } + + if n.From != nil { + ctx.WriteKeyWord(" FROM ") + if err := n.From.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.From: %w", err) + } + } + + if n.From == nil && n.Where != nil { + ctx.WriteKeyWord(" FROM DUAL") + } + + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.Where: %w", err) + } + } + + if n.GroupBy != nil { + ctx.WritePlain(" ") + if err := n.GroupBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.GroupBy: %w", err) + } + } + + if n.Having != nil { + ctx.WritePlain(" ") + if err := n.Having.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.Having: %w", err) + } + } + + if n.WindowSpecs != nil { + ctx.WriteKeyWord(" WINDOW ") + for i, windowsSpec := range n.WindowSpecs { + if i != 0 { + ctx.WritePlain(",") + } + if err := windowsSpec.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.WindowSpec[%d]: %w", i, err) + } + } + } + case SelectStmtKindTable: + if err := n.From.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.From: %w", err) + } + case SelectStmtKindValues: + for i, v := range n.Lists { + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.Lists[%d]: %w", i, err) + } + if i != len(n.Lists)-1 { + ctx.WritePlain(", ") + } + } + } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.OrderBy: %w", err) + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.Limit: %w", err) + } + } + + if n.LockInfo != nil { + ctx.WritePlain(" ") + switch n.LockInfo.LockType { //nolint:exhaustive + case SelectLockNone: + case SelectLockForUpdateNoWait: + ctx.WriteKeyWord("for update") + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + ctx.WriteKeyWord(" nowait") + case SelectLockForUpdateWaitN: + ctx.WriteKeyWord("for update") + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + ctx.WriteKeyWord(" wait") + ctx.WritePlainf(" %d", n.LockInfo.WaitSec) + case SelectLockForShareNoWait: + ctx.WriteKeyWord("for share") + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + ctx.WriteKeyWord(" nowait") + case SelectLockForUpdateSkipLocked: + ctx.WriteKeyWord("for update") + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + ctx.WriteKeyWord(" skip locked") + case SelectLockForShareSkipLocked: + ctx.WriteKeyWord("for share") + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + ctx.WriteKeyWord(" skip locked") + default: + ctx.WriteKeyWord(n.LockInfo.LockType.String()) + if len(n.LockInfo.Tables) != 0 { + ctx.WriteKeyWord(" OF ") + if err := restoreTables(ctx, n.LockInfo.Tables); err != nil { + return err + } + } + } + } + + if n.SelectIntoOpt != nil { + ctx.WritePlain(" ") + if err := n.SelectIntoOpt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.SelectIntoOpt: %w", err) + } + } + return nil +} + +func restoreTables(ctx *format.RestoreCtx, ts []*TableName) error { + for i, v := range ts { + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectStmt.LockInfo: %w", err) + } + if i != len(ts)-1 { + ctx.WritePlain(", ") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SelectStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*SelectStmt) + + if n.With != nil { + node, ok := n.With.Accept(v) + if !ok { + return n, false + } + n.With = node.(*WithClause) + } + + if len(n.TableHints) != 0 { + newHints := make([]*TableOptimizerHint, len(n.TableHints)) + for i, hint := range n.TableHints { + node, ok := hint.Accept(v) + if !ok { + return n, false + } + newHints[i] = node.(*TableOptimizerHint) + } + n.TableHints = newHints + } + + if n.Fields != nil { + node, ok := n.Fields.Accept(v) + if !ok { + return n, false + } + n.Fields = node.(*FieldList) + } + + if n.From != nil { + node, ok := n.From.Accept(v) + if !ok { + return n, false + } + n.From = node.(*TableRefsClause) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + + if n.GroupBy != nil { + node, ok := n.GroupBy.Accept(v) + if !ok { + return n, false + } + n.GroupBy = node.(*GroupByClause) + } + + if n.Having != nil { + node, ok := n.Having.Accept(v) + if !ok { + return n, false + } + n.Having = node.(*HavingClause) + } + + for i, list := range n.Lists { + node, ok := list.Accept(v) + if !ok { + return n, false + } + n.Lists[i] = node.(*RowExpr) + } + + for i, spec := range n.WindowSpecs { + node, ok := spec.Accept(v) + if !ok { + return n, false + } + n.WindowSpecs[i] = *node.(*WindowSpec) + } + + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + + if n.LockInfo != nil { + for i, t := range n.LockInfo.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.LockInfo.Tables[i] = node.(*TableName) + } + } + + return v.Leave(n) +} + +// SetOprSelectList represents the SelectStmt/TableStmt/ValuesStmt list in a union statement. +type SetOprSelectList struct { + node + + With *WithClause + AfterSetOperator *SetOprType + Selects []Node + Limit *Limit + OrderBy *OrderByClause +} + +// Restore implements Node interface. +func (n *SetOprSelectList) Restore(ctx *format.RestoreCtx) error { + if n.With != nil { + defer ctx.RestoreCTEFunc()() + if err := n.With.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprSelectList.With: %w", err) + } + } + + for i, stmt := range n.Selects { + switch selectStmt := stmt.(type) { + case *SelectStmt: + if i != 0 { + ctx.WriteKeyWord(" " + selectStmt.AfterSetOperator.String() + " ") + } + if err := selectStmt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprSelectList.SelectStmt: %w", err) + } + case *SetOprSelectList: + if i != 0 { + ctx.WriteKeyWord(" " + selectStmt.AfterSetOperator.String() + " ") + } + ctx.WritePlain("(") + err := selectStmt.Restore(ctx) + if err != nil { + return err + } + ctx.WritePlain(")") + } + } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprSelectList.OrderBy: %w", err) + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprSelectList.Limit: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetOprSelectList) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetOprSelectList) + if n.With != nil { + node, ok := n.With.Accept(v) + if !ok { + return n, false + } + n.With = node.(*WithClause) + } + for i, sel := range n.Selects { + node, ok := sel.Accept(v) + if !ok { + return n, false + } + n.Selects[i] = node + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +type SetOprType uint8 + +const ( + Union SetOprType = iota + UnionAll + Except + ExceptAll + Intersect + IntersectAll +) + +func (s *SetOprType) String() string { + switch *s { + case Union: + return "UNION" + case UnionAll: + return "UNION ALL" + case Except: + return "EXCEPT" + case ExceptAll: + return "EXCEPT ALL" + case Intersect: + return "INTERSECT" + case IntersectAll: + return "INTERSECT ALL" + } + return "" +} + +// SetOprStmt represents "union/except/intersect statement" +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +// INTERSECT and EXCEPT are supported by MySQL 8.0.31+. +// See https://dev.mysql.com/doc/refman/8.0/en/set-operations.html +type SetOprStmt struct { + dmlNode + + IsInBraces bool + SelectList *SetOprSelectList + OrderBy *OrderByClause + Limit *Limit + With *WithClause +} + +func (*SetOprStmt) resultSet() {} + +// Restore implements Node interface. +func (n *SetOprStmt) Restore(ctx *format.RestoreCtx) error { + if n.With != nil { + defer ctx.RestoreCTEFunc()() + if err := n.With.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprStmt.With: %w", err) + } + } + if n.IsInBraces { + ctx.WritePlain("(") + defer func() { + ctx.WritePlain(")") + }() + } + + if err := n.SelectList.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprStmt.SelectList: %w", err) + } + + if n.OrderBy != nil { + ctx.WritePlain(" ") + if err := n.OrderBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprStmt.OrderBy: %w", err) + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetOprStmt.Limit: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetOprStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + if n.With != nil { + node, ok := n.With.Accept(v) + if !ok { + return n, false + } + n.With = node.(*WithClause) + } + if n.SelectList != nil { + node, ok := n.SelectList.Accept(v) + if !ok { + return n, false + } + n.SelectList = node.(*SetOprSelectList) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// Assignment is the expression for assignment, like a = 1. +type Assignment struct { + node + // Column is the column name to be assigned. + Column *ColumnName + // Expr is the expression assigning to ColName. + Expr ExprNode +} + +// Restore implements Node interface. +func (n *Assignment) Restore(ctx *format.RestoreCtx) error { + if err := n.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Assignment.Column: %w", err) + } + ctx.WritePlain("=") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Assignment.Expr: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *Assignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*Assignment) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + node, ok = n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +type ColumnNameOrUserVar struct { + node + ColumnName *ColumnName + UserVar *VariableExpr +} + +func (n *ColumnNameOrUserVar) Restore(ctx *format.RestoreCtx) error { + if n.ColumnName != nil { + if err := n.ColumnName.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ColumnNameOrUserVar.ColumnName: %w", err) + } + } + if n.UserVar != nil { + if err := n.UserVar.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ColumnNameOrUserVar.UserVar: %w", err) + } + } + return nil +} + +func (n *ColumnNameOrUserVar) Accept(v Visitor) (node Node, ok bool) { + newNode, skipChild := v.Enter(n) + if skipChild { + return v.Leave(newNode) + } + n = newNode.(*ColumnNameOrUserVar) + if n.ColumnName != nil { + node, ok = n.ColumnName.Accept(v) + if !ok { + return node, false + } + n.ColumnName = node.(*ColumnName) + } + if n.UserVar != nil { + node, ok = n.UserVar.Accept(v) + if !ok { + return node, false + } + n.UserVar = node.(*VariableExpr) + } + return v.Leave(n) +} + +// FileLocRefTp indicates where the LOAD DATA file is located. +// See https://dev.mysql.com/doc/refman/8.0/en/load-data.html +type FileLocRefTp int + +const ( + // FileLocServer is used when there is no LOCAL keyword, meaning the data + // file is located on the server host. + FileLocServer FileLocRefTp = iota + // FileLocClient is used when there's LOCAL keyword in SQL, which means the data file should be located on the MySQL + // client. + FileLocClient +) + +type LoadDataStmt struct { + dmlNode + + LowPriority bool + FileLocRef FileLocRefTp + Path string + OnDuplicate OnDuplicateKeyHandlingType + Table *TableName + Charset *string + Columns []*ColumnName + FieldsInfo *FieldsClause + LinesInfo *LinesClause + IgnoreLines *uint64 + ColumnAssignments []*Assignment + + ColumnsAndUserVars []*ColumnNameOrUserVar +} + +// Restore implements Node interface. +func (n *LoadDataStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("LOAD DATA ") + if n.LowPriority { + ctx.WriteKeyWord("LOW_PRIORITY ") + } + switch n.FileLocRef { + case FileLocServer: + case FileLocClient: + ctx.WriteKeyWord("LOCAL ") + } + ctx.WriteKeyWord("INFILE ") + ctx.WriteString(n.Path) + switch n.OnDuplicate { //nolint:exhaustive + case OnDuplicateKeyHandlingReplace: + ctx.WriteKeyWord(" REPLACE") + case OnDuplicateKeyHandlingIgnore: + ctx.WriteKeyWord(" IGNORE") + } + ctx.WriteKeyWord(" INTO TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore LoadDataStmt.Table: %w", err) + } + if n.Charset != nil { + ctx.WriteKeyWord(" CHARACTER SET ") + ctx.WritePlain(*n.Charset) + } + if n.FieldsInfo != nil { + if err := n.FieldsInfo.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore LoadDataStmt.FieldsInfo: %w", err) + } + } + if n.LinesInfo != nil { + if err := n.LinesInfo.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore LoadDataStmt.LinesInfo: %w", err) + } + } + if n.IgnoreLines != nil { + ctx.WriteKeyWord(" IGNORE ") + ctx.WritePlainf("%d", *n.IgnoreLines) + ctx.WriteKeyWord(" LINES") + } + if len(n.ColumnsAndUserVars) != 0 { + ctx.WritePlain(" (") + for i, c := range n.ColumnsAndUserVars { + if i != 0 { + ctx.WritePlain(",") + } + if err := c.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore LoadDataStmt.ColumnsAndUserVars: %w", err) + } + } + ctx.WritePlain(")") + } + + if n.ColumnAssignments != nil { + ctx.WriteKeyWord(" SET") + for i, assign := range n.ColumnAssignments { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain(" ") + if err := assign.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore LoadDataStmt.ColumnAssignments: %w", err) + } + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *LoadDataStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*LoadDataStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + + for i, assignment := range n.ColumnAssignments { + node, ok := assignment.Accept(v) + if !ok { + return n, false + } + n.ColumnAssignments[i] = node.(*Assignment) + } + for i, cuVars := range n.ColumnsAndUserVars { + node, ok := cuVars.Accept(v) + if !ok { + return n, false + } + n.ColumnsAndUserVars[i] = node.(*ColumnNameOrUserVar) + } + return v.Leave(n) +} + +const ( + Terminated = iota + Enclosed + Escaped + DefinedNullBy +) + +type FieldItem struct { + Type int + Value string + OptEnclosed bool +} + +// FieldsClause represents fields references clause in load data statement. +type FieldsClause struct { + Terminated *string + Enclosed *string // length always <= 1 if not nil, see parser.y + Escaped *string // length always <= 1 if not nil, see parser.y + OptEnclosed bool + DefinedNullBy *string + NullValueOptEnclosed bool +} + +// Restore for FieldsClause +func (n *FieldsClause) Restore(ctx *format.RestoreCtx) error { + if n.Terminated == nil && n.Enclosed == nil && n.Escaped == nil && n.DefinedNullBy == nil { + return nil + } + + ctx.WriteKeyWord(" FIELDS") + if n.Terminated != nil { + ctx.WriteKeyWord(" TERMINATED BY ") + ctx.WriteString(*n.Terminated) + } + if n.Enclosed != nil { + if n.OptEnclosed { + ctx.WriteKeyWord(" OPTIONALLY") + } + ctx.WriteKeyWord(" ENCLOSED BY ") + ctx.WriteString(*n.Enclosed) + } + if n.Escaped != nil { + ctx.WriteKeyWord(" ESCAPED BY ") + ctx.WriteString(*n.Escaped) + } + if n.DefinedNullBy != nil { + ctx.WriteKeyWord(" DEFINED NULL BY ") + ctx.WriteString(*n.DefinedNullBy) + if n.NullValueOptEnclosed { + ctx.WriteKeyWord(" OPTIONALLY ENCLOSED") + } + } + return nil +} + +// LinesClause represents lines references clause in load data statement. +type LinesClause struct { + Starting *string + Terminated *string +} + +// Restore for LinesClause +func (n *LinesClause) Restore(ctx *format.RestoreCtx) error { + if n.Starting == nil && n.Terminated == nil { + return nil + } + ctx.WriteKeyWord(" LINES") + if n.Starting != nil { + ctx.WriteKeyWord(" STARTING BY ") + ctx.WriteString(*n.Starting) + } + if n.Terminated != nil { + ctx.WriteKeyWord(" TERMINATED BY ") + ctx.WriteString(*n.Terminated) + } + return nil +} + +// CallStmt represents a call procedure query node. +// See https://dev.mysql.com/doc/refman/5.7/en/call.html +type CallStmt struct { + dmlNode + + Procedure *FuncCallExpr +} + +// Restore implements Node interface. +func (n *CallStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CALL ") + + if err := n.Procedure.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CallStmt.Procedure: %w", err) + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CallStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*CallStmt) + + if n.Procedure != nil { + node, ok := n.Procedure.Accept(v) + if !ok { + return n, false + } + + n.Procedure = node.(*FuncCallExpr) + } + + return v.Leave(n) +} + +// InsertStmt is a statement to insert new rows into an existing table. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +type InsertStmt struct { + dmlNode + + IsReplace bool + IgnoreErr bool + Table *TableRefsClause + Columns []*ColumnName + Lists [][]ExprNode + Setlist bool + Priority mysql.PriorityEnum + OnDuplicate []*Assignment + Select ResultSetNode + // TableHints represents the table level Optimizer Hint for join type. + TableHints []*TableOptimizerHint + PartitionNames []CIStr + // RowAlias is the optional row alias for VALUES/SET clause (MySQL 8.0.19+). + // e.g. INSERT INTO t VALUES (1,2) AS new ON DUPLICATE KEY UPDATE b = new.b + RowAlias CIStr + // ColumnAliases is the optional column alias list for the row alias. + // e.g. INSERT INTO t VALUES (1,2) AS new(m, n) ON DUPLICATE KEY UPDATE b = m + ColumnAliases []CIStr +} + +// Restore implements Node interface. +func (n *InsertStmt) Restore(ctx *format.RestoreCtx) error { + if n.IsReplace { + ctx.WriteKeyWord("REPLACE ") + } else { + ctx.WriteKeyWord("INSERT ") + } + + if len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if i != 0 { + ctx.WritePlain(" ") + } + if err := tableHint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.TableHints[%d]: %w", i, err) + } + } + ctx.WritePlain("*/ ") + } + + if err := n.Priority.Restore(ctx); err != nil { + return err + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + ctx.WriteKeyWord("INTO ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.Table: %w", err) + } + if len(n.PartitionNames) != 0 { + ctx.WriteKeyWord(" PARTITION") + ctx.WritePlain("(") + for i := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(n.PartitionNames[i].String()) + } + ctx.WritePlain(")") + } + if n.Setlist { + if len(n.Lists) != 1 { + return fmt.Errorf("expect len(InsertStmt.Lists)[%d] == 1 for SET x=y", len(n.Lists)) + } + if len(n.Lists[0]) != len(n.Columns) { + return fmt.Errorf("expect len(InsertStmt.Columns)[%d] == len(InsertStmt.Lists[0])[%d] for SET x=y", len(n.Columns), len(n.Lists[0])) + } + ctx.WriteKeyWord(" SET ") + for i, v := range n.Lists[0] { + if i != 0 { + ctx.WritePlain(",") + } + v := &Assignment{ + Column: n.Columns[i], + Expr: v, + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.Set (Columns = Expr)[%d]: %w", i, err) + } + } + } else { + if n.Columns != nil { + ctx.WritePlain(" (") + for i, v := range n.Columns { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.Columns[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + if n.Lists != nil { + ctx.WriteKeyWord(" VALUES ") + for i, row := range n.Lists { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain("(") + for j, v := range row { + if j != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.Lists[%d][%d]: %w", i, j, err) + } + } + ctx.WritePlain(")") + } + } + } + if n.Select != nil { + ctx.WritePlain(" ") + switch v := n.Select.(type) { + case *SelectStmt, *SetOprStmt: + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.Select: %w", err) + } + default: + return fmt.Errorf("incorrect type for InsertStmt.Select: %T", v) + } + } + if asName := n.RowAlias.String(); asName != "" { + ctx.WriteKeyWord(" AS ") + ctx.WriteName(asName) + if len(n.ColumnAliases) > 0 { + ctx.WritePlain("(") + for i, col := range n.ColumnAliases { + if i > 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(col.String()) + } + ctx.WritePlain(")") + } + } + if n.OnDuplicate != nil { + ctx.WriteKeyWord(" ON DUPLICATE KEY UPDATE ") + for i, v := range n.OnDuplicate { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore InsertStmt.OnDuplicate[%d]: %w", i, err) + } + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *InsertStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*InsertStmt) + if n.Select != nil { + node, ok := n.Select.Accept(v) + if !ok { + return n, false + } + n.Select = node.(ResultSetNode) + } + + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableRefsClause) + + for i, val := range n.Columns { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Columns[i] = node.(*ColumnName) + } + for i, list := range n.Lists { + for j, val := range list { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Lists[i][j] = node.(ExprNode) + } + } + for i, val := range n.OnDuplicate { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.OnDuplicate[i] = node.(*Assignment) + } + return v.Leave(n) +} + +// WhereExpr implements ShardableDMLStmt interface. +func (n *InsertStmt) WhereExpr() ExprNode { + if n.Select == nil { + return nil + } + s, ok := n.Select.(*SelectStmt) + if !ok { + return nil + } + return s.Where +} + +// SetWhereExpr implements ShardableDMLStmt interface. +func (n *InsertStmt) SetWhereExpr(e ExprNode) { + if n.Select == nil { + return + } + s, ok := n.Select.(*SelectStmt) + if !ok { + return + } + s.Where = e +} + +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *InsertStmt) TableRefsJoin() (*Join, bool) { + if n.Select == nil { + return nil, false + } + s, ok := n.Select.(*SelectStmt) + if !ok { + return nil, false + } + return s.From.TableRefs, true +} + +// DeleteStmt is a statement to delete rows from table. +// See https://dev.mysql.com/doc/refman/5.7/en/delete.html +type DeleteStmt struct { + dmlNode + + // TableRefs is used in both single table and multiple table delete statement. + TableRefs *TableRefsClause + // Tables is only used in multiple table delete statement. + Tables *DeleteTableList + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + Quick bool + IsMultiTable bool + BeforeFrom bool + // TableHints represents the table level Optimizer Hint for join type. + TableHints []*TableOptimizerHint + With *WithClause +} + +// Restore implements Node interface. +func (n *DeleteStmt) Restore(ctx *format.RestoreCtx) error { + if n.With != nil { + defer ctx.RestoreCTEFunc()() + err := n.With.Restore(ctx) + if err != nil { + return err + } + } + + ctx.WriteKeyWord("DELETE ") + + if len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if i != 0 { + ctx.WritePlain(" ") + } + if err := tableHint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.TableHints[%d]: %w", i, err) + } + } + ctx.WritePlain("*/ ") + } + + if err := n.Priority.Restore(ctx); err != nil { + return err + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.Quick { + ctx.WriteKeyWord("QUICK ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + + if n.IsMultiTable { // Multiple-Table Syntax + if n.BeforeFrom { + if err := n.Tables.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.Tables: %w", err) + } + + ctx.WriteKeyWord(" FROM ") + if err := n.TableRefs.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.TableRefs: %w", err) + } + } else { + ctx.WriteKeyWord("FROM ") + if err := n.Tables.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.Tables: %w", err) + } + + ctx.WriteKeyWord(" USING ") + if err := n.TableRefs.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.TableRefs: %w", err) + } + } + } else { // Single-Table Syntax + ctx.WriteKeyWord("FROM ") + + if err := n.TableRefs.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.TableRefs: %w", err) + } + } + + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.Where: %w", err) + } + } + + if n.Order != nil { + ctx.WritePlain(" ") + if err := n.Order.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.Order: %w", err) + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DeleteStmt.Limit: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *DeleteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*DeleteStmt) + if n.With != nil { + node, ok := n.With.Accept(v) + if !ok { + return n, false + } + n.With = node.(*WithClause) + } + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + + if n.Tables != nil { + node, ok = n.Tables.Accept(v) + if !ok { + return n, false + } + n.Tables = node.(*DeleteTableList) + } + + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// WhereExpr implements ShardableDMLStmt interface. +func (n *DeleteStmt) WhereExpr() ExprNode { + return n.Where +} + +// SetWhereExpr implements ShardableDMLStmt interface. +func (n *DeleteStmt) SetWhereExpr(e ExprNode) { + n.Where = e +} + +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *DeleteStmt) TableRefsJoin() (*Join, bool) { + return n.TableRefs.TableRefs, true +} + +// UpdateStmt is a statement to update columns of existing rows in tables with new values. +// See https://dev.mysql.com/doc/refman/5.7/en/update.html +type UpdateStmt struct { + dmlNode + + TableRefs *TableRefsClause + List []*Assignment + Where ExprNode + Order *OrderByClause + Limit *Limit + Priority mysql.PriorityEnum + IgnoreErr bool + MultipleTable bool + TableHints []*TableOptimizerHint + With *WithClause +} + +// Restore implements Node interface. +func (n *UpdateStmt) Restore(ctx *format.RestoreCtx) error { + if n.With != nil { + defer ctx.RestoreCTEFunc()() + err := n.With.Restore(ctx) + if err != nil { + return err + } + } + + ctx.WriteKeyWord("UPDATE ") + + if len(n.TableHints) != 0 { + ctx.WritePlain("/*+ ") + for i, tableHint := range n.TableHints { + if i != 0 { + ctx.WritePlain(" ") + } + if err := tableHint.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.TableHints[%d]: %w", i, err) + } + } + ctx.WritePlain("*/ ") + } + + if err := n.Priority.Restore(ctx); err != nil { + return err + } + if n.Priority != mysql.NoPriority { + ctx.WritePlain(" ") + } + if n.IgnoreErr { + ctx.WriteKeyWord("IGNORE ") + } + + if err := n.TableRefs.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.TableRefs: %w", err) + } + + ctx.WriteKeyWord(" SET ") + for i, assignment := range n.List { + if i != 0 { + ctx.WritePlain(", ") + } + + if err := assignment.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.List[%d].Column: %w", i, err) + } + + ctx.WritePlain("=") + + if err := assignment.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.List[%d].Expr: %w", i, err) + } + } + + if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.Where: %w", err) + } + } + + if n.Order != nil { + ctx.WritePlain(" ") + if err := n.Order.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.Order: %w", err) + } + } + + if n.Limit != nil { + ctx.WritePlain(" ") + if err := n.Limit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UpdateStmt.Limit: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *UpdateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UpdateStmt) + if n.With != nil { + node, ok := n.With.Accept(v) + if !ok { + return n, false + } + n.With = node.(*WithClause) + } + node, ok := n.TableRefs.Accept(v) + if !ok { + return n, false + } + n.TableRefs = node.(*TableRefsClause) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(*Assignment) + } + if n.Where != nil { + node, ok = n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Order != nil { + node, ok = n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + if n.Limit != nil { + node, ok = n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// WhereExpr implements ShardableDMLStmt interface. +func (n *UpdateStmt) WhereExpr() ExprNode { + return n.Where +} + +// SetWhereExpr implements ShardableDMLStmt interface. +func (n *UpdateStmt) SetWhereExpr(e ExprNode) { + n.Where = e +} + +// TableRefsJoin implements ShardableDMLStmt interface. +func (n *UpdateStmt) TableRefsJoin() (*Join, bool) { + return n.TableRefs.TableRefs, true +} + +// Limit is the limit clause. +type Limit struct { + node + + Count ExprNode + Offset ExprNode +} + +// Restore implements Node interface. +func (n *Limit) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("LIMIT ") + if n.Offset != nil { + if err := n.Offset.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Limit.Offset: %w", err) + } + ctx.WritePlain(",") + } + if err := n.Count.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore Limit.Count: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *Limit) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + if n.Count != nil { + node, ok := n.Count.Accept(v) + if !ok { + return n, false + } + n.Count = node.(ExprNode) + } + if n.Offset != nil { + node, ok := n.Offset.Accept(v) + if !ok { + return n, false + } + n.Offset = node.(ExprNode) + } + + n = newNode.(*Limit) + return v.Leave(n) +} + +// ShowStmtType is the type for SHOW statement. +type ShowStmtType int + +// Show statement types. +const ( + ShowNone = iota + ShowEngines + ShowDatabases + ShowTables + ShowTableStatus + ShowColumns + ShowWarnings + ShowCharset + ShowVariables + ShowStatus + ShowCollation + ShowCreateTable + ShowCreateView + ShowCreateUser + ShowGrants + ShowTriggers + ShowIndex + ShowProcessList + ShowCreateDatabase + ShowEvents + ShowPlugins + ShowProfile + ShowProfiles + ShowMasterStatus + ShowPrivileges + ShowErrors + ShowOpenTables + ShowBinlogStatus + ShowReplicaStatus +) + +const ( + ProfileTypeInvalid = iota + ProfileTypeCPU + ProfileTypeMemory + ProfileTypeBlockIo + ProfileTypeContextSwitch + ProfileTypePageFaults + ProfileTypeIpc + ProfileTypeSwaps + ProfileTypeSource + ProfileTypeAll +) + +// ShowStmt is a statement to provide information about databases, tables, columns and so on. +// See https://dev.mysql.com/doc/refman/5.7/en/show.html +type ShowStmt struct { + dmlNode + + Tp ShowStmtType // Databases/Tables/Columns/.... + DBName string + Table *TableName // Used for showing columns. + Partition CIStr // Used for showing partition. + Column *ColumnName // Used for `desc table column`. + IndexName CIStr + Flag int // Some flag parsed from sql, such as FULL. + Full bool + User *auth.UserIdentity // Used for show grants/create user. + Roles []*auth.RoleIdentity // Used for show grants .. using + IfNotExists bool // Used for `show create database if not exists` + Extended bool // Used for `show extended columns from ...` + Limit *Limit // Used for partial Show STMTs to limit Result Set row numbers. + + CountWarningsOrErrors bool // Used for showing count(*) warnings | errors + + // GlobalScope is used by `show variables` + GlobalScope bool + Pattern *PatternLikeExpr + Where ExprNode + + ShowProfileTypes []int // Used for `SHOW PROFILE` syntax + ShowProfileArgs *int64 // Used for `SHOW PROFILE` syntax + ShowProfileLimit *Limit // Used for `SHOW PROFILE` syntax +} + +// Restore implements Node interface. +func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { + restoreOptFull := func() { + if n.Full { + ctx.WriteKeyWord("FULL ") + } + } + restoreShowDatabaseNameOpt := func() { + if n.DBName != "" { + // FROM OR IN + ctx.WriteKeyWord(" IN ") + ctx.WriteName(n.DBName) + } + } + restoreGlobalScope := func() { + if n.GlobalScope { + ctx.WriteKeyWord("GLOBAL ") + } else { + ctx.WriteKeyWord("SESSION ") + } + } + restoreShowLikeOrWhereOpt := func() error { + if n.Pattern != nil && n.Pattern.Pattern != nil { + ctx.WriteKeyWord(" LIKE ") + if err := n.Pattern.Pattern.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.Pattern: %w", err) + } + } else if n.Where != nil { + ctx.WriteKeyWord(" WHERE ") + if err := n.Where.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.Where: %w", err) + } + } + return nil + } + + ctx.WriteKeyWord("SHOW ") + switch n.Tp { + case ShowBinlogStatus: + ctx.WriteKeyWord("BINARY LOG STATUS") + case ShowCreateTable: + ctx.WriteKeyWord("CREATE TABLE ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.Table: %w", err) + } + case ShowCreateView: + ctx.WriteKeyWord("CREATE VIEW ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.VIEW: %w", err) + } + case ShowCreateDatabase: + ctx.WriteKeyWord("CREATE DATABASE ") + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + ctx.WriteName(n.DBName) + case ShowCreateUser: + ctx.WriteKeyWord("CREATE USER ") + if err := n.User.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.User: %w", err) + } + case ShowGrants: + ctx.WriteKeyWord("GRANTS") + if n.User != nil { + ctx.WriteKeyWord(" FOR ") + if err := n.User.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.User: %w", err) + } + } + if n.Roles != nil { + ctx.WriteKeyWord(" USING ") + for i, r := range n.Roles { + if err := r.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.User: %w", err) + } + if i != len(n.Roles)-1 { + ctx.WritePlain(", ") + } + } + } + case ShowMasterStatus: + ctx.WriteKeyWord("MASTER STATUS") + case ShowProcessList: + restoreOptFull() + ctx.WriteKeyWord("PROCESSLIST") + case ShowProfiles: + ctx.WriteKeyWord("PROFILES") + case ShowProfile: + ctx.WriteKeyWord("PROFILE") + if len(n.ShowProfileTypes) > 0 { + for i, tp := range n.ShowProfileTypes { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlain(" ") + switch tp { + case ProfileTypeCPU: + ctx.WriteKeyWord("CPU") + case ProfileTypeMemory: + ctx.WriteKeyWord("MEMORY") + case ProfileTypeBlockIo: + ctx.WriteKeyWord("BLOCK IO") + case ProfileTypeContextSwitch: + ctx.WriteKeyWord("CONTEXT SWITCHES") + case ProfileTypeIpc: + ctx.WriteKeyWord("IPC") + case ProfileTypePageFaults: + ctx.WriteKeyWord("PAGE FAULTS") + case ProfileTypeSource: + ctx.WriteKeyWord("SOURCE") + case ProfileTypeSwaps: + ctx.WriteKeyWord("SWAPS") + case ProfileTypeAll: + ctx.WriteKeyWord("ALL") + } + } + } + if n.ShowProfileArgs != nil { + ctx.WriteKeyWord(" FOR QUERY ") + ctx.WritePlainf("%d", *n.ShowProfileArgs) + } + if n.ShowProfileLimit != nil { + ctx.WritePlain(" ") + if err := n.ShowProfileLimit.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.WritePlain: %w", err) + } + } + + case ShowPrivileges: + ctx.WriteKeyWord("PRIVILEGES") + default: + switch n.Tp { + case ShowEngines: + ctx.WriteKeyWord("ENGINES") + case ShowDatabases: + ctx.WriteKeyWord("DATABASES") + case ShowCharset: + ctx.WriteKeyWord("CHARSET") + case ShowTables: + restoreOptFull() + ctx.WriteKeyWord("TABLES") + restoreShowDatabaseNameOpt() + case ShowOpenTables: + ctx.WriteKeyWord("OPEN TABLES") + restoreShowDatabaseNameOpt() + case ShowTableStatus: + ctx.WriteKeyWord("TABLE STATUS") + restoreShowDatabaseNameOpt() + case ShowIndex: + // here can be INDEX INDEXES KEYS + // FROM or IN + ctx.WriteKeyWord("INDEX IN ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.Table: %w", err) + } // TODO: remember to check this case + case ShowColumns: // equivalent to SHOW FIELDS + if n.Extended { + ctx.WriteKeyWord("EXTENDED ") + } + restoreOptFull() + ctx.WriteKeyWord("COLUMNS") + if n.Table != nil { + // FROM or IN + ctx.WriteKeyWord(" IN ") + if err := n.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ShowStmt.Table: %w", err) + } + } + restoreShowDatabaseNameOpt() + case ShowWarnings: + ctx.WriteKeyWord("WARNINGS") + case ShowErrors: + ctx.WriteKeyWord("ERRORS") + case ShowVariables: + restoreGlobalScope() + ctx.WriteKeyWord("VARIABLES") + case ShowStatus: + restoreGlobalScope() + ctx.WriteKeyWord("STATUS") + case ShowCollation: + ctx.WriteKeyWord("COLLATION") + case ShowTriggers: + ctx.WriteKeyWord("TRIGGERS") + restoreShowDatabaseNameOpt() + case ShowEvents: + ctx.WriteKeyWord("EVENTS") + restoreShowDatabaseNameOpt() + case ShowPlugins: + ctx.WriteKeyWord("PLUGINS") + case ShowReplicaStatus: + ctx.WriteKeyWord("REPLICA STATUS") + default: + return errors.New("unknown ShowStmt type") + } + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ShowStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ShowStmt) + if n.Table != nil { + node, ok := n.Table.Accept(v) + if !ok { + return n, false + } + n.Table = node.(*TableName) + } + if n.Column != nil { + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + n.Column = node.(*ColumnName) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(*PatternLikeExpr) + } + + if n.Where != nil { + node, ok := n.Where.Accept(v) + if !ok { + return n, false + } + n.Where = node.(ExprNode) + } + if n.Limit != nil { + node, ok := n.Limit.Accept(v) + if !ok { + return n, false + } + n.Limit = node.(*Limit) + } + return v.Leave(n) +} + +// WindowSpec is the specification of a window. +type WindowSpec struct { + node + + Name CIStr + // Ref is the reference window of this specification. For example, in `w2 as (w1 order by a)`, + // the definition of `w2` references `w1`. + Ref CIStr + + PartitionBy *PartitionByClause + OrderBy *OrderByClause + Frame *FrameClause + + // OnlyAlias will set to true of the first following case. + // To make compatible with MySQL, we need to distinguish `select func over w` from `select func over (w)`. + OnlyAlias bool +} + +// Restore implements Node interface. +func (n *WindowSpec) Restore(ctx *format.RestoreCtx) error { + if name := n.Name.String(); name != "" { + ctx.WriteName(name) + if n.OnlyAlias { + return nil + } + ctx.WriteKeyWord(" AS ") + } + ctx.WritePlain("(") + sep := "" + if refName := n.Ref.String(); refName != "" { + ctx.WriteName(refName) + sep = " " + } + if n.PartitionBy != nil { + ctx.WritePlain(sep) + if err := n.PartitionBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WindowSpec.PartitionBy: %w", err) + } + sep = " " + } + if n.OrderBy != nil { + ctx.WritePlain(sep) + if err := n.OrderBy.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WindowSpec.OrderBy: %w", err) + } + sep = " " + } + if n.Frame != nil { + ctx.WritePlain(sep) + if err := n.Frame.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WindowSpec.Frame: %w", err) + } + } + ctx.WritePlain(")") + + return nil +} + +// Accept implements Node Accept interface. +func (n *WindowSpec) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WindowSpec) + if n.PartitionBy != nil { + node, ok := n.PartitionBy.Accept(v) + if !ok { + return n, false + } + n.PartitionBy = node.(*PartitionByClause) + } + if n.OrderBy != nil { + node, ok := n.OrderBy.Accept(v) + if !ok { + return n, false + } + n.OrderBy = node.(*OrderByClause) + } + if n.Frame != nil { + node, ok := n.Frame.Accept(v) + if !ok { + return n, false + } + n.Frame = node.(*FrameClause) + } + return v.Leave(n) +} + +type SelectIntoType int + +const ( + SelectIntoOutfile SelectIntoType = iota + 1 + SelectIntoDumpfile + SelectIntoVars +) + +type SelectIntoOption struct { + node + + Tp SelectIntoType + FileName string + FieldsInfo *FieldsClause + LinesInfo *LinesClause +} + +// Restore implements Node interface. +func (n *SelectIntoOption) Restore(ctx *format.RestoreCtx) error { + if n.Tp != SelectIntoOutfile { + // only support SELECT/TABLE/VALUES ... INTO OUTFILE statement now + return errors.New("unsupported SelectionInto type") + } + + ctx.WriteKeyWord("INTO OUTFILE ") + ctx.WriteString(n.FileName) + if n.FieldsInfo != nil { + if err := n.FieldsInfo.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectInto.FieldsInfo: %w", err) + } + } + if n.LinesInfo != nil { + if err := n.LinesInfo.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SelectInto.LinesInfo: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SelectIntoOption) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// PartitionByClause represents partition by clause. +type PartitionByClause struct { + node + + Items []*ByItem +} + +// Restore implements Node interface. +func (n *PartitionByClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("PARTITION BY ") + for i, v := range n.Items { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PartitionByClause.Items[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PartitionByClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PartitionByClause) + for i, val := range n.Items { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Items[i] = node.(*ByItem) + } + return v.Leave(n) +} + +// FrameType is the type of window function frame. +type FrameType int + +// Window function frame types. +// MySQL only supports `ROWS` and `RANGES`. +const ( + Rows = iota + Ranges + Groups +) + +// FrameClause represents frame clause. +type FrameClause struct { + node + + Type FrameType + Extent FrameExtent +} + +// Restore implements Node interface. +func (n *FrameClause) Restore(ctx *format.RestoreCtx) error { + switch n.Type { + case Rows: + ctx.WriteKeyWord("ROWS") + case Ranges: + ctx.WriteKeyWord("RANGE") + default: + return errors.New("unsupported window function frame type") + } + ctx.WriteKeyWord(" BETWEEN ") + if err := n.Extent.Start.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FrameClause.Extent.Start: %w", err) + } + ctx.WriteKeyWord(" AND ") + if err := n.Extent.End.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FrameClause.Extent.End: %w", err) + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *FrameClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FrameClause) + node, ok := n.Extent.Start.Accept(v) + if !ok { + return n, false + } + n.Extent.Start = *node.(*FrameBound) + node, ok = n.Extent.End.Accept(v) + if !ok { + return n, false + } + n.Extent.End = *node.(*FrameBound) + return v.Leave(n) +} + +// FrameExtent represents frame extent. +type FrameExtent struct { + Start FrameBound + End FrameBound +} + +// FrameType is the type of window function frame bound. +type BoundType int + +// Frame bound types. +const ( + Following = iota + Preceding + CurrentRow +) + +// FrameBound represents frame bound. +type FrameBound struct { + node + + Type BoundType + UnBounded bool + Expr ExprNode + // `Unit` is used to indicate the units in which the `Expr` should be interpreted. + // For example: '2:30' MINUTE_SECOND. + Unit TimeUnitType +} + +// Restore implements Node interface. +func (n *FrameBound) Restore(ctx *format.RestoreCtx) error { + if n.UnBounded { + ctx.WriteKeyWord("UNBOUNDED") + } + switch n.Type { + case CurrentRow: + ctx.WriteKeyWord("CURRENT ROW") + case Preceding, Following: + if n.Unit != TimeUnitInvalid { + ctx.WriteKeyWord("INTERVAL ") + } + if n.Expr != nil { + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FrameBound.Expr: %w", err) + } + } + if n.Unit != TimeUnitInvalid { + ctx.WritePlain(" ") + ctx.WriteKeyWord(n.Unit.String()) + } + if n.Type == Preceding { + ctx.WriteKeyWord(" PRECEDING") + } else { + ctx.WriteKeyWord(" FOLLOWING") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FrameBound) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FrameBound) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +type FulltextSearchModifier int + +const ( + FulltextSearchModifierNaturalLanguageMode = 0 + FulltextSearchModifierBooleanMode = 1 + FulltextSearchModifierModeMask = 0xF + FulltextSearchModifierWithQueryExpansion = 1 << 4 +) + +func (m FulltextSearchModifier) IsBooleanMode() bool { + return m&FulltextSearchModifierModeMask == FulltextSearchModifierBooleanMode +} + +func (m FulltextSearchModifier) IsNaturalLanguageMode() bool { + return m&FulltextSearchModifierModeMask == FulltextSearchModifierNaturalLanguageMode +} + +func (m FulltextSearchModifier) WithQueryExpansion() bool { + return m&FulltextSearchModifierWithQueryExpansion == FulltextSearchModifierWithQueryExpansion +} diff --git a/pkg/parser/ast/dml_test.go b/pkg/parser/ast/dml_test.go new file mode 100644 index 000000000..697fc536c --- /dev/null +++ b/pkg/parser/ast/dml_test.go @@ -0,0 +1,27 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "testing" + + . "github.com/block/spirit/pkg/parser/ast" + "github.com/stretchr/testify/require" +) + +func TestFulltextSearchModifier(t *testing.T) { + require.False(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsBooleanMode()) + require.True(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsNaturalLanguageMode()) + require.False(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).WithQueryExpansion()) +} diff --git a/pkg/parser/ast/expressions.go b/pkg/parser/ast/expressions.go new file mode 100644 index 000000000..769c0938e --- /dev/null +++ b/pkg/parser/ast/expressions.go @@ -0,0 +1,1412 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "errors" + "fmt" + "regexp" + + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/opcode" +) + +var ( + _ ExprNode = &BetweenExpr{} + _ ExprNode = &BinaryOperationExpr{} + _ ExprNode = &CaseExpr{} + _ ExprNode = &ColumnNameExpr{} + _ ExprNode = &CompareSubqueryExpr{} + _ ExprNode = &DefaultExpr{} + _ ExprNode = &ExistsSubqueryExpr{} + _ ExprNode = &IsNullExpr{} + _ ExprNode = &IsTruthExpr{} + _ ExprNode = &ParenthesesExpr{} + _ ExprNode = &PatternInExpr{} + _ ExprNode = &PatternLikeExpr{} + _ ExprNode = &PatternRegexpExpr{} + _ ExprNode = &PositionExpr{} + _ ExprNode = &RowExpr{} + _ ExprNode = &SubqueryExpr{} + _ ExprNode = &UnaryOperationExpr{} + _ ExprNode = &ValuesExpr{} + _ ExprNode = &VariableExpr{} + _ ExprNode = &MatchAgainst{} + _ ExprNode = &SetCollationExpr{} + + _ Node = &ColumnName{} + _ Node = &WhenClause{} +) + +// BetweenExpr is for "between and" or "not between and" expression. +type BetweenExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Left is the expression for minimal value in the range. + Left ExprNode + // Right is the expression for maximum value in the range. + Right ExprNode + // Not is true, the expression is "not between and". + Not bool +} + +// Restore implements Node interface. +func (n *BetweenExpr) Restore(ctx *format.RestoreCtx) error { + if ctx.Flags.HasRestoreBracketAroundBetweenExpr() { + ctx.WritePlain("(") + } + // There is no opcode for BETWEEN. Use a restore-only opcode so BETWEEN + // operands can be checked against MySQL precedence without conflating + // BETWEEN with comparison operators. + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, restoreOpBetween, binaryOpLeftSide); err != nil { + return fmt.Errorf("an error occurred while restore BetweenExpr.Expr: %w", err) + } + if n.Not { + ctx.WriteKeyWord(" NOT BETWEEN ") + } else { + ctx.WriteKeyWord(" BETWEEN ") + } + if err := restoreExprWithBinaryOpParent(ctx, n.Left, restoreOpBetween, binaryOpRightSide); err != nil { + return fmt.Errorf("an error occurred while restore BetweenExpr.Left: %w", err) + } + ctx.WriteKeyWord(" AND ") + if err := restoreExprWithBinaryOpParent(ctx, n.Right, restoreOpBetween, binaryOpRightSide); err != nil { + return fmt.Errorf("an error occurred while restore BetweenExpr.Right : %w", err) + } + if ctx.Flags.HasRestoreBracketAroundBetweenExpr() { + ctx.WritePlain(")") + } + return nil +} + +// Accept implements Node interface. +func (n *BetweenExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BetweenExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Left.Accept(v) + if !ok { + return n, false + } + n.Left = node.(ExprNode) + + node, ok = n.Right.Accept(v) + if !ok { + return n, false + } + n.Right = node.(ExprNode) + + return v.Leave(n) +} + +// BinaryOperationExpr is for binary operation like `1 + 1`, `1 - 1`, etc. +type BinaryOperationExpr struct { + exprNode + // Op is the operator code for BinaryOperation. + Op opcode.Op + // L is the left expression in BinaryOperation. + L ExprNode + // R is the right expression in BinaryOperation. + R ExprNode +} + +func restoreBinaryOpWithSpacesAround(ctx *format.RestoreCtx, op opcode.Op) error { + shouldInsertSpace := ctx.Flags.HasSpacesAroundBinaryOperationFlag() || op.IsKeyword() + if shouldInsertSpace { + ctx.WritePlain(" ") + } + if err := op.Restore(ctx); err != nil { + return err // no need to annotate, the caller will annotate. + } + if shouldInsertSpace { + ctx.WritePlain(" ") + } + return nil +} + +// restoreExprWithBinaryOpParent restores expr as a child of parentOp, on +// parentSide, so a ParenthesesExpr below it can tell whether its parentheses +// are redundant under the surrounding operator. +func restoreExprWithBinaryOpParent(ctx *format.RestoreCtx, expr ExprNode, parentOp opcode.Op, parentSide int) error { + originalParentOp, originalParentSide := ctx.ParentBinaryOp, ctx.ParentBinarySide + defer func() { + ctx.ParentBinaryOp, ctx.ParentBinarySide = originalParentOp, originalParentSide + }() + ctx.ParentBinaryOp, ctx.ParentBinarySide = int(parentOp), parentSide + return expr.Restore(ctx) +} + +// restoreExprWithUnaryOpParent restores expr as the operand of a unary +// operator, where no parentheses may be dropped. +func restoreExprWithUnaryOpParent(ctx *format.RestoreCtx, expr ExprNode) error { + originalInUnaryOperation := ctx.InUnaryOperation + defer func() { + ctx.InUnaryOperation = originalInUnaryOperation + }() + ctx.InUnaryOperation = true + return expr.Restore(ctx) +} + +// restoreWithResetParentContext restores below a syntactic boundary — the +// parentheses of a subquery, or a pair of parentheses that is being kept — +// where the enclosing operator no longer constrains the child. +func restoreWithResetParentContext(ctx *format.RestoreCtx, restore func() error) error { + inUnaryOperation, parentOp, parentSide := ctx.InUnaryOperation, ctx.ParentBinaryOp, ctx.ParentBinarySide + defer func() { + ctx.InUnaryOperation, ctx.ParentBinaryOp, ctx.ParentBinarySide = inUnaryOperation, parentOp, parentSide + }() + ctx.InUnaryOperation, ctx.ParentBinaryOp, ctx.ParentBinarySide = false, 0, 0 + return restore() +} + +// Restore implements Node interface. +func (n *BinaryOperationExpr) Restore(ctx *format.RestoreCtx) error { + originalFlags := ctx.Flags + if ctx.Flags.HasRestoreBracketAroundBinaryOperation() { + ctx.WritePlain("(") + ctx.Flags |= format.RestoreBracketAroundBetweenExpr + } + parentOp, parentSide := ctx.ParentBinaryOp, ctx.ParentBinarySide + defer func() { + ctx.ParentBinaryOp, ctx.ParentBinarySide = parentOp, parentSide + }() + ctx.ParentBinaryOp, ctx.ParentBinarySide = int(n.Op), binaryOpLeftSide + if err := n.L.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore BinaryOperationExpr.L: %w", err) + } + if err := restoreBinaryOpWithSpacesAround(ctx, n.Op); err != nil { + return fmt.Errorf("an error occurred while restore BinaryOperationExpr.Op: %w", err) + } + ctx.ParentBinaryOp, ctx.ParentBinarySide = int(n.Op), binaryOpRightSide + if err := n.R.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore BinaryOperationExpr.R: %w", err) + } + if ctx.Flags.HasRestoreBracketAroundBinaryOperation() { + ctx.WritePlain(")") + ctx.Flags = originalFlags + } + return nil +} + +// Accept implements Node interface. +func (n *BinaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BinaryOperationExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + + return v.Leave(n) +} + +// WhenClause is the when clause in Case expression for "when condition then result". +type WhenClause struct { + node + // Expr is the condition expression in WhenClause. + Expr ExprNode + // Result is the result expression in WhenClause. + Result ExprNode +} + +// Restore implements Node interface. +func (n *WhenClause) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("WHEN ") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WhenClauses.Expr: %w", err) + } + ctx.WriteKeyWord(" THEN ") + if err := n.Result.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WhenClauses.Result: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *WhenClause) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*WhenClause) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + + node, ok = n.Result.Accept(v) + if !ok { + return n, false + } + n.Result = node.(ExprNode) + return v.Leave(n) +} + +// CaseExpr is the case expression. +type CaseExpr struct { + exprNode + // Value is the compare value expression. + Value ExprNode + // WhenClauses is the condition check expression. + WhenClauses []*WhenClause + // ElseClause is the else result expression. + ElseClause ExprNode +} + +// Restore implements Node interface. +func (n *CaseExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CASE") + if n.Value != nil { + ctx.WritePlain(" ") + if err := n.Value.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CaseExpr.Value: %w", err) + } + } + for _, clause := range n.WhenClauses { + ctx.WritePlain(" ") + if err := clause.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CaseExpr.WhenClauses: %w", err) + } + } + if n.ElseClause != nil { + ctx.WriteKeyWord(" ELSE ") + if err := n.ElseClause.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CaseExpr.ElseClause: %w", err) + } + } + ctx.WriteKeyWord(" END") + + return nil +} + +// Accept implements Node Accept interface. +func (n *CaseExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*CaseExpr) + if n.Value != nil { + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + } + for i, val := range n.WhenClauses { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.WhenClauses[i] = node.(*WhenClause) + } + if n.ElseClause != nil { + node, ok := n.ElseClause.Accept(v) + if !ok { + return n, false + } + n.ElseClause = node.(ExprNode) + } + return v.Leave(n) +} + +// SubqueryExpr represents a subquery. +type SubqueryExpr struct { + exprNode + // Query is the query SelectNode. + Query ResultSetNode + Evaluated bool + Correlated bool + MultiRows bool + Exists bool +} + +func (*SubqueryExpr) resultSet() {} + +// Restore implements Node interface. +func (n *SubqueryExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WritePlain("(") + if err := restoreWithResetParentContext(ctx, func() error { + return n.Query.Restore(ctx) + }); err != nil { + return fmt.Errorf("an error occurred while restore SubqueryExpr.Query: %w", err) + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *SubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SubqueryExpr) + node, ok := n.Query.Accept(v) + if !ok { + return n, false + } + n.Query = node.(ResultSetNode) + return v.Leave(n) +} + +// CompareSubqueryExpr is the expression for "expr cmp (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/comparisons-using-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html +// See https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html +type CompareSubqueryExpr struct { + exprNode + // L is the left expression + L ExprNode + // Op is the comparison opcode. + Op opcode.Op + // R is the subquery for right expression, may be rewritten to other type of expression. + R ExprNode + // All is true, we should compare all records in subquery. + All bool +} + +// Restore implements Node interface. +func (n *CompareSubqueryExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.L, n.Op, binaryOpLeftSide); err != nil { + return fmt.Errorf("an error occurred while restore CompareSubqueryExpr.L: %w", err) + } + if err := restoreBinaryOpWithSpacesAround(ctx, n.Op); err != nil { + return fmt.Errorf("an error occurred while restore CompareSubqueryExpr.Op: %w", err) + } + if n.All { + ctx.WriteKeyWord("ALL ") + } else { + ctx.WriteKeyWord("ANY ") + } + if err := n.R.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CompareSubqueryExpr.R: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CompareSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CompareSubqueryExpr) + node, ok := n.L.Accept(v) + if !ok { + return n, false + } + n.L = node.(ExprNode) + node, ok = n.R.Accept(v) + if !ok { + return n, false + } + n.R = node.(ExprNode) + return v.Leave(n) +} + +// ColumnName represents column name. +type ColumnName struct { + node + Schema CIStr + Table CIStr + Name CIStr +} + +// Restore implements Node interface. +func (n *ColumnName) Restore(ctx *format.RestoreCtx) error { + if n.Schema.O != "" && !ctx.IsCTETableName(n.Table.L) && !ctx.Flags.HasWithoutSchemaNameFlag() { + ctx.WriteName(n.Schema.O) + ctx.WritePlain(".") + } + if n.Table.O != "" && !ctx.Flags.HasWithoutTableNameFlag() { + ctx.WriteName(n.Table.O) + ctx.WritePlain(".") + } + ctx.WriteName(n.Name.O) + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnName) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnName) + return v.Leave(n) +} + +// String implements Stringer interface. +func (n *ColumnName) String() string { + result := n.Name.L + if n.Table.L != "" { + result = n.Table.L + "." + result + } + if n.Schema.L != "" { + result = n.Schema.L + "." + result + } + return result +} + +// OrigColName returns the full original column name. +func (n *ColumnName) OrigColName() (ret string) { + ret = n.Name.O + if n.Table.O == "" { + return + } + ret = n.Table.O + "." + ret + if n.Schema.O == "" { + return + } + ret = n.Schema.O + "." + ret + return +} + +// Match means that if a match b, e.g. t.a can match test.t.a but test.t.a can't match t.a. +// Because column a want column from database test exactly. +func (n *ColumnName) Match(b *ColumnName) bool { + if n.Schema.L == "" || n.Schema.L == b.Schema.L { + if n.Table.L == "" || n.Table.L == b.Table.L { + return n.Name.L == b.Name.L + } + } + return false +} + +// ColumnNameExpr represents a column name expression. +type ColumnNameExpr struct { + exprNode + + // Name is the referenced column name. + Name *ColumnName +} + +// Restore implements Node interface. +func (n *ColumnNameExpr) Restore(ctx *format.RestoreCtx) error { + if err := n.Name.Restore(ctx); err != nil { + return err + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ColumnNameExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ColumnNameExpr) + node, ok := n.Name.Accept(v) + if !ok { + return n, false + } + n.Name = node.(*ColumnName) + return v.Leave(n) +} + +// DefaultExpr is the default expression using default value for a column. +type DefaultExpr struct { + exprNode + // Name is the column name. + Name *ColumnName +} + +// Restore implements Node interface. +func (n *DefaultExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DEFAULT") + if n.Name != nil { + ctx.WritePlain("(") + if err := n.Name.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DefaultExpr.Name: %w", err) + } + ctx.WritePlain(")") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DefaultExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DefaultExpr) + return v.Leave(n) +} + +// ExistsSubqueryExpr is the expression for "exists (select ...)". +// See https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html +type ExistsSubqueryExpr struct { + exprNode + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode + // Not is true, the expression is "not exists". + Not bool +} + +// Restore implements Node interface. +func (n *ExistsSubqueryExpr) Restore(ctx *format.RestoreCtx) error { + if n.Not { + ctx.WriteKeyWord("NOT EXISTS ") + } else { + ctx.WriteKeyWord("EXISTS ") + } + if err := n.Sel.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ExistsSubqueryExpr.Sel: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ExistsSubqueryExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExistsSubqueryExpr) + node, ok := n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + return v.Leave(n) +} + +// PatternInExpr is the expression for in operator, like "expr in (1, 2, 3)" or "expr in (select c from t)". +type PatternInExpr struct { + exprNode + // Expr is the value expression to be compared. + Expr ExprNode + // List is the list expression in compare list. + List []ExprNode + // Not is true, the expression is "not in". + Not bool + // Sel is the subquery, may be rewritten to other type of expression. + Sel ExprNode +} + +// Restore implements Node interface. +func (n *PatternInExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, opcode.In, binaryOpLeftSide); err != nil { + return fmt.Errorf("an error occurred while restore PatternInExpr.Expr: %w", err) + } + if n.Not { + ctx.WriteKeyWord(" NOT IN ") + } else { + ctx.WriteKeyWord(" IN ") + } + if n.Sel != nil { + if err := n.Sel.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PatternInExpr.Sel: %w", err) + } + } else { + ctx.WritePlain("(") + for i, expr := range n.List { + if i != 0 { + ctx.WritePlain(",") + } + if err := expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PatternInExpr.List[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PatternInExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternInExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + for i, val := range n.List { + node, ok = val.Accept(v) + if !ok { + return n, false + } + n.List[i] = node.(ExprNode) + } + if n.Sel != nil { + node, ok = n.Sel.Accept(v) + if !ok { + return n, false + } + n.Sel = node.(ExprNode) + } + return v.Leave(n) +} + +// IsNullExpr is the expression for null check. +type IsNullExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not null". + Not bool +} + +// Restore implements Node interface. +func (n *IsNullExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, opcode.IsNull, binaryOpLeftSide); err != nil { + return err + } + if n.Not { + ctx.WriteKeyWord(" IS NOT NULL") + } else { + ctx.WriteKeyWord(" IS NULL") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IsNullExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsNullExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// IsTruthExpr is the expression for true/false check. +type IsTruthExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Not is true, the expression is "is not true/false". + Not bool + // True indicates checking true or false. + True int64 +} + +// Restore implements Node interface. +func (n *IsTruthExpr) Restore(ctx *format.RestoreCtx) error { + parentOp := opcode.IsFalsity + if n.True > 0 { + parentOp = opcode.IsTruth + } + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, parentOp, binaryOpLeftSide); err != nil { + return err + } + if n.Not { + ctx.WriteKeyWord(" IS NOT") + } else { + ctx.WriteKeyWord(" IS") + } + if n.True > 0 { + ctx.WriteKeyWord(" TRUE") + } else { + ctx.WriteKeyWord(" FALSE") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *IsTruthExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*IsTruthExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// PatternLikeExpr is the expression for the LIKE operator, e.g. expr LIKE "%123%". +type PatternLikeExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the like expression. + Pattern ExprNode + // Not is true, the expression is "not like". + Not bool + + Escape byte + // EscapeExplicit indicates whether ESCAPE clause is specified explicitly. + EscapeExplicit bool + + PatChars []byte + PatTypes []byte +} + +// Restore implements Node interface. +func (n *PatternLikeExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, opcode.Like, binaryOpLeftSide); err != nil { + return fmt.Errorf("an error occurred while restore PatternLikeExpr.Expr: %w", err) + } + + if n.Not { + ctx.WriteKeyWord(" NOT LIKE ") + } else { + ctx.WriteKeyWord(" LIKE ") + } + + if err := restoreExprWithBinaryOpParent(ctx, n.Pattern, opcode.Like, binaryOpRightSide); err != nil { + return fmt.Errorf("an error occurred while restore PatternLikeExpr.Pattern: %w", err) + } + + if n.EscapeExplicit && n.Escape != '\\' { + ctx.WriteKeyWord(" ESCAPE ") + if n.Escape == 0 { + // ESCAPE '' means no escape character + ctx.WriteString("") + } else { + ctx.WriteString(string(n.Escape)) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PatternLikeExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternLikeExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + if n.Pattern != nil { + node, ok := n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + } + return v.Leave(n) +} + +// ParenthesesExpr is the parentheses' expression. +type ParenthesesExpr struct { + exprNode + // Expr is the expression in parentheses. + Expr ExprNode +} + +// Restore implements Node interface. +func (n *ParenthesesExpr) Restore(ctx *format.RestoreCtx) error { + if ctx.Flags.HasRestoreSkipRedundantParentheses() && canRestoreWithoutParentheses(ctx, n.Expr) { + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ParenthesesExpr.Expr: %w", err) + } + return nil + } + ctx.WritePlain("(") + if err := restoreWithResetParentContext(ctx, func() error { + return n.Expr.Restore(ctx) + }); err != nil { + return fmt.Errorf("an error occurred while restore ParenthesesExpr.Expr: %w", err) + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *ParenthesesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParenthesesExpr) + if n.Expr != nil { + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + } + return v.Leave(n) +} + +const ( + binaryOpLeftSide = iota + 1 + binaryOpRightSide +) + +// Restore-only opcodes for constructs that behave like binary operators when it +// comes to precedence but have no opcode.Op of their own. They are negative so +// they cannot collide with a real opcode. +const ( + restoreOpMemberOf opcode.Op = -1 - iota + restoreOpCollate + restoreOpBetween +) + +// canRestoreWithoutParentheses decides whether removing a pair of parentheses +// keeps the expression under the same surrounding parse boundary. Unknown or +// ambiguous cases keep parentheses. Unary parents are conservative because +// expressions like -(a + b) are not equivalent to -a + b. +func canRestoreWithoutParentheses(ctx *format.RestoreCtx, expr ExprNode) bool { + if ctx.InUnaryOperation { + return false + } + // Unary expressions need conservative handling under a binary parent because + // dropping their parentheses can expose a different parse boundary to the + // surrounding binary operator. + if _, ok := expr.(*UnaryOperationExpr); ok && ctx.ParentBinaryOp != 0 { + return false + } + childOp, ok := restoreParenthesizedExprOp(expr) + if !ok { + return true + } + parentOp := opcode.Op(ctx.ParentBinaryOp) + if parentOp == 0 { + return true + } + return canRestoreBinaryChildWithoutParentheses(parentOp, childOp, ctx.ParentBinarySide) +} + +// restoreParenthesizedExprOp reports the operator a parenthesized expression is +// built around, if it is one whose precedence matters to the parent. The second +// return value is false for expressions that are self-delimiting (a literal, a +// column reference, a function call), whose parentheses are always redundant. +func restoreParenthesizedExprOp(expr ExprNode) (opcode.Op, bool) { + switch x := expr.(type) { + case *BinaryOperationExpr: + return x.Op, true + case *BetweenExpr: + return restoreOpBetween, true + case *CompareSubqueryExpr: + return x.Op, true + case *IsNullExpr: + return opcode.IsNull, true + case *IsTruthExpr: + if x.True > 0 { + return opcode.IsTruth, true + } + return opcode.IsFalsity, true + case *PatternInExpr: + return opcode.In, true + case *PatternLikeExpr: + return opcode.Like, true + case *PatternRegexpExpr: + return opcode.Regexp, true + case *SetCollationExpr: + return restoreOpCollate, true + case *FuncCallExpr: + if x.FnName.L == JSONMemberOf { + return restoreOpMemberOf, true + } + } + return 0, false +} + +func canRestoreBinaryChildWithoutParentheses(parentOp, childOp opcode.Op, side int) bool { + parentPrecedence := restoreBinaryPrecedence(parentOp) + childPrecedence := restoreBinaryPrecedence(childOp) + if parentPrecedence == 0 || childPrecedence == 0 { + return false + } + if childPrecedence > parentPrecedence { + return true + } + if childPrecedence < parentPrecedence { + return false + } + return side == binaryOpLeftSide || isAssociativeRestoreOp(parentOp, childOp) +} + +// restoreBinaryPrecedence follows MySQL operator precedence: larger values bind +// tighter, and 0 means unknown so parentheses must be kept. Binary operators are +// left-associative, so same-precedence right children can drop parentheses only +// for operators that preserve SQL evaluation semantics after regrouping. +// Arithmetic operators are intentionally excluded: subtraction, division, +// integer division, and modulo are not associative, while addition and +// multiplication can still produce different finite-precision numeric results +// after reassociation. +// +// Examples: +// - `(a + b) * c` must keep parentheses. +// - `a + (b * c)` can become `a + b * c`. +// - `(a BETWEEN b AND c) = d` must keep parentheses because BETWEEN binds +// weaker than comparison operators. +// +// See https://dev.mysql.com/doc/refman/8.4/en/operator-precedence.html. +func restoreBinaryPrecedence(op opcode.Op) int { + // The unary opcodes (Not, Not2, BitNeg) and Case are not binary operators; + // they fall through to the unknown-precedence default on purpose. + switch op { //nolint:exhaustive + case opcode.LogicOr: + return 1 + case opcode.LogicXor: + return 2 + case opcode.LogicAnd: + return 3 + case restoreOpBetween: + return 4 + case opcode.EQ, opcode.NE, opcode.NullEQ, opcode.LT, opcode.LE, opcode.GT, opcode.GE, + opcode.In, opcode.Like, opcode.Regexp, opcode.IsNull, opcode.IsTruth, opcode.IsFalsity, + restoreOpMemberOf: + return 5 + case opcode.Or: + return 6 + case opcode.And: + return 7 + case opcode.LeftShift, opcode.RightShift: + return 8 + case opcode.Plus, opcode.Minus: + return 9 + case opcode.Mul, opcode.Div, opcode.IntDiv, opcode.Mod: + return 10 + case opcode.Xor: + return 11 + case restoreOpCollate: + return 12 + default: + return 0 + } +} + +func isAssociativeRestoreOp(parentOp, childOp opcode.Op) bool { + if parentOp != childOp { + return false + } + // Every other operator is either non-associative or not worth regrouping. + switch parentOp { //nolint:exhaustive + case opcode.LogicAnd, opcode.LogicOr, opcode.And, opcode.Or, opcode.Xor: + return true + default: + return false + } +} + +// PositionExpr is the expression for order by and group by position. +// MySQL use position expression started from 1, it looks a little confused inner. +// maybe later we will use 0 at first. +type PositionExpr struct { + exprNode + // N is the position, started from 1 now. + N int + // P is the parameterized position. + P ExprNode +} + +// Restore implements Node interface. +func (n *PositionExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WritePlainf("%d", n.N) + return nil +} + +// Accept implements Node Accept interface. +func (n *PositionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PositionExpr) + if n.P != nil { + node, ok := n.P.Accept(v) + if !ok { + return n, false + } + n.P = node.(ExprNode) + } + return v.Leave(n) +} + +// PatternRegexpExpr is the pattern expression for pattern match. +type PatternRegexpExpr struct { + exprNode + // Expr is the expression to be checked. + Expr ExprNode + // Pattern is the expression for pattern. + Pattern ExprNode + // Not is true, the expression is "not rlike", + Not bool + + // Re is the compiled regexp. + Re *regexp.Regexp + // Sexpr is the string for Expr expression. + Sexpr *string +} + +// Restore implements Node interface. +func (n *PatternRegexpExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, opcode.Regexp, binaryOpLeftSide); err != nil { + return fmt.Errorf("an error occurred while restore PatternRegexpExpr.Expr: %w", err) + } + + if n.Not { + ctx.WriteKeyWord(" NOT REGEXP ") + } else { + ctx.WriteKeyWord(" REGEXP ") + } + + if err := restoreExprWithBinaryOpParent(ctx, n.Pattern, opcode.Regexp, binaryOpRightSide); err != nil { + return fmt.Errorf("an error occurred while restore PatternRegexpExpr.Pattern: %w", err) + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *PatternRegexpExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PatternRegexpExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + node, ok = n.Pattern.Accept(v) + if !ok { + return n, false + } + n.Pattern = node.(ExprNode) + return v.Leave(n) +} + +// RowExpr is the expression for row constructor. +// See https://dev.mysql.com/doc/refman/5.7/en/row-subqueries.html +type RowExpr struct { + exprNode + + Values []ExprNode +} + +// Restore implements Node interface. +func (n *RowExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ROW") + ctx.WritePlain("(") + for i, v := range n.Values { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RowExpr.Values[%v]: %w", i, err) + } + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *RowExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RowExpr) + for i, val := range n.Values { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Values[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// UnaryOperationExpr is the expression for unary operator. +type UnaryOperationExpr struct { + exprNode + // Op is the operator opcode. + Op opcode.Op + // V is the unary expression. + V ExprNode +} + +// Restore implements Node interface. +func (n *UnaryOperationExpr) Restore(ctx *format.RestoreCtx) error { + if err := n.Op.Restore(ctx); err != nil { + return err + } + if err := restoreExprWithUnaryOpParent(ctx, n.V); err != nil { + return err + } + return nil +} + +// Accept implements Node Accept interface. +func (n *UnaryOperationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UnaryOperationExpr) + node, ok := n.V.Accept(v) + if !ok { + return n, false + } + n.V = node.(ExprNode) + return v.Leave(n) +} + +// ValuesExpr is the expression used in INSERT VALUES. +type ValuesExpr struct { + exprNode + // Column is column name. + Column *ColumnNameExpr +} + +// Restore implements Node interface. +func (n *ValuesExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("VALUES") + ctx.WritePlain("(") + if err := n.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ValuesExpr.Column: %w", err) + } + ctx.WritePlain(")") + + return nil +} + +// Accept implements Node Accept interface. +func (n *ValuesExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValuesExpr) + node, ok := n.Column.Accept(v) + if !ok { + return n, false + } + // `node` may be *ast.ValueExpr, to avoid panic, we write `_` and do not use + // it. + n.Column, _ = node.(*ColumnNameExpr) + return v.Leave(n) +} + +// VariableExpr is the expression for variable. +type VariableExpr struct { + exprNode + // Name is the variable name. + Name string + // IsGlobal indicates whether this variable is global. + IsGlobal bool + // IsInstance indicates whether this variable is instance. + IsInstance bool + // IsSystem indicates whether this variable is a system variable in current session. + IsSystem bool + // ExplicitScope indicates whether this variable scope is set explicitly. + ExplicitScope bool + // Value is the variable value. + Value ExprNode +} + +// Restore implements Node interface. +func (n *VariableExpr) Restore(ctx *format.RestoreCtx) error { + if n.IsSystem { + ctx.WritePlain("@@") + if n.ExplicitScope { + switch { + case n.IsGlobal: + ctx.WriteKeyWord("GLOBAL") + case n.IsInstance: + ctx.WriteKeyWord("INSTANCE") + default: + ctx.WriteKeyWord("SESSION") + } + ctx.WritePlain(".") + } + } else { + ctx.WritePlain("@") + } + ctx.WriteName(n.Name) + + if n.Value != nil { + ctx.WritePlain(":=") + if err := n.Value.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore VariableExpr.Value: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *VariableExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableExpr) + if n.Value == nil { + return v.Leave(n) + } + + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// MaxValueExpr is the expression for "maxvalue" used in partition. +type MaxValueExpr struct { + exprNode +} + +// Restore implements Node interface. +func (n *MaxValueExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("MAXVALUE") + return nil +} + +// Accept implements Node Accept interface. +func (n *MaxValueExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// MatchAgainst is the expression for matching against fulltext index. +type MatchAgainst struct { + exprNode + // ColumnNames are the columns to match. + ColumnNames []*ColumnName + // Against + Against ExprNode + // Modifier + Modifier FulltextSearchModifier +} + +func (n *MatchAgainst) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("MATCH") + ctx.WritePlain(" (") + for i, v := range n.ColumnNames { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore MatchAgainst.ColumnNames[%d]: %w", i, err) + } + } + ctx.WritePlain(") ") + ctx.WriteKeyWord("AGAINST") + ctx.WritePlain(" (") + if err := n.Against.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore MatchAgainst.Against: %w", err) + } + if n.Modifier.IsBooleanMode() { + ctx.WritePlain(" IN BOOLEAN MODE") + if n.Modifier.WithQueryExpansion() { + return errors.New("BOOLEAN MODE doesn't support QUERY EXPANSION") + } + } else if n.Modifier.WithQueryExpansion() { + ctx.WritePlain(" WITH QUERY EXPANSION") + } + ctx.WritePlain(")") + return nil +} + +func (n *MatchAgainst) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*MatchAgainst) + for i, colName := range n.ColumnNames { + newColName, ok := colName.Accept(v) + if !ok { + return n, false + } + n.ColumnNames[i] = newColName.(*ColumnName) + } + newAgainst, ok := n.Against.Accept(v) + if !ok { + return n, false + } + n.Against = newAgainst.(ExprNode) + return v.Leave(n) +} + +// SetCollationExpr is the expression for the `COLLATE collation_name` clause. +type SetCollationExpr struct { + exprNode + // Expr is the expression to be set. + Expr ExprNode + // Collate is the name of collation to set. + Collate string +} + +// Restore implements Node interface. +func (n *SetCollationExpr) Restore(ctx *format.RestoreCtx) error { + if err := restoreExprWithBinaryOpParent(ctx, n.Expr, restoreOpCollate, binaryOpLeftSide); err != nil { + return err + } + ctx.WriteKeyWord(" COLLATE ") + ctx.WritePlain(n.Collate) + return nil +} + +// Accept implements Node Accept interface. +func (n *SetCollationExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetCollationExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} diff --git a/pkg/parser/ast/expressions_test.go b/pkg/parser/ast/expressions_test.go new file mode 100644 index 000000000..9c258259e --- /dev/null +++ b/pkg/parser/ast/expressions_test.go @@ -0,0 +1,100 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "testing" + + . "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/stretchr/testify/require" +) + +type checkVisitor struct{} + +func (v checkVisitor) Enter(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.enterCnt++ + return in, true + } + return in, false +} + +func (v checkVisitor) Leave(in Node) (Node, bool) { + if e, ok := in.(*checkExpr); ok { + e.leaveCnt++ + } + return in, true +} + +type checkExpr struct { + ValueExpr + + enterCnt int + leaveCnt int +} + +func (n *checkExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*checkExpr) + return v.Leave(n) +} + +func (n *checkExpr) reset() { + n.enterCnt = 0 + n.leaveCnt = 0 +} + +func TestExpresionsVisitorCover(t *testing.T) { + ce := &checkExpr{} + stmts := + []struct { + node Node + expectedEnterCnt int + expectedLeaveCnt int + }{ + {&BetweenExpr{Expr: ce, Left: ce, Right: ce}, 3, 3}, + {&BinaryOperationExpr{L: ce, R: ce}, 2, 2}, + {&CaseExpr{Value: ce, WhenClauses: []*WhenClause{{Expr: ce, Result: ce}, + {Expr: ce, Result: ce}}, ElseClause: ce}, 6, 6}, + {&ColumnNameExpr{Name: &ColumnName{}}, 0, 0}, + {&CompareSubqueryExpr{L: ce, R: ce}, 2, 2}, + {&DefaultExpr{Name: &ColumnName{}}, 0, 0}, + {&ExistsSubqueryExpr{Sel: ce}, 1, 1}, + {&IsNullExpr{Expr: ce}, 1, 1}, + {&IsTruthExpr{Expr: ce}, 1, 1}, + {NewParamMarkerExpr(0), 0, 0}, + {&ParenthesesExpr{Expr: ce}, 1, 1}, + {&PatternInExpr{Expr: ce, List: []ExprNode{ce, ce, ce}, Sel: ce}, 5, 5}, + {&PatternLikeExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PatternRegexpExpr{Expr: ce, Pattern: ce}, 2, 2}, + {&PositionExpr{}, 0, 0}, + {&RowExpr{Values: []ExprNode{ce, ce}}, 2, 2}, + {&UnaryOperationExpr{V: ce}, 1, 1}, + {NewValueExpr(0, mysql.DefaultCharset, mysql.DefaultCollationName), 0, 0}, + {&ValuesExpr{Column: &ColumnNameExpr{Name: &ColumnName{}}}, 0, 0}, + {&VariableExpr{Value: ce}, 1, 1}, + } + + for _, v := range stmts { + ce.reset() + v.node.Accept(checkVisitor{}) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) + v.node.Accept(visitor1{}) + } +} diff --git a/pkg/parser/ast/functions.go b/pkg/parser/ast/functions.go new file mode 100644 index 000000000..607393202 --- /dev/null +++ b/pkg/parser/ast/functions.go @@ -0,0 +1,1099 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "strings" + "time" + + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/types" +) + +var ( + _ FuncNode = &AggregateFuncExpr{} + _ FuncNode = &FuncCallExpr{} + _ FuncNode = &FuncCastExpr{} + _ FuncNode = &WindowFuncExpr{} +) + +// List scalar function names. +const ( + LogicAnd = "and" + Cast = "cast" + LeftShift = "leftshift" + RightShift = "rightshift" + LogicOr = "or" + GE = "ge" + LE = "le" + EQ = "eq" + NE = "ne" + LT = "lt" + GT = "gt" + Plus = "plus" + Minus = "minus" + And = "bitand" + Or = "bitor" + Mod = "mod" + Xor = "bitxor" + Div = "div" + Mul = "mul" + UnaryNot = "not" // Avoid name conflict with Not in github/pingcap/check. + BitNeg = "bitneg" + IntDiv = "intdiv" + LogicXor = "xor" + NullEQ = "nulleq" + UnaryPlus = "unaryplus" + UnaryMinus = "unaryminus" + In = "in" + Like = "like" + Case = "case" + Regexp = "regexp" + RegexpLike = "regexp_like" + RegexpSubstr = "regexp_substr" + RegexpInStr = "regexp_instr" + RegexpReplace = "regexp_replace" + IsNull = "isnull" + IsTruthWithoutNull = "istrue" // Avoid name conflict with IsTrue in github/pingcap/check. + IsTruthWithNull = "istrue_with_null" + IsFalsity = "isfalse" // Avoid name conflict with IsFalse in github/pingcap/check. + RowFunc = "row" + SetVar = "setvar" + GetVar = "getvar" + Values = "values" + BitCount = "bit_count" + GetParam = "getparam" + + // common functions + Coalesce = "coalesce" + Greatest = "greatest" + Least = "least" + Interval = "interval" + + // masking functions + MaskFull = "mask_full" + MaskPartial = "mask_partial" + MaskNull = "mask_null" + MaskDate = "mask_date" + + // math functions + Abs = "abs" + Acos = "acos" + Asin = "asin" + Atan = "atan" + Atan2 = "atan2" + Ceil = "ceil" + Ceiling = "ceiling" + Conv = "conv" + Cos = "cos" + Cot = "cot" + CRC32 = "crc32" + Degrees = "degrees" + Exp = "exp" + Floor = "floor" + Ln = "ln" + Log = "log" + Log2 = "log2" + Log10 = "log10" + PI = "pi" + Pow = "pow" + Power = "power" + Radians = "radians" + Rand = "rand" + Round = "round" + Sign = "sign" + Sin = "sin" + Sqrt = "sqrt" + Tan = "tan" + Truncate = "truncate" + + // time functions + AddDate = "adddate" + AddTime = "addtime" + ConvertTz = "convert_tz" + Curdate = "curdate" + CurrentDate = "current_date" + CurrentTime = "current_time" + CurrentTimestamp = "current_timestamp" + Curtime = "curtime" + Date = "date" + DateLiteral = "'spirit`.(dateliteral" + DateAdd = "date_add" + DateFormat = "date_format" + DateSub = "date_sub" + DateDiff = "datediff" + Day = "day" + DayName = "dayname" + DayOfMonth = "dayofmonth" + DayOfWeek = "dayofweek" + DayOfYear = "dayofyear" + Extract = "extract" + FromDays = "from_days" + FromUnixTime = "from_unixtime" + GetFormat = "get_format" + Hour = "hour" + LocalTime = "localtime" + LocalTimestamp = "localtimestamp" + MakeDate = "makedate" + MakeTime = "maketime" + MicroSecond = "microsecond" + Minute = "minute" + Month = "month" + MonthName = "monthname" + Now = "now" + PeriodAdd = "period_add" + PeriodDiff = "period_diff" + Quarter = "quarter" + SecToTime = "sec_to_time" + Second = "second" + StrToDate = "str_to_date" + SubDate = "subdate" + SubTime = "subtime" + Sysdate = "sysdate" + Time = "time" + TimeLiteral = "'spirit`.(timeliteral" + TimeFormat = "time_format" + TimeToSec = "time_to_sec" + TimeDiff = "timediff" + Timestamp = "timestamp" + TimestampLiteral = "'spirit`.(timestampliteral" + TimestampAdd = "timestampadd" + TimestampDiff = "timestampdiff" + ToDays = "to_days" + ToSeconds = "to_seconds" + UnixTimestamp = "unix_timestamp" + UTCDate = "utc_date" + UTCTime = "utc_time" + UTCTimestamp = "utc_timestamp" + Week = "week" + Weekday = "weekday" + WeekOfYear = "weekofyear" + Year = "year" + YearWeek = "yearweek" + LastDay = "last_day" + // string functions + ASCII = "ascii" + Bin = "bin" + Concat = "concat" + ConcatWS = "concat_ws" + Convert = "convert" + Elt = "elt" + ExportSet = "export_set" + Field = "field" + Format = "format" + FromBase64 = "from_base64" + InsertFunc = "insert_func" + Instr = "instr" + Lcase = "lcase" + Left = "left" + Length = "length" + LoadFile = "load_file" + Locate = "locate" + Lower = "lower" + Lpad = "lpad" + LTrim = "ltrim" + MakeSet = "make_set" + Mid = "mid" + Oct = "oct" + OctetLength = "octet_length" + Ord = "ord" + Position = "position" + Quote = "quote" + Repeat = "repeat" + Replace = "replace" + Reverse = "reverse" + Right = "right" + RTrim = "rtrim" + Space = "space" + Strcmp = "strcmp" + Substring = "substring" + Substr = "substr" + SubstringIndex = "substring_index" + ToBase64 = "to_base64" + Trim = "trim" + Translate = "translate" + Upper = "upper" + Ucase = "ucase" + Hex = "hex" + Unhex = "unhex" + Rpad = "rpad" + BitLength = "bit_length" + CharFunc = "char_func" + CharLength = "char_length" + CharacterLength = "character_length" + FindInSet = "find_in_set" + WeightString = "weight_string" + Soundex = "soundex" + + // information functions + Benchmark = "benchmark" + Charset = "charset" + Coercibility = "coercibility" + Collation = "collation" + ConnectionID = "connection_id" + CurrentUser = "current_user" + CurrentRole = "current_role" + Database = "database" + FoundRows = "found_rows" + LastInsertId = "last_insert_id" + RowCount = "row_count" + Schema = "schema" + SessionUser = "session_user" + SystemUser = "system_user" + User = "user" + Version = "version" + FormatBytes = "format_bytes" + + // control functions + If = "if" + Ifnull = "ifnull" + Nullif = "nullif" + + // miscellaneous functions + AnyValue = "any_value" + DefaultFunc = "default_func" + InetAton = "inet_aton" + InetNtoa = "inet_ntoa" + Inet6Aton = "inet6_aton" + Inet6Ntoa = "inet6_ntoa" + IsFreeLock = "is_free_lock" + IsIPv4 = "is_ipv4" + IsIPv4Compat = "is_ipv4_compat" + IsIPv4Mapped = "is_ipv4_mapped" + IsIPv6 = "is_ipv6" + IsUsedLock = "is_used_lock" + IsUUID = "is_uuid" + NameConst = "name_const" + ReleaseAllLocks = "release_all_locks" + Sleep = "sleep" + UUID = "uuid" + UUIDv4 = "uuid_v4" + UUIDv7 = "uuid_v7" + UUIDVersion = "uuid_version" + UUIDTimestamp = "uuid_timestamp" + UUIDShort = "uuid_short" + UUIDToBin = "uuid_to_bin" + BinToUUID = "bin_to_uuid" + GetLock = "get_lock" + ReleaseLock = "release_lock" + Grouping = "grouping" + + // encryption and compression functions + AesDecrypt = "aes_decrypt" + AesEncrypt = "aes_encrypt" + Compress = "compress" + Decode = "decode" + Encode = "encode" + MD5 = "md5" + PasswordFunc = "password" + RandomBytes = "random_bytes" + SHA1 = "sha1" + SHA = "sha" + SHA2 = "sha2" + SM3 = "sm3" + Uncompress = "uncompress" + UncompressedLength = "uncompressed_length" + ValidatePasswordStrength = "validate_password_strength" + + // json functions + JSONType = "json_type" + JSONExtract = "json_extract" + JSONUnquote = "json_unquote" + JSONArray = "json_array" + JSONObject = "json_object" + JSONMerge = "json_merge" + JSONSet = "json_set" + JSONSumCrc32 = "json_sum_crc32" + JSONInsert = "json_insert" + JSONReplace = "json_replace" + JSONRemove = "json_remove" + JSONOverlaps = "json_overlaps" + JSONContains = "json_contains" + JSONMemberOf = "json_memberof" + JSONContainsPath = "json_contains_path" + JSONValid = "json_valid" + JSONArrayAppend = "json_array_append" + JSONArrayInsert = "json_array_insert" + JSONMergePatch = "json_merge_patch" + JSONMergePreserve = "json_merge_preserve" + JSONPretty = "json_pretty" + JSONQuote = "json_quote" + JSONSchemaValid = "json_schema_valid" + JSONSearch = "json_search" + JSONStorageFree = "json_storage_free" + JSONStorageSize = "json_storage_size" + JSONDepth = "json_depth" + JSONKeys = "json_keys" + JSONLength = "json_length" +) + +type FuncCallExprType int8 + +const ( + FuncCallExprTypeKeyword FuncCallExprType = iota + FuncCallExprTypeGeneric +) + +// FuncCallExpr is for function expression. +type FuncCallExpr struct { + funcNode + Tp FuncCallExprType + Schema CIStr + // FnName is the function name. + FnName CIStr + // Args is the function args. + Args []ExprNode +} + +// Restore implements Node interface. +func (n *FuncCallExpr) Restore(ctx *format.RestoreCtx) error { + done, err := n.customRestore(ctx) + if done { + return err + } + + if len(n.Schema.String()) != 0 { + ctx.WriteName(n.Schema.O) + ctx.WritePlain(".") + } + if n.Tp == FuncCallExprTypeGeneric { + ctx.WriteName(n.FnName.O) + } else { + ctx.WriteKeyWord(n.FnName.O) + } + + ctx.WritePlain("(") + switch n.FnName.L { + case "convert": + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCastExpr.Expr: %w", err) + } + ctx.WriteKeyWord(" USING ") + if err := n.Args[1].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCastExpr.Expr: %w", err) + } + case "adddate", "subdate", "date_add", "date_sub": + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[0]: %w", err) + } + ctx.WritePlain(", ") + ctx.WriteKeyWord("INTERVAL ") + if err := n.Args[1].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[1]: %w", err) + } + ctx.WritePlain(" ") + if err := n.Args[2].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[2]: %w", err) + } + case "extract": + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[0]: %w", err) + } + ctx.WriteKeyWord(" FROM ") + if err := n.Args[1].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[1]: %w", err) + } + case "position": + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr: %w", err) + } + ctx.WriteKeyWord(" IN ") + if err := n.Args[1].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr: %w", err) + } + case "trim": + switch len(n.Args) { + case 3: + if err := n.Args[2].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[2]: %w", err) + } + ctx.WritePlain(" ") + fallthrough + case 2: + if expr, isValue := n.Args[1].(*ValueExpr); !isValue || expr.GetValue() != nil { + if err := n.Args[1].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[1]: %w", err) + } + ctx.WritePlain(" ") + } + ctx.WriteKeyWord("FROM ") + fallthrough + case 1: + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args[0]: %w", err) + } + } + case WeightString: + if err := n.Args[0].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.(WEIGHT_STRING).Args[0]: %w", err) + } + if len(n.Args) == 3 { + ctx.WriteKeyWord(" AS ") + ctx.WriteKeyWord(n.Args[1].(*ValueExpr).GetValue().(string)) + ctx.WritePlain("(") + if err := n.Args[2].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.(WEIGHT_STRING).Args[2]: %w", err) + } + ctx.WritePlain(")") + } + default: + for i, argv := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } + if err := argv.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCallExpr.Args %d: %w", i, err) + } + } + } + ctx.WritePlain(")") + return nil +} + +func (n *FuncCallExpr) customRestore(ctx *format.RestoreCtx) (bool, error) { + var specialLiteral string + switch n.FnName.L { + case DateLiteral: + specialLiteral = "DATE " + case TimeLiteral: + specialLiteral = "TIME " + case TimestampLiteral: + specialLiteral = "TIMESTAMP " + } + if specialLiteral != "" { + ctx.WritePlain(specialLiteral) + if err := n.Args[0].Restore(ctx); err != nil { + return true, fmt.Errorf("an error occurred while restore FuncCallExpr.Expr: %w", err) + } + return true, nil + } + if n.FnName.L == JSONMemberOf { + if len(n.Args) == 2 { + if err := restoreExprWithBinaryOpParent(ctx, n.Args[0], restoreOpMemberOf, binaryOpLeftSide); err != nil { + return true, fmt.Errorf("an error occurred while restore FuncCallExpr.(MEMBER OF).Args[0]: %w", err) + } + ctx.WriteKeyWord(" MEMBER OF ") + ctx.WritePlain("(") + if err := restoreExprWithBinaryOpParent(ctx, n.Args[1], restoreOpMemberOf, binaryOpRightSide); err != nil { + return true, fmt.Errorf("an error occurred while restore FuncCallExpr.(MEMBER OF).Args[1]: %w", err) + } + ctx.WritePlain(")") + return true, nil + } + return true, (fmt.Errorf("incorrect parameter count in the call to native function 'json_memberof'")) + } + return false, nil +} + +// Accept implements Node interface. +func (n *FuncCallExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCallExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// CastFunctionType is the type for cast function. +type CastFunctionType int + +// CastFunction types +const ( + CastFunction CastFunctionType = iota + 1 + CastConvertFunction + CastBinaryOperator +) + +// JSONSumCrc32Expr is the function to calculate sum of crc32 values for array in json +// It's modified from CastFunction to support processing JSON Array. +type JSONSumCrc32Expr struct { + funcNode + // Expr is the expression to be converted. + Expr ExprNode + // Tp is the conversion type. + Tp *types.FieldType + // ExplicitCharSet is true when charset is explicit indicated. + ExplicitCharSet bool +} + +// Restore implements Node interface. +func (n *JSONSumCrc32Expr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("JSON_SUM_CRC32") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore JSONSumCrc32Expr.Expr: %w", err) + } + ctx.WriteKeyWord(" AS ") + n.Tp.RestoreAsCastType(ctx, n.ExplicitCharSet) + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *JSONSumCrc32Expr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*JSONSumCrc32Expr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// FuncCastExpr is the cast function converting value to another type, e.g, cast(expr AS signed). +// See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html +type FuncCastExpr struct { + funcNode + // Expr is the expression to be converted. + Expr ExprNode + // Tp is the conversion type. + Tp *types.FieldType + // FunctionType is either Cast, Convert or Binary. + FunctionType CastFunctionType + // ExplicitCharSet is true when charset is explicit indicated. + ExplicitCharSet bool +} + +// Restore implements Node interface. +func (n *FuncCastExpr) Restore(ctx *format.RestoreCtx) error { + switch n.FunctionType { + case CastFunction: + ctx.WriteKeyWord("CAST") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCastExpr.Expr: %w", err) + } + ctx.WriteKeyWord(" AS ") + n.Tp.RestoreAsCastType(ctx, n.ExplicitCharSet) + ctx.WritePlain(")") + case CastConvertFunction: + ctx.WriteKeyWord("CONVERT") + ctx.WritePlain("(") + if err := n.Expr.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FuncCastExpr.Expr: %w", err) + } + ctx.WritePlain(", ") + n.Tp.RestoreAsCastType(ctx, n.ExplicitCharSet) + ctx.WritePlain(")") + case CastBinaryOperator: + ctx.WriteKeyWord("BINARY ") + if err := restoreExprWithUnaryOpParent(ctx, n.Expr); err != nil { + return fmt.Errorf("an error occurred while restore FuncCastExpr.Expr: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FuncCastExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FuncCastExpr) + node, ok := n.Expr.Accept(v) + if !ok { + return n, false + } + n.Expr = node.(ExprNode) + return v.Leave(n) +} + +// TrimDirectionType is the type for trim direction. +type TrimDirectionType int + +const ( + // TrimBothDefault trims from both direction by default. + TrimBothDefault TrimDirectionType = iota + // TrimBoth trims from both direction with explicit notation. + TrimBoth + // TrimLeading trims from left. + TrimLeading + // TrimTrailing trims from right. + TrimTrailing +) + +// String implements fmt.Stringer interface. +func (direction TrimDirectionType) String() string { + switch direction { + case TrimBoth, TrimBothDefault: + return "BOTH" + case TrimLeading: + return "LEADING" + case TrimTrailing: + return "TRAILING" + default: + return "" + } +} + +// TrimDirectionExpr is an expression representing the trim direction used in the TRIM() function. +type TrimDirectionExpr struct { + exprNode + // Direction is the trim direction + Direction TrimDirectionType +} + +// Restore implements Node interface. +func (n *TrimDirectionExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.Direction.String()) + return nil +} + +// Accept implements Node Accept interface. +func (n *TrimDirectionExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// DateArithType is type for DateArith type. +type DateArithType byte + +const ( + // DateArithAdd is to run adddate or date_add function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_adddate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add + DateArithAdd DateArithType = iota + 1 + // DateArithSub is to run subdate or date_sub function option. + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_subdate + // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-sub + DateArithSub +) + +const ( + // AggFuncCount is the name of Count function. + AggFuncCount = "count" + // AggFuncSum is the name of Sum function. + AggFuncSum = "sum" + // AggFuncAvg is the name of Avg function. + AggFuncAvg = "avg" + // AggFuncFirstRow is the name of FirstRowColumn function. + AggFuncFirstRow = "firstrow" + // AggFuncMax is the name of max function. + AggFuncMax = "max" + // AggFuncMin is the name of min function. + AggFuncMin = "min" + // AggFuncGroupConcat is the name of group_concat function. + AggFuncGroupConcat = "group_concat" + // AggFuncBitOr is the name of bit_or function. + AggFuncBitOr = "bit_or" + // AggFuncBitXor is the name of bit_xor function. + AggFuncBitXor = "bit_xor" + // AggFuncBitAnd is the name of bit_and function. + AggFuncBitAnd = "bit_and" + // AggFuncVarPop is the name of var_pop function + AggFuncVarPop = "var_pop" + // AggFuncVarSamp is the name of var_samp function + AggFuncVarSamp = "var_samp" + // AggFuncStddevPop is the name of stddev_pop/std/stddev function + AggFuncStddevPop = "stddev_pop" + // AggFuncStddevSamp is the name of stddev_samp function + AggFuncStddevSamp = "stddev_samp" + // AggFuncJsonArrayagg is the name of json_arrayagg function + AggFuncJsonArrayagg = "json_arrayagg" + // AggFuncJsonObjectAgg is the name of json_objectagg function + AggFuncJsonObjectAgg = "json_objectagg" + // AggFuncApproxCountDistinct is the name of approx_count_distinct function. + AggFuncApproxCountDistinct = "approx_count_distinct" + // AggFuncApproxPercentile is the name of approx_percentile function. + AggFuncApproxPercentile = "approx_percentile" +) + +// AggregateFuncExpr represents aggregate function expression. +type AggregateFuncExpr struct { + funcNode + // F is the function name. + F string + // Args is the function args. + Args []ExprNode + // Distinct is true, function hence only aggregate distinct values. + // For example, column c1 values are "1", "2", "2", "sum(c1)" is "5", + // but "sum(distinct c1)" is "3". + Distinct bool + // Order is only used in GROUP_CONCAT + Order *OrderByClause +} + +// Restore implements Node interface. +func (n *AggregateFuncExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.F) + ctx.WritePlain("(") + if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } + switch strings.ToLower(n.F) { + case "group_concat": + for i := range len(n.Args) - 1 { + if i != 0 { + ctx.WritePlain(", ") + } + if err := n.Args[i].Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AggregateFuncExpr.Args[%d]: %w", i, err) + } + } + if n.Order != nil { + ctx.WritePlain(" ") + if err := n.Order.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AggregateFuncExpr.Args Order: %w", err) + } + } + ctx.WriteKeyWord(" SEPARATOR ") + // The grammar only accepts `SEPARATOR stringLit` without a charset + // introducer, so restore the separator literal without one even though + // it carries the connection charset/collation. + separatorCtx := *ctx + separatorCtx.Flags |= format.RestoreStringWithoutCharset + if err := n.Args[len(n.Args)-1].Restore(&separatorCtx); err != nil { + return fmt.Errorf("an error occurred while restore AggregateFuncExpr.Args SEPARATOR: %w", err) + } + default: + for i, argv := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } + if err := argv.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AggregateFuncExpr.Args[%d]: %w", i, err) + } + } + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *AggregateFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AggregateFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + if n.Order != nil { + node, ok := n.Order.Accept(v) + if !ok { + return n, false + } + n.Order = node.(*OrderByClause) + } + return v.Leave(n) +} + +const ( + // WindowFuncRowNumber is the name of row_number function. + WindowFuncRowNumber = "row_number" + // WindowFuncRank is the name of rank function. + WindowFuncRank = "rank" + // WindowFuncDenseRank is the name of dense_rank function. + WindowFuncDenseRank = "dense_rank" + // WindowFuncCumeDist is the name of cume_dist function. + WindowFuncCumeDist = "cume_dist" + // WindowFuncPercentRank is the name of percent_rank function. + WindowFuncPercentRank = "percent_rank" + // WindowFuncNtile is the name of ntile function. + WindowFuncNtile = "ntile" + // WindowFuncLead is the name of lead function. + WindowFuncLead = "lead" + // WindowFuncLag is the name of lag function. + WindowFuncLag = "lag" + // WindowFuncFirstValue is the name of first_value function. + WindowFuncFirstValue = "first_value" + // WindowFuncLastValue is the name of last_value function. + WindowFuncLastValue = "last_value" + // WindowFuncNthValue is the name of nth_value function. + WindowFuncNthValue = "nth_value" +) + +// WindowFuncExpr represents window function expression. +type WindowFuncExpr struct { + funcNode + + // Name is the function name. + Name string + // Args is the function args. + Args []ExprNode + // Distinct cannot be true for most window functions, except `max` and `min`. + // We need to raise error if it is not allowed to be true. + Distinct bool + // IgnoreNull indicates how to handle null value. + // MySQL only supports `RESPECT NULLS`, so we need to raise error if it is true. + IgnoreNull bool + // FromLast indicates the calculation direction of this window function. + // MySQL only supports calculation from first, so we need to raise error if it is true. + FromLast bool + // Spec is the specification of this window. + Spec WindowSpec +} + +// Restore implements Node interface. +func (n *WindowFuncExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.Name) + ctx.WritePlain("(") + for i, v := range n.Args { + if i != 0 { + ctx.WritePlain(", ") + } else if n.Distinct { + ctx.WriteKeyWord("DISTINCT ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WindowFuncExpr.Args[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + if n.FromLast { + ctx.WriteKeyWord(" FROM LAST") + } + if n.IgnoreNull { + ctx.WriteKeyWord(" IGNORE NULLS") + } + ctx.WriteKeyWord(" OVER ") + if err := n.Spec.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore WindowFuncExpr.Spec: %w", err) + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *WindowFuncExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*WindowFuncExpr) + for i, val := range n.Args { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Args[i] = node.(ExprNode) + } + node, ok := n.Spec.Accept(v) + if !ok { + return n, false + } + n.Spec = *node.(*WindowSpec) + return v.Leave(n) +} + +// TimeUnitType is the type for time and timestamp units. +type TimeUnitType int + +const ( + // TimeUnitInvalid is a placeholder for an invalid time or timestamp unit + TimeUnitInvalid TimeUnitType = iota + // TimeUnitMicrosecond is the time or timestamp unit MICROSECOND. + TimeUnitMicrosecond + // TimeUnitSecond is the time or timestamp unit SECOND. + TimeUnitSecond + // TimeUnitMinute is the time or timestamp unit MINUTE. + TimeUnitMinute + // TimeUnitHour is the time or timestamp unit HOUR. + TimeUnitHour + // TimeUnitDay is the time or timestamp unit DAY. + TimeUnitDay + // TimeUnitWeek is the time or timestamp unit WEEK. + TimeUnitWeek + // TimeUnitMonth is the time or timestamp unit MONTH. + TimeUnitMonth + // TimeUnitQuarter is the time or timestamp unit QUARTER. + TimeUnitQuarter + // TimeUnitYear is the time or timestamp unit YEAR. + TimeUnitYear + // TimeUnitSecondMicrosecond is the time unit SECOND_MICROSECOND. + TimeUnitSecondMicrosecond + // TimeUnitMinuteMicrosecond is the time unit MINUTE_MICROSECOND. + TimeUnitMinuteMicrosecond + // TimeUnitMinuteSecond is the time unit MINUTE_SECOND. + TimeUnitMinuteSecond + // TimeUnitHourMicrosecond is the time unit HOUR_MICROSECOND. + TimeUnitHourMicrosecond + // TimeUnitHourSecond is the time unit HOUR_SECOND. + TimeUnitHourSecond + // TimeUnitHourMinute is the time unit HOUR_MINUTE. + TimeUnitHourMinute + // TimeUnitDayMicrosecond is the time unit DAY_MICROSECOND. + TimeUnitDayMicrosecond + // TimeUnitDaySecond is the time unit DAY_SECOND. + TimeUnitDaySecond + // TimeUnitDayMinute is the time unit DAY_MINUTE. + TimeUnitDayMinute + // TimeUnitDayHour is the time unit DAY_HOUR. + TimeUnitDayHour + // TimeUnitYearMonth is the time unit YEAR_MONTH. + TimeUnitYearMonth +) + +// String implements fmt.Stringer interface. +func (unit TimeUnitType) String() string { + switch unit { //nolint:exhaustive + case TimeUnitMicrosecond: + return "MICROSECOND" + case TimeUnitSecond: + return "SECOND" + case TimeUnitMinute: + return "MINUTE" + case TimeUnitHour: + return "HOUR" + case TimeUnitDay: + return "DAY" + case TimeUnitWeek: + return "WEEK" + case TimeUnitMonth: + return "MONTH" + case TimeUnitQuarter: + return "QUARTER" + case TimeUnitYear: + return "YEAR" + case TimeUnitSecondMicrosecond: + return "SECOND_MICROSECOND" + case TimeUnitMinuteMicrosecond: + return "MINUTE_MICROSECOND" + case TimeUnitMinuteSecond: + return "MINUTE_SECOND" + case TimeUnitHourMicrosecond: + return "HOUR_MICROSECOND" + case TimeUnitHourSecond: + return "HOUR_SECOND" + case TimeUnitHourMinute: + return "HOUR_MINUTE" + case TimeUnitDayMicrosecond: + return "DAY_MICROSECOND" + case TimeUnitDaySecond: + return "DAY_SECOND" + case TimeUnitDayMinute: + return "DAY_MINUTE" + case TimeUnitDayHour: + return "DAY_HOUR" + case TimeUnitYearMonth: + return "YEAR_MONTH" + default: + return "" + } +} + +// Duration represented by this unit. +// Returns error if the time unit is not a fixed time interval (such as MONTH) +// or a composite unit (such as MINUTE_SECOND). +func (unit TimeUnitType) Duration() (time.Duration, error) { + switch unit { //nolint:exhaustive + case TimeUnitMicrosecond: + return time.Microsecond, nil + case TimeUnitSecond: + return time.Second, nil + case TimeUnitMinute: + return time.Minute, nil + case TimeUnitHour: + return time.Hour, nil + case TimeUnitDay: + return time.Hour * 24, nil + case TimeUnitWeek: + return time.Hour * 24 * 7, nil + case TimeUnitMonth, TimeUnitQuarter, TimeUnitYear: + return 0, fmt.Errorf("%s is not a constant time interval and cannot be used here", unit) + default: + return 0, fmt.Errorf("%s is a composite time unit and is not supported yet", unit) + } +} + +// TimeUnitExpr is an expression representing a time or timestamp unit. +type TimeUnitExpr struct { + exprNode + // Unit is the time or timestamp unit. + Unit TimeUnitType +} + +// Restore implements Node interface. +func (n *TimeUnitExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.Unit.String()) + return nil +} + +// Accept implements Node Accept interface. +func (n *TimeUnitExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} + +// GetFormatSelectorType is the type for the first argument of GET_FORMAT() function. +type GetFormatSelectorType int + +const ( + // GetFormatSelectorDate is the GET_FORMAT selector DATE. + GetFormatSelectorDate GetFormatSelectorType = iota + 1 + // GetFormatSelectorTime is the GET_FORMAT selector TIME. + GetFormatSelectorTime + // GetFormatSelectorDatetime is the GET_FORMAT selector DATETIME and TIMESTAMP. + GetFormatSelectorDatetime +) + +// GetFormatSelectorExpr is an expression used as the first argument of GET_FORMAT() function. +type GetFormatSelectorExpr struct { + exprNode + // Selector is the GET_FORMAT() selector. + Selector GetFormatSelectorType +} + +// String implements fmt.Stringer interface. +func (selector GetFormatSelectorType) String() string { + switch selector { + case GetFormatSelectorDate: + return "DATE" + case GetFormatSelectorTime: + return "TIME" + case GetFormatSelectorDatetime: + return "DATETIME" + default: + return "" + } +} + +// Restore implements Node interface. +func (n *GetFormatSelectorExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.Selector.String()) + return nil +} + +// Accept implements Node Accept interface. +func (n *GetFormatSelectorExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + return v.Leave(n) +} diff --git a/pkg/parser/ast/functions_test.go b/pkg/parser/ast/functions_test.go new file mode 100644 index 000000000..f540d98fe --- /dev/null +++ b/pkg/parser/ast/functions_test.go @@ -0,0 +1,187 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + . "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/stretchr/testify/require" +) + +func TestFunctionsVisitorCover(t *testing.T) { + valueExpr := NewValueExpr(42, mysql.DefaultCharset, mysql.DefaultCollationName) + stmts := []Node{ + &AggregateFuncExpr{Args: []ExprNode{valueExpr}}, + &FuncCallExpr{Args: []ExprNode{valueExpr}}, + &FuncCastExpr{Expr: valueExpr}, + &WindowFuncExpr{Spec: WindowSpec{}}, + } + + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func TestAggregateFuncExprRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"AVG(test_score)", "AVG(`test_score`)"}, + {"AVG(distinct test_score)", "AVG(DISTINCT `test_score`)"}, + {"BIT_AND(test_score)", "BIT_AND(`test_score`)"}, + {"BIT_OR(test_score)", "BIT_OR(`test_score`)"}, + {"BIT_XOR(test_score)", "BIT_XOR(`test_score`)"}, + {"COUNT(test_score)", "COUNT(`test_score`)"}, + {"COUNT(*)", "COUNT(1)"}, + {"COUNT(DISTINCT scores, results)", "COUNT(DISTINCT `scores`, `results`)"}, + {"MIN(test_score)", "MIN(`test_score`)"}, + {"MIN(DISTINCT test_score)", "MIN(DISTINCT `test_score`)"}, + {"MAX(test_score)", "MAX(`test_score`)"}, + {"MAX(DISTINCT test_score)", "MAX(DISTINCT `test_score`)"}, + {"STD(test_score)", "STDDEV_POP(`test_score`)"}, + {"STDDEV(test_score)", "STDDEV_POP(`test_score`)"}, + {"STDDEV_POP(test_score)", "STDDEV_POP(`test_score`)"}, + {"STDDEV_SAMP(test_score)", "STDDEV_SAMP(`test_score`)"}, + {"SUM(test_score)", "SUM(`test_score`)"}, + {"SUM(DISTINCT test_score)", "SUM(DISTINCT `test_score`)"}, + {"VAR_POP(test_score)", "VAR_POP(`test_score`)"}, + {"VAR_SAMP(test_score)", "VAR_SAMP(`test_score`)"}, + {"VARIANCE(test_score)", "VAR_POP(`test_score`)"}, + {"JSON_OBJECTAGG(test_score, results)", "JSON_OBJECTAGG(`test_score`, `results`)"}, + {"GROUP_CONCAT(a)", "GROUP_CONCAT(`a` SEPARATOR ',')"}, + {"GROUP_CONCAT(a separator '--')", "GROUP_CONCAT(`a` SEPARATOR '--')"}, + {"GROUP_CONCAT(a order by b desc, c)", "GROUP_CONCAT(`a` ORDER BY `b` DESC,`c` SEPARATOR ',')"}, + {"GROUP_CONCAT(a order by b desc, c separator '--')", "GROUP_CONCAT(`a` ORDER BY `b` DESC,`c` SEPARATOR '--')"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*SelectStmt).Fields.Fields[0].Expr + } + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) +} + +func TestConvert(t *testing.T) { + // Test case for CONVERT(expr USING transcoding_name). + cases := []struct { + SQL string + CharsetName string + ErrorMessage string + }{ + {`SELECT CONVERT("abc" USING "latin1")`, "latin1", ""}, + {`SELECT CONVERT("abc" USING laTiN1)`, "latin1", ""}, + {`SELECT CONVERT("abc" USING "binary")`, "binary", ""}, + {`SELECT CONVERT("abc" USING biNaRy)`, "binary", ""}, + {`SELECT CONVERT(a USING a)`, "", `[parser:1115]Unknown character set: 'a'`}, // TiDB issue #4436. + {`SELECT CONVERT("abc" USING CONCAT("utf", "8"))`, "", `[parser:1115]Unknown character set: 'CONCAT'`}, + } + for _, testCase := range cases { + stmt, err := parser.New().ParseOneStmt(testCase.SQL, "", "") + if testCase.ErrorMessage != "" { + require.EqualError(t, err, testCase.ErrorMessage) + continue + } + require.NoError(t, err) + + st := stmt.(*SelectStmt) + expr := st.Fields.Fields[0].Expr.(*FuncCallExpr) + charsetArg := expr.Args[1].(*ValueExpr) + require.Equal(t, testCase.CharsetName, charsetArg.GetString()) + } +} + +func TestChar(t *testing.T) { + // Test case for CHAR(N USING charset_name) + cases := []struct { + SQL string + CharsetName string + ErrorMessage string + }{ + {`SELECT CHAR("abc" USING "latin1")`, "latin1", ""}, + {`SELECT CHAR("abc" USING laTiN1)`, "latin1", ""}, + {`SELECT CHAR("abc" USING "binary")`, "binary", ""}, + {`SELECT CHAR("abc" USING binary)`, "binary", ""}, + {`SELECT CHAR(a USING a)`, "", `[parser:1115]Unknown character set: 'a'`}, + {`SELECT CHAR("abc" USING CONCAT("utf", "8"))`, "", `[parser:1115]Unknown character set: 'CONCAT'`}, + } + for _, testCase := range cases { + stmt, err := parser.New().ParseOneStmt(testCase.SQL, "", "") + if testCase.ErrorMessage != "" { + require.EqualError(t, err, testCase.ErrorMessage) + continue + } + require.NoError(t, err) + + st := stmt.(*SelectStmt) + expr := st.Fields.Fields[0].Expr.(*FuncCallExpr) + charsetArg := expr.Args[1].(*ValueExpr) + require.Equal(t, testCase.CharsetName, charsetArg.GetString()) + } +} + +func TestWindowFuncExprRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"RANK() OVER w", "RANK() OVER `w`"}, + {"RANK() OVER (PARTITION BY a)", "RANK() OVER (PARTITION BY `a`)"}, + {"MAX(DISTINCT a) OVER (PARTITION BY a)", "MAX(DISTINCT `a`) OVER (PARTITION BY `a`)"}, + {"MAX(DISTINCTROW a) OVER (PARTITION BY a)", "MAX(DISTINCT `a`) OVER (PARTITION BY `a`)"}, + {"MAX(DISTINCT ALL a) OVER (PARTITION BY a)", "MAX(DISTINCT `a`) OVER (PARTITION BY `a`)"}, + {"MAX(ALL a) OVER (PARTITION BY a)", "MAX(`a`) OVER (PARTITION BY `a`)"}, + {"FIRST_VALUE(val) IGNORE NULLS OVER (w)", "FIRST_VALUE(`val`) IGNORE NULLS OVER (`w`)"}, + {"FIRST_VALUE(val) RESPECT NULLS OVER w", "FIRST_VALUE(`val`) OVER `w`"}, + {"NTH_VALUE(val, 233) FROM LAST IGNORE NULLS OVER w", "NTH_VALUE(`val`, 233) FROM LAST IGNORE NULLS OVER `w`"}, + {"NTH_VALUE(val, 233) FROM FIRST IGNORE NULLS OVER (w)", "NTH_VALUE(`val`, 233) IGNORE NULLS OVER (`w`)"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*SelectStmt).Fields.Fields[0].Expr + } + runNodeRestoreTest(t, testCases, "select %s from t", extractNodeFunc) +} + +func TestGenericFuncRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"s.a()", "`s`.`a`()"}, + {"`s`.`a`()", "`s`.`a`()"}, + {"now()", "NOW()"}, + {"`s`.`now`()", "`s`.`now`()"}, + // FIXME: expectSQL should be `generic_func()`. + {"generic_func()", "GENERIC_FUNC()"}, + {"`ident.1`.`ident.2`()", "`ident.1`.`ident.2`()"}, + } + extractNodeFunc := func(node Node) Node { + return node.(*SelectStmt).Fields.Fields[0].Expr + } + runNodeRestoreTest(t, testCases, "select %s from t", extractNodeFunc) +} + +func TestRestoreWithError(t *testing.T) { + testCases := []string{ + "json_memberof()", + } + + extractNodeFunc := func(node Node) Node { + return node.(*SelectStmt).Fields.Fields[0].Expr + } + + for _, c := range testCases { + sql := "select " + c + p := parser.New() + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + var sb strings.Builder + require.Error(t, extractNodeFunc(stmt).Restore(format.NewRestoreCtx(format.DefaultRestoreFlags, &sb))) + } +} diff --git a/pkg/parser/ast/misc.go b/pkg/parser/ast/misc.go new file mode 100644 index 000000000..c3fa2fa1e --- /dev/null +++ b/pkg/parser/ast/misc.go @@ -0,0 +1,2247 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" +) + +var ( + _ StmtNode = &AlterUserStmt{} + _ StmtNode = &BeginStmt{} + _ StmtNode = &BinlogStmt{} + _ StmtNode = &CommitStmt{} + _ StmtNode = &CreateUserStmt{} + _ StmtNode = &DeallocateStmt{} + _ StmtNode = &DoStmt{} + _ StmtNode = &ExecuteStmt{} + _ StmtNode = &ExplainStmt{} + _ StmtNode = &GrantStmt{} + _ StmtNode = &PrepareStmt{} + _ StmtNode = &RollbackStmt{} + _ StmtNode = &SetPwdStmt{} + _ StmtNode = &SetRoleStmt{} + _ StmtNode = &SetDefaultRoleStmt{} + _ StmtNode = &SetStmt{} + _ StmtNode = &UseStmt{} + _ StmtNode = &FlushStmt{} + _ StmtNode = &KillStmt{} + _ StmtNode = &ShutdownStmt{} + _ StmtNode = &RestartStmt{} + _ StmtNode = &RenameUserStmt{} + + _ Node = &PrivElem{} + _ Node = &VariableAssignment{} +) + +// Isolation level constants. +const ( + ReadCommitted = "READ-COMMITTED" + ReadUncommitted = "READ-UNCOMMITTED" + Serializable = "SERIALIZABLE" + RepeatableRead = "REPEATABLE-READ" +) + +// TypeOpt is used for parsing data type option from SQL. +type TypeOpt struct { + IsUnsigned bool + IsZerofill bool +} + +// FloatOpt is used for parsing floating-point type option from SQL. +// See http://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html +type FloatOpt struct { + Flen int + Decimal int +} + +// AuthOption is used for parsing create use statement. +type AuthOption struct { + // ByAuthString set as true, if AuthString is used for authorization. Otherwise, authorization is done by HashString. + ByAuthString bool + AuthString string + ByHashString bool + HashString string + AuthPlugin string +} + +// Restore implements Node interface. +func (n *AuthOption) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("IDENTIFIED") + if n.AuthPlugin != "" { + ctx.WriteKeyWord(" WITH ") + ctx.WriteString(n.AuthPlugin) + } + if n.ByAuthString { + ctx.WriteKeyWord(" BY ") + ctx.WriteString(n.AuthString) + } else if n.ByHashString { + ctx.WriteKeyWord(" AS ") + ctx.WriteString(n.HashString) + } + return nil +} + +// ExplainForStmt is a statement to provite information about how is SQL statement executeing +// in connection #ConnectionID +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainForStmt struct { + stmtNode + + Format string + ConnectionID uint64 +} + +// Restore implements Node interface. +func (n *ExplainForStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("EXPLAIN ") + ctx.WriteKeyWord("FORMAT ") + ctx.WritePlain("= ") + ctx.WriteString(n.Format) + ctx.WritePlain(" ") + ctx.WriteKeyWord("FOR ") + ctx.WriteKeyWord("CONNECTION ") + ctx.WritePlain(strconv.FormatUint(n.ConnectionID, 10)) + return nil +} + +// Accept implements Node Accept interface. +func (n *ExplainForStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainForStmt) + return v.Leave(n) +} + +// ExplainStmt is a statement to provide information about how is SQL statement executed +// or get columns information in a table. +// See https://dev.mysql.com/doc/refman/5.7/en/explain.html +type ExplainStmt struct { + stmtNode + + Stmt StmtNode + Format string + Analyze bool + + // Explore indicates whether to use EXPLAIN EXPLORE. + Explore bool + // SQLDigest to explain, used in `EXPLAIN EXPLORE `. + SQLDigest string + // PlanDigest to explain, used in `EXPLAIN [ANALYZE] `. + PlanDigest string +} + +// Restore implements Node interface. +func (n *ExplainStmt) Restore(ctx *format.RestoreCtx) error { + if showStmt, ok := n.Stmt.(*ShowStmt); ok { + ctx.WriteKeyWord("DESC ") + if err := showStmt.Table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ExplainStmt.ShowStmt.Table: %w", err) + } + if showStmt.Column != nil { + ctx.WritePlain(" ") + if err := showStmt.Column.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ExplainStmt.ShowStmt.Column: %w", err) + } + } + return nil + } + ctx.WriteKeyWord("EXPLAIN ") + if n.Analyze { + ctx.WriteKeyWord("ANALYZE ") + } + if n.Explore { + ctx.WriteKeyWord("EXPLORE ") + if n.SQLDigest != "" { + ctx.WriteString(n.SQLDigest) + } + } else if !n.Analyze || strings.ToLower(n.Format) != "row" { + ctx.WriteKeyWord("FORMAT ") + ctx.WritePlain("= ") + ctx.WriteString(n.Format) + ctx.WritePlain(" ") + } + if n.PlanDigest != "" { + ctx.WriteString(n.PlanDigest) + } + if n.Stmt != nil { + if err := n.Stmt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ExplainStmt.Stmt: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ExplainStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExplainStmt) + if n.Stmt != nil { + node, ok := n.Stmt.Accept(v) + if !ok { + return n, false + } + n.Stmt = node.(StmtNode) + } + return v.Leave(n) +} + +// PrepareStmt is a statement to prepares a SQL statement which contains placeholders, +// and it is executed with ExecuteStmt and released with DeallocateStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/prepare.html +type PrepareStmt struct { + stmtNode + + Name string + SQLText string + SQLVar *VariableExpr +} + +// Restore implements Node interface. +func (n *PrepareStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("PREPARE ") + ctx.WriteName(n.Name) + ctx.WriteKeyWord(" FROM ") + if n.SQLText != "" { + ctx.WriteString(n.SQLText) + return nil + } + if n.SQLVar != nil { + if err := n.SQLVar.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PrepareStmt.SQLVar: %w", err) + } + return nil + } + return errors.New("an error occurred while restore PrepareStmt") +} + +// Accept implements Node Accept interface. +func (n *PrepareStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrepareStmt) + if n.SQLVar != nil { + node, ok := n.SQLVar.Accept(v) + if !ok { + return n, false + } + n.SQLVar = node.(*VariableExpr) + } + return v.Leave(n) +} + +// DeallocateStmt is a statement to release PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/deallocate-prepare.html +type DeallocateStmt struct { + stmtNode + + Name string +} + +// Restore implements Node interface. +func (n *DeallocateStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DEALLOCATE PREPARE ") + ctx.WriteName(n.Name) + return nil +} + +// Accept implements Node Accept interface. +func (n *DeallocateStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DeallocateStmt) + return v.Leave(n) +} + +// ExecuteStmt is a statement to execute PreparedStmt. +// See https://dev.mysql.com/doc/refman/5.7/en/execute.html +type ExecuteStmt struct { + stmtNode + + Name string + UsingVars []ExprNode + BinaryArgs any + PrepStmt any // the corresponding prepared statement + PrepStmtId uint32 + IdxInMulti int + + // FromGeneralStmt indicates whether this execute-stmt is converted from a general query. + // e.g. select * from t where a>2 --> execute 'select * from t where a>?' using 2 + FromGeneralStmt bool +} + +// Restore implements Node interface. +func (n *ExecuteStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("EXECUTE ") + ctx.WriteName(n.Name) + if len(n.UsingVars) > 0 { + ctx.WriteKeyWord(" USING ") + for i, val := range n.UsingVars { + if i != 0 { + ctx.WritePlain(",") + } + if err := val.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore ExecuteStmt.UsingVars index %d: %w", i, err) + } + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *ExecuteStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ExecuteStmt) + for i, val := range n.UsingVars { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.UsingVars[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// BeginStmt is a statement to start a new transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type BeginStmt struct { + stmtNode + ReadOnly bool +} + +// Restore implements Node interface. +func (n *BeginStmt) Restore(ctx *format.RestoreCtx) error { + if n.ReadOnly { + ctx.WriteKeyWord("START TRANSACTION READ ONLY") + } else { + ctx.WriteKeyWord("START TRANSACTION") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *BeginStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + + n = newNode.(*BeginStmt) + return v.Leave(n) +} + +// BinlogStmt is an internal-use statement. +// We just parse and ignore it. +// See http://dev.mysql.com/doc/refman/5.7/en/binlog.html +type BinlogStmt struct { + stmtNode + Str string +} + +// Restore implements Node interface. +func (n *BinlogStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("BINLOG ") + ctx.WriteString(n.Str) + return nil +} + +// Accept implements Node Accept interface. +func (n *BinlogStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*BinlogStmt) + return v.Leave(n) +} + +// CompletionType defines completion_type used in COMMIT and ROLLBACK statements +type CompletionType int8 + +const ( + // CompletionTypeDefault refers to NO_CHAIN + CompletionTypeDefault CompletionType = iota + CompletionTypeChain + CompletionTypeRelease +) + +func (n CompletionType) Restore(ctx *format.RestoreCtx) error { + switch n { + case CompletionTypeDefault: + case CompletionTypeChain: + ctx.WriteKeyWord(" AND CHAIN") + case CompletionTypeRelease: + ctx.WriteKeyWord(" RELEASE") + } + return nil +} + +// CommitStmt is a statement to commit the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type CommitStmt struct { + stmtNode + // CompletionType overwrites system variable `completion_type` within transaction + CompletionType CompletionType +} + +// Restore implements Node interface. +func (n *CommitStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("COMMIT") + if err := n.CompletionType.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CommitStmt.CompletionType: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *CommitStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CommitStmt) + return v.Leave(n) +} + +// RollbackStmt is a statement to roll back the current transaction. +// See https://dev.mysql.com/doc/refman/5.7/en/commit.html +type RollbackStmt struct { + stmtNode + // CompletionType overwrites system variable `completion_type` within transaction + CompletionType CompletionType + // SavepointName is the savepoint name. + SavepointName string +} + +// Restore implements Node interface. +func (n *RollbackStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ROLLBACK") + if n.SavepointName != "" { + ctx.WritePlain(" TO ") + ctx.WritePlain(n.SavepointName) + } + if err := n.CompletionType.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RollbackStmt.CompletionType: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RollbackStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RollbackStmt) + return v.Leave(n) +} + +// UseStmt is a statement to use the DBName database as the current database. +// See https://dev.mysql.com/doc/refman/5.7/en/use.html +type UseStmt struct { + stmtNode + + DBName string +} + +// Restore implements Node interface. +func (n *UseStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("USE ") + ctx.WriteName(n.DBName) + return nil +} + +// Accept implements Node Accept interface. +func (n *UseStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UseStmt) + return v.Leave(n) +} + +const ( + // SetNames is the const for set names stmt. + // If VariableAssignment.Name == Names, it should be set names stmt. + SetNames = "SetNAMES" + // SetCharset is the const for set charset stmt. + SetCharset = "SetCharset" +) + +// VariableAssignment is a variable assignment struct. +type VariableAssignment struct { + node + Name string + Value ExprNode + IsInstance bool + IsGlobal bool + IsSystem bool + + // ExtendValue is a way to store extended info. + // VariableAssignment should be able to store information for SetCharset/SetPWD Stmt. + // For SetCharsetStmt, Value is charset, ExtendValue is collation. + // TODO: Use SetStmt to implement set password statement. + ExtendValue *ValueExpr +} + +// Restore implements Node interface. +func (n *VariableAssignment) Restore(ctx *format.RestoreCtx) error { + if n.IsSystem { + ctx.WritePlain("@@") + switch { + case n.IsGlobal: + ctx.WriteKeyWord("GLOBAL") + case n.IsInstance: + ctx.WriteKeyWord("INSTANCE") + default: + ctx.WriteKeyWord("SESSION") + } + ctx.WritePlain(".") + } else if n.Name != SetNames && n.Name != SetCharset { + ctx.WriteKeyWord("@") + } + switch n.Name { + case SetNames: + ctx.WriteKeyWord("NAMES ") + case SetCharset: + ctx.WriteKeyWord("CHARSET ") + default: + ctx.WriteName(n.Name) + ctx.WritePlain("=") + } + if err := n.Value.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore VariableAssignment.Value: %w", err) + } + if n.ExtendValue != nil { + ctx.WriteKeyWord(" COLLATE ") + if err := n.ExtendValue.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore VariableAssignment.ExtendValue: %w", err) + } + } + return nil +} + +// Accept implements Node interface. +func (n *VariableAssignment) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*VariableAssignment) + node, ok := n.Value.Accept(v) + if !ok { + return n, false + } + n.Value = node.(ExprNode) + return v.Leave(n) +} + +// FlushStmtType is the type for FLUSH statement. +type FlushStmtType int + +// Flush statement types. +const ( + FlushNone FlushStmtType = iota + FlushTables + FlushPrivileges + FlushStatus + FlushHosts + FlushLogs + FlushUserResources + FlushOptimizerCosts +) + +// LogType is the log type used in FLUSH statement. +type LogType int8 + +const ( + LogTypeDefault LogType = iota + LogTypeBinary + LogTypeEngine + LogTypeError + LogTypeGeneral + LogTypeSlow + LogTypeRelay +) + +// FlushStmt is a statement to flush tables/privileges/optimizer costs and so on. +type FlushStmt struct { + stmtNode + + Tp FlushStmtType // Privileges/Tables/... + NoWriteToBinLog bool + LogType LogType + Tables []*TableName // For FlushTableStmt, if Tables is empty, it means flush all tables. + ReadLock bool + ForExport bool + // Channel is the FOR CHANNEL of FLUSH RELAY LOGS. + Channel string +} + +// Restore implements Node interface. +func (n *FlushStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("FLUSH ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + switch n.Tp { //nolint:exhaustive + case FlushTables: + ctx.WriteKeyWord("TABLES") + for i, v := range n.Tables { + if i == 0 { + ctx.WritePlain(" ") + } else { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore FlushStmt.Tables[%d]: %w", i, err) + } + } + if n.ReadLock { + ctx.WriteKeyWord(" WITH READ LOCK") + } + if n.ForExport { + ctx.WriteKeyWord(" FOR EXPORT") + } + case FlushPrivileges: + ctx.WriteKeyWord("PRIVILEGES") + case FlushStatus: + ctx.WriteKeyWord("STATUS") + case FlushHosts: + ctx.WriteKeyWord("HOSTS") + case FlushUserResources: + ctx.WriteKeyWord("USER_RESOURCES") + case FlushOptimizerCosts: + ctx.WriteKeyWord("OPTIMIZER_COSTS") + case FlushLogs: + var logType string + switch n.LogType { + case LogTypeDefault: + logType = "LOGS" + case LogTypeBinary: + logType = "BINARY LOGS" + case LogTypeEngine: + logType = "ENGINE LOGS" + case LogTypeError: + logType = "ERROR LOGS" + case LogTypeGeneral: + logType = "GENERAL LOGS" + case LogTypeSlow: + logType = "SLOW LOGS" + case LogTypeRelay: + logType = "RELAY LOGS" + } + ctx.WriteKeyWord(logType) + if n.LogType == LogTypeRelay && n.Channel != "" { + ctx.WriteKeyWord(" FOR CHANNEL ") + ctx.WriteString(n.Channel) + } + default: + return errors.New("unsupported type of FlushStmt") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *FlushStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*FlushStmt) + for i, t := range n.Tables { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.Tables[i] = node.(*TableName) + } + return v.Leave(n) +} + +// KillStmt is a statement to kill a query or connection. +type KillStmt struct { + stmtNode + + // Query indicates whether terminate a single query on this connection or the whole connection. + // If Query is true, terminates the statement the connection is currently executing, but leaves the connection itself intact. + // If Query is false, terminates the connection associated with the given ConnectionID, after terminating any statement the connection is executing. + Query bool + ConnectionID uint64 + + Expr ExprNode +} + +// Restore implements Node interface. +func (n *KillStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("KILL") + if n.Query { + ctx.WriteKeyWord(" QUERY") + } + if n.Expr != nil { + ctx.WriteKeyWord(" ") + if err := n.Expr.Restore(ctx); err != nil { + return err + } + } else { + ctx.WritePlainf(" %d", n.ConnectionID) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *KillStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*KillStmt) + return v.Leave(n) +} + +// SavepointStmt is the statement of SAVEPOINT. +type SavepointStmt struct { + stmtNode + // Name is the savepoint name. + Name string +} + +// Restore implements Node interface. +func (n *SavepointStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SAVEPOINT ") + ctx.WritePlain(n.Name) + return nil +} + +// Accept implements Node Accept interface. +func (n *SavepointStmt) Accept(v Visitor) (Node, bool) { + newNode, _ := v.Enter(n) + n = newNode.(*SavepointStmt) + return v.Leave(n) +} + +// ReleaseSavepointStmt is the statement of RELEASE SAVEPOINT. +type ReleaseSavepointStmt struct { + stmtNode + // Name is the savepoint name. + Name string +} + +// Restore implements Node interface. +func (n *ReleaseSavepointStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("RELEASE SAVEPOINT ") + ctx.WritePlain(n.Name) + return nil +} + +// Accept implements Node Accept interface. +func (n *ReleaseSavepointStmt) Accept(v Visitor) (Node, bool) { + newNode, _ := v.Enter(n) + n = newNode.(*ReleaseSavepointStmt) + return v.Leave(n) +} + +// SetStmt is the statement to set variables. +type SetStmt struct { + stmtNode + // Variables is the list of variable assignment. + Variables []*VariableAssignment +} + +// Restore implements Node interface. +func (n *SetStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SET ") + for i, v := range n.Variables { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetStmt.Variables[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetStmt) + for i, val := range n.Variables { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Variables[i] = node.(*VariableAssignment) + } + return v.Leave(n) +} + +// SetPwdStmt is a statement to assign a password to user account. +// See https://dev.mysql.com/doc/refman/5.7/en/set-password.html +type SetPwdStmt struct { + stmtNode + + User *auth.UserIdentity + Password string + RetainCurrentPassword bool +} + +// Restore implements Node interface. +func (n *SetPwdStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SET PASSWORD") + if n.User != nil { + ctx.WriteKeyWord(" FOR ") + if err := n.User.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore SetPwdStmt.User: %w", err) + } + } + ctx.WritePlain("=") + ctx.WriteString(n.Password) + if n.RetainCurrentPassword { + ctx.WriteKeyWord(" RETAIN CURRENT PASSWORD") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetPwdStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetPwdStmt) + return v.Leave(n) +} + +// SetRoleStmtType is the type for FLUSH statement. +type SetRoleStmtType int + +// SetRole statement types. +const ( + SetRoleDefault SetRoleStmtType = iota + SetRoleNone + SetRoleAll + SetRoleAllExcept + SetRoleRegular +) + +type SetRoleStmt struct { + stmtNode + + SetRoleOpt SetRoleStmtType + RoleList []*auth.RoleIdentity +} + +func (n *SetRoleStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SET ROLE") + switch n.SetRoleOpt { //nolint:exhaustive + case SetRoleDefault: + ctx.WriteKeyWord(" DEFAULT") + case SetRoleNone: + ctx.WriteKeyWord(" NONE") + case SetRoleAll: + ctx.WriteKeyWord(" ALL") + case SetRoleAllExcept: + ctx.WriteKeyWord(" ALL EXCEPT") + } + for i, role := range n.RoleList { + ctx.WritePlain(" ") + err := role.Restore(ctx) + if err != nil { + return fmt.Errorf("an error occurred while restore SetRoleStmt.RoleList: %w", err) + } + if i != len(n.RoleList)-1 { + ctx.WritePlain(",") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetRoleStmt) + return v.Leave(n) +} + +type SetDefaultRoleStmt struct { + stmtNode + + SetRoleOpt SetRoleStmtType + RoleList []*auth.RoleIdentity + UserList []*auth.UserIdentity +} + +func (n *SetDefaultRoleStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SET DEFAULT ROLE") + switch n.SetRoleOpt { //nolint:exhaustive + case SetRoleNone: + ctx.WriteKeyWord(" NONE") + case SetRoleAll: + ctx.WriteKeyWord(" ALL") + default: + } + for i, role := range n.RoleList { + ctx.WritePlain(" ") + err := role.Restore(ctx) + if err != nil { + return fmt.Errorf("an error occurred while restore SetDefaultRoleStmt.RoleList: %w", err) + } + if i != len(n.RoleList)-1 { + ctx.WritePlain(",") + } + } + ctx.WritePlain(" TO") + for i, user := range n.UserList { + ctx.WritePlain(" ") + err := user.Restore(ctx) + if err != nil { + return fmt.Errorf("an error occurred while restore SetDefaultRoleStmt.UserList: %w", err) + } + if i != len(n.UserList)-1 { + ctx.WritePlain(",") + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *SetDefaultRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*SetDefaultRoleStmt) + return v.Leave(n) +} + +// UserSpec is used for parsing create user statement. +type UserSpec struct { + User *auth.UserIdentity + AuthOpt *AuthOption + DualPasswordOption DualPasswordOptionType + IsRole bool +} + +// Restore implements Node interface. +func (n *UserSpec) Restore(ctx *format.RestoreCtx) error { + if err := n.User.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UserSpec.User: %w", err) + } + if n.AuthOpt != nil { + ctx.WritePlain(" ") + if err := n.AuthOpt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UserSpec.AuthOpt: %w", err) + } + } + if n.DualPasswordOption != 0 { + ctx.WritePlain(" ") + if err := n.DualPasswordOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UserSpec.DualPasswordOption: %w", err) + } + } + return nil +} + +// SecurityString formats the UserSpec without password information. The +// dual-password clause (RETAIN CURRENT PASSWORD / DISCARD OLD PASSWORD) is +// non-secret and is surfaced verbatim so the redacted output preserves the +// fact that the statement targets the secondary-password slot. +func (n *UserSpec) SecurityString() string { + withPassword := false + if opt := n.AuthOpt; opt != nil { + if len(opt.AuthString) > 0 || len(opt.HashString) > 0 { + withPassword = true + } + } + dualClause := "" + switch n.DualPasswordOption { + case DualPasswordRetainCurrent: + dualClause = " RETAIN CURRENT PASSWORD" + case DualPasswordDiscardOld: + dualClause = " DISCARD OLD PASSWORD" + } + if withPassword { + return fmt.Sprintf("{%s password = ***%s}", n.User, dualClause) + } + if dualClause != "" { + return fmt.Sprintf("{%s%s}", n.User, dualClause) + } + return n.User.String() +} + +// DualPasswordOptionType identifies the per-UserSpec MySQL 8.0 dual-password +// clause (RETAIN CURRENT PASSWORD or DISCARD OLD PASSWORD). The grammar +// attaches it to the UserSpec rather than to AlterUserStmt because MySQL +// allows different dual-password actions per spec inside a multi-user ALTER +// USER statement. The zero value means "no dual-password clause". +type DualPasswordOptionType int + +const ( + // DualPasswordRetainCurrent corresponds to RETAIN CURRENT PASSWORD. + DualPasswordRetainCurrent DualPasswordOptionType = iota + 1 + // DualPasswordDiscardOld corresponds to DISCARD OLD PASSWORD. + DualPasswordDiscardOld +) + +// Restore implements Node interface. +func (t DualPasswordOptionType) Restore(ctx *format.RestoreCtx) error { + switch t { + case DualPasswordRetainCurrent: + ctx.WriteKeyWord("RETAIN CURRENT PASSWORD") + case DualPasswordDiscardOld: + ctx.WriteKeyWord("DISCARD OLD PASSWORD") + default: + return fmt.Errorf("unsupported DualPasswordOptionType %d", t) + } + return nil +} + +type AuthTokenOrTLSOption struct { + Type AuthTokenOrTLSOptionType + Value string +} + +func (t *AuthTokenOrTLSOption) Restore(ctx *format.RestoreCtx) error { + switch t.Type { + case TlsNone: + ctx.WriteKeyWord("NONE") + case Ssl: + ctx.WriteKeyWord("SSL") + case X509: + ctx.WriteKeyWord("X509") + case Cipher: + ctx.WriteKeyWord("CIPHER ") + ctx.WriteString(t.Value) + case Issuer: + ctx.WriteKeyWord("ISSUER ") + ctx.WriteString(t.Value) + case Subject: + ctx.WriteKeyWord("SUBJECT ") + ctx.WriteString(t.Value) + case SAN: + ctx.WriteKeyWord("SAN ") + ctx.WriteString(t.Value) + case TokenIssuer: + ctx.WriteKeyWord("TOKEN_ISSUER ") + ctx.WriteString(t.Value) + default: + return fmt.Errorf("unsupported AuthTokenOrTLSOption.Type %d", t.Type) + } + return nil +} + +type AuthTokenOrTLSOptionType int + +const ( + TlsNone AuthTokenOrTLSOptionType = iota + Ssl + X509 + Cipher + Issuer + Subject + SAN + TokenIssuer +) + +func (t AuthTokenOrTLSOptionType) String() string { + switch t { + case TlsNone: + return "NONE" + case Ssl: + return "SSL" + case X509: + return "X509" + case Cipher: + return "CIPHER" + case Issuer: + return "ISSUER" + case Subject: + return "SUBJECT" + case SAN: + return "SAN" + case TokenIssuer: + return "TOKEN_ISSUER" + default: + return "UNKNOWN" + } +} + +const ( + MaxQueriesPerHour = iota + 1 + MaxUpdatesPerHour + MaxConnectionsPerHour + MaxUserConnections +) + +type ResourceOption struct { + Type int + Count int64 +} + +func (r *ResourceOption) Restore(ctx *format.RestoreCtx) error { + switch r.Type { + case MaxQueriesPerHour: + ctx.WriteKeyWord("MAX_QUERIES_PER_HOUR ") + case MaxUpdatesPerHour: + ctx.WriteKeyWord("MAX_UPDATES_PER_HOUR ") + case MaxConnectionsPerHour: + ctx.WriteKeyWord("MAX_CONNECTIONS_PER_HOUR ") + case MaxUserConnections: + ctx.WriteKeyWord("MAX_USER_CONNECTIONS ") + default: + return fmt.Errorf("unsupported ResourceOption.Type %d", r.Type) + } + ctx.WritePlainf("%d", r.Count) + return nil +} + +const ( + PasswordExpire = iota + 1 + PasswordExpireDefault + PasswordExpireNever + PasswordExpireInterval + PasswordHistory + PasswordHistoryDefault + PasswordReuseInterval + PasswordReuseDefault + Lock + Unlock + FailedLoginAttempts + PasswordLockTime + PasswordLockTimeUnbounded + UserCommentType + UserAttributeType + PasswordRequireCurrentDefault + + UserResourceGroupName +) + +type PasswordOrLockOption struct { + Type int + Count int64 +} + +func (p *PasswordOrLockOption) Restore(ctx *format.RestoreCtx) error { + switch p.Type { + case PasswordExpire: + ctx.WriteKeyWord("PASSWORD EXPIRE") + case PasswordExpireDefault: + ctx.WriteKeyWord("PASSWORD EXPIRE DEFAULT") + case PasswordExpireNever: + ctx.WriteKeyWord("PASSWORD EXPIRE NEVER") + case PasswordExpireInterval: + ctx.WriteKeyWord("PASSWORD EXPIRE INTERVAL") + ctx.WritePlainf(" %d", p.Count) + ctx.WriteKeyWord(" DAY") + case Lock: + ctx.WriteKeyWord("ACCOUNT LOCK") + case Unlock: + ctx.WriteKeyWord("ACCOUNT UNLOCK") + case FailedLoginAttempts: + ctx.WriteKeyWord("FAILED_LOGIN_ATTEMPTS") + ctx.WritePlainf(" %d", p.Count) + case PasswordLockTime: + ctx.WriteKeyWord("PASSWORD_LOCK_TIME") + ctx.WritePlainf(" %d", p.Count) + case PasswordLockTimeUnbounded: + ctx.WriteKeyWord("PASSWORD_LOCK_TIME UNBOUNDED") + case PasswordHistory: + ctx.WriteKeyWord("PASSWORD HISTORY") + ctx.WritePlainf(" %d", p.Count) + case PasswordHistoryDefault: + ctx.WriteKeyWord("PASSWORD HISTORY DEFAULT") + case PasswordReuseInterval: + ctx.WriteKeyWord("PASSWORD REUSE INTERVAL") + ctx.WritePlainf(" %d", p.Count) + ctx.WriteKeyWord(" DAY") + case PasswordReuseDefault: + ctx.WriteKeyWord("PASSWORD REUSE INTERVAL DEFAULT") + default: + return fmt.Errorf("unsupported PasswordOrLockOption.Type %d", p.Type) + } + return nil +} + +type CommentOrAttributeOption struct { + Type int + Value string +} + +func (c *CommentOrAttributeOption) Restore(ctx *format.RestoreCtx) error { + switch c.Type { + case UserCommentType: + ctx.WriteKeyWord(" COMMENT ") + ctx.WriteString(c.Value) + case UserAttributeType: + ctx.WriteKeyWord(" ATTRIBUTE ") + ctx.WriteString(c.Value) + } + return nil +} + +type ResourceGroupNameOption struct { + Value string +} + +func (c *ResourceGroupNameOption) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(" RESOURCE GROUP ") + ctx.WriteName(c.Value) + return nil +} + +// CreateUserStmt creates user account. +// See https://dev.mysql.com/doc/refman/8.0/en/create-user.html +type CreateUserStmt struct { + stmtNode + + IsCreateRole bool + IfNotExists bool + Specs []*UserSpec + AuthTokenOrTLSOptions []*AuthTokenOrTLSOption + ResourceOptions []*ResourceOption + PasswordOrLockOptions []*PasswordOrLockOption + CommentOrAttributeOption *CommentOrAttributeOption + ResourceGroupNameOption *ResourceGroupNameOption +} + +// Restore implements Node interface. +func (n *CreateUserStmt) Restore(ctx *format.RestoreCtx) error { + if n.IsCreateRole { + ctx.WriteKeyWord("CREATE ROLE ") + } else { + ctx.WriteKeyWord("CREATE USER ") + } + if n.IfNotExists { + ctx.WriteKeyWord("IF NOT EXISTS ") + } + for i, v := range n.Specs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.Specs[%d]: %w", i, err) + } + } + + if len(n.AuthTokenOrTLSOptions) != 0 { + ctx.WriteKeyWord(" REQUIRE ") + } + + for i, option := range n.AuthTokenOrTLSOptions { + if i != 0 { + ctx.WriteKeyWord(" AND ") + } + if err := option.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.AuthTokenOrTLSOptions[%d]: %w", i, err) + } + } + + if len(n.ResourceOptions) != 0 { + ctx.WriteKeyWord(" WITH") + } + + for i, v := range n.ResourceOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.ResourceOptions[%d]: %w", i, err) + } + } + + for i, v := range n.PasswordOrLockOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.PasswordOrLockOptions[%d]: %w", i, err) + } + } + + if n.CommentOrAttributeOption != nil { + if err := n.CommentOrAttributeOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.CommentOrAttributeOption: %w", err) + } + } + + if n.ResourceGroupNameOption != nil { + if err := n.ResourceGroupNameOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore CreateUserStmt.ResourceGroupNameOption: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *CreateUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateUserStmt) + return v.Leave(n) +} + +// AlterUserStmt modifies user account. +// See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html +type AlterUserStmt struct { + stmtNode + + IfExists bool + CurrentAuth *AuthOption + // CurrentDualPasswordOption carries the dual-password clause attached to + // the `ALTER USER USER() ...` (current-user) form. The named-user form + // stores its dual-password clause on the per-UserSpec DualPasswordOption. + CurrentDualPasswordOption DualPasswordOptionType + Specs []*UserSpec + AuthTokenOrTLSOptions []*AuthTokenOrTLSOption + ResourceOptions []*ResourceOption + PasswordOrLockOptions []*PasswordOrLockOption + CommentOrAttributeOption *CommentOrAttributeOption + ResourceGroupNameOption *ResourceGroupNameOption +} + +// Restore implements Node interface. +func (n *AlterUserStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER USER ") + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + if n.CurrentAuth != nil { + ctx.WriteKeyWord("USER") + ctx.WritePlain("() ") + if err := n.CurrentAuth.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.CurrentAuth: %w", err) + } + if n.CurrentDualPasswordOption != 0 { + ctx.WritePlain(" ") + if err := n.CurrentDualPasswordOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.CurrentDualPasswordOption: %w", err) + } + } + } else if n.CurrentDualPasswordOption != 0 { + // Standalone DISCARD OLD PASSWORD on the current-user form (no IDENTIFIED BY). + ctx.WriteKeyWord("USER") + ctx.WritePlain("() ") + if err := n.CurrentDualPasswordOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.CurrentDualPasswordOption: %w", err) + } + } + for i, v := range n.Specs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.Specs[%d]: %w", i, err) + } + } + + if len(n.AuthTokenOrTLSOptions) != 0 { + ctx.WriteKeyWord(" REQUIRE ") + } + + for i, option := range n.AuthTokenOrTLSOptions { + if i != 0 { + ctx.WriteKeyWord(" AND ") + } + if err := option.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.AuthTokenOrTLSOptions[%d]: %w", i, err) + } + } + + if len(n.ResourceOptions) != 0 { + ctx.WriteKeyWord(" WITH") + } + + for i, v := range n.ResourceOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.ResourceOptions[%d]: %w", i, err) + } + } + + for i, v := range n.PasswordOrLockOptions { + ctx.WritePlain(" ") + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.PasswordOrLockOptions[%d]: %w", i, err) + } + } + + if n.CommentOrAttributeOption != nil { + if err := n.CommentOrAttributeOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.CommentOrAttributeOption: %w", err) + } + } + + if n.ResourceGroupNameOption != nil { + if err := n.ResourceGroupNameOption.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AlterUserStmt.ResourceGroupNameOption: %w", err) + } + } + + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterUserStmt) + return v.Leave(n) +} + +// RedoLogAction is the {ENABLE | DISABLE} INNODB REDO_LOG action of ALTER INSTANCE. +type RedoLogAction int + +// RedoLogAction values. +const ( + RedoLogActionNone RedoLogAction = iota + RedoLogActionEnable + RedoLogActionDisable +) + +// AlterInstanceStmt modifies instance. +// See https://dev.mysql.com/doc/refman/8.4/en/alter-instance.html +type AlterInstanceStmt struct { + stmtNode + + ReloadTLS bool + NoRollbackOnError bool + // TLSChannel is the optional FOR CHANNEL of RELOAD TLS. + TLSChannel string + // RotateMasterKey is "INNODB" or "BINLOG" for ROTATE ... MASTER KEY. + RotateMasterKey string + // RedoLog is set for {ENABLE | DISABLE} INNODB REDO_LOG. + RedoLog RedoLogAction + ReloadKeyring bool +} + +// Restore implements Node interface. +func (n *AlterInstanceStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER INSTANCE") + switch { + case n.ReloadTLS: + ctx.WriteKeyWord(" RELOAD TLS") + if n.TLSChannel != "" { + ctx.WriteKeyWord(" FOR CHANNEL ") + ctx.WriteName(n.TLSChannel) + } + if n.NoRollbackOnError { + ctx.WriteKeyWord(" NO ROLLBACK ON ERROR") + } + case n.RotateMasterKey != "": + ctx.WriteKeyWord(" ROTATE ") + ctx.WriteKeyWord(n.RotateMasterKey) + ctx.WriteKeyWord(" MASTER KEY") + case n.RedoLog == RedoLogActionEnable: + ctx.WriteKeyWord(" ENABLE INNODB REDO_LOG") + case n.RedoLog == RedoLogActionDisable: + ctx.WriteKeyWord(" DISABLE INNODB REDO_LOG") + case n.ReloadKeyring: + ctx.WriteKeyWord(" RELOAD KEYRING") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AlterInstanceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterInstanceStmt) + return v.Leave(n) +} + +// DropUserStmt creates user account. +// See http://dev.mysql.com/doc/refman/5.7/en/drop-user.html +type DropUserStmt struct { + stmtNode + + IfExists bool + IsDropRole bool + UserList []*auth.UserIdentity +} + +// Restore implements Node interface. +func (n *DropUserStmt) Restore(ctx *format.RestoreCtx) error { + if n.IsDropRole { + ctx.WriteKeyWord("DROP ROLE ") + } else { + ctx.WriteKeyWord("DROP USER ") + } + if n.IfExists { + ctx.WriteKeyWord("IF EXISTS ") + } + for i, v := range n.UserList { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DropUserStmt.UserList[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DropUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropUserStmt) + return v.Leave(n) +} + +// DoStmt is the struct for DO statement. +type DoStmt struct { + stmtNode + + Exprs []ExprNode +} + +// Restore implements Node interface. +func (n *DoStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DO ") + for i, v := range n.Exprs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore DoStmt.Exprs[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *DoStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DoStmt) + for i, val := range n.Exprs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Exprs[i] = node.(ExprNode) + } + return v.Leave(n) +} + +// RoleOrPriv is a temporary structure to be further processed into auth.RoleIdentity or PrivElem +type RoleOrPriv struct { + Symbols string // hold undecided symbols + Node any // hold auth.RoleIdentity or PrivElem that can be sure when parsing +} + +func (n *RoleOrPriv) ToRole() (*auth.RoleIdentity, error) { + if n.Node != nil { + if r, ok := n.Node.(*auth.RoleIdentity); ok { + return r, nil + } + return nil, fmt.Errorf("can't convert to RoleIdentity, type %T", n.Node) + } + return &auth.RoleIdentity{Username: n.Symbols, Hostname: "%"}, nil +} + +func (n *RoleOrPriv) ToPriv() (*PrivElem, error) { + if n.Node != nil { + if p, ok := n.Node.(*PrivElem); ok { + return p, nil + } + return nil, fmt.Errorf("can't convert to PrivElem, type %T", n.Node) + } + if len(n.Symbols) == 0 { + return nil, errors.New("symbols should not be length 0") + } + return &PrivElem{Priv: mysql.ExtendedPriv, Name: n.Symbols}, nil +} + +// PrivElem is the privilege type and optional column list. +type PrivElem struct { + node + + Priv mysql.PrivilegeType + Cols []*ColumnName + Name string +} + +// Restore implements Node interface. +func (n *PrivElem) Restore(ctx *format.RestoreCtx) error { + switch n.Priv { //nolint:exhaustive + case mysql.AllPriv: + ctx.WriteKeyWord("ALL") + case mysql.ExtendedPriv: + ctx.WriteKeyWord(n.Name) + default: + str, ok := mysql.Priv2Str[n.Priv] + if !ok { + return errors.New("undefined privilege type") + } + ctx.WriteKeyWord(str) + } + if n.Cols != nil { + ctx.WritePlain(" (") + for i, v := range n.Cols { + if i != 0 { + ctx.WritePlain(",") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore PrivElem.Cols[%d]: %w", i, err) + } + } + ctx.WritePlain(")") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *PrivElem) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*PrivElem) + for i, val := range n.Cols { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Cols[i] = node.(*ColumnName) + } + return v.Leave(n) +} + +// ObjectTypeType is the type for object type. +type ObjectTypeType int + +const ( + // ObjectTypeNone is for empty object type. + ObjectTypeNone ObjectTypeType = iota + 1 + // ObjectTypeTable means the following object is a table. + ObjectTypeTable + // ObjectTypeFunction means the following object is a stored function. + ObjectTypeFunction + // ObjectTypeProcedure means the following object is a stored procedure. + ObjectTypeProcedure +) + +// Restore implements Node interface. +func (n ObjectTypeType) Restore(ctx *format.RestoreCtx) error { + switch n { + case ObjectTypeNone: + // do nothing + case ObjectTypeTable: + ctx.WriteKeyWord("TABLE") + case ObjectTypeFunction: + ctx.WriteKeyWord("FUNCTION") + case ObjectTypeProcedure: + ctx.WriteKeyWord("PROCEDURE") + default: + return errors.New("unsupported object type") + } + return nil +} + +// GrantLevelType is the type for grant level. +type GrantLevelType int + +const ( + // GrantLevelNone is the dummy const for default value. + GrantLevelNone GrantLevelType = iota + 1 + // GrantLevelGlobal means the privileges are administrative or apply to all databases on a given server. + GrantLevelGlobal + // GrantLevelDB means the privileges apply to all objects in a given database. + GrantLevelDB + // GrantLevelTable means the privileges apply to all columns in a given table. + GrantLevelTable +) + +// GrantLevel is used for store the privilege scope. +type GrantLevel struct { + Level GrantLevelType + DBName string + TableName string +} + +// Restore implements Node interface. +func (n *GrantLevel) Restore(ctx *format.RestoreCtx) error { + switch n.Level { //nolint:exhaustive + case GrantLevelDB: + if n.DBName == "" { + ctx.WritePlain("*") + } else { + ctx.WriteName(n.DBName) + ctx.WritePlain(".*") + } + case GrantLevelGlobal: + ctx.WritePlain("*.*") + case GrantLevelTable: + if n.DBName != "" { + ctx.WriteName(n.DBName) + ctx.WritePlain(".") + } + ctx.WriteName(n.TableName) + } + return nil +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec +} + +// Restore implements Node interface. +func (n *RevokeStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("REVOKE ") + for i, v := range n.Privs { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeStmt.Privs[%d]: %w", i, err) + } + } + ctx.WriteKeyWord(" ON ") + if n.ObjectType != ObjectTypeNone { + if err := n.ObjectType.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeStmt.ObjectType: %w", err) + } + ctx.WritePlain(" ") + } + if err := n.Level.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeStmt.Level: %w", err) + } + ctx.WriteKeyWord(" FROM ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeStmt.Users[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RevokeStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// RevokeStmt is the struct for REVOKE statement. +type RevokeRoleStmt struct { + stmtNode + + Roles []*auth.RoleIdentity + Users []*auth.UserIdentity +} + +// Restore implements Node interface. +func (n *RevokeRoleStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("REVOKE ") + for i, role := range n.Roles { + if i != 0 { + ctx.WritePlain(", ") + } + if err := role.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeRoleStmt.Roles[%d]: %w", i, err) + } + } + ctx.WriteKeyWord(" FROM ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RevokeRoleStmt.Users[%d]: %w", i, err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RevokeRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RevokeRoleStmt) + return v.Leave(n) +} + +// GrantStmt is the struct for GRANT statement. +type GrantStmt struct { + stmtNode + + Privs []*PrivElem + ObjectType ObjectTypeType + Level *GrantLevel + Users []*UserSpec + AuthTokenOrTLSOptions []*AuthTokenOrTLSOption + WithGrant bool +} + +// Restore implements Node interface. +func (n *GrantStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("GRANT ") + for i, v := range n.Privs { + if i != 0 && v.Priv != 0 { + ctx.WritePlain(", ") + } else if v.Priv == 0 { + ctx.WritePlain(" ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.Privs[%d]: %w", i, err) + } + } + ctx.WriteKeyWord(" ON ") + if n.ObjectType != ObjectTypeNone { + if err := n.ObjectType.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.ObjectType: %w", err) + } + ctx.WritePlain(" ") + } + if err := n.Level.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.Level: %w", err) + } + ctx.WriteKeyWord(" TO ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.Users[%d]: %w", i, err) + } + } + if n.AuthTokenOrTLSOptions != nil { + if len(n.AuthTokenOrTLSOptions) != 0 { + ctx.WriteKeyWord(" REQUIRE ") + } + for i, option := range n.AuthTokenOrTLSOptions { + if i != 0 { + ctx.WriteKeyWord(" AND ") + } + if err := option.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.AuthTokenOrTLSOptions[%d]: %w", i, err) + } + } + } + if n.WithGrant { + ctx.WriteKeyWord(" WITH GRANT OPTION") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *GrantStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantStmt) + for i, val := range n.Privs { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.Privs[i] = node.(*PrivElem) + } + return v.Leave(n) +} + +// GrantProxyStmt is the struct for GRANT PROXY statement. +type GrantProxyStmt struct { + stmtNode + + LocalUser *auth.UserIdentity + ExternalUsers []*auth.UserIdentity + WithGrant bool +} + +// Accept implements Node Accept interface. +func (n *GrantProxyStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantProxyStmt) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *GrantProxyStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("GRANT PROXY ON ") + if err := n.LocalUser.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantProxyStmt.LocalUser: %w", err) + } + ctx.WriteKeyWord(" TO ") + for i, v := range n.ExternalUsers { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantProxyStmt.ExternalUsers[%d]: %w", i, err) + } + } + if n.WithGrant { + ctx.WriteKeyWord(" WITH GRANT OPTION") + } + return nil +} + +// GrantRoleStmt is the struct for GRANT TO statement. +type GrantRoleStmt struct { + stmtNode + + Roles []*auth.RoleIdentity + Users []*auth.UserIdentity +} + +// Accept implements Node Accept interface. +func (n *GrantRoleStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*GrantRoleStmt) + return v.Leave(n) +} + +// Restore implements Node interface. +func (n *GrantRoleStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("GRANT ") + if len(n.Roles) > 0 { + for i, role := range n.Roles { + if i != 0 { + ctx.WritePlain(", ") + } + if err := role.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantRoleStmt.Roles[%d]: %w", i, err) + } + } + } + ctx.WriteKeyWord(" TO ") + for i, v := range n.Users { + if i != 0 { + ctx.WritePlain(", ") + } + if err := v.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore GrantStmt.Users[%d]: %w", i, err) + } + } + return nil +} + +// ShutdownStmt is a statement to stop the MySQL server. +// See https://dev.mysql.com/doc/refman/8.0/en/shutdown.html +type ShutdownStmt struct { + stmtNode +} + +// Restore implements Node interface. +func (n *ShutdownStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("SHUTDOWN") + return nil +} + +// Accept implements Node Accept interface. +func (n *ShutdownStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ShutdownStmt) + return v.Leave(n) +} + +// RestartStmt is a statement to restart the server (MySQL 8.0 RESTART). +// See https://dev.mysql.com/doc/refman/8.0/en/restart.html +type RestartStmt struct { + stmtNode +} + +// Restore implements Node interface. +func (n *RestartStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("RESTART") + return nil +} + +// Accept implements Node Accept interface. +func (n *RestartStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RestartStmt) + return v.Leave(n) +} + +// RenameUserStmt is a statement to rename a user. +// See http://dev.mysql.com/doc/refman/5.7/en/rename-user.html +type RenameUserStmt struct { + stmtNode + + UserToUsers []*UserToUser +} + +// Restore implements Node interface. +func (n *RenameUserStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("RENAME USER ") + for index, user2user := range n.UserToUsers { + if index != 0 { + ctx.WritePlain(", ") + } + if err := user2user.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore RenameUserStmt.UserToUsers: %w", err) + } + } + return nil +} + +// Accept implements Node Accept interface. +func (n *RenameUserStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*RenameUserStmt) + + for i, t := range n.UserToUsers { + node, ok := t.Accept(v) + if !ok { + return n, false + } + n.UserToUsers[i] = node.(*UserToUser) + } + return v.Leave(n) +} + +// UserToUser represents renaming old user to new user used in RenameUserStmt. +type UserToUser struct { + node + OldUser *auth.UserIdentity + NewUser *auth.UserIdentity +} + +// Restore implements Node interface. +func (n *UserToUser) Restore(ctx *format.RestoreCtx) error { + if err := n.OldUser.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UserToUser.OldUser: %w", err) + } + ctx.WriteKeyWord(" TO ") + if err := n.NewUser.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore UserToUser.NewUser: %w", err) + } + return nil +} + +// Accept implements Node Accept interface. +func (n *UserToUser) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*UserToUser) + return v.Leave(n) +} + +// SelectStmtOpts wrap around select hints and switches +type SelectStmtOpts struct { + Distinct bool + SQLBigResult bool + SQLBufferResult bool + SQLCache bool + SQLSmallResult bool + CalcFoundRows bool + StraightJoin bool + Priority mysql.PriorityEnum + TableHints []*TableOptimizerHint + ExplicitAll bool +} + +// TableOptimizerHint is Table level optimizer hint +type TableOptimizerHint struct { + node + // HintName is the name or alias of the table(s) which the hint will affect. + // Table hints has no schema info + // It allows only table name or alias (if table has an alias) + HintName CIStr + // HintData is the payload of the hint. The actual type of this field + // depends on `HintName`: + // + // - MAX_EXECUTION_TIME => uint64 + // - RESOURCE_GROUP => string + // - SET_VAR => HintSetVar + HintData any + // QBName is the default effective query block of this hint. + QBName CIStr + Tables []HintTable + Indexes []CIStr +} + +// HintSetVar is the payload of `SET_VAR` hint +type HintSetVar struct { + VarName string + Value string +} + +// HintTable is table in the hint. It may have query block info. +type HintTable struct { + DBName CIStr + TableName CIStr + QBName CIStr +} + +func (ht *HintTable) Restore(ctx *format.RestoreCtx) { + if !ctx.Flags.HasWithoutSchemaNameFlag() { + if ht.DBName.L != "" { + ctx.WriteName(ht.DBName.String()) + ctx.WriteKeyWord(".") + } + } + ctx.WriteName(ht.TableName.String()) + if ht.QBName.L != "" { + ctx.WriteKeyWord("@") + ctx.WriteName(ht.QBName.String()) + } +} + +// Restore implements Node interface. +func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(n.HintName.String()) + ctx.WritePlain("(") + if n.QBName.L != "" { + if n.HintName.L != "qb_name" { + ctx.WriteKeyWord("@") + } + ctx.WriteName(n.QBName.String()) + } + if n.HintName.L == "qb_name" && len(n.Tables) == 0 { + ctx.WritePlain(")") + return nil + } + // Hints without args except query block. + switch n.HintName.L { + case "no_index_merge", "merge": + ctx.WritePlain(")") + return nil + } + if n.QBName.L != "" { + ctx.WritePlain(" ") + } + // Hints with args except query block. + switch n.HintName.L { + case "max_execution_time": + ctx.WritePlainf("%d", n.HintData.(uint64)) + case "resource_group": + ctx.WriteName(n.HintData.(string)) + case "hash_join", "no_hash_join": + for i, table := range n.Tables { + if i != 0 { + ctx.WritePlain(", ") + } + table.Restore(ctx) + } + case "order_index", "no_order_index": + n.Tables[0].Restore(ctx) + ctx.WritePlain(" ") + for i, index := range n.Indexes { + if i != 0 { + ctx.WritePlain(", ") + } + ctx.WriteName(index.String()) + } + case "qb_name": + if len(n.Tables) > 0 { + ctx.WritePlain(", ") + for i, table := range n.Tables { + if i != 0 { + ctx.WritePlain(". ") + } + table.Restore(ctx) + } + } + case "set_var": + hintData := n.HintData.(HintSetVar) + ctx.WritePlain(hintData.VarName) + ctx.WritePlain(" = ") + ctx.WriteString(hintData.Value) + } + ctx.WritePlain(")") + return nil +} + +// Accept implements Node Accept interface. +func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*TableOptimizerHint) + return v.Leave(n) +} + +// TextString represent a string, it can be a binary literal. +type TextString struct { + Value string + IsBinaryLiteral bool +} diff --git a/pkg/parser/ast/misc_test.go b/pkg/parser/ast/misc_test.go new file mode 100644 index 000000000..6182d5058 --- /dev/null +++ b/pkg/parser/ast/misc_test.go @@ -0,0 +1,120 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/stretchr/testify/require" +) + +type visitor struct{} + +func (v visitor) Enter(in ast.Node) (ast.Node, bool) { + return in, false +} + +func (v visitor) Leave(in ast.Node) (ast.Node, bool) { + return in, true +} + +type visitor1 struct { + visitor +} + +func (visitor1) Enter(in ast.Node) (ast.Node, bool) { + return in, true +} + +func TestDDLVisitorCoverMisc(t *testing.T) { + sql := ` +create table t (c1 smallint unsigned, c2 int unsigned); +alter table t add column a smallint unsigned after b; +alter table t add column (a int, constraint check (a > 0)); +create index t_i on t (id); +create database test character set utf8; +drop database test; +drop index t_i on t; +drop table t; +truncate t; +create table t ( +jobAbbr char(4) not null, +constraint foreign key (jobabbr) references ffxi_jobtype (jobabbr) on delete cascade on update cascade +); +` + parse := parser.New() + stmts, _, err := parse.Parse(sql, "", "") + require.NoError(t, err) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func TestDMLVistorCover(t *testing.T) { + sql := `delete from somelog where user = 'jcole' order by timestamp_column limit 1; +delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id; +select * from t where exists(select * from t k where t.c = k.c having sum(c) = 1); +insert into t_copy select * from t where t.x > 5; +(select /*+ TIDB_INLJ(t1) */ a from t1 where a=10 and b=1) union (select /*+ TIDB_SMJ(t2) */ a from t2 where a=11 and b=2) order by a limit 10; +update t1 set col1 = col1 + 1, col2 = col1; +show create table t; +load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by 'b'` + + p := parser.New() + stmts, _, err := p.Parse(sql, "", "") + require.NoError(t, err) + for _, stmt := range stmts { + stmt.Accept(visitor{}) + stmt.Accept(visitor1{}) + } +} + +func TestTableOptimizerHintRestore(t *testing.T) { + testCases := []NodeRestoreTestCase{ + {"ORDER_INDEX(t1 c1)", "ORDER_INDEX(`t1` `c1`)"}, + {"ORDER_INDEX(test.t1 c1)", "ORDER_INDEX(`test`.`t1` `c1`)"}, + {"ORDER_INDEX(@sel_1 t1 c1)", "ORDER_INDEX(@`sel_1` `t1` `c1`)"}, + {"ORDER_INDEX(t1@sel_1 c1)", "ORDER_INDEX(`t1`@`sel_1` `c1`)"}, + {"ORDER_INDEX(test.t1@sel_1 c1)", "ORDER_INDEX(`test`.`t1`@`sel_1` `c1`)"}, + {"NO_ORDER_INDEX(t1 c1)", "NO_ORDER_INDEX(`t1` `c1`)"}, + {"NO_ORDER_INDEX(test.t1 c1)", "NO_ORDER_INDEX(`test`.`t1` `c1`)"}, + {"NO_ORDER_INDEX(@sel_1 t1 c1)", "NO_ORDER_INDEX(@`sel_1` `t1` `c1`)"}, + {"NO_ORDER_INDEX(t1@sel_1 c1)", "NO_ORDER_INDEX(`t1`@`sel_1` `c1`)"}, + {"NO_ORDER_INDEX(test.t1@sel_1 c1)", "NO_ORDER_INDEX(`test`.`t1`@`sel_1` `c1`)"}, + {"HASH_JOIN(`t1`)", "HASH_JOIN(`t1`)"}, + {"HASH_JOIN(t1)", "HASH_JOIN(`t1`)"}, + {"HASH_JOIN(t1,t2)", "HASH_JOIN(`t1`, `t2`)"}, + {"HASH_JOIN(@sel1 t1,t2)", "HASH_JOIN(@`sel1` `t1`, `t2`)"}, + {"HASH_JOIN(t1@sel1,t2@sel2)", "HASH_JOIN(`t1`@`sel1`, `t2`@`sel2`)"}, + {"NO_HASH_JOIN(t1,t2)", "NO_HASH_JOIN(`t1`, `t2`)"}, + {"NO_HASH_JOIN(@sel1 t1,t2)", "NO_HASH_JOIN(@`sel1` `t1`, `t2`)"}, + {"MAX_EXECUTION_TIME(3000)", "MAX_EXECUTION_TIME(3000)"}, + {"MAX_EXECUTION_TIME(@sel1 3000)", "MAX_EXECUTION_TIME(@`sel1` 3000)"}, + {"MERGE()", "MERGE()"}, + {"MERGE(@sel1)", "MERGE(@`sel1`)"}, + {"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"}, + {"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"}, + {"QB_NAME(sel1)", "QB_NAME(`sel1`)"}, + {"SET_VAR(sql_mode = 'ANSI')", "SET_VAR(sql_mode = 'ANSI')"}, + {"RESOURCE_GROUP(rg1)", "RESOURCE_GROUP(`rg1`)"}, + {"RESOURCE_GROUP(`default`)", "RESOURCE_GROUP(`default`)"}, + } + extractNodeFunc := func(node ast.Node) ast.Node { + return node.(*ast.SelectStmt).TableHints[0] + } + runNodeRestoreTest(t, testCases, "select /*+ %s */ * from t1 join t2", extractNodeFunc) +} diff --git a/pkg/parser/ast/model.go b/pkg/parser/ast/model.go new file mode 100644 index 000000000..65c4834ac --- /dev/null +++ b/pkg/parser/ast/model.go @@ -0,0 +1,273 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "encoding/json" + "strings" + "unsafe" +) + +// TableLockType is the type of the table lock. +type TableLockType byte + +const ( + // TableLockNone means this table lock is absent. + TableLockNone TableLockType = iota + // TableLockRead means the session with this lock can read the table (but not write it). + // Multiple sessions can acquire a READ lock for the table at the same time. + // Other sessions can read the table without explicitly acquiring a READ lock. + TableLockRead + // TableLockReadLocal is not supported. + TableLockReadLocal + // TableLockReadOnly is used to set a table into read-only status, + // when the session exits, it will not release its lock automatically. + TableLockReadOnly + // TableLockWrite means only the session with this lock has write/read permission. + // Only the session that holds the lock can access the table. No other session can access it until the lock is released. + TableLockWrite + // TableLockWriteLocal means the session with this lock has write/read permission, and the other session still has read permission. + TableLockWriteLocal +) + +// String implements fmt.Stringer interface. +func (t TableLockType) String() string { + switch t { + case TableLockNone: + return "NONE" + case TableLockRead: + return "READ" + case TableLockReadLocal: + return "READ LOCAL" + case TableLockReadOnly: + return "READ ONLY" + case TableLockWriteLocal: + return "WRITE LOCAL" + case TableLockWrite: + return "WRITE" + } + return "" +} + +// ViewAlgorithm is VIEW's SQL ALGORITHM characteristic. +// See https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html +type ViewAlgorithm int + +// ViewAlgorithm values. +const ( + AlgorithmUndefined ViewAlgorithm = iota + AlgorithmMerge + AlgorithmTemptable +) + +// String implements fmt.Stringer interface. +func (v *ViewAlgorithm) String() string { + switch *v { + case AlgorithmMerge: + return "MERGE" + case AlgorithmTemptable: + return "TEMPTABLE" + case AlgorithmUndefined: + return "UNDEFINED" + default: + return "UNDEFINED" + } +} + +// ViewSecurity is VIEW's SQL SECURITY characteristic. +// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html +type ViewSecurity int + +// ViewSecurity values. +const ( + SecurityDefiner ViewSecurity = iota + SecurityInvoker +) + +// String implements fmt.Stringer interface. +func (v *ViewSecurity) String() string { + switch *v { + case SecurityInvoker: + return "INVOKER" + case SecurityDefiner: + return "DEFINER" + default: + return "DEFINER" + } +} + +// ViewCheckOption is VIEW's WITH CHECK OPTION clause part. +// See https://dev.mysql.com/doc/refman/5.7/en/view-check-option.html +type ViewCheckOption int + +// ViewCheckOption values. +const ( + CheckOptionLocal ViewCheckOption = iota + CheckOptionCascaded +) + +// String implements fmt.Stringer interface. +func (v *ViewCheckOption) String() string { + switch *v { + case CheckOptionLocal: + return "LOCAL" + case CheckOptionCascaded: + return "CASCADED" + default: + return "CASCADED" + } +} + +// PartitionType is the type for PartitionInfo +type PartitionType int + +// PartitionType types. +const ( + // Actually non-partitioned, but during DDL keeping the table as + // a single partition + PartitionTypeNone PartitionType = 0 + + PartitionTypeRange PartitionType = 1 + PartitionTypeHash PartitionType = 2 + PartitionTypeList PartitionType = 3 + PartitionTypeKey PartitionType = 4 +) + +// String implements fmt.Stringer interface. +func (p PartitionType) String() string { + switch p { + case PartitionTypeRange: + return "RANGE" + case PartitionTypeHash: + return "HASH" + case PartitionTypeList: + return "LIST" + case PartitionTypeKey: + return "KEY" + case PartitionTypeNone: + return "NONE" + default: + return "" + } +} + +// IndexType is the type of index +type IndexType int + +// String implements Stringer interface. +func (t IndexType) String() string { + switch t { //nolint:exhaustive + case IndexTypeBtree: + return "BTREE" + case IndexTypeHash: + return "HASH" + case IndexTypeRtree: + return "RTREE" + case IndexTypeFulltext: + return "FULLTEXT" + default: + return "" + } +} + +// IndexTypes +const ( + IndexTypeInvalid IndexType = iota + IndexTypeBtree + IndexTypeHash + IndexTypeRtree + IndexTypeFulltext +) + +// ReferOptionType is the type for refer options. +type ReferOptionType int + +// Refer option types. +const ( + ReferOptionNoOption ReferOptionType = iota + ReferOptionRestrict + ReferOptionCascade + ReferOptionSetNull + ReferOptionNoAction + ReferOptionSetDefault +) + +// String implements fmt.Stringer interface. +func (r ReferOptionType) String() string { + switch r { //nolint:exhaustive + case ReferOptionRestrict: + return "RESTRICT" + case ReferOptionCascade: + return "CASCADE" + case ReferOptionSetNull: + return "SET NULL" + case ReferOptionNoAction: + return "NO ACTION" + case ReferOptionSetDefault: + return "SET DEFAULT" + } + return "" +} + +// CIStr is case insensitive string. +type CIStr struct { + O string `json:"O"` // Original string. + L string `json:"L"` // Lower case string. +} + +// String implements fmt.Stringer interface. +func (cis CIStr) String() string { + return cis.O +} + +// NewCIStr creates a new CIStr. +func NewCIStr(s string) (cs CIStr) { + cs.O = s + cs.L = strings.ToLower(s) + return +} + +// UnmarshalJSON implements the user defined unmarshal method. +// CIStr can also be unmarshaled from a plain JSON string for backward +// compatibility with older serialized forms. +func (cis *CIStr) UnmarshalJSON(b []byte) error { + type T CIStr + if err := json.Unmarshal(b, (*T)(cis)); err == nil { + return nil + } + + // Unmarshal CIStr from a single string. + err := json.Unmarshal(b, &cis.O) + if err != nil { + return err + } + cis.L = strings.ToLower(cis.O) + return nil +} + +// MemoryUsage return the memory usage of CIStr +func (cis *CIStr) MemoryUsage() (sum int64) { + if cis == nil { + return + } + + return int64(unsafe.Sizeof(cis.O))*2 + int64(len(cis.O)+len(cis.L)) +} + +// Priority values. +const ( + LowPriorityValue = 1 + MediumPriorityValue = 8 + HighPriorityValue = 16 +) diff --git a/pkg/parser/ast/model_test.go b/pkg/parser/ast/model_test.go new file mode 100644 index 000000000..5e0f1c077 --- /dev/null +++ b/pkg/parser/ast/model_test.go @@ -0,0 +1,47 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestT(t *testing.T) { + abc := NewCIStr("aBC") + require.Equal(t, "aBC", abc.O) + require.Equal(t, "abc", abc.L) + require.Equal(t, "aBC", abc.String()) +} + +func TestUnmarshalCIStr(t *testing.T) { + var ci CIStr + + // Test unmarshal CIStr from a single string. + str := "aaBB" + buf, err := json.Marshal(str) + require.NoError(t, err) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) + + buf, err = json.Marshal(ci) + require.NoError(t, err) + require.JSONEq(t, `{"O":"aaBB","L":"aabb"}`, string(buf)) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) +} diff --git a/pkg/parser/ast/mydecimal.go b/pkg/parser/ast/mydecimal.go new file mode 100644 index 000000000..630e0a2d4 --- /dev/null +++ b/pkg/parser/ast/mydecimal.go @@ -0,0 +1,303 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "errors" + + "github.com/block/spirit/pkg/parser/types" +) + +// errBadDecimal is returned for byte sequences FromString cannot interpret as +// a decimal at all. The lexer never produces such sequences (decLit tokens +// always carry at least one digit and no exponent), so this is defensive. +var errBadDecimal = errors.New("bad decimal number") + +// constant values. +const ( + maxWordBufLen = 9 // A MyDecimal holds 9 words. + digitsPerWord = 9 // A word holds 9 digits. + digMask = 100000000 +) + +var ( + wordBufLen = 9 +) + +// fixWordCntError limits word count in wordBufLen, and returns overflow or truncate error. +// Like MySQL, an integer part wider than the buffer is an out-of-range error, while a +// fractional part that merely doesn't fit is truncated to what remains. +func fixWordCntError(wordsInt, wordsFrac int) (newWordsInt int, newWordsFrac int, err error) { + if wordsInt > wordBufLen { + return wordBufLen, 0, types.ErrDataOutOfRange + } + if wordsInt+wordsFrac > wordBufLen { + return wordsInt, wordBufLen - wordsInt, types.ErrTruncatedWrongValue + } + return wordsInt, wordsFrac, nil +} + +/* +countLeadingZeroes returns the number of leading zeroes that can be removed from fraction. + +@param i start index +@param word value to compare against list of powers of 10 +*/ +func countLeadingZeroes(i int, word int32) int { + leading := 0 + for word < pow10(i) { + i-- + leading++ + } + return leading +} + +func digitsToWords(digits int) int { + return (digits + digitsPerWord - 1) / digitsPerWord +} + +// MyDecimal represents a decimal value. +type MyDecimal struct { + digitsInt int8 // the number of *decimal* digits before the point. + + digitsFrac int8 // the number of decimal digits after the point. + + resultFrac int8 // result fraction digits. + + negative bool + + // wordBuf is an array of int32 words. + // A word is an int32 value can hold 9 digits.(0 <= word < wordBase) + wordBuf [maxWordBufLen]int32 +} + +// String returns the decimal string representation rounded to resultFrac. +func (d *MyDecimal) String() string { + tmp := *d + return string(tmp.ToString()) +} + +func (d *MyDecimal) stringSize() int { + // sign, zero integer and dot. + return int(d.digitsInt + d.digitsFrac + 3) +} + +func (d *MyDecimal) removeLeadingZeros() (wordIdx int, digitsInt int) { + digitsInt = int(d.digitsInt) + i := ((digitsInt - 1) % digitsPerWord) + 1 + for digitsInt > 0 && d.wordBuf[wordIdx] == 0 { + digitsInt -= i + i = digitsPerWord + wordIdx++ + } + if digitsInt > 0 { + digitsInt -= countLeadingZeroes((digitsInt-1)%digitsPerWord, d.wordBuf[wordIdx]) + } else { + digitsInt = 0 + } + return +} + +// ToString converts decimal to its printable string representation without rounding. +// +// RETURN VALUE +// +// str - result string +// errCode - eDecOK/eDecTruncate/eDecOverflow +func (d *MyDecimal) ToString() (str []byte) { + str = make([]byte, d.stringSize()) + digitsFrac := int(d.digitsFrac) + wordStartIdx, digitsInt := d.removeLeadingZeros() + if digitsInt+digitsFrac == 0 { + digitsInt = 1 + wordStartIdx = 0 + } + + digitsIntLen := digitsInt + if digitsIntLen == 0 { + digitsIntLen = 1 + } + digitsFracLen := digitsFrac + length := digitsIntLen + digitsFracLen + if d.negative { + length++ + } + if digitsFrac > 0 { + length++ + } + str = str[:length] + strIdx := 0 + if d.negative { + str[strIdx] = '-' + strIdx++ + } + var fill int + if digitsFrac > 0 { + fracIdx := strIdx + digitsIntLen + fill = digitsFracLen - digitsFrac + wordIdx := wordStartIdx + digitsToWords(digitsInt) + str[fracIdx] = '.' + fracIdx++ + for ; digitsFrac > 0; digitsFrac -= digitsPerWord { + x := d.wordBuf[wordIdx] + wordIdx++ + for i := myMin(digitsFrac, digitsPerWord); i > 0; i-- { + y := x / digMask + str[fracIdx] = byte(y) + '0' + fracIdx++ + x -= y * digMask + x *= 10 + } + } + for ; fill > 0; fill-- { + str[fracIdx] = '0' + fracIdx++ + } + } + fill = digitsIntLen - digitsInt + if digitsInt == 0 { + fill-- /* symbol 0 before digital point */ + } + for ; fill > 0; fill-- { + str[strIdx] = '0' + strIdx++ + } + if digitsInt > 0 { + strIdx += digitsInt + wordIdx := wordStartIdx + digitsToWords(digitsInt) + for ; digitsInt > 0; digitsInt -= digitsPerWord { + wordIdx-- + x := d.wordBuf[wordIdx] + for i := myMin(digitsInt, digitsPerWord); i > 0; i-- { + y := x / 10 + strIdx-- + str[strIdx] = '0' + byte(x-y*10) + x = y + } + } + } else { + str[strIdx] = '0' + } + return +} + +// FromString parses decimal from string. +func (d *MyDecimal) FromString(str []byte) error { + for i := range str { + if !isSpace(str[i]) { + str = str[i:] + break + } + } + if len(str) == 0 { + return errBadDecimal + } + switch str[0] { + case '-': + d.negative = true + fallthrough + case '+': + str = str[1:] + } + var strIdx int + for strIdx < len(str) && isDigit(str[strIdx]) { + strIdx++ + } + digitsInt := strIdx + var digitsFrac int + var endIdx int + if strIdx < len(str) && str[strIdx] == '.' { + endIdx = strIdx + 1 + for endIdx < len(str) && isDigit(str[endIdx]) { + endIdx++ + } + digitsFrac = endIdx - strIdx - 1 + } else { + digitsFrac = 0 + endIdx = strIdx + } + if digitsInt+digitsFrac == 0 { + return errBadDecimal + } + wordsInt := digitsToWords(digitsInt) + wordsFrac := digitsToWords(digitsFrac) + wordsInt, wordsFrac, err := fixWordCntError(wordsInt, wordsFrac) + if err != nil { + // Clamp to what fits and keep parsing; the caller decides how to + // surface the overflow/truncation. + digitsFrac = wordsFrac * digitsPerWord + if errors.Is(err, types.ErrDataOutOfRange) { + digitsInt = wordsInt * digitsPerWord + } + } + d.digitsInt = int8(digitsInt) + d.digitsFrac = int8(digitsFrac) + wordIdx := wordsInt + strIdxTmp := strIdx + var word int32 + var innerIdx int + for digitsInt > 0 { + digitsInt-- + strIdx-- + word += int32(str[strIdx]-'0') * pow10(innerIdx) + innerIdx++ + if innerIdx == digitsPerWord { + wordIdx-- + d.wordBuf[wordIdx] = word + word = 0 + innerIdx = 0 + } + } + if innerIdx != 0 { + wordIdx-- + d.wordBuf[wordIdx] = word + } + + wordIdx = wordsInt + strIdx = strIdxTmp + word = 0 + innerIdx = 0 + for digitsFrac > 0 { + digitsFrac-- + strIdx++ + word = int32(str[strIdx]-'0') + word*10 + innerIdx++ + if innerIdx == digitsPerWord { + d.wordBuf[wordIdx] = word + wordIdx++ + word = 0 + innerIdx = 0 + } + } + if innerIdx != 0 { + d.wordBuf[wordIdx] = word * pow10(digitsPerWord-innerIdx) + } + if endIdx+1 <= len(str) && (str[endIdx] == 'e' || str[endIdx] == 'E') { + // Scientific notation never reaches here: the lexer tokenizes it as a + // float literal, not a decimal literal. + return errBadDecimal + } + allZero := true + for i := range wordBufLen { + if d.wordBuf[i] != 0 { + allZero = false + break + } + } + if allZero { + d.negative = false + } + d.resultFrac = d.digitsFrac + return err +} diff --git a/pkg/parser/ast/restore_helpers_test.go b/pkg/parser/ast/restore_helpers_test.go new file mode 100644 index 000000000..e1e519b72 --- /dev/null +++ b/pkg/parser/ast/restore_helpers_test.go @@ -0,0 +1,118 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + . "github.com/block/spirit/pkg/parser/ast" + . "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/stretchr/testify/require" +) + +type NodeRestoreTestCase struct { + sourceSQL string + expectSQL string +} + +func runNodeRestoreTest(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { + runNodeRestoreTestWithFlags(t, nodeTestCases, template, extractNodeFunc, DefaultRestoreFlags) +} + +func runNodeRestoreTestWithFlags(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node, flags RestoreFlags) { + p := parser.New() + p.EnableWindowFunc(true) + for _, testCase := range nodeTestCases { + sourceSQL := fmt.Sprintf(template, testCase.sourceSQL) + expectSQL := fmt.Sprintf(template, testCase.expectSQL) + stmt, err := p.ParseOneStmt(sourceSQL, "", "") + comment := fmt.Sprintf("source %#v", testCase) + require.NoError(t, err, comment) + var sb strings.Builder + err = extractNodeFunc(stmt).Restore(NewRestoreCtx(flags, &sb)) + require.NoError(t, err, comment) + restoreSql := fmt.Sprintf(template, sb.String()) + comment = fmt.Sprintf("source %#v; restore %v", testCase, restoreSql) + require.Equal(t, expectSQL, restoreSql, comment) + stmt2, err := p.ParseOneStmt(restoreSql, "", "") + require.NoError(t, err, comment) + CleanNodeText(stmt) + CleanNodeText(stmt2) + require.Equal(t, stmt, stmt2, comment) + } +} + +// CleanNodeText set the text of node and all child node empty. +// For test only. +func CleanNodeText(node Node) { + var cleaner nodeTextCleaner + node.Accept(&cleaner) +} + +// nodeTextCleaner clears the text and origin-text offsets of every node so +// that two ASTs can be compared for structural equality. +type nodeTextCleaner struct { +} + +// Enter implements Visitor interface. +func (checker *nodeTextCleaner) Enter(in Node) (out Node, skipChildren bool) { + in.SetText(nil, "") + in.SetOriginTextPosition(0) + if v, ok := in.(*ValueExpr); ok && v != nil { + tpFlag := v.GetType().GetFlag() + if tpFlag&mysql.UnderScoreCharsetFlag != 0 { + // ignore underscore charset flag to let `'abc' = _utf8'abc'` pass + tpFlag ^= mysql.UnderScoreCharsetFlag + v.GetType().SetFlag(tpFlag) + } + } + + switch node := in.(type) { + case *Constraint: + if node.Option != nil { + if node.Option.KeyBlockSize == 0x0 && node.Option.Tp == 0 && node.Option.Comment == "" { + node.Option = nil + } + } + case *FuncCallExpr: + node.FnName.O = strings.ToLower(node.FnName.O) + if node.FnName.L == "convert" { + node.Args[1].(*ValueExpr).SetBytes(nil) + } + case *AggregateFuncExpr: + node.F = strings.ToLower(node.F) + case *FieldList: + for _, f := range node.Fields { + f.Offset = 0 + } + case *AlterTableSpec: + for _, opt := range node.Options { + opt.StrValue = strings.ToLower(opt.StrValue) + } + case *Join: + node.ExplicitParens = false + case *ColumnDef: + node.Tp.CleanElemIsBinaryLit() + } + return in, false +} + +// Leave implements Visitor interface. +func (checker *nodeTextCleaner) Leave(in Node) (out Node, ok bool) { + return in, true +} diff --git a/pkg/parser/ast/restore_skip_parens_test.go b/pkg/parser/ast/restore_skip_parens_test.go new file mode 100644 index 000000000..b00fa67f8 --- /dev/null +++ b/pkg/parser/ast/restore_skip_parens_test.go @@ -0,0 +1,225 @@ +// Copyright 2026 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast_test + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + . "github.com/block/spirit/pkg/parser/ast" + . "github.com/block/spirit/pkg/parser/format" + "github.com/stretchr/testify/require" +) + +// parenStripper removes every ParenthesesExpr from an expression, leaving the +// bare parse structure. Two expressions parse to the same structure if and only +// if their stripped trees are equal, which is what "dropping a redundant +// parenthesis" has to preserve. +type parenStripper struct{} + +func (parenStripper) Enter(n Node) (Node, bool) { return n, false } + +func (parenStripper) Leave(n Node) (Node, bool) { + if paren, ok := n.(*ParenthesesExpr); ok { + return paren.Expr, true + } + return n, true +} + +// restoreExpr parses "SELECT " and restores the select-field expression +// with the given flags. +func restoreExpr(t *testing.T, p *parser.Parser, expr string, flags RestoreFlags) (string, ExprNode) { + t.Helper() + stmt, err := p.ParseOneStmt("SELECT "+expr, "", "") + require.NoError(t, err, "source %q", expr) + field := stmt.(*SelectStmt).Fields.Fields[0].Expr + var sb strings.Builder + require.NoError(t, field.Restore(NewRestoreCtx(flags, &sb)), "source %q", expr) + return sb.String(), field +} + +// TestRestoreSkipRedundantParentheses checks the canonical text produced with +// RestoreSkipRedundantParentheses, and — for every case — that the text parses +// back to the same expression structure and is a fixed point of the transform. +func TestRestoreSkipRedundantParentheses(t *testing.T) { + cases := []struct { + source string + expect string + }{ + // Parentheses around a self-delimiting expression are always redundant. + {"(a)", "`a`"}, + {"((a))", "`a`"}, + {"(1)", "1"}, + {"(f(a))", "F(`a`)"}, + // A parenthesized expression with no parent operator is delimited by + // whatever syntax encloses it. + {"((a = 1) AND (b = 2))", "`a`=1 AND `b`=2"}, + + // Precedence: a tighter-binding child does not need parentheses, a + // weaker-binding one does. + {"a + (b * c)", "`a`+`b`*`c`"}, + {"(a + b) * c", "(`a`+`b`)*`c`"}, + {"(a * b) + c", "`a`*`b`+`c`"}, + {"a * (b + c)", "`a`*(`b`+`c`)"}, + {"(a AND b) OR c", "`a` AND `b` OR `c`"}, + {"(a OR b) AND c", "(`a` OR `b`) AND `c`"}, + {"a | (b & c)", "`a`|`b`&`c`"}, + {"a & (b | c)", "`a`&(`b`|`c`)"}, + {"a + (b << 1)", "`a`+(`b`<<1)"}, + {"(a << 1) + b", "(`a`<<1)+`b`"}, + + // Associativity: binary operators are left-associative, so a + // same-precedence left child never needs parentheses... + {"(a - b) - c", "`a`-`b`-`c`"}, + {"(a / b) / c", "`a`/`b`/`c`"}, + {"(a AND b) AND c", "`a` AND `b` AND `c`"}, + // ...while a right child only drops them when regrouping is safe. + {"a - (b - c)", "`a`-(`b`-`c`)"}, + {"a / (b / c)", "`a`/(`b`/`c`)"}, + {"a % (b % c)", "`a`%(`b`%`c`)"}, + // Addition and multiplication are excluded too: reassociating them can + // change a finite-precision result. + {"a + (b + c)", "`a`+(`b`+`c`)"}, + {"a * (b * c)", "`a`*(`b`*`c`)"}, + // (The operators that do regroup safely are covered by + // TestRestoreSkipRedundantParenthesesRegroups.) + // Mixing operators of equal precedence is not regrouping-safe. + {"a AND (b OR c)", "`a` AND (`b` OR `c`)"}, + {"a - (b + c)", "`a`-(`b`+`c`)"}, + + // Comparison-level constructs (IS NULL, IS TRUE, IN, LIKE, REGEXP, + // MEMBER OF) all bind tighter than AND. + {"(a IS NULL) AND b", "`a` IS NULL AND `b`"}, + {"a AND (b IS NOT NULL)", "`a` AND `b` IS NOT NULL"}, + {"(a = 1) IS TRUE", "`a`=1 IS TRUE"}, + {"(a IN (1,2)) AND b", "`a` IN (1,2) AND `b`"}, + {"(a LIKE 'x') AND b", "`a` LIKE _UTF8MB4'x' AND `b`"}, + {"(a REGEXP 'x') AND b", "`a` REGEXP _UTF8MB4'x' AND `b`"}, + {"(a MEMBER OF (b)) AND c", "`a` MEMBER OF (`b`) AND `c`"}, + // ...and their own operands drop parentheses by the same rule. + {"(a + b) IN (1,2)", "`a`+`b` IN (1,2)"}, + {"a IN ((1 + 2),3)", "`a` IN (1+2,3)"}, + {"(a + b) IS NULL", "`a`+`b` IS NULL"}, + + // BETWEEN binds weaker than comparison but tighter than AND. + {"(a BETWEEN 1 AND 2) AND b", "`a` BETWEEN 1 AND 2 AND `b`"}, + {"(a BETWEEN 1 AND 2) = b", "(`a` BETWEEN 1 AND 2)=`b`"}, + {"a = (b BETWEEN 1 AND 2)", "`a`=(`b` BETWEEN 1 AND 2)"}, + {"a BETWEEN (b + 1) AND (c * 2)", "`a` BETWEEN `b`+1 AND `c`*2"}, + + // COLLATE binds tighter than every binary operator. + {"(a COLLATE utf8mb4_bin) = b", "`a` COLLATE utf8mb4_bin=`b`"}, + {"a = (b COLLATE utf8mb4_bin)", "`a`=`b` COLLATE utf8mb4_bin"}, + + // Unary operands keep their parentheses: -(a + b) is not -a + b, and a + // parenthesized unary expression under a binary operator is left alone + // rather than reasoned about. + {"-(a + b)", "-(`a`+`b`)"}, + {"-(a)", "-(`a`)"}, + {"NOT (a AND b)", "NOT (`a` AND `b`)"}, + {"NOT (a)", "NOT (`a`)"}, + {"BINARY (a + b)", "BINARY (`a`+`b`)"}, + {"(-a) + b", "(-`a`)+`b`"}, + {"(NOT a) IS NULL", "(NOT `a`) IS NULL"}, + + // A subquery is its own parse boundary, so the enclosing operator does + // not reach into it. + {"a = (SELECT (1 + 2))", "`a`=(SELECT 1+2)"}, + {"(SELECT 1) = a", "(SELECT 1)=`a`"}, + // Neither does a pair of parentheses that is being kept. + {"a * ((b + c) * d)", "`a`*((`b`+`c`)*`d`)"}, + + // Other self-delimiting operand positions. + {"CASE WHEN (a AND b) THEN (c + 1) ELSE (d) END", "CASE WHEN `a` AND `b` THEN `c`+1 ELSE `d` END"}, + {"f((a + b))", "F(`a`+`b`)"}, + } + + p := parser.New() + for _, c := range cases { + t.Run(c.source, func(t *testing.T) { + source, reparsed := checkCanonicalRestore(t, p, c.source, c.expect) + + // Outside of the reassociation cases below, the canonical text must + // parse back to the same expression, up to the parentheses dropped. + stripped, ok := source.Accept(parenStripper{}) + require.True(t, ok) + strippedReparsed, ok := reparsed.Accept(parenStripper{}) + require.True(t, ok) + CleanNodeText(stripped) + CleanNodeText(strippedReparsed) + require.Equal(t, stripped, strippedReparsed, + "dropping parentheses changed the expression structure") + }) + } +} + +// TestRestoreSkipRedundantParenthesesRegroups covers the operators whose +// same-precedence right child may drop its parentheses. Unlike every other +// case, these deliberately change the parse structure — `a AND (b AND c)` +// becomes the left-nested `a AND b AND c` — which is only sound because the +// operator is associative in SQL, so the value of the expression is unchanged. +func TestRestoreSkipRedundantParenthesesRegroups(t *testing.T) { + cases := []struct { + source string + expect string + }{ + {"a AND (b AND c)", "`a` AND `b` AND `c`"}, + {"a OR (b OR c)", "`a` OR `b` OR `c`"}, + {"a & (b & c)", "`a`&`b`&`c`"}, + {"a | (b | c)", "`a`|`b`|`c`"}, + {"a ^ (b ^ c)", "`a`^`b`^`c`"}, + } + + p := parser.New() + for _, c := range cases { + t.Run(c.source, func(t *testing.T) { + checkCanonicalRestore(t, p, c.source, c.expect) + }) + } +} + +// checkCanonicalRestore asserts that source restores to expect under +// RestoreSkipRedundantParentheses and that the result is a fixed point of the +// transform, which it must be for the canonical form to be stable. It returns +// the source expression and the re-parse of its canonical text. +func checkCanonicalRestore(t *testing.T, p *parser.Parser, source, expect string) (ExprNode, ExprNode) { + t.Helper() + flags := DefaultRestoreFlags | RestoreSkipRedundantParentheses + got, sourceExpr := restoreExpr(t, p, source, flags) + require.Equal(t, expect, got) + gotAgain, reparsed := restoreExpr(t, p, got, flags) + require.Equal(t, got, gotAgain, "restore is not a fixed point") + return sourceExpr, reparsed +} + +// TestRestoreSkipRedundantParenthesesIsOptIn checks that the flag changes +// nothing unless it is asked for: without it, every parenthesis the user wrote +// is restored verbatim. +func TestRestoreSkipRedundantParenthesesIsOptIn(t *testing.T) { + p := parser.New() + for _, expr := range []string{ + "(a)", + "((a = 1) AND (b = 2))", + "a + (b * c)", + "(a IS NULL) AND b", + "f((a + b))", + } { + got, _ := restoreExpr(t, p, expr, DefaultRestoreFlags) + reparsedGot, _ := restoreExpr(t, p, got, DefaultRestoreFlags) + require.Equal(t, got, reparsedGot, "default restore is not a fixed point") + require.Equal(t, strings.Count(expr, "("), strings.Count(got, "("), + "default restore dropped a parenthesis in %q: %q", expr, got) + } +} diff --git a/pkg/parser/ast/stats.go b/pkg/parser/ast/stats.go new file mode 100644 index 000000000..ef17e5e87 --- /dev/null +++ b/pkg/parser/ast/stats.go @@ -0,0 +1,177 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + + "github.com/block/spirit/pkg/parser/format" +) + +var ( + _ StmtNode = &AnalyzeTableStmt{} +) + +// AnalyzeTableStmt is the MySQL ANALYZE TABLE statement, including the +// histogram forms: ANALYZE TABLE t UPDATE HISTOGRAM ON c [WITH n BUCKETS] +// and ANALYZE TABLE t DROP HISTOGRAM ON c. +type AnalyzeTableStmt struct { + stmtNode + + TableNames []*TableName + PartitionNames []CIStr + AnalyzeOpts []AnalyzeOpt + + NoWriteToBinLog bool + // HistogramOperation is set in "ANALYZE TABLE ... UPDATE/DROP HISTOGRAM ..." statement. + HistogramOperation HistogramOperationType + // ColumnNames indicate the columns whose histograms are updated or dropped. + ColumnNames []CIStr + // HistogramUpdate is the MANUAL/AUTO UPDATE suffix of UPDATE HISTOGRAM (MySQL 8.4+). + HistogramUpdate HistogramUpdateType + // UsingData is set for UPDATE HISTOGRAM ... USING DATA 'json'; HistogramData + // holds the JSON payload. + UsingData bool + HistogramData string +} + +// AnalyzeOptionType is the type for analyze options. +type AnalyzeOptionType int + +// Analyze option types. +const ( + AnalyzeOptNumBuckets AnalyzeOptionType = iota +) + +// AnalyzeOptionString stores the string form of analyze options. +var AnalyzeOptionString = map[AnalyzeOptionType]string{ + AnalyzeOptNumBuckets: "BUCKETS", +} + +// HistogramUpdateType is the MANUAL/AUTO UPDATE suffix of UPDATE HISTOGRAM. +type HistogramUpdateType int + +// Histogram update types. +const ( + HistogramUpdateNop HistogramUpdateType = iota + HistogramUpdateManual + HistogramUpdateAuto +) + +// HistogramOperationType is the type for histogram operation. +type HistogramOperationType int + +// Histogram operation types. +const ( + // HistogramOperationNop shows no operation in histogram. Default value. + HistogramOperationNop HistogramOperationType = iota + HistogramOperationUpdate + HistogramOperationDrop +) + +// String implements fmt.Stringer for HistogramOperationType. +func (hot HistogramOperationType) String() string { + switch hot { //nolint:exhaustive + case HistogramOperationUpdate: + return "UPDATE HISTOGRAM" + case HistogramOperationDrop: + return "DROP HISTOGRAM" + } + return "" +} + +// AnalyzeOpt stores the analyze option type and value. +type AnalyzeOpt struct { + Type AnalyzeOptionType + Value *ValueExpr +} + +// Restore implements Node interface. +func (n *AnalyzeTableStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ANALYZE ") + if n.NoWriteToBinLog { + ctx.WriteKeyWord("NO_WRITE_TO_BINLOG ") + } + ctx.WriteKeyWord("TABLE ") + for i, table := range n.TableNames { + if i != 0 { + ctx.WritePlain(",") + } + if err := table.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore AnalyzeTableStmt.TableNames[%d]: %w", i, err) + } + } + if len(n.PartitionNames) != 0 { + ctx.WriteKeyWord(" PARTITION ") + } + for i, partition := range n.PartitionNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(partition.O) + } + if n.HistogramOperation != HistogramOperationNop { + ctx.WritePlain(" ") + ctx.WriteKeyWord(n.HistogramOperation.String()) + ctx.WritePlain(" ") + if len(n.ColumnNames) > 0 { + ctx.WriteKeyWord("ON ") + for i, columnName := range n.ColumnNames { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteName(columnName.O) + } + } + if n.UsingData { + ctx.WriteKeyWord(" USING DATA ") + ctx.WriteString(n.HistogramData) + } + } + if len(n.AnalyzeOpts) != 0 { + ctx.WriteKeyWord(" WITH") + for i, opt := range n.AnalyzeOpts { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WritePlainf(" %v ", opt.Value.GetValue()) + ctx.WritePlain(AnalyzeOptionString[opt.Type]) + } + } + switch n.HistogramUpdate { + case HistogramUpdateNop: + case HistogramUpdateManual: + ctx.WriteKeyWord(" MANUAL UPDATE") + case HistogramUpdateAuto: + ctx.WriteKeyWord(" AUTO UPDATE") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *AnalyzeTableStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AnalyzeTableStmt) + for i, val := range n.TableNames { + node, ok := val.Accept(v) + if !ok { + return n, false + } + n.TableNames[i] = node.(*TableName) + } + return v.Leave(n) +} diff --git a/pkg/parser/ast/tablespace.go b/pkg/parser/ast/tablespace.go new file mode 100644 index 000000000..fea89e3ad --- /dev/null +++ b/pkg/parser/ast/tablespace.go @@ -0,0 +1,342 @@ +// Copyright 2026 Block, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + + "github.com/block/spirit/pkg/parser/format" +) + +var ( + _ DDLNode = &CreateTablespaceStmt{} + _ DDLNode = &AlterTablespaceStmt{} + _ DDLNode = &DropTablespaceStmt{} + _ DDLNode = &CreateLogfileGroupStmt{} + _ DDLNode = &AlterLogfileGroupStmt{} + _ DDLNode = &DropLogfileGroupStmt{} +) + +// TablespaceOptionType is the type of a tablespace / logfile group option. +type TablespaceOptionType int + +// Tablespace option types. +const ( + TablespaceOptNone TablespaceOptionType = iota + TablespaceOptInitialSize + TablespaceOptMaxSize + TablespaceOptExtentSize + TablespaceOptAutoextendSize + TablespaceOptFileBlockSize + TablespaceOptUndoBufferSize + TablespaceOptRedoBufferSize + TablespaceOptNodegroup + TablespaceOptWait + TablespaceOptNoWait + TablespaceOptComment + TablespaceOptEncryption + TablespaceOptEngine + TablespaceOptEngineAttribute +) + +// TablespaceOption is a single tablespace / logfile group option. Size +// options keep either a raw numeric value (UintValue) or the identifier +// spelling like "10M" (StrValue), matching how they were written. +type TablespaceOption struct { + Tp TablespaceOptionType + StrValue string + UintValue uint64 +} + +// Restore implements Node interface. +func (n *TablespaceOption) Restore(ctx *format.RestoreCtx) error { + switch n.Tp { //nolint:exhaustive // TablespaceOptNone is invalid and hits the default error. + case TablespaceOptInitialSize: + ctx.WriteKeyWord("INITIAL_SIZE") + case TablespaceOptMaxSize: + ctx.WriteKeyWord("MAX_SIZE") + case TablespaceOptExtentSize: + ctx.WriteKeyWord("EXTENT_SIZE") + case TablespaceOptAutoextendSize: + ctx.WriteKeyWord("AUTOEXTEND_SIZE") + case TablespaceOptFileBlockSize: + ctx.WriteKeyWord("FILE_BLOCK_SIZE") + case TablespaceOptUndoBufferSize: + ctx.WriteKeyWord("UNDO_BUFFER_SIZE") + case TablespaceOptRedoBufferSize: + ctx.WriteKeyWord("REDO_BUFFER_SIZE") + case TablespaceOptNodegroup: + ctx.WriteKeyWord("NODEGROUP") + case TablespaceOptWait: + ctx.WriteKeyWord("WAIT") + return nil + case TablespaceOptNoWait: + ctx.WriteKeyWord("NO_WAIT") + return nil + case TablespaceOptComment: + ctx.WriteKeyWord("COMMENT") + case TablespaceOptEncryption: + ctx.WriteKeyWord("ENCRYPTION") + case TablespaceOptEngine: + ctx.WriteKeyWord("ENGINE") + case TablespaceOptEngineAttribute: + ctx.WriteKeyWord("ENGINE_ATTRIBUTE") + default: + return fmt.Errorf("invalid TablespaceOptionType: %d", n.Tp) + } + ctx.WritePlain(" = ") + switch n.Tp { //nolint:exhaustive // remaining options are numeric sizes handled by default + case TablespaceOptComment, TablespaceOptEncryption, TablespaceOptEngineAttribute: + ctx.WriteString(n.StrValue) + case TablespaceOptEngine: + ctx.WriteName(n.StrValue) + default: + if n.StrValue != "" { + ctx.WritePlain(n.StrValue) // e.g. 10M + } else { + ctx.WritePlainf("%d", n.UintValue) + } + } + return nil +} + +func restoreTablespaceOptions(ctx *format.RestoreCtx, options []*TablespaceOption) error { + for i, opt := range options { + ctx.WritePlain(" ") + if err := opt.Restore(ctx); err != nil { + return fmt.Errorf("an error occurred while restore TablespaceOption[%d]: %w", i, err) + } + } + return nil +} + +// CreateTablespaceStmt is a statement to create a tablespace. +// See https://dev.mysql.com/doc/refman/8.4/en/create-tablespace.html +type CreateTablespaceStmt struct { + ddlNode + + Undo bool + Name CIStr + DataFile string + HasDataFile bool + LogfileGroup CIStr // USE LOGFILE GROUP + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *CreateTablespaceStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE ") + if n.Undo { + ctx.WriteKeyWord("UNDO ") + } + ctx.WriteKeyWord("TABLESPACE ") + ctx.WriteName(n.Name.O) + if n.HasDataFile { + ctx.WriteKeyWord(" ADD DATAFILE ") + ctx.WriteString(n.DataFile) + } + if n.LogfileGroup.O != "" { + ctx.WriteKeyWord(" USE LOGFILE GROUP ") + ctx.WriteName(n.LogfileGroup.O) + } + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *CreateTablespaceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateTablespaceStmt) + return v.Leave(n) +} + +// AlterTablespaceActionType is the action of an ALTER [UNDO] TABLESPACE. +type AlterTablespaceActionType int + +// Alter tablespace actions. +const ( + AlterTablespaceOptionsOnly AlterTablespaceActionType = iota + AlterTablespaceAddDataFile + AlterTablespaceDropDataFile + AlterTablespaceRenameTo + AlterTablespaceSetActive + AlterTablespaceSetInactive +) + +// AlterTablespaceStmt is a statement to modify a tablespace. +// See https://dev.mysql.com/doc/refman/8.4/en/alter-tablespace.html +type AlterTablespaceStmt struct { + ddlNode + + Undo bool + Name CIStr + Action AlterTablespaceActionType + DataFile string + NewName CIStr + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *AlterTablespaceStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER ") + if n.Undo { + ctx.WriteKeyWord("UNDO ") + } + ctx.WriteKeyWord("TABLESPACE ") + ctx.WriteName(n.Name.O) + switch n.Action { + case AlterTablespaceOptionsOnly: + case AlterTablespaceAddDataFile: + ctx.WriteKeyWord(" ADD DATAFILE ") + ctx.WriteString(n.DataFile) + case AlterTablespaceDropDataFile: + ctx.WriteKeyWord(" DROP DATAFILE ") + ctx.WriteString(n.DataFile) + case AlterTablespaceRenameTo: + ctx.WriteKeyWord(" RENAME TO ") + ctx.WriteName(n.NewName.O) + case AlterTablespaceSetActive: + ctx.WriteKeyWord(" SET ACTIVE") + case AlterTablespaceSetInactive: + ctx.WriteKeyWord(" SET INACTIVE") + } + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *AlterTablespaceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterTablespaceStmt) + return v.Leave(n) +} + +// DropTablespaceStmt is a statement to drop a tablespace. +// See https://dev.mysql.com/doc/refman/8.4/en/drop-tablespace.html +type DropTablespaceStmt struct { + ddlNode + + Undo bool + Name CIStr + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *DropTablespaceStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP ") + if n.Undo { + ctx.WriteKeyWord("UNDO ") + } + ctx.WriteKeyWord("TABLESPACE ") + ctx.WriteName(n.Name.O) + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *DropTablespaceStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropTablespaceStmt) + return v.Leave(n) +} + +// CreateLogfileGroupStmt is a statement to create a logfile group (NDB). +// See https://dev.mysql.com/doc/refman/8.4/en/create-logfile-group.html +type CreateLogfileGroupStmt struct { + ddlNode + + Name CIStr + UndoFile string + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *CreateLogfileGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("CREATE LOGFILE GROUP ") + ctx.WriteName(n.Name.O) + ctx.WriteKeyWord(" ADD UNDOFILE ") + ctx.WriteString(n.UndoFile) + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *CreateLogfileGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*CreateLogfileGroupStmt) + return v.Leave(n) +} + +// AlterLogfileGroupStmt is a statement to add an undofile to a logfile group. +// See https://dev.mysql.com/doc/refman/8.4/en/alter-logfile-group.html +type AlterLogfileGroupStmt struct { + ddlNode + + Name CIStr + UndoFile string + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *AlterLogfileGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ALTER LOGFILE GROUP ") + ctx.WriteName(n.Name.O) + ctx.WriteKeyWord(" ADD UNDOFILE ") + ctx.WriteString(n.UndoFile) + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *AlterLogfileGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*AlterLogfileGroupStmt) + return v.Leave(n) +} + +// DropLogfileGroupStmt is a statement to drop a logfile group (NDB). +// See https://dev.mysql.com/doc/refman/8.4/en/drop-logfile-group.html +type DropLogfileGroupStmt struct { + ddlNode + + Name CIStr + Options []*TablespaceOption +} + +// Restore implements Node interface. +func (n *DropLogfileGroupStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("DROP LOGFILE GROUP ") + ctx.WriteName(n.Name.O) + return restoreTablespaceOptions(ctx, n.Options) +} + +// Accept implements Node Accept interface. +func (n *DropLogfileGroupStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*DropLogfileGroupStmt) + return v.Leave(n) +} diff --git a/pkg/parser/ast/value_expr.go b/pkg/parser/ast/value_expr.go new file mode 100644 index 000000000..300c80358 --- /dev/null +++ b/pkg/parser/ast/value_expr.go @@ -0,0 +1,170 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "fmt" + "strconv" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" +) + +var _ ExprNode = &ValueExpr{} + +// NewDecimal parses a string into a MyDecimal value. +func NewDecimal(str string) (*MyDecimal, error) { + dec := new(MyDecimal) + err := dec.FromString([]byte(str)) + return dec, err +} + +// ValueExpr is the simple value expression. +type ValueExpr struct { + exprNode + Datum + projectionOffset int +} + +// Restore implements Node interface. +func (n *ValueExpr) Restore(ctx *format.RestoreCtx) error { + switch n.Kind() { + case KindNull: + ctx.WriteKeyWord("NULL") + case KindInt64: + if n.Type.GetFlag()&mysql.IsBooleanFlag != 0 { + if n.GetInt64() > 0 { + ctx.WriteKeyWord("TRUE") + } else { + ctx.WriteKeyWord("FALSE") + } + } else { + ctx.WritePlain(strconv.FormatInt(n.GetInt64(), 10)) + } + case KindUint64: + ctx.WritePlain(strconv.FormatUint(n.GetUint64(), 10)) + case KindFloat32: + ctx.WritePlain(strconv.FormatFloat(n.GetFloat64(), 'e', -1, 32)) + case KindFloat64: + ctx.WritePlain(strconv.FormatFloat(n.GetFloat64(), 'e', -1, 64)) + case KindString: + if n.Type.GetCharset() != "" && + !ctx.Flags.HasStringWithoutCharset() && + (!ctx.Flags.HasStringWithoutDefaultCharset() || n.Type.GetCharset() != mysql.DefaultCharset) { + ctx.WritePlain("_") + ctx.WriteKeyWord(n.Type.GetCharset()) + } + ctx.WriteString(n.GetString()) + case KindBytes: + ctx.WriteString(n.GetString()) + case KindMysqlDecimal: + ctx.WritePlain(n.GetMysqlDecimal().String()) + case KindBinaryLiteral: + if n.Type.GetCharset() != "" && n.Type.GetCharset() != mysql.DefaultCharset && + !ctx.Flags.HasStringWithoutCharset() && + n.Type.GetCharset() != charset.CharsetBin { + ctx.WritePlain("_") + ctx.WriteKeyWord(n.Type.GetCharset() + " ") + } + if n.Type.GetFlag()&mysql.UnsignedFlag != 0 { + ctx.WritePlainf("x'%x'", n.GetBytes()) + } else { + ctx.WritePlain(n.GetBinaryLiteral().ToBitLiteralString(true)) + } + case KindMysqlDuration, KindMysqlEnum, + KindMysqlBit, KindMysqlSet, KindMysqlTime, + KindInterface, KindMinNotNull, KindMaxValue, + KindRaw, KindMysqlJSON: + // TODO implement Restore function + return fmt.Errorf("not implemented") + default: + return fmt.Errorf("can't format to string") + } + return nil +} + +// GetDatumString returns the string value of the datum. +func (n *ValueExpr) GetDatumString() string { + return n.GetString() +} + +// NewValueExpr creates a ValueExpr with value, and sets default field type. +func NewValueExpr(value any, charset string, collate string) *ValueExpr { + if ve, ok := value.(*ValueExpr); ok { + return ve + } + ve := &ValueExpr{} + ve.SetValue(value) + DefaultTypeForValue(value, &ve.Type, charset, collate) + ve.projectionOffset = -1 + return ve +} + +// SetProjectionOffset sets ValueExpr.projectionOffset for logical plan builder. +func (n *ValueExpr) SetProjectionOffset(offset int) { + n.projectionOffset = offset +} + +// GetProjectionOffset returns ValueExpr.projectionOffset. +func (n *ValueExpr) GetProjectionOffset() int { + return n.projectionOffset +} + +// Accept implements Node interface. +func (n *ValueExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ValueExpr) + return v.Leave(n) +} + +// ParamMarkerExpr expression holds a place for another expression. +// Used in parsing prepare statement. +type ParamMarkerExpr struct { + ValueExpr + Offset int + Order int + InExecute bool +} + +// Restore implements Node interface. +func (n *ParamMarkerExpr) Restore(ctx *format.RestoreCtx) error { + ctx.WritePlain("?") + return nil +} + +// NewParamMarkerExpr creates a ParamMarkerExpr. +func NewParamMarkerExpr(offset int) *ParamMarkerExpr { + return &ParamMarkerExpr{ + Offset: offset, + } +} + +// Accept implements Node Accept interface. +func (n *ParamMarkerExpr) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*ParamMarkerExpr) + return v.Leave(n) +} + +// SetOrder sets the order of the parameter marker. +func (n *ParamMarkerExpr) SetOrder(order int) { + n.Order = order +} diff --git a/pkg/parser/ast/xa.go b/pkg/parser/ast/xa.go new file mode 100644 index 000000000..5d8c4d642 --- /dev/null +++ b/pkg/parser/ast/xa.go @@ -0,0 +1,127 @@ +// Copyright 2026 Block, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package ast + +import ( + "github.com/block/spirit/pkg/parser/format" +) + +var _ StmtNode = &XAStmt{} + +// XAOpType is the operation of an XA statement. +type XAOpType int + +// XA operations. +const ( + XAOpStart XAOpType = iota // XA {START|BEGIN} + XAOpEnd + XAOpPrepare + XAOpCommit + XAOpRollback + XAOpRecover +) + +// XAXid is the xid of an XA statement: gtrid [, bqual [, formatID]]. +// The gtrid and bqual are byte strings; NParts records how many parts were +// written so restore preserves the original shape. +type XAXid struct { + GTRID string + BQual string + FormatID uint64 + NParts int +} + +// Restore implements Node interface. +func (x *XAXid) Restore(ctx *format.RestoreCtx) error { + ctx.WriteString(x.GTRID) + if x.NParts >= 2 { + ctx.WritePlain(", ") + ctx.WriteString(x.BQual) + } + if x.NParts >= 3 { + ctx.WritePlainf(", %d", x.FormatID) + } + return nil +} + +// XAStmt is an XA transaction control statement. spirit does not support XA +// workloads (they binlog in ways the replication client cannot apply +// consistently), but the parser must recognize them so pkg/change can refuse +// them cleanly instead of failing to parse. +// See https://dev.mysql.com/doc/refman/8.4/en/xa-statements.html +type XAStmt struct { + stmtNode + + Op XAOpType + Xid *XAXid // nil for XA RECOVER + + Join bool // XA START ... JOIN + Resume bool // XA START ... RESUME + Suspend bool // XA END ... SUSPEND + ForMigrate bool // XA END ... SUSPEND FOR MIGRATE + OnePhase bool // XA COMMIT ... ONE PHASE + ConvertXid bool // XA RECOVER CONVERT XID +} + +// Restore implements Node interface. +func (n *XAStmt) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("XA ") + switch n.Op { + case XAOpStart: + ctx.WriteKeyWord("START ") + case XAOpEnd: + ctx.WriteKeyWord("END ") + case XAOpPrepare: + ctx.WriteKeyWord("PREPARE ") + case XAOpCommit: + ctx.WriteKeyWord("COMMIT ") + case XAOpRollback: + ctx.WriteKeyWord("ROLLBACK ") + case XAOpRecover: + ctx.WriteKeyWord("RECOVER") + if n.ConvertXid { + ctx.WriteKeyWord(" CONVERT XID") + } + return nil + } + if err := n.Xid.Restore(ctx); err != nil { + return err + } + if n.Join { + ctx.WriteKeyWord(" JOIN") + } + if n.Resume { + ctx.WriteKeyWord(" RESUME") + } + if n.Suspend { + ctx.WriteKeyWord(" SUSPEND") + if n.ForMigrate { + ctx.WriteKeyWord(" FOR MIGRATE") + } + } + if n.OnePhase { + ctx.WriteKeyWord(" ONE PHASE") + } + return nil +} + +// Accept implements Node Accept interface. +func (n *XAStmt) Accept(v Visitor) (Node, bool) { + newNode, skipChildren := v.Enter(n) + if skipChildren { + return v.Leave(newNode) + } + n = newNode.(*XAStmt) + return v.Leave(n) +} diff --git a/pkg/parser/auth/auth.go b/pkg/parser/auth/auth.go new file mode 100644 index 000000000..675092f68 --- /dev/null +++ b/pkg/parser/auth/auth.go @@ -0,0 +1,95 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package auth + +import ( + "fmt" + + "github.com/block/spirit/pkg/parser/format" +) + +const ( + // UserNameMaxLength is the max length of username. + UserNameMaxLength = 32 + // HostNameMaxLength is the max length of host name. + HostNameMaxLength = 255 +) + +// UserIdentity represents username and hostname. +type UserIdentity struct { + Username string + Hostname string + CurrentUser bool + AuthUsername string // Username matched in privileges system + AuthHostname string // Match in privs system (i.e. could be a wildcard) + AuthPlugin string // The plugin specified in handshake, only used during authentication. +} + +// Restore implements Node interface. +func (user *UserIdentity) Restore(ctx *format.RestoreCtx) error { + if user.CurrentUser { + ctx.WriteKeyWord("CURRENT_USER") + } else { + ctx.WriteName(user.Username) + ctx.WritePlain("@") + ctx.WriteName(user.Hostname) + } + return nil +} + +// String converts UserIdentity to the format user@host. +// It defaults to providing the AuthIdentity (the matching entry in priv tables) +// To use the actual identity use LoginString() +func (user *UserIdentity) String() string { + // TODO: Escape username and hostname. + if user == nil { + return "" + } + if user.AuthUsername != "" { + return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) + } + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) +} + +// LoginString returns matched identity in user@host format +// It matches the login user. +func (user *UserIdentity) LoginString() string { + // TODO: Escape username and hostname. + if user == nil { + return "" + } + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) +} + +// RoleIdentity represents a role name. +type RoleIdentity struct { + Username string + Hostname string +} + +// Restore implements Node interface. +func (role *RoleIdentity) Restore(ctx *format.RestoreCtx) error { + ctx.WriteName(role.Username) + if role.Hostname != "" { + ctx.WritePlain("@") + ctx.WriteName(role.Hostname) + } + return nil +} + +// String converts UserIdentity to the format user@host. +func (role *RoleIdentity) String() string { + // TODO: Escape username and hostname. + return fmt.Sprintf("`%s`@`%s`", role.Username, role.Hostname) +} diff --git a/pkg/parser/bench_test.go b/pkg/parser/bench_test.go new file mode 100644 index 000000000..8057b9fa3 --- /dev/null +++ b/pkg/parser/bench_test.go @@ -0,0 +1,66 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" +) + +func BenchmarkSysbenchSelect(b *testing.B) { + parser := New() + sql := "SELECT pad FROM sbtest1 WHERE id=1;" + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _, err := parser.Parse(sql, "", "") + if err != nil { + b.Fatal(err) + } + } + b.ReportAllocs() +} + +func BenchmarkParseComplex(b *testing.B) { + var table = []string{ + `SELECT DISTINCT ca.l9_convergence_code AS atb2, cu.cust_sub_type AS account_type, cst.description AS account_type_desc, ss.prim_resource_val AS msisdn, ca.ban AS ban_key, To_char(mo.memo_date, 'YYYYMMDD') AS memo_date, cu.l9_identification AS thai_id, ss.subscriber_no AS subs_key, ss.dealer_code AS shop_code, cd.description AS shop_name, mot.short_desc, Regexp_substr(mo.attr1value, '[^ ;]+', 1, 3) staff_id, mo.operator_id AS user_id, mo.memo_system_text, co2.soc_name AS first_socname, co3.soc_name AS previous_socname, co.soc_name AS current_socname, Regexp_substr(mo.attr1value, '[^ ; ]+', 1, 1) NAME, co.soc_description AS current_pp_desc, co3.soc_description AS prev_pp_desc, co.soc_cd AS soc_cd, ( SELECT Sum(br.amount) FROM bl1_rc_rates BR, customer CU, subscriber SS WHERE br.service_receiver_id = ss.subscriber_no AND br.receiver_customer = ss.customer_id AND br.effective_date <= br.expiration_date AND (( ss. sub_status <> 'C' AND ss. sub_status <> 'T' AND br.expiration_date IS NULL) OR ( ss. sub_status = 'C' AND br.expiration_date LIKE ss.effective_date)) AND br.pp_ind = 'Y' AND br.cycle_code = cu.bill_cycle) AS pp_rate, cu.bill_cycle AS cycle_code, To_char(Nvl(ss.l9_tmv_act_date, ss.init_act_date),'YYYYMMDD') AS activated_date, To_char(cd.effective_date, 'YYYYMMDD') AS shop_effective_date, cd.expiration_date AS shop_expired_date, ca.l9_company_code AS company_code FROM service_details S, product CO, csm_pay_channel CPC, account CA, subscriber SS, customer CU, customer_sub_type CST, csm_dealer CD, service_details S2, product CO2, service_details S3, product CO3, memo MO , memo_type MOT, logical_date LO, charge_details CHD WHERE ss.subscriber_no = chd.agreement_no AND cpc.pym_channel_no = chd.target_pcn AND chd.chg_split_type = 'DR' AND chd.expiration_date IS NULL AND s.soc = co.soc_cd AND co.soc_type = 'P' AND s.agreement_no = ss.subscriber_no AND ss.prim_resource_tp = 'C' AND cpc.payment_category = 'POST' AND ca.ban = cpc.ban AND ( ca.l9_company_code = 'RF' OR ca.l9_company_code = 'RM' OR ca.l9_company_code = 'TM') AND ss.customer_id = cu.customer_id AND cu.cust_sub_type = cst.cust_sub_type AND cu.customer_type = cst.customer_type AND ss.dealer_code = cd.dealer AND s2.effective_date= ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s2.agreement_no = s.agreement_no AND s2.soc = co2.soc_cd AND co2.soc_type = 'P' AND s2.effective_date = ( SELECT Min(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co2.soc_cd = sa1.soc AND co.soc_type = 'P' ) AND s3.agreement_no = s.agreement_no AND s3.soc = co3.soc_cd AND co3.soc_type = 'P' AND s3.effective_date = ( SELECT Max(sa1.effective_date) FROM service_details SA1, a product o1 WHERE sa1.agreement_no = ss.subscriber_no AND sa1.effective_date < ( SELECT Max(sa1.effective_date) FROM service_details SA1, product o1 WHERE sa1.agreement_no = ss.subscriber_no AND co3.soc_cd = sa1.soc AND co3.soc_type = 'P' ) AND co3.soc_cd = sa1.soc AND o1.soc_type = 'P' ) AND mo.entity_id = ss.subscriber_no AND mo.entity_type_id = 6 AND mo.memo_type_id = mot.memo_type_id AND Trunc(mo.sys_creation_date) = ( SELECT Trunc(lo.logical_date - 1) FROM lo) trunc(lo.logical_date - 1) AND lo.expiration_date IS NULL AND lo.logical_date_type = 'B' AND lo.expiration_date IS NULL AND ( mot.short_desc = 'BCN' OR mot.short_desc = 'BCNM' )`} + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} + +func BenchmarkParseSimple(b *testing.B) { + var table = []string{ + "insert into t values (1), (2), (3)", + "insert into t values (4), (5), (6), (7)", + "select c from t where c > 2", + } + parser := New() + b.ResetTimer() + for i := 0; i < b.N; i++ { + for _, v := range table { + _, _, err := parser.Parse(v, "", "") + if err != nil { + b.Failed() + } + } + } + b.ReportAllocs() +} diff --git a/pkg/parser/binlog_stmt_gaps_test.go b/pkg/parser/binlog_stmt_gaps_test.go new file mode 100644 index 000000000..05329e82d --- /dev/null +++ b/pkg/parser/binlog_stmt_gaps_test.go @@ -0,0 +1,172 @@ +// Copyright 2026 Block, Inc. + +package parser_test + +import ( + "testing" +) + +// These statements are all valid MySQL that can appear in the binary log as +// Query events; spirit's pkg/change must be able to parse them. + +func TestRepairTable(t *testing.T) { + table := []testCase{ + {"REPAIR TABLE t1", true, "REPAIR TABLE `t1`"}, + {"repair tables t1, t2", true, "REPAIR TABLE `t1`, `t2`"}, + {"REPAIR NO_WRITE_TO_BINLOG TABLE t1 QUICK EXTENDED USE_FRM", true, "REPAIR NO_WRITE_TO_BINLOG TABLE `t1` QUICK EXTENDED USE_FRM"}, + {"REPAIR LOCAL TABLE t1 USE_FRM", true, "REPAIR NO_WRITE_TO_BINLOG TABLE `t1` USE_FRM"}, + {"REPAIR TABLE t1 EXTENDED QUICK", true, "REPAIR TABLE `t1` QUICK EXTENDED"}, + {"REPAIR TABLE", false, ""}, + } + RunTest(t, table, false) +} + +func TestRenameTables(t *testing.T) { + table := []testCase{ + {"RENAME TABLES t1 TO t2", true, "RENAME TABLE `t1` TO `t2`"}, + {"RENAME TABLES t1 TO t2, t3 TO t4", true, "RENAME TABLE `t1` TO `t2`, `t3` TO `t4`"}, + } + RunTest(t, table, false) +} + +func TestAnalyzeTableHistograms(t *testing.T) { + table := []testCase{ + {"ANALYZE TABLES t1, t2", true, "ANALYZE TABLE `t1`,`t2`"}, + {"ANALYZE TABLE t UPDATE HISTOGRAM ON c1, c2 WITH 8 BUCKETS", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c1`,`c2` WITH 8 BUCKETS"}, + {"ANALYZE TABLE t UPDATE HISTOGRAM ON c WITH 4 BUCKETS AUTO UPDATE", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c` WITH 4 BUCKETS AUTO UPDATE"}, + {"ANALYZE TABLE t UPDATE HISTOGRAM ON c AUTO UPDATE", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c` AUTO UPDATE"}, + {"ANALYZE TABLE t UPDATE HISTOGRAM ON c MANUAL UPDATE", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c` MANUAL UPDATE"}, + {`ANALYZE TABLE t UPDATE HISTOGRAM ON c USING DATA '{"histogram": {}}'`, true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c` USING DATA '{\"histogram\": {}}'"}, + {"ANALYZE TABLE t DROP HISTOGRAM ON c", true, "ANALYZE TABLE `t` DROP HISTOGRAM ON `c`"}, + } + RunTest(t, table, false) +} + +func TestTransactionSpellings(t *testing.T) { + table := []testCase{ + {"BEGIN WORK", true, "START TRANSACTION"}, + {"COMMIT WORK", true, "COMMIT"}, + {"ROLLBACK WORK", true, "ROLLBACK"}, + {"COMMIT WORK AND CHAIN", true, "COMMIT AND CHAIN"}, + {"ROLLBACK WORK AND NO CHAIN NO RELEASE", true, "ROLLBACK"}, + {"ROLLBACK WORK TO SAVEPOINT sp1", true, "ROLLBACK TO sp1"}, + {"ROLLBACK WORK TO sp1", true, "ROLLBACK TO sp1"}, + {"START TRANSACTION READ ONLY, WITH CONSISTENT SNAPSHOT", true, "START TRANSACTION READ ONLY"}, + {"START TRANSACTION WITH CONSISTENT SNAPSHOT, READ WRITE", true, "START TRANSACTION"}, + {"START TRANSACTION WITH CONSISTENT SNAPSHOT, READ ONLY", true, "START TRANSACTION READ ONLY"}, + } + RunTest(t, table, false) +} + +func TestFlushOptions(t *testing.T) { + table := []testCase{ + {"FLUSH USER_RESOURCES", true, "FLUSH USER_RESOURCES"}, + {"FLUSH OPTIMIZER_COSTS", true, "FLUSH OPTIMIZER_COSTS"}, + {"FLUSH LOCAL OPTIMIZER_COSTS", true, "FLUSH NO_WRITE_TO_BINLOG OPTIMIZER_COSTS"}, + {"FLUSH RELAY LOGS", true, "FLUSH RELAY LOGS"}, + {"FLUSH RELAY LOGS FOR CHANNEL 'group_replication_applier'", true, "FLUSH RELAY LOGS FOR CHANNEL 'group_replication_applier'"}, + {"FLUSH TABLES t1 FOR EXPORT", true, "FLUSH TABLES `t1` FOR EXPORT"}, + {"FLUSH TABLES t1, t2 WITH READ LOCK", true, "FLUSH TABLES `t1`, `t2` WITH READ LOCK"}, + } + RunTest(t, table, false) +} + +func TestAlterDatabaseReadOnly(t *testing.T) { + table := []testCase{ + {"ALTER DATABASE d READ ONLY = 1", true, "ALTER DATABASE `d` READ ONLY = 1"}, + {"ALTER DATABASE d READ ONLY 0", true, "ALTER DATABASE `d` READ ONLY = 0"}, + {"ALTER DATABASE d READ ONLY = DEFAULT", true, "ALTER DATABASE `d` READ ONLY = DEFAULT"}, + {"ALTER DATABASE READ ONLY = 1", true, "ALTER DATABASE READ ONLY = 1"}, + {"ALTER SCHEMA d READ ONLY = 1 CHARACTER SET = utf8mb4", true, "ALTER DATABASE `d` READ ONLY = 1 CHARACTER SET = utf8mb4"}, + } + RunTest(t, table, false) +} + +func TestAlterView(t *testing.T) { + table := []testCase{ + {"ALTER VIEW v AS SELECT * FROM t", true, "ALTER ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, + {"ALTER ALGORITHM = MERGE DEFINER = u@h SQL SECURITY INVOKER VIEW v (a, b) AS SELECT a, b FROM t WITH LOCAL CHECK OPTION", true, "ALTER ALGORITHM = MERGE DEFINER = `u`@`h` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS SELECT `a`,`b` FROM `t` WITH LOCAL CHECK OPTION"}, + {"ALTER VIEW v AS", false, ""}, + } + RunTest(t, table, false) +} + +func TestXAStatements(t *testing.T) { + table := []testCase{ + {"XA START 'gtrid'", true, "XA START 'gtrid'"}, + {"XA BEGIN 'gtrid'", true, "XA START 'gtrid'"}, + {"XA START 'g', 'b'", true, "XA START 'g', 'b'"}, + {"XA START 'g', 'b', 12", true, "XA START 'g', 'b', 12"}, + {"XA START X'41', X'42', 1", true, "XA START 'A', 'B', 1"}, + {"XA START 0x7465737462, 0x2030405060, 0xb", true, "XA START 'testb', ' 0@P`', 11"}, + {"XA START 'g' JOIN", true, "XA START 'g' JOIN"}, + {"XA START 'g' RESUME", true, "XA START 'g' RESUME"}, + {"XA END 'g'", true, "XA END 'g'"}, + {"XA END 'g' SUSPEND", true, "XA END 'g' SUSPEND"}, + {"XA END 'g' SUSPEND FOR MIGRATE", true, "XA END 'g' SUSPEND FOR MIGRATE"}, + {"XA PREPARE 'g'", true, "XA PREPARE 'g'"}, + {"XA COMMIT 'g'", true, "XA COMMIT 'g'"}, + {"XA COMMIT 'g' ONE PHASE", true, "XA COMMIT 'g' ONE PHASE"}, + {"XA ROLLBACK 'g'", true, "XA ROLLBACK 'g'"}, + {"XA RECOVER", true, "XA RECOVER"}, + {"XA RECOVER CONVERT XID", true, "XA RECOVER CONVERT XID"}, + {"XA START", false, ""}, + } + RunTest(t, table, false) +} + +func TestSpatialReferenceSystem(t *testing.T) { + table := []testCase{ + {`CREATE SPATIAL REFERENCE SYSTEM 4120 NAME 'Bessel' DEFINITION 'GEOGCS[]'`, true, "CREATE SPATIAL REFERENCE SYSTEM 4120 NAME 'Bessel' DEFINITION 'GEOGCS[]'"}, + {`CREATE OR REPLACE SPATIAL REFERENCE SYSTEM 4120 ORGANIZATION 'EPSG' IDENTIFIED BY 4120 DESCRIPTION 'd' NAME 'n' DEFINITION 'def'`, true, "CREATE OR REPLACE SPATIAL REFERENCE SYSTEM 4120 ORGANIZATION 'EPSG' IDENTIFIED BY 4120 DESCRIPTION 'd' NAME 'n' DEFINITION 'def'"}, + {`CREATE SPATIAL REFERENCE SYSTEM IF NOT EXISTS 4120 NAME 'n' DEFINITION 'def'`, true, "CREATE SPATIAL REFERENCE SYSTEM IF NOT EXISTS 4120 NAME 'n' DEFINITION 'def'"}, + {"DROP SPATIAL REFERENCE SYSTEM 4120", true, "DROP SPATIAL REFERENCE SYSTEM 4120"}, + {"DROP SPATIAL REFERENCE SYSTEM IF EXISTS 4120", true, "DROP SPATIAL REFERENCE SYSTEM IF EXISTS 4120"}, + // unrelated statements starting with the same tokens still parse + {"CREATE SPATIAL INDEX idx ON t (g)", true, "CREATE SPATIAL INDEX `idx` ON `t` (`g`)"}, + } + RunTest(t, table, false) +} + +func TestTablespaceDDL(t *testing.T) { + table := []testCase{ + {"CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd'", true, "CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd'"}, + {"CREATE TABLESPACE ts1", true, "CREATE TABLESPACE `ts1`"}, + {"CREATE TABLESPACE ts1 ADD DATAFILE 'f' ENGINE = InnoDB", true, "CREATE TABLESPACE `ts1` ADD DATAFILE 'f' ENGINE = `InnoDB`"}, + {"CREATE TABLESPACE ts1 ADD DATAFILE 'f' FILE_BLOCK_SIZE = 8192 ENCRYPTION = 'Y'", true, "CREATE TABLESPACE `ts1` ADD DATAFILE 'f' FILE_BLOCK_SIZE = 8192 ENCRYPTION = 'Y'"}, + {"CREATE TABLESPACE ts1 ADD DATAFILE 'f' USE LOGFILE GROUP lg1 EXTENT_SIZE 4M INITIAL_SIZE 12M ENGINE NDB", true, "CREATE TABLESPACE `ts1` ADD DATAFILE 'f' USE LOGFILE GROUP `lg1` EXTENT_SIZE = 4M INITIAL_SIZE = 12M ENGINE = `NDB`"}, + {"CREATE UNDO TABLESPACE u1 ADD DATAFILE 'u1.ibu'", true, "CREATE UNDO TABLESPACE `u1` ADD DATAFILE 'u1.ibu'"}, + {"ALTER TABLESPACE ts1 ADD DATAFILE 'f2' INITIAL_SIZE = 1G WAIT", true, "ALTER TABLESPACE `ts1` ADD DATAFILE 'f2' INITIAL_SIZE = 1G WAIT"}, + {"ALTER TABLESPACE ts1 DROP DATAFILE 'f2' ENGINE NDB", true, "ALTER TABLESPACE `ts1` DROP DATAFILE 'f2' ENGINE = `NDB`"}, + {"ALTER TABLESPACE ts1 RENAME TO ts2", true, "ALTER TABLESPACE `ts1` RENAME TO `ts2`"}, + {"ALTER TABLESPACE ts1 AUTOEXTEND_SIZE = 64M", true, "ALTER TABLESPACE `ts1` AUTOEXTEND_SIZE = 64M"}, + {"ALTER UNDO TABLESPACE u1 SET INACTIVE", true, "ALTER UNDO TABLESPACE `u1` SET INACTIVE"}, + {"ALTER UNDO TABLESPACE u1 SET ACTIVE ENGINE = InnoDB", true, "ALTER UNDO TABLESPACE `u1` SET ACTIVE ENGINE = `InnoDB`"}, + {"DROP TABLESPACE ts1", true, "DROP TABLESPACE `ts1`"}, + {"DROP TABLESPACE ts1 ENGINE = NDB", true, "DROP TABLESPACE `ts1` ENGINE = `NDB`"}, + {"DROP UNDO TABLESPACE u1", true, "DROP UNDO TABLESPACE `u1`"}, + {"CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' UNDO_BUFFER_SIZE = 8M ENGINE = NDB", true, "CREATE LOGFILE GROUP `lg1` ADD UNDOFILE 'undo.dat' UNDO_BUFFER_SIZE = 8M ENGINE = `NDB`"}, + {"ALTER LOGFILE GROUP lg1 ADD UNDOFILE 'undo2.dat' INITIAL_SIZE 4M WAIT ENGINE NDB", true, "ALTER LOGFILE GROUP `lg1` ADD UNDOFILE 'undo2.dat' INITIAL_SIZE = 4M WAIT ENGINE = `NDB`"}, + {"DROP LOGFILE GROUP lg1 ENGINE = NDB", true, "DROP LOGFILE GROUP `lg1` ENGINE = `NDB`"}, + {"CREATE TABLESPACE ts1 ADD DATAFILE 'f' INITIAL_SIZE = 12M, MAX_SIZE = 100M, NODEGROUP = 3, NO_WAIT", true, "CREATE TABLESPACE `ts1` ADD DATAFILE 'f' INITIAL_SIZE = 12M MAX_SIZE = 100M NODEGROUP = 3 NO_WAIT"}, + } + RunTest(t, table, false) +} + +func TestAlterInstance(t *testing.T) { + table := []testCase{ + {"ALTER INSTANCE RELOAD TLS", true, "ALTER INSTANCE RELOAD TLS"}, + {"ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR", true, "ALTER INSTANCE RELOAD TLS NO ROLLBACK ON ERROR"}, + {"ALTER INSTANCE RELOAD TLS FOR CHANNEL mysql_admin", true, "ALTER INSTANCE RELOAD TLS FOR CHANNEL `mysql_admin`"}, + {"ALTER INSTANCE RELOAD TLS FOR CHANNEL mysql_main NO ROLLBACK ON ERROR", true, "ALTER INSTANCE RELOAD TLS FOR CHANNEL `mysql_main` NO ROLLBACK ON ERROR"}, + {"ALTER INSTANCE ROTATE INNODB MASTER KEY", true, "ALTER INSTANCE ROTATE INNODB MASTER KEY"}, + {"ALTER INSTANCE ROTATE BINLOG MASTER KEY", true, "ALTER INSTANCE ROTATE BINLOG MASTER KEY"}, + {"ALTER INSTANCE ROTATE innodb master key", true, "ALTER INSTANCE ROTATE INNODB MASTER KEY"}, + {"ALTER INSTANCE ENABLE INNODB REDO_LOG", true, "ALTER INSTANCE ENABLE INNODB REDO_LOG"}, + {"ALTER INSTANCE DISABLE INNODB REDO_LOG", true, "ALTER INSTANCE DISABLE INNODB REDO_LOG"}, + {"ALTER INSTANCE RELOAD KEYRING", true, "ALTER INSTANCE RELOAD KEYRING"}, + {"ALTER INSTANCE ROTATE FOO MASTER KEY", false, ""}, + {"ALTER INSTANCE ENABLE FOO REDO_LOG", false, ""}, + } + RunTest(t, table, false) +} diff --git a/pkg/parser/charset/charset.go b/pkg/parser/charset/charset.go new file mode 100644 index 000000000..f085463b5 --- /dev/null +++ b/pkg/parser/charset/charset.go @@ -0,0 +1,559 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "fmt" + "strings" + + "github.com/block/spirit/pkg/parser/mysql" +) + +var ( + // ErrUnknownCollation is unknown collation. + ErrUnknownCollation = mysql.NewStdErr("ddl", mysql.ErrUnknownCollation) + // ErrCollationCharsetMismatch is collation charset mismatch. + ErrCollationCharsetMismatch = mysql.NewStdErr("ddl", mysql.ErrCollationCharsetMismatch) +) + +var ( + // PadSpace is to mark that trailing spaces are insignificant in comparisons + PadSpace = "PAD SPACE" + // PadNone is to mark that trailing spaces are significant in comparisons + PadNone = "NO PAD" +) + +// Charset is a charset. +// Now we only support MySQL. +type Charset struct { + Name string + DefaultCollation string + Collations map[string]*Collation + Desc string + Maxlen int +} + +// Collation is a collation. +// Now we only support MySQL. +type Collation struct { + ID int + CharsetName string + Name string + IsDefault bool + Sortlen int + PadAttribute string +} + +var collationsNameMap = make(map[string]*Collation) + +// CharacterSetInfos contains all the supported charsets. +var CharacterSetInfos = map[string]*Charset{ + CharsetUTF8: {CharsetUTF8, CollationUTF8, make(map[string]*Collation), "UTF-8 Unicode", 3}, + CharsetUTF8MB4: {CharsetUTF8MB4, CollationUTF8MB4, make(map[string]*Collation), "UTF-8 Unicode", 4}, + CharsetASCII: {CharsetASCII, CollationASCII, make(map[string]*Collation), "US ASCII", 1}, + CharsetLatin1: {CharsetLatin1, CollationLatin1, make(map[string]*Collation), "Latin1", 1}, + CharsetBin: {CharsetBin, CollationBin, make(map[string]*Collation), "binary", 1}, + CharsetGBK: {CharsetGBK, CollationGBKBin, make(map[string]*Collation), "Chinese Internal Code Specification", 2}, + CharsetGB18030: {CharsetGB18030, CollationGB18030Bin, make(map[string]*Collation), "China National Standard GB18030", 4}, +} + +// ValidCharsetAndCollation checks the charset and the collation validity +// and returns a boolean. +func ValidCharsetAndCollation(cs string, co string) bool { + // We will use utf8 as a default charset. + if cs == "" || cs == CharsetUTF8MB3 { + cs = CharsetUTF8 + } + chs, err := GetCharsetInfo(cs) + if err != nil { + return false + } + + if co == "" { + return true + } + co = utf8Alias(strings.ToLower(co)) + _, ok := chs.Collations[co] + return ok +} + +// GetDefaultCollationLegacy is compatible with the charset support in old version parser. +func GetDefaultCollationLegacy(charset string) (string, error) { + switch strings.ToLower(charset) { + case CharsetUTF8MB3: + return GetDefaultCollation(CharsetUTF8) + case CharsetUTF8, CharsetUTF8MB4, CharsetASCII, CharsetLatin1, CharsetBin: + return GetDefaultCollation(charset) + default: + return "", fmt.Errorf("unknown charset %s", charset) + } +} + +// GetDefaultCollation returns the default collation for charset. +func GetDefaultCollation(charset string) (string, error) { + cs, err := GetCharsetInfo(charset) + if err != nil { + return "", err + } + return cs.DefaultCollation, nil +} + +// GetCharsetInfo returns charset and collation for cs as name. +func GetCharsetInfo(cs string) (*Charset, error) { + if strings.ToLower(cs) == CharsetUTF8MB3 { + cs = CharsetUTF8 + } + + if c, ok := CharacterSetInfos[strings.ToLower(cs)]; ok { + return c, nil + } + + if c, ok := charsets[strings.ToLower(cs)]; ok { + return c, fmt.Errorf("unsupported charset %s", cs) + } + + return nil, fmt.Errorf("unknown charset %s", cs) +} + +func utf8Alias(csname string) string { + switch csname { + case "utf8mb3_bin": + csname = "utf8_bin" + case "utf8mb3_unicode_ci": + csname = "utf8_unicode_ci" + case "utf8mb3_general_ci": + csname = "utf8_general_ci" + default: + } + return csname +} + +// GetCollationByName returns the collation by name. +func GetCollationByName(name string) (*Collation, error) { + csname := utf8Alias(strings.ToLower(name)) + collation, ok := collationsNameMap[csname] + if !ok { + return nil, ErrUnknownCollation.GenByArgs(name) + } + return collation, nil +} + +const ( + // CollationBin is the default collation for CharsetBin. + CollationBin = "binary" + // CollationUTF8 is the default collation for CharsetUTF8. + CollationUTF8 = "utf8_bin" + // CollationUTF8MB4 is the default collation for CharsetUTF8MB4. + CollationUTF8MB4 = "utf8mb4_bin" + // CollationASCII is the default collation for CharsetACSII. + CollationASCII = "ascii_bin" + // CollationLatin1 is the default collation for CharsetLatin1. + CollationLatin1 = "latin1_bin" + // CollationGBKBin is the default collation for CharsetGBK when new collation is disabled. + CollationGBKBin = "gbk_bin" + // CollationGBKChineseCI is the default collation for CharsetGBK when new collation is enabled. + CollationGBKChineseCI = "gbk_chinese_ci" + // CollationGB18030Bin is the default collation for CharsetGB18030 when new collation is disabled. + CollationGB18030Bin = "gb18030_bin" + // CollationGB18030ChineseCI is the default collation for CharsetGB18030 when new collation is enabled. + CollationGB18030ChineseCI = "gb18030_chinese_ci" +) + +const ( + // CharsetASCII is a subset of UTF8. + CharsetASCII = "ascii" + // CharsetBin is used for marking binary charset. + CharsetBin = "binary" + // CharsetLatin1 is a single byte charset. + CharsetLatin1 = "latin1" + // CharsetUTF8 is the default charset for string types. + CharsetUTF8 = "utf8" + // CharsetUTF8MB3 is 3 bytes utf8, a MySQL legacy encoding. "utf8" and "utf8mb3" are aliases. + CharsetUTF8MB3 = "utf8mb3" + // CharsetUTF8MB4 represents 4 bytes utf8, which works the same way as utf8 in Go. + CharsetUTF8MB4 = "utf8mb4" + // CharsetGB18030 represents 4 bytes gb18030. + CharsetGB18030 = "gb18030" + //revive:disable:exported + CharsetARMSCII8 = "armscii8" + CharsetBig5 = "big5" + CharsetCP1250 = "cp1250" + CharsetCP1251 = "cp1251" + CharsetCP1256 = "cp1256" + CharsetCP1257 = "cp1257" + CharsetCP850 = "cp850" + CharsetCP852 = "cp852" + CharsetCP866 = "cp866" + CharsetCP932 = "cp932" + CharsetDEC8 = "dec8" + CharsetEUCJPMS = "eucjpms" + CharsetEUCKR = "euckr" + CharsetGB2312 = "gb2312" + CharsetGBK = "gbk" + CharsetGEOSTD8 = "geostd8" + CharsetGreek = "greek" + CharsetHebrew = "hebrew" + CharsetHP8 = "hp8" + CharsetKEYBCS2 = "keybcs2" + CharsetKOI8R = "koi8r" + CharsetKOI8U = "koi8u" + CharsetLatin2 = "latin2" + CharsetLatin5 = "latin5" + CharsetLatin7 = "latin7" + CharsetMacCE = "macce" + CharsetMacRoman = "macroman" + CharsetSJIS = "sjis" + CharsetSWE7 = "swe7" + CharsetTIS620 = "tis620" + CharsetUCS2 = "ucs2" + CharsetUJIS = "ujis" + CharsetUTF16 = "utf16" + CharsetUTF16LE = "utf16le" + CharsetUTF32 = "utf32" + //revive:enable:exported +) + +var charsets = map[string]*Charset{ + CharsetARMSCII8: {Name: CharsetARMSCII8, Maxlen: 1, DefaultCollation: "armscii8_general_ci", Desc: "ARMSCII-8 Armenian", Collations: make(map[string]*Collation)}, + CharsetASCII: {Name: CharsetASCII, Maxlen: 1, DefaultCollation: "ascii_general_ci", Desc: "US ASCII", Collations: make(map[string]*Collation)}, + CharsetBig5: {Name: CharsetBig5, Maxlen: 2, DefaultCollation: "big5_chinese_ci", Desc: "Big5 Traditional Chinese", Collations: make(map[string]*Collation)}, + CharsetBin: {Name: CharsetBin, Maxlen: 1, DefaultCollation: "binary", Desc: "Binary pseudo charset", Collations: make(map[string]*Collation)}, + CharsetCP1250: {Name: CharsetCP1250, Maxlen: 1, DefaultCollation: "cp1250_general_ci", Desc: "Windows Central European", Collations: make(map[string]*Collation)}, + CharsetCP1251: {Name: CharsetCP1251, Maxlen: 1, DefaultCollation: "cp1251_general_ci", Desc: "Windows Cyrillic", Collations: make(map[string]*Collation)}, + CharsetCP1256: {Name: CharsetCP1256, Maxlen: 1, DefaultCollation: "cp1256_general_ci", Desc: "Windows Arabic", Collations: make(map[string]*Collation)}, + CharsetCP1257: {Name: CharsetCP1257, Maxlen: 1, DefaultCollation: "cp1257_general_ci", Desc: "Windows Baltic", Collations: make(map[string]*Collation)}, + CharsetCP850: {Name: CharsetCP850, Maxlen: 1, DefaultCollation: "cp850_general_ci", Desc: "DOS West European", Collations: make(map[string]*Collation)}, + CharsetCP852: {Name: CharsetCP852, Maxlen: 1, DefaultCollation: "cp852_general_ci", Desc: "DOS Central European", Collations: make(map[string]*Collation)}, + CharsetCP866: {Name: CharsetCP866, Maxlen: 1, DefaultCollation: "cp866_general_ci", Desc: "DOS Russian", Collations: make(map[string]*Collation)}, + CharsetCP932: {Name: CharsetCP932, Maxlen: 2, DefaultCollation: "cp932_japanese_ci", Desc: "SJIS for Windows Japanese", Collations: make(map[string]*Collation)}, + CharsetDEC8: {Name: CharsetDEC8, Maxlen: 1, DefaultCollation: "dec8_swedish_ci", Desc: "DEC West European", Collations: make(map[string]*Collation)}, + CharsetEUCJPMS: {Name: CharsetEUCJPMS, Maxlen: 3, DefaultCollation: "eucjpms_japanese_ci", Desc: "UJIS for Windows Japanese", Collations: make(map[string]*Collation)}, + CharsetEUCKR: {Name: CharsetEUCKR, Maxlen: 2, DefaultCollation: "euckr_korean_ci", Desc: "EUC-KR Korean", Collations: make(map[string]*Collation)}, + CharsetGB18030: {Name: CharsetGB18030, Maxlen: 4, DefaultCollation: "gb18030_chinese_ci", Desc: "China National Standard GB18030", Collations: make(map[string]*Collation)}, + CharsetGB2312: {Name: CharsetGB2312, Maxlen: 2, DefaultCollation: "gb2312_chinese_ci", Desc: "GB2312 Simplified Chinese", Collations: make(map[string]*Collation)}, + CharsetGBK: {Name: CharsetGBK, Maxlen: 2, DefaultCollation: "gbk_chinese_ci", Desc: "GBK Simplified Chinese", Collations: make(map[string]*Collation)}, + CharsetGEOSTD8: {Name: CharsetGEOSTD8, Maxlen: 1, DefaultCollation: "geostd8_general_ci", Desc: "GEOSTD8 Georgian", Collations: make(map[string]*Collation)}, + CharsetGreek: {Name: CharsetGreek, Maxlen: 1, DefaultCollation: "greek_general_ci", Desc: "ISO 8859-7 Greek", Collations: make(map[string]*Collation)}, + CharsetHebrew: {Name: CharsetHebrew, Maxlen: 1, DefaultCollation: "hebrew_general_ci", Desc: "ISO 8859-8 Hebrew", Collations: make(map[string]*Collation)}, + CharsetHP8: {Name: CharsetHP8, Maxlen: 1, DefaultCollation: "hp8_english_ci", Desc: "HP West European", Collations: make(map[string]*Collation)}, + CharsetKEYBCS2: {Name: CharsetKEYBCS2, Maxlen: 1, DefaultCollation: "keybcs2_general_ci", Desc: "DOS Kamenicky Czech-Slovak", Collations: make(map[string]*Collation)}, + CharsetKOI8R: {Name: CharsetKOI8R, Maxlen: 1, DefaultCollation: "koi8u_general_ci", Desc: "KOI8-U Ukrainian", Collations: make(map[string]*Collation)}, + CharsetKOI8U: {Name: CharsetKOI8U, Maxlen: 1, DefaultCollation: "koi8r_general_ci", Desc: "KOI8-R Relcom Russian", Collations: make(map[string]*Collation)}, + CharsetLatin1: {Name: CharsetLatin1, Maxlen: 1, DefaultCollation: "latin1_swedish_ci", Desc: "cp1252 West European", Collations: make(map[string]*Collation)}, + CharsetLatin2: {Name: CharsetLatin2, Maxlen: 1, DefaultCollation: "latin2_general_ci", Desc: "ISO 8859-2 Central European", Collations: make(map[string]*Collation)}, + CharsetLatin5: {Name: CharsetLatin5, Maxlen: 1, DefaultCollation: "latin5_turkish_ci", Desc: "ISO 8859-9 Turkish", Collations: make(map[string]*Collation)}, + CharsetLatin7: {Name: CharsetLatin7, Maxlen: 1, DefaultCollation: "latin7_general_ci", Desc: "ISO 8859-13 Baltic", Collations: make(map[string]*Collation)}, + CharsetMacCE: {Name: CharsetMacCE, Maxlen: 1, DefaultCollation: "macce_general_ci", Desc: "Mac Central European", Collations: make(map[string]*Collation)}, + CharsetMacRoman: {Name: CharsetMacRoman, Maxlen: 1, DefaultCollation: "macroman_general_ci", Desc: "Mac West European", Collations: make(map[string]*Collation)}, + CharsetSJIS: {Name: CharsetSJIS, Maxlen: 2, DefaultCollation: "sjis_japanese_ci", Desc: "Shift-JIS Japanese", Collations: make(map[string]*Collation)}, + CharsetSWE7: {Name: CharsetSWE7, Maxlen: 1, DefaultCollation: "swe7_swedish_ci", Desc: "7bit Swedish", Collations: make(map[string]*Collation)}, + CharsetTIS620: {Name: CharsetTIS620, Maxlen: 1, DefaultCollation: "tis620_thai_ci", Desc: "TIS620 Thai", Collations: make(map[string]*Collation)}, + CharsetUCS2: {Name: CharsetUCS2, Maxlen: 2, DefaultCollation: "ucs2_general_ci", Desc: "UCS-2 Unicode", Collations: make(map[string]*Collation)}, + CharsetUJIS: {Name: CharsetUJIS, Maxlen: 3, DefaultCollation: "ujis_japanese_ci", Desc: "EUC-JP Japanese", Collations: make(map[string]*Collation)}, + CharsetUTF16: {Name: CharsetUTF16, Maxlen: 4, DefaultCollation: "utf16_general_ci", Desc: "UTF-16 Unicode", Collations: make(map[string]*Collation)}, + CharsetUTF16LE: {Name: CharsetUTF16LE, Maxlen: 4, DefaultCollation: "utf16le_general_ci", Desc: "UTF-16LE Unicode", Collations: make(map[string]*Collation)}, + CharsetUTF32: {Name: CharsetUTF32, Maxlen: 4, DefaultCollation: "utf32_general_ci", Desc: "UTF-32 Unicode", Collations: make(map[string]*Collation)}, + CharsetUTF8: {Name: CharsetUTF8, Maxlen: 3, DefaultCollation: "utf8_general_ci", Desc: "UTF-8 Unicode", Collations: make(map[string]*Collation)}, + CharsetUTF8MB4: {Name: CharsetUTF8MB4, Maxlen: 4, DefaultCollation: "utf8mb4_0900_ai_ci", Desc: "UTF-8 Unicode", Collations: make(map[string]*Collation)}, +} + +var collations = []*Collation{ + {1, "big5", "big5_chinese_ci", true, 1, PadSpace}, + {2, "latin2", "latin2_czech_cs", false, 1, PadSpace}, + {3, "dec8", "dec8_swedish_ci", true, 1, PadSpace}, + {4, "cp850", "cp850_general_ci", true, 1, PadSpace}, + {5, "latin1", "latin1_german1_ci", false, 1, PadSpace}, + {6, "hp8", "hp8_english_ci", true, 1, PadSpace}, + {7, "koi8r", "koi8r_general_ci", true, 1, PadSpace}, + {8, "latin1", "latin1_swedish_ci", false, 1, PadSpace}, + {9, "latin2", "latin2_general_ci", true, 1, PadSpace}, + {10, "swe7", "swe7_swedish_ci", true, 1, PadSpace}, + {11, "ascii", "ascii_general_ci", false, 1, PadSpace}, + {12, "ujis", "ujis_japanese_ci", true, 1, PadSpace}, + {13, "sjis", "sjis_japanese_ci", true, 1, PadSpace}, + {14, "cp1251", "cp1251_bulgarian_ci", false, 1, PadSpace}, + {15, "latin1", "latin1_danish_ci", false, 1, PadSpace}, + {16, "hebrew", "hebrew_general_ci", true, 1, PadSpace}, + {18, "tis620", "tis620_thai_ci", true, 1, PadSpace}, + {19, "euckr", "euckr_korean_ci", true, 1, PadSpace}, + {20, "latin7", "latin7_estonian_cs", false, 1, PadSpace}, + {21, "latin2", "latin2_hungarian_ci", false, 1, PadSpace}, + {22, "koi8u", "koi8u_general_ci", true, 1, PadSpace}, + {23, "cp1251", "cp1251_ukrainian_ci", false, 1, PadSpace}, + {24, "gb2312", "gb2312_chinese_ci", true, 1, PadSpace}, + {25, "greek", "greek_general_ci", true, 1, PadSpace}, + {26, "cp1250", "cp1250_general_ci", true, 1, PadSpace}, + {27, "latin2", "latin2_croatian_ci", false, 1, PadSpace}, + {28, "gbk", "gbk_chinese_ci", false, 1, PadSpace}, + {29, "cp1257", "cp1257_lithuanian_ci", false, 1, PadSpace}, + {30, "latin5", "latin5_turkish_ci", true, 1, PadSpace}, + {31, "latin1", "latin1_german2_ci", false, 1, PadSpace}, + {32, "armscii8", "armscii8_general_ci", true, 1, PadSpace}, + {33, "utf8", "utf8_general_ci", false, 1, PadSpace}, + {34, "cp1250", "cp1250_czech_cs", false, 1, PadSpace}, + {35, "ucs2", "ucs2_general_ci", true, 1, PadSpace}, + {36, "cp866", "cp866_general_ci", true, 1, PadSpace}, + {37, "keybcs2", "keybcs2_general_ci", true, 1, PadSpace}, + {38, "macce", "macce_general_ci", true, 1, PadSpace}, + {39, "macroman", "macroman_general_ci", true, 1, PadSpace}, + {40, "cp852", "cp852_general_ci", true, 1, PadSpace}, + {41, "latin7", "latin7_general_ci", true, 1, PadSpace}, + {42, "latin7", "latin7_general_cs", false, 1, PadSpace}, + {43, "macce", "macce_bin", false, 1, PadSpace}, + {44, "cp1250", "cp1250_croatian_ci", false, 1, PadSpace}, + {45, "utf8mb4", "utf8mb4_general_ci", false, 1, PadSpace}, + {46, "utf8mb4", "utf8mb4_bin", true, 1, PadSpace}, + {47, "latin1", "latin1_bin", true, 1, PadSpace}, + {48, "latin1", "latin1_general_ci", false, 1, PadSpace}, + {49, "latin1", "latin1_general_cs", false, 1, PadSpace}, + {50, "cp1251", "cp1251_bin", false, 1, PadSpace}, + {51, "cp1251", "cp1251_general_ci", true, 1, PadSpace}, + {52, "cp1251", "cp1251_general_cs", false, 1, PadSpace}, + {53, "macroman", "macroman_bin", false, 1, PadSpace}, + {54, "utf16", "utf16_general_ci", true, 1, PadSpace}, + {55, "utf16", "utf16_bin", false, 1, PadSpace}, + {56, "utf16le", "utf16le_general_ci", true, 1, PadSpace}, + {57, "cp1256", "cp1256_general_ci", true, 1, PadSpace}, + {58, "cp1257", "cp1257_bin", false, 1, PadSpace}, + {59, "cp1257", "cp1257_general_ci", true, 1, PadSpace}, + {60, "utf32", "utf32_general_ci", true, 1, PadSpace}, + {61, "utf32", "utf32_bin", false, 1, PadSpace}, + {62, "utf16le", "utf16le_bin", false, 1, PadSpace}, + {63, "binary", "binary", true, 1, PadNone}, + {64, "armscii8", "armscii8_bin", false, 1, PadSpace}, + {65, "ascii", "ascii_bin", true, 1, PadSpace}, + {66, "cp1250", "cp1250_bin", false, 1, PadSpace}, + {67, "cp1256", "cp1256_bin", false, 1, PadSpace}, + {68, "cp866", "cp866_bin", false, 1, PadSpace}, + {69, "dec8", "dec8_bin", false, 1, PadSpace}, + {70, "greek", "greek_bin", false, 1, PadSpace}, + {71, "hebrew", "hebrew_bin", false, 1, PadSpace}, + {72, "hp8", "hp8_bin", false, 1, PadSpace}, + {73, "keybcs2", "keybcs2_bin", false, 1, PadSpace}, + {74, "koi8r", "koi8r_bin", false, 1, PadSpace}, + {75, "koi8u", "koi8u_bin", false, 1, PadSpace}, + {76, "utf8", "utf8_tolower_ci", false, 1, PadNone}, + {77, "latin2", "latin2_bin", false, 1, PadSpace}, + {78, "latin5", "latin5_bin", false, 1, PadSpace}, + {79, "latin7", "latin7_bin", false, 1, PadSpace}, + {80, "cp850", "cp850_bin", false, 1, PadSpace}, + {81, "cp852", "cp852_bin", false, 1, PadSpace}, + {82, "swe7", "swe7_bin", false, 1, PadSpace}, + {83, "utf8", "utf8_bin", true, 1, PadSpace}, + {84, "big5", "big5_bin", false, 1, PadSpace}, + {85, "euckr", "euckr_bin", false, 1, PadSpace}, + {86, "gb2312", "gb2312_bin", false, 1, PadSpace}, + {87, "gbk", "gbk_bin", true, 1, PadSpace}, + {88, "sjis", "sjis_bin", false, 1, PadSpace}, + {89, "tis620", "tis620_bin", false, 1, PadSpace}, + {90, "ucs2", "ucs2_bin", false, 1, PadSpace}, + {91, "ujis", "ujis_bin", false, 1, PadSpace}, + {92, "geostd8", "geostd8_general_ci", true, 1, PadSpace}, + {93, "geostd8", "geostd8_bin", false, 1, PadSpace}, + {94, "latin1", "latin1_spanish_ci", false, 1, PadSpace}, + {95, "cp932", "cp932_japanese_ci", true, 1, PadSpace}, + {96, "cp932", "cp932_bin", false, 1, PadSpace}, + {97, "eucjpms", "eucjpms_japanese_ci", true, 1, PadSpace}, + {98, "eucjpms", "eucjpms_bin", false, 1, PadSpace}, + {99, "cp1250", "cp1250_polish_ci", false, 1, PadSpace}, + {101, "utf16", "utf16_unicode_ci", false, 1, PadSpace}, + {102, "utf16", "utf16_icelandic_ci", false, 1, PadSpace}, + {103, "utf16", "utf16_latvian_ci", false, 1, PadSpace}, + {104, "utf16", "utf16_romanian_ci", false, 1, PadSpace}, + {105, "utf16", "utf16_slovenian_ci", false, 1, PadSpace}, + {106, "utf16", "utf16_polish_ci", false, 1, PadSpace}, + {107, "utf16", "utf16_estonian_ci", false, 1, PadSpace}, + {108, "utf16", "utf16_spanish_ci", false, 1, PadSpace}, + {109, "utf16", "utf16_swedish_ci", false, 1, PadSpace}, + {110, "utf16", "utf16_turkish_ci", false, 1, PadSpace}, + {111, "utf16", "utf16_czech_ci", false, 1, PadSpace}, + {112, "utf16", "utf16_danish_ci", false, 1, PadSpace}, + {113, "utf16", "utf16_lithuanian_ci", false, 1, PadSpace}, + {114, "utf16", "utf16_slovak_ci", false, 1, PadSpace}, + {115, "utf16", "utf16_spanish2_ci", false, 1, PadSpace}, + {116, "utf16", "utf16_roman_ci", false, 1, PadSpace}, + {117, "utf16", "utf16_persian_ci", false, 1, PadSpace}, + {118, "utf16", "utf16_esperanto_ci", false, 1, PadSpace}, + {119, "utf16", "utf16_hungarian_ci", false, 1, PadSpace}, + {120, "utf16", "utf16_sinhala_ci", false, 1, PadSpace}, + {121, "utf16", "utf16_german2_ci", false, 1, PadSpace}, + {122, "utf16", "utf16_croatian_ci", false, 1, PadSpace}, + {123, "utf16", "utf16_unicode_520_ci", false, 1, PadSpace}, + {124, "utf16", "utf16_vietnamese_ci", false, 1, PadSpace}, + {128, "ucs2", "ucs2_unicode_ci", false, 1, PadSpace}, + {129, "ucs2", "ucs2_icelandic_ci", false, 1, PadSpace}, + {130, "ucs2", "ucs2_latvian_ci", false, 1, PadSpace}, + {131, "ucs2", "ucs2_romanian_ci", false, 1, PadSpace}, + {132, "ucs2", "ucs2_slovenian_ci", false, 1, PadSpace}, + {133, "ucs2", "ucs2_polish_ci", false, 1, PadSpace}, + {134, "ucs2", "ucs2_estonian_ci", false, 1, PadSpace}, + {135, "ucs2", "ucs2_spanish_ci", false, 1, PadSpace}, + {136, "ucs2", "ucs2_swedish_ci", false, 1, PadSpace}, + {137, "ucs2", "ucs2_turkish_ci", false, 1, PadSpace}, + {138, "ucs2", "ucs2_czech_ci", false, 1, PadSpace}, + {139, "ucs2", "ucs2_danish_ci", false, 1, PadSpace}, + {140, "ucs2", "ucs2_lithuanian_ci", false, 1, PadSpace}, + {141, "ucs2", "ucs2_slovak_ci", false, 1, PadSpace}, + {142, "ucs2", "ucs2_spanish2_ci", false, 1, PadSpace}, + {143, "ucs2", "ucs2_roman_ci", false, 1, PadSpace}, + {144, "ucs2", "ucs2_persian_ci", false, 1, PadSpace}, + {145, "ucs2", "ucs2_esperanto_ci", false, 1, PadSpace}, + {146, "ucs2", "ucs2_hungarian_ci", false, 1, PadSpace}, + {147, "ucs2", "ucs2_sinhala_ci", false, 1, PadSpace}, + {148, "ucs2", "ucs2_german2_ci", false, 1, PadSpace}, + {149, "ucs2", "ucs2_croatian_ci", false, 1, PadSpace}, + {150, "ucs2", "ucs2_unicode_520_ci", false, 1, PadSpace}, + {151, "ucs2", "ucs2_vietnamese_ci", false, 1, PadSpace}, + {159, "ucs2", "ucs2_general_mysql500_ci", false, 1, PadSpace}, + {160, "utf32", "utf32_unicode_ci", false, 1, PadSpace}, + {161, "utf32", "utf32_icelandic_ci", false, 1, PadSpace}, + {162, "utf32", "utf32_latvian_ci", false, 1, PadSpace}, + {163, "utf32", "utf32_romanian_ci", false, 1, PadSpace}, + {164, "utf32", "utf32_slovenian_ci", false, 1, PadSpace}, + {165, "utf32", "utf32_polish_ci", false, 1, PadSpace}, + {166, "utf32", "utf32_estonian_ci", false, 1, PadSpace}, + {167, "utf32", "utf32_spanish_ci", false, 1, PadSpace}, + {168, "utf32", "utf32_swedish_ci", false, 1, PadSpace}, + {169, "utf32", "utf32_turkish_ci", false, 1, PadSpace}, + {170, "utf32", "utf32_czech_ci", false, 1, PadSpace}, + {171, "utf32", "utf32_danish_ci", false, 1, PadSpace}, + {172, "utf32", "utf32_lithuanian_ci", false, 1, PadSpace}, + {173, "utf32", "utf32_slovak_ci", false, 1, PadSpace}, + {174, "utf32", "utf32_spanish2_ci", false, 1, PadSpace}, + {175, "utf32", "utf32_roman_ci", false, 1, PadSpace}, + {176, "utf32", "utf32_persian_ci", false, 1, PadSpace}, + {177, "utf32", "utf32_esperanto_ci", false, 1, PadSpace}, + {178, "utf32", "utf32_hungarian_ci", false, 1, PadSpace}, + {179, "utf32", "utf32_sinhala_ci", false, 1, PadSpace}, + {180, "utf32", "utf32_german2_ci", false, 1, PadSpace}, + {181, "utf32", "utf32_croatian_ci", false, 1, PadSpace}, + {182, "utf32", "utf32_unicode_520_ci", false, 1, PadSpace}, + {183, "utf32", "utf32_vietnamese_ci", false, 1, PadSpace}, + {192, "utf8", "utf8_unicode_ci", false, 8, PadSpace}, + {193, "utf8", "utf8_icelandic_ci", false, 1, PadNone}, + {194, "utf8", "utf8_latvian_ci", false, 1, PadNone}, + {195, "utf8", "utf8_romanian_ci", false, 1, PadNone}, + {196, "utf8", "utf8_slovenian_ci", false, 1, PadNone}, + {197, "utf8", "utf8_polish_ci", false, 1, PadNone}, + {198, "utf8", "utf8_estonian_ci", false, 1, PadNone}, + {199, "utf8", "utf8_spanish_ci", false, 1, PadNone}, + {200, "utf8", "utf8_swedish_ci", false, 1, PadNone}, + {201, "utf8", "utf8_turkish_ci", false, 1, PadNone}, + {202, "utf8", "utf8_czech_ci", false, 1, PadNone}, + {203, "utf8", "utf8_danish_ci", false, 1, PadNone}, + {204, "utf8", "utf8_lithuanian_ci", false, 1, PadNone}, + {205, "utf8", "utf8_slovak_ci", false, 1, PadNone}, + {206, "utf8", "utf8_spanish2_ci", false, 1, PadNone}, + {207, "utf8", "utf8_roman_ci", false, 1, PadNone}, + {208, "utf8", "utf8_persian_ci", false, 1, PadNone}, + {209, "utf8", "utf8_esperanto_ci", false, 1, PadNone}, + {210, "utf8", "utf8_hungarian_ci", false, 1, PadNone}, + {211, "utf8", "utf8_sinhala_ci", false, 1, PadNone}, + {212, "utf8", "utf8_german2_ci", false, 1, PadNone}, + {213, "utf8", "utf8_croatian_ci", false, 1, PadNone}, + {214, "utf8", "utf8_unicode_520_ci", false, 1, PadNone}, + {215, "utf8", "utf8_vietnamese_ci", false, 1, PadNone}, + {223, "utf8", "utf8_general_mysql500_ci", false, 1, PadNone}, + {224, "utf8mb4", "utf8mb4_unicode_ci", false, 8, PadSpace}, + {225, "utf8mb4", "utf8mb4_icelandic_ci", false, 1, PadSpace}, + {226, "utf8mb4", "utf8mb4_latvian_ci", false, 1, PadSpace}, + {227, "utf8mb4", "utf8mb4_romanian_ci", false, 1, PadSpace}, + {228, "utf8mb4", "utf8mb4_slovenian_ci", false, 1, PadSpace}, + {229, "utf8mb4", "utf8mb4_polish_ci", false, 1, PadSpace}, + {230, "utf8mb4", "utf8mb4_estonian_ci", false, 1, PadSpace}, + {231, "utf8mb4", "utf8mb4_spanish_ci", false, 1, PadSpace}, + {232, "utf8mb4", "utf8mb4_swedish_ci", false, 1, PadSpace}, + {233, "utf8mb4", "utf8mb4_turkish_ci", false, 1, PadSpace}, + {234, "utf8mb4", "utf8mb4_czech_ci", false, 1, PadSpace}, + {235, "utf8mb4", "utf8mb4_danish_ci", false, 1, PadSpace}, + {236, "utf8mb4", "utf8mb4_lithuanian_ci", false, 1, PadSpace}, + {237, "utf8mb4", "utf8mb4_slovak_ci", false, 1, PadSpace}, + {238, "utf8mb4", "utf8mb4_spanish2_ci", false, 1, PadSpace}, + {239, "utf8mb4", "utf8mb4_roman_ci", false, 1, PadSpace}, + {240, "utf8mb4", "utf8mb4_persian_ci", false, 1, PadSpace}, + {241, "utf8mb4", "utf8mb4_esperanto_ci", false, 1, PadSpace}, + {242, "utf8mb4", "utf8mb4_hungarian_ci", false, 1, PadSpace}, + {243, "utf8mb4", "utf8mb4_sinhala_ci", false, 1, PadSpace}, + {244, "utf8mb4", "utf8mb4_german2_ci", false, 1, PadSpace}, + {245, "utf8mb4", "utf8mb4_croatian_ci", false, 1, PadSpace}, + {246, "utf8mb4", "utf8mb4_unicode_520_ci", false, 1, PadSpace}, + {247, "utf8mb4", "utf8mb4_vietnamese_ci", false, 1, PadSpace}, + {248, "gb18030", "gb18030_chinese_ci", false, 1, PadSpace}, + {249, "gb18030", "gb18030_bin", true, 1, PadSpace}, + {250, "gb18030", "gb18030_unicode_520_ci", false, 1, PadSpace}, + {255, "utf8mb4", "utf8mb4_0900_ai_ci", false, 0, PadNone}, + {256, "utf8mb4", "utf8mb4_de_pb_0900_ai_ci", false, 1, PadNone}, + {257, "utf8mb4", "utf8mb4_is_0900_ai_ci", false, 1, PadNone}, + {258, "utf8mb4", "utf8mb4_lv_0900_ai_ci", false, 1, PadNone}, + {259, "utf8mb4", "utf8mb4_ro_0900_ai_ci", false, 1, PadNone}, + {260, "utf8mb4", "utf8mb4_sl_0900_ai_ci", false, 1, PadNone}, + {261, "utf8mb4", "utf8mb4_pl_0900_ai_ci", false, 1, PadNone}, + {262, "utf8mb4", "utf8mb4_et_0900_ai_ci", false, 1, PadNone}, + {263, "utf8mb4", "utf8mb4_es_0900_ai_ci", false, 1, PadNone}, + {264, "utf8mb4", "utf8mb4_sv_0900_ai_ci", false, 1, PadNone}, + {265, "utf8mb4", "utf8mb4_tr_0900_ai_ci", false, 1, PadNone}, + {266, "utf8mb4", "utf8mb4_cs_0900_ai_ci", false, 1, PadNone}, + {267, "utf8mb4", "utf8mb4_da_0900_ai_ci", false, 1, PadNone}, + {268, "utf8mb4", "utf8mb4_lt_0900_ai_ci", false, 1, PadNone}, + {269, "utf8mb4", "utf8mb4_sk_0900_ai_ci", false, 1, PadNone}, + {270, "utf8mb4", "utf8mb4_es_trad_0900_ai_ci", false, 1, PadNone}, + {271, "utf8mb4", "utf8mb4_la_0900_ai_ci", false, 1, PadNone}, + {273, "utf8mb4", "utf8mb4_eo_0900_ai_ci", false, 1, PadNone}, + {274, "utf8mb4", "utf8mb4_hu_0900_ai_ci", false, 1, PadNone}, + {275, "utf8mb4", "utf8mb4_hr_0900_ai_ci", false, 1, PadNone}, + {277, "utf8mb4", "utf8mb4_vi_0900_ai_ci", false, 1, PadNone}, + {278, "utf8mb4", "utf8mb4_0900_as_cs", false, 1, PadNone}, + {279, "utf8mb4", "utf8mb4_de_pb_0900_as_cs", false, 1, PadNone}, + {280, "utf8mb4", "utf8mb4_is_0900_as_cs", false, 1, PadNone}, + {281, "utf8mb4", "utf8mb4_lv_0900_as_cs", false, 1, PadNone}, + {282, "utf8mb4", "utf8mb4_ro_0900_as_cs", false, 1, PadNone}, + {283, "utf8mb4", "utf8mb4_sl_0900_as_cs", false, 1, PadNone}, + {284, "utf8mb4", "utf8mb4_pl_0900_as_cs", false, 1, PadNone}, + {285, "utf8mb4", "utf8mb4_et_0900_as_cs", false, 1, PadNone}, + {286, "utf8mb4", "utf8mb4_es_0900_as_cs", false, 1, PadNone}, + {287, "utf8mb4", "utf8mb4_sv_0900_as_cs", false, 1, PadNone}, + {288, "utf8mb4", "utf8mb4_tr_0900_as_cs", false, 1, PadNone}, + {289, "utf8mb4", "utf8mb4_cs_0900_as_cs", false, 1, PadNone}, + {290, "utf8mb4", "utf8mb4_da_0900_as_cs", false, 1, PadNone}, + {291, "utf8mb4", "utf8mb4_lt_0900_as_cs", false, 1, PadNone}, + {292, "utf8mb4", "utf8mb4_sk_0900_as_cs", false, 1, PadNone}, + {293, "utf8mb4", "utf8mb4_es_trad_0900_as_cs", false, 1, PadNone}, + {294, "utf8mb4", "utf8mb4_la_0900_as_cs", false, 1, PadNone}, + {296, "utf8mb4", "utf8mb4_eo_0900_as_cs", false, 1, PadNone}, + {297, "utf8mb4", "utf8mb4_hu_0900_as_cs", false, 1, PadNone}, + {298, "utf8mb4", "utf8mb4_hr_0900_as_cs", false, 1, PadNone}, + {300, "utf8mb4", "utf8mb4_vi_0900_as_cs", false, 1, PadNone}, + {303, "utf8mb4", "utf8mb4_ja_0900_as_cs", false, 1, PadNone}, + {304, "utf8mb4", "utf8mb4_ja_0900_as_cs_ks", false, 1, PadNone}, + {305, "utf8mb4", "utf8mb4_0900_as_ci", false, 1, PadNone}, + {306, "utf8mb4", "utf8mb4_ru_0900_ai_ci", false, 1, PadNone}, + {307, "utf8mb4", "utf8mb4_ru_0900_as_cs", false, 1, PadNone}, + {308, "utf8mb4", "utf8mb4_zh_0900_as_cs", false, 1, PadNone}, + {309, "utf8mb4", "utf8mb4_0900_bin", false, 1, PadNone}, +} + +// init method always puts to the end of file. +func init() { + for _, c := range collations { + collationsNameMap[c.Name] = c + + if charset, ok := CharacterSetInfos[c.CharsetName]; ok { + charset.Collations[c.Name] = c + } + + if charset, ok := charsets[c.CharsetName]; ok { + charset.Collations[c.Name] = c + } + } +} diff --git a/pkg/parser/charset/charset_test.go b/pkg/parser/charset/charset_test.go new file mode 100644 index 000000000..fd23728d3 --- /dev/null +++ b/pkg/parser/charset/charset_test.go @@ -0,0 +1,171 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/require" +) + +func testValidCharset(t *testing.T, charset string, collation string, expect bool) { + b := ValidCharsetAndCollation(charset, collation) + require.Equal(t, expect, b) +} + +func TestValidCharset(t *testing.T) { + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_general_ci", true}, + {"", "utf8_general_ci", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"latin1", "latin1_bin", true}, + {"utf8", "utf8_invalid_ci", false}, + {"utf16", "utf16_bin", false}, + {"gb2312", "gb2312_chinese_ci", false}, + {"UTF8", "UTF8_BIN", true}, + {"UTF8", "utf8_bin", true}, + {"UTF8MB4", "utf8mb4_bin", true}, + {"UTF8MB4", "UTF8MB4_bin", true}, + {"UTF8MB4", "UTF8MB4_general_ci", true}, + {"Utf8", "uTf8_bIN", true}, + {"utf8mb3", "", true}, + {"utf8mb3", "utf8mb3_bin", true}, + {"utf8mb3", "utf8mb3_general_ci", true}, + {"utf8mb3", "utf8mb3_unicode_ci", true}, + } + for _, tt := range tests { + testValidCharset(t, tt.cs, tt.co, tt.succ) + } +} + +func testGetDefaultCollation(t *testing.T, charset string, expectCollation string, succ bool) { + b, err := GetDefaultCollation(charset) + if !succ { + require.Error(t, err) + return + } + require.Equal(t, expectCollation, b) +} + +func TestGetDefaultCollation(t *testing.T) { + tests := []struct { + cs string + co string + succ bool + }{ + {"utf8", "utf8_bin", true}, + {"UTF8", "utf8_bin", true}, + {"utf8mb4", "utf8mb4_bin", true}, + {"ascii", "ascii_bin", true}, + {"binary", "binary", true}, + {"latin1", "latin1_bin", true}, + {"invalid_cs", "", false}, + {"", "utf8_bin", false}, + } + for _, tt := range tests { + testGetDefaultCollation(t, tt.cs, tt.co, tt.succ) + } + + // Test the consistency of collations table and charset desc table + charsetNum := 0 + for _, collate := range collations { + if collate.IsDefault { + if desc, ok := CharacterSetInfos[collate.CharsetName]; ok { + require.Equal(t, desc.DefaultCollation, collate.Name) + charsetNum++ + } + } + } + require.Equal(t, len(CharacterSetInfos), charsetNum) +} + +func TestGetCharsetDesc(t *testing.T) { + tests := []struct { + cs string + result string + succ bool + }{ + {"utf8", "utf8", true}, + {"UTF8", "utf8", true}, + {"utf8mb4", "utf8mb4", true}, + {"ascii", "ascii", true}, + {"binary", "binary", true}, + {"latin1", "latin1", true}, + {"invalid_cs", "", false}, + {"", "utf8_bin", false}, + } + for _, tt := range tests { + desc, err := GetCharsetInfo(tt.cs) + if !tt.succ { + require.Error(t, err) + } else { + require.Equal(t, tt.result, desc.Name) + } + } +} + +func TestGetCollationByName(t *testing.T) { + for _, collation := range collations { + coll, err := GetCollationByName(collation.Name) + require.NoError(t, err) + require.Equal(t, collation, coll) + } + + _, err := GetCollationByName("non_exist") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'non_exist'") +} + +func TestInvalidCollation(t *testing.T) { + testValidCharset(t, "utf8", "utf8_invalid_ci", false) +} + +func TestUTF8MB3(t *testing.T) { + colname, err := GetDefaultCollationLegacy("utf8mb3") + require.NoError(t, err) + require.Equal(t, "utf8_bin", colname) + + csinfo, err := GetCharsetInfo("utf8mb3") + require.NoError(t, err) + require.Equal(t, "utf8", csinfo.Name) + + tests := []struct { + cs string + alias string + }{ + {"utf8mb3_bin", "utf8_bin"}, + {"utf8mb3_general_ci", "utf8_general_ci"}, + {"utf8mb3_unicode_ci", "utf8_unicode_ci"}, + } + for _, tt := range tests { + col, err := GetCollationByName(tt.cs) + require.NoError(t, err) + require.Equal(t, col.Name, tt.alias) + } +} + +func BenchmarkGetCharsetDesc(b *testing.B) { + b.ResetTimer() + charsets := []string{CharsetUTF8, CharsetUTF8MB4, CharsetASCII, CharsetLatin1, CharsetBin} + index := rand.Intn(len(charsets)) + cs := charsets[index] + + for i := 0; i < b.N; i++ { + _, _ = GetCharsetInfo(cs) + } +} diff --git a/pkg/parser/charset/encoding.go b/pkg/parser/charset/encoding.go new file mode 100644 index 000000000..b8b788c15 --- /dev/null +++ b/pkg/parser/charset/encoding.go @@ -0,0 +1,113 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import "bytes" + +// Make sure all of them implement Encoding interface. +var ( + _ Encoding = &encodingUTF8{} + _ Encoding = &encodingUTF8MB3Strict{} + _ Encoding = &encodingASCII{} + _ Encoding = &encodingLatin1{} + _ Encoding = &encodingBin{} +) + +// FindEncoding finds the encoding according to charset. +func FindEncoding(charset string) Encoding { + if len(charset) == 0 { + return EncodingBinImpl + } + if e, exist := encodingMap[charset]; exist { + return e + } + return EncodingBinImpl +} + +var encodingMap = map[string]Encoding{ + CharsetUTF8MB4: EncodingUTF8Impl, + CharsetUTF8: EncodingUTF8Impl, + CharsetLatin1: EncodingLatin1Impl, + CharsetBin: EncodingBinImpl, + CharsetASCII: EncodingASCIIImpl, +} + +// Encoding provide encode/decode functions for a string with a specific charset. +type Encoding interface { + // Name is the name of the encoding. + Name() string + // Tp is the type of the encoding. + Tp() EncodingTp + // Peek returns the next char. + Peek(src []byte) []byte + // MbLen returns multiple byte length, if the next character is single byte, return 0. + MbLen(string) int + // IsValid checks whether the utf-8 bytes can be convert to valid string in current encoding. + IsValid(src []byte) bool + // Foreach iterates the characters in current encoding. + Foreach(src []byte, op Op, fn func(from, to []byte, ok bool) bool) + // Transform map the bytes in src to dest according to Op. + // **the caller should initialize the dest if it wants to avoid memory alloc every time, + // or else it will always make a new one** + // + // **the returned array may be the alias of `src`, edit the returned array on your own risk** + Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) + // ToUpper change a string to uppercase. + ToUpper(src string) string + // ToLower change a string to lowercase. + ToLower(src string) string +} + +// EncodingTp is the type of the encoding. +type EncodingTp int8 + +//revive:disable +const ( + EncodingTpNone EncodingTp = iota + EncodingTpUTF8 + EncodingTpUTF8MB3Strict + EncodingTpASCII + EncodingTpLatin1 + EncodingTpBin +) + +//revive:enable + +// Op is used by Encoding.Transform. +type Op int16 + +const ( + opFromUTF8 Op = 1 << iota + opToUTF8 + opTruncateTrim + opTruncateReplace + opCollectFrom + opCollectTo + opSkipError +) + +//revive:disable +const ( + // OpReplaceNoErr is used to replace invalid bytes with '?'. + OpReplaceNoErr = opFromUTF8 | opTruncateReplace | opCollectFrom | opSkipError + OpReplace = opFromUTF8 | opTruncateReplace | opCollectFrom + OpEncode = opFromUTF8 | opTruncateTrim | opCollectTo + OpEncodeNoErr = OpEncode | opSkipError + OpEncodeReplace = opFromUTF8 | opTruncateReplace | opCollectTo + OpDecode = opToUTF8 | opTruncateTrim | opCollectTo + OpDecodeNoErr = OpDecode | opSkipError + OpDecodeReplace = opToUTF8 | opTruncateReplace | opCollectTo +) + +//revive:enable diff --git a/pkg/parser/charset/encoding_ascii.go b/pkg/parser/charset/encoding_ascii.go new file mode 100644 index 000000000..c0554c924 --- /dev/null +++ b/pkg/parser/charset/encoding_ascii.go @@ -0,0 +1,85 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "bytes" + go_unicode "unicode" + + "golang.org/x/text/encoding" +) + +// EncodingASCIIImpl is the instance of encodingASCII +var EncodingASCIIImpl = &encodingASCII{encodingBase{enc: encoding.Nop}} + +func init() { + EncodingASCIIImpl.self = EncodingASCIIImpl +} + +// encodingASCII is the ASCII encoding. +type encodingASCII struct { + encodingBase +} + +// Name implements Encoding interface. +func (*encodingASCII) Name() string { + return CharsetASCII +} + +// Tp implements Encoding interface. +func (*encodingASCII) Tp() EncodingTp { + return EncodingTpASCII +} + +// Peek implements Encoding interface. +func (*encodingASCII) Peek(src []byte) []byte { + if len(src) == 0 { + return src + } + return src[:1] +} + +// IsValid implements Encoding interface. +func (*encodingASCII) IsValid(src []byte) bool { + srcLen := len(src) + for i := range srcLen { + if src[i] > go_unicode.MaxASCII { + return false + } + } + return true +} + +// Transform implements Encoding interface. +func (e *encodingASCII) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { + if e.IsValid(src) { + return src, nil + } + return e.encodingBase.Transform(dest, src, op) +} + +// Foreach implements Encoding interface. +func (*encodingASCII) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { + for i, w := 0, 0; i < len(src); i += w { + w = 1 + ok := true + if src[i] > go_unicode.MaxASCII { + w = len(EncodingUTF8Impl.Peek(src[i:])) + ok = false + } + if !fn(src[i:i+w], src[i:i+w], ok) { + return + } + } +} diff --git a/pkg/parser/charset/encoding_base.go b/pkg/parser/charset/encoding_base.go new file mode 100644 index 000000000..455926e6f --- /dev/null +++ b/pkg/parser/charset/encoding_base.go @@ -0,0 +1,137 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "bytes" + "fmt" + "strings" + "unsafe" + + "github.com/block/spirit/pkg/parser/mysql" + "golang.org/x/text/encoding" + "golang.org/x/text/transform" +) + +// ErrInvalidCharacterString returns when the string is invalid in the specific charset. +var ErrInvalidCharacterString = mysql.NewStdErr("parser", mysql.ErrInvalidCharacterString) + +// encodingBase defines some generic functions. +type encodingBase struct { + enc encoding.Encoding + self Encoding +} + +func (encodingBase) MbLen(_ string) int { + return 0 +} + +func (encodingBase) ToUpper(src string) string { + return strings.ToUpper(src) +} + +func (encodingBase) ToLower(src string) string { + return strings.ToLower(src) +} + +func (b encodingBase) IsValid(src []byte) bool { + isValid := true + b.self.Foreach(src, opFromUTF8, func(_, _ []byte, ok bool) bool { + isValid = ok + return ok + }) + return isValid +} + +func (b encodingBase) Transform(dest *bytes.Buffer, src []byte, op Op) (result []byte, err error) { + if dest == nil { + dest = &bytes.Buffer{} + dest.Grow(len(src)) + } + dest.Reset() + b.self.Foreach(src, op, func(from, to []byte, ok bool) bool { + if !ok { + if err == nil && (op&opSkipError == 0) { + err = generateEncodingErr(b.self.Name(), from) + } + if op&opTruncateTrim != 0 { + return false + } + if op&opTruncateReplace != 0 { + dest.WriteByte('?') + return true + } + } + if op&opCollectFrom != 0 { + dest.Write(from) + } else if op&opCollectTo != 0 { + dest.Write(to) + } + return true + }) + return dest.Bytes(), err +} + +func (b encodingBase) Foreach(src []byte, op Op, fn func(from, to []byte, ok bool) bool) { + var tfm transform.Transformer + var peek func([]byte) []byte + if op&opFromUTF8 != 0 { + tfm = b.enc.NewEncoder() + peek = EncodingUTF8Impl.Peek + } else { + tfm = b.enc.NewDecoder() + peek = b.self.Peek + } + var buf [4]byte + for i, w := 0, 0; i < len(src); i += w { + w = len(peek(src[i:])) + nDst, _, err := tfm.Transform(buf[:], src[i:i+w], false) + meetErr := err != nil || (op&opToUTF8 != 0 && beginWithReplacementChar(buf[:nDst])) + if !fn(src[i:i+w], buf[:nDst], !meetErr) { + return + } + } +} + +// replacementBytes are bytes for the replacement rune 0xfffd. +var replacementBytes = []byte{0xEF, 0xBF, 0xBD} + +// beginWithReplacementChar check if dst has the prefix '0xEFBFBD'. +func beginWithReplacementChar(dst []byte) bool { + return bytes.HasPrefix(dst, replacementBytes) +} + +// generateEncodingErr generates an invalid string in charset error. +func generateEncodingErr(name string, invalidBytes []byte) error { + arg := fmt.Sprintf("%X", invalidBytes) + return ErrInvalidCharacterString.GenByArgs(name, arg) +} + +// HackSlice converts string to slice without copy. +// Use at your own risk. +func HackSlice(s string) (b []byte) { + if len(s) == 0 { + return []byte{} + } + return unsafe.Slice(unsafe.StringData(s), len(s)) +} + +// HackString converts slice to string without copy. +// Use it at your own risk. +func HackString(b []byte) (s string) { + if len(b) == 0 { + return "" + } + return unsafe.String(unsafe.SliceData(b), len(b)) +} diff --git a/pkg/parser/charset/encoding_bin.go b/pkg/parser/charset/encoding_bin.go new file mode 100644 index 000000000..c10823d8d --- /dev/null +++ b/pkg/parser/charset/encoding_bin.go @@ -0,0 +1,68 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "bytes" + + "golang.org/x/text/encoding" +) + +// EncodingBinImpl is the instance of encodingBin. +var EncodingBinImpl = &encodingBin{encodingBase{enc: encoding.Nop}} + +func init() { + EncodingBinImpl.self = EncodingBinImpl +} + +// encodingBin is the binary encoding. +type encodingBin struct { + encodingBase +} + +// Name implements Encoding interface. +func (*encodingBin) Name() string { + return CharsetBin +} + +// Tp implements Encoding interface. +func (*encodingBin) Tp() EncodingTp { + return EncodingTpBin +} + +// Peek implements Encoding interface. +func (*encodingBin) Peek(src []byte) []byte { + if len(src) == 0 { + return src + } + return src[:1] +} + +// IsValid implements Encoding interface. +func (*encodingBin) IsValid(_ []byte) bool { + return true +} + +// Foreach implements Encoding interface. +func (*encodingBin) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { + for i := range src { + if !fn(src[i:i+1], src[i:i+1], true) { + return + } + } +} + +func (*encodingBin) Transform(_ *bytes.Buffer, src []byte, _ Op) ([]byte, error) { + return src, nil +} diff --git a/pkg/parser/charset/encoding_latin1.go b/pkg/parser/charset/encoding_latin1.go new file mode 100644 index 000000000..aa18984a6 --- /dev/null +++ b/pkg/parser/charset/encoding_latin1.go @@ -0,0 +1,61 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "bytes" + + "golang.org/x/text/encoding" +) + +// EncodingLatin1Impl is the instance of encodingLatin1. +// latin1 is handled with the utf8 implementation (a no-op transform) for +// backward compatibility. +var EncodingLatin1Impl = &encodingLatin1{encodingUTF8{encodingBase{enc: encoding.Nop}}} + +func init() { + EncodingLatin1Impl.self = EncodingLatin1Impl +} + +// encodingLatin1 is a transparent (no-transform) encoding for latin1. +type encodingLatin1 struct { + encodingUTF8 +} + +// Name implements Encoding interface. +func (*encodingLatin1) Name() string { + return CharsetLatin1 +} + +// Peek implements Encoding interface. +func (*encodingLatin1) Peek(src []byte) []byte { + if len(src) == 0 { + return src + } + return src[:1] +} + +// IsValid implements Encoding interface. +func (*encodingLatin1) IsValid(_ []byte) bool { + return true +} + +// Tp implements Encoding interface. +func (*encodingLatin1) Tp() EncodingTp { + return EncodingTpLatin1 +} + +func (*encodingLatin1) Transform(_ *bytes.Buffer, src []byte, _ Op) ([]byte, error) { + return src, nil +} diff --git a/pkg/parser/charset/encoding_test.go b/pkg/parser/charset/encoding_test.go new file mode 100644 index 000000000..3a6c66420 --- /dev/null +++ b/pkg/parser/charset/encoding_test.go @@ -0,0 +1,83 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset_test + +import ( + "fmt" + "testing" + "unicode/utf8" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/stretchr/testify/require" +) + +func TestFindEncoding(t *testing.T) { + // Charsets with a real transcoder. + for _, chs := range []string{charset.CharsetUTF8MB4, charset.CharsetUTF8, charset.CharsetLatin1, charset.CharsetASCII, charset.CharsetBin} { + enc := charset.FindEncoding(chs) + require.NotEqual(t, charset.EncodingTpNone, enc.Tp(), chs) + } + + // Charsets without one (including gbk/gb18030, whose transcoders were + // dropped in the fork) fall back to the pass-through binary encoding. + for _, chs := range []string{"gbk", "gb18030", "big5", "latin2", ""} { + enc := charset.FindEncoding(chs) + require.Equal(t, charset.CharsetBin, enc.Name(), chs) + } +} + +func TestEncodingValidate(t *testing.T) { + oxfffefd := string([]byte{0xff, 0xfe, 0xfd}) + testCases := []struct { + chs string + str string + expected string + nSrc int + ok bool + }{ + {charset.CharsetASCII, "", "", 0, true}, + {charset.CharsetASCII, "qwerty", "qwerty", 6, true}, + {charset.CharsetASCII, "qwÊrty", "qw?rty", 2, false}, + {charset.CharsetASCII, "中文", "??", 0, false}, + {charset.CharsetASCII, "中文?qwert", "???qwert", 0, false}, + {charset.CharsetUTF8MB4, "", "", 0, true}, + {charset.CharsetUTF8MB4, "qwerty", "qwerty", 6, true}, + {charset.CharsetUTF8MB4, "qwÊrty", "qwÊrty", 7, true}, + {charset.CharsetUTF8MB4, "qwÊ合法字符串", "qwÊ合法字符串", 19, true}, + {charset.CharsetUTF8MB4, "😂", "😂", 4, true}, + {charset.CharsetUTF8MB4, oxfffefd, "???", 0, false}, + {charset.CharsetUTF8MB4, "中文" + oxfffefd, "中文???", 6, false}, + {charset.CharsetUTF8MB4, string(utf8.RuneError), "�", 3, true}, + {charset.CharsetUTF8, "", "", 0, true}, + {charset.CharsetUTF8, "qwerty", "qwerty", 6, true}, + {charset.CharsetUTF8, "qwÊrty", "qwÊrty", 7, true}, + {charset.CharsetUTF8, "qwÊ合法字符串", "qwÊ合法字符串", 19, true}, + {charset.CharsetUTF8, "😂", "?", 0, false}, + {charset.CharsetUTF8, "valid_str😂", "valid_str?", 9, false}, + {charset.CharsetUTF8, oxfffefd, "???", 0, false}, + {charset.CharsetUTF8, "中文" + oxfffefd, "中文???", 6, false}, + {charset.CharsetUTF8, string(utf8.RuneError), "�", 3, true}, + } + for _, tc := range testCases { + msg := fmt.Sprintf("%v", tc) + enc := charset.FindEncoding(tc.chs) + if tc.chs == charset.CharsetUTF8 { + enc = charset.EncodingUTF8MB3StrictImpl + } + strBytes := []byte(tc.str) + require.Equal(t, tc.ok, enc.IsValid(strBytes), msg) + replace, _ := enc.Transform(nil, strBytes, charset.OpReplaceNoErr) + require.Equal(t, tc.expected, string(replace), msg) + } +} diff --git a/pkg/parser/charset/encoding_utf8.go b/pkg/parser/charset/encoding_utf8.go new file mode 100644 index 000000000..3dc7a80ee --- /dev/null +++ b/pkg/parser/charset/encoding_utf8.go @@ -0,0 +1,137 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package charset + +import ( + "bytes" + "unicode/utf8" + + "golang.org/x/text/encoding" +) + +// EncodingUTF8Impl is the instance of encodingUTF8. +var EncodingUTF8Impl = &encodingUTF8{encodingBase{enc: encoding.Nop}} + +// EncodingUTF8MB3StrictImpl is the instance of encodingUTF8MB3Strict. +var EncodingUTF8MB3StrictImpl = &encodingUTF8MB3Strict{ + encodingUTF8{ + encodingBase{ + enc: encoding.Nop, + }, + }, +} + +func init() { + EncodingUTF8Impl.self = EncodingUTF8Impl + EncodingUTF8MB3StrictImpl.self = EncodingUTF8MB3StrictImpl +} + +// encodingUTF8 is the default encoding. +type encodingUTF8 struct { + encodingBase +} + +// Name implements Encoding interface. +func (*encodingUTF8) Name() string { + return CharsetUTF8MB4 +} + +// Tp implements Encoding interface. +func (*encodingUTF8) Tp() EncodingTp { + return EncodingTpUTF8 +} + +// Peek implements Encoding interface. +func (*encodingUTF8) Peek(src []byte) []byte { + nextLen := 4 + switch { + case len(src) == 0 || src[0] < 0x80: + nextLen = 1 + case src[0] < 0xe0: + nextLen = 2 + case src[0] < 0xf0: + nextLen = 3 + } + if len(src) < nextLen { + return src + } + return src[:nextLen] +} + +func (*encodingUTF8) MbLen(bs string) int { + _, size := utf8.DecodeRuneInString(bs) + if size <= 1 { + return 0 + } + return size +} + +// IsValid implements Encoding interface. +func (e *encodingUTF8) IsValid(src []byte) bool { + if utf8.Valid(src) { + return true + } + return e.encodingBase.IsValid(src) +} + +// Transform implements Encoding interface. +func (e *encodingUTF8) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { + if e.IsValid(src) { + return src, nil + } + return e.encodingBase.Transform(dest, src, op) +} + +// Foreach implements Encoding interface. +func (*encodingUTF8) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { + var rv rune + for i, w := 0, 0; i < len(src); i += w { + rv, w = utf8.DecodeRune(src[i:]) + meetErr := rv == utf8.RuneError && w == 1 + if !fn(src[i:i+w], src[i:i+w], !meetErr) { + return + } + } +} + +// encodingUTF8MB3Strict is the strict mode of EncodingUTF8MB3. +// MB4 characters are considered invalid. +type encodingUTF8MB3Strict struct { + encodingUTF8 +} + +// IsValid implements Encoding interface. +func (e *encodingUTF8MB3Strict) IsValid(src []byte) bool { + return e.encodingBase.IsValid(src) +} + +// Foreach implements Encoding interface. +func (*encodingUTF8MB3Strict) Foreach(src []byte, _ Op, fn func(srcCh, dstCh []byte, ok bool) bool) { + for i, w := 0, 0; i < len(src); i += w { + var rv rune + rv, w = utf8.DecodeRune(src[i:]) + meetErr := (rv == utf8.RuneError && w == 1) || w > 3 + if !fn(src[i:i+w], src[i:i+w], !meetErr) { + return + } + } +} + +// Transform implements Encoding interface. +func (e *encodingUTF8MB3Strict) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { + if e.IsValid(src) { + return src, nil + } + return e.encodingBase.Transform(dest, src, op) +} diff --git a/pkg/parser/consistent_test.go b/pkg/parser/consistent_test.go new file mode 100644 index 000000000..82377b1f3 --- /dev/null +++ b/pkg/parser/consistent_test.go @@ -0,0 +1,94 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + gio "io" + "os" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestKeywordConsistent(t *testing.T) { + parserFilename := "parser.y" + parserFile, err := os.Open(parserFilename) + require.NoError(t, err) + data, err := gio.ReadAll(parserFile) + require.NoError(t, err) + content := string(data) + + reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */" + unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */" + notKeywordTokenStartMarker := "\t/* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */" + identTokenEndMarker := "%token\t" + + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, identTokenEndMarker) + + for k, v := range aliases { + require.NotEqual(t, k, v) + require.Equal(t, tokenMap[v], tokenMap[k]) + } + keywordCount := len(reservedKeywords) + len(unreservedKeywords) + len(notKeywordTokens) + require.Equal(t, keywordCount-len(windowFuncTokenMap), len(tokenMap)-len(aliases)) + + unreservedCollectionDef := extractKeywordsFromCollectionDef(content, "\nUnReservedKeyword:") + require.Equal(t, unreservedCollectionDef, unreservedKeywords, "UnReservedKeyword") + + notKeywordTokensCollectionDef := extractKeywordsFromCollectionDef(content, "\nNotKeywordToken:") + require.Equal(t, notKeywordTokensCollectionDef, notKeywordTokens, "NotKeywordToken") + +} + +func extractMiddle(str, startMarker, endMarker string) string { + _, str, ok := strings.Cut(str, startMarker) + if !ok { + return "" + } + middle, _, ok := strings.Cut(str, endMarker) + if !ok { + return "" + } + return middle +} + +func extractQuotedWords(strs []string) []string { + //nolint: prealloc + var words []string + for _, str := range strs { + word := extractMiddle(str, "\"", "\"") + if word == "" { + continue + } + words = append(words, word) + } + sort.Strings(words) + return words +} + +func extractKeywords(content, startMarker, endMarker string) []string { + keywordSection := extractMiddle(content, startMarker, endMarker) + lines := strings.Split(keywordSection, "\n") + return extractQuotedWords(lines) +} + +func extractKeywordsFromCollectionDef(content, startMarker string) []string { + keywordSection := extractMiddle(content, startMarker, "\n\n") + words := strings.Split(keywordSection, "|") + return extractQuotedWords(words) +} diff --git a/pkg/parser/decimal_literal_test.go b/pkg/parser/decimal_literal_test.go new file mode 100644 index 000000000..9b8bca334 --- /dev/null +++ b/pkg/parser/decimal_literal_test.go @@ -0,0 +1,76 @@ +// Copyright 2026 Block, Inc. + +package parser_test + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/stretchr/testify/require" +) + +// selectDecimal parses "SELECT " and returns the resulting decimal +// value's string form plus any parser warnings. +func selectDecimal(t *testing.T, lit string) (string, []error) { + t.Helper() + p := parser.New() + stmts, warns, err := p.Parse("SELECT "+lit, "", "") + require.NoError(t, err) + require.Len(t, stmts, 1) + sel, ok := stmts[0].(*ast.SelectStmt) + require.True(t, ok) + ve, ok := sel.Fields.Fields[0].Expr.(*ast.ValueExpr) + require.True(t, ok) + require.Equal(t, ast.KindMysqlDecimal, ve.Kind()) + return ve.GetMysqlDecimal().String(), warns +} + +// Decimal literals wider than MyDecimal's 81-digit buffer used to panic at +// parse time. MySQL accepts them (clamping/truncating with a warning), and +// they can appear in binlogged statements, so the parser must too. +func TestHugeDecimalLiterals(t *testing.T) { + maxDecimal := strings.Repeat("9", 65) + + t.Run("integer part overflows buffer", func(t *testing.T) { + // MySQL: SELECT 99…9 (130 digits) returns the max decimal value + // (65 nines) with a truncation warning. + val, warns := selectDecimal(t, strings.Repeat("9", 130)) + require.Equal(t, maxDecimal, val) + require.Len(t, warns, 1) + require.ErrorContains(t, warns[0], "Truncated incorrect DECIMAL value") + }) + + t.Run("integer part overflows buffer with fraction", func(t *testing.T) { + val, warns := selectDecimal(t, strings.Repeat("9", 90)+".5") + require.Equal(t, maxDecimal, val) + require.Len(t, warns, 1) + }) + + t.Run("fraction truncated to buffer", func(t *testing.T) { + // One integer word leaves eight words (72 digits) of fraction. + val, warns := selectDecimal(t, "1."+strings.Repeat("9", 100)) + require.Equal(t, "1."+strings.Repeat("9", 72), val) + require.Len(t, warns, 1) + require.ErrorContains(t, warns[0], "Truncated incorrect DECIMAL value") + }) + + t.Run("fraction-only literal truncated", func(t *testing.T) { + val, warns := selectDecimal(t, "."+strings.Repeat("7", 200)) + require.Equal(t, "0."+strings.Repeat("7", 81), val) + require.Len(t, warns, 1) + }) + + t.Run("81 digits fits without warning", func(t *testing.T) { + val, warns := selectDecimal(t, strings.Repeat("9", 81)) + require.Equal(t, strings.Repeat("9", 81), val) + require.Empty(t, warns) + }) + + t.Run("ordinary decimal unaffected", func(t *testing.T) { + val, warns := selectDecimal(t, "1.5") + require.Equal(t, "1.5", val) + require.Empty(t, warns) + }) +} diff --git a/pkg/parser/format/format.go b/pkg/parser/format/format.go new file mode 100644 index 000000000..85fe920fe --- /dev/null +++ b/pkg/parser/format/format.go @@ -0,0 +1,482 @@ +// Copyright (c) 2014 The sortutil Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/STRUTIL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "fmt" + "io" + "slices" + "strings" +) + +const ( + st0 = iota + stBOL + stPERC + stBOLPERC +) + +// Formatter is an io.Writer extended formatter by a fmt.Printf like function Format. +type Formatter interface { + io.Writer + Format(format string, args ...any) (n int, errno error) +} + +type indentFormatter struct { + io.Writer + indent []byte + indentLevel int + state int +} + +var replace = map[rune]string{ + '\000': "\\0", + '\'': "''", + '\n': "\\n", + '\r': "\\r", +} + +// IndentFormatter returns a new Formatter which interprets %i and %u in the +// Format() formats string as indent and unindent commands. The commands can +// nest. The Formatter writes to io.Writer 'w' and inserts one 'indent' +// string per current indent level value. +// Behaviour of commands reaching negative indent levels is undefined. +// +// IndentFormatter(os.Stdout, "\t").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// +// output: +// +// abc3%e +// x +// y +// z +// +// The Go quoted string literal form of the above is: +// +// "abc%%e\n\tx\n\tx\nz\n" +// +// The commands can be scattered between separate invocations of Format(), +// i.e. the formatter keeps track of the indent level and knows if it is +// positioned on start of a line and should emit indentation(s). +// The same output as above can be produced by e.g.: +// +// f := IndentFormatter(os.Stdout, " ") +// f.Format("abc%d%%e%i\nx\n", 3) +// f.Format("y\n%uz\n") +func IndentFormatter(w io.Writer, indent string) Formatter { + return &indentFormatter{w, []byte(indent), 0, stBOL} +} + +func (f *indentFormatter) format(flat bool, format string, args ...any) (n int, errno error) { + var buf = make([]byte, 0) + for i := range len(format) { + c := format[i] + switch f.state { + case st0: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + f.state = stBOL + case '%': + f.state = stPERC + default: + buf = append(buf, c) + } + case stBOL: + switch c { + case '\n': + cc := c + if flat && f.indentLevel != 0 { + cc = ' ' + } + buf = append(buf, cc) + case '%': + f.state = stBOLPERC + default: + if !flat { + for range f.indentLevel { + buf = append(buf, f.indent...) + } + } + buf = append(buf, c) + f.state = st0 + } + case stBOLPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = stBOL + case 'u': + f.indentLevel-- + f.state = stBOL + default: + if !flat { + for range f.indentLevel { + buf = append(buf, f.indent...) + } + } + buf = append(buf, '%', c) + f.state = st0 + } + case stPERC: + switch c { + case 'i': + f.indentLevel++ + f.state = st0 + case 'u': + f.indentLevel-- + f.state = st0 + default: + buf = append(buf, '%', c) + f.state = st0 + } + default: + panic("unexpected state") + } + } + switch f.state { + case stPERC, stBOLPERC: + buf = append(buf, '%') + } + return fmt.Fprintf(f, string(buf), args...) +} + +// Format implements Format interface. +func (f *indentFormatter) Format(format string, args ...any) (n int, errno error) { + return f.format(false, format, args...) +} + +type flatFormatter indentFormatter + +// FlatFormatter returns a newly created Formatter with the same functionality as the one returned +// by IndentFormatter except it allows a newline in the 'format' string argument of Format +// to pass through if the indent level is current zero. +// +// If the indent level is non-zero then such new lines are changed to a space character. +// There is no indent string, the %i and %u format verbs are used solely to determine the indent level. +// +// The FlatFormatter is intended for flattening of normally nested structure textual representation to +// a one top level structure per line form. +// +// FlatFormatter(os.Stdout, " ").Format("abc%d%%e%i\nx\ny\n%uz\n", 3) +// +// output in the form of a Go quoted string literal: +// +// "abc3%%e x y z\n" +func FlatFormatter(w io.Writer) Formatter { + return (*flatFormatter)(IndentFormatter(w, "").(*indentFormatter)) +} + +// Format implements Format interface. +func (f *flatFormatter) Format(format string, args ...any) (n int, errno error) { + return (*indentFormatter)(f).format(true, format, args...) +} + +// OutputFormat output escape character with backslash. +func OutputFormat(s string) string { + var buf bytes.Buffer + for _, old := range s { + if newVal, ok := replace[old]; ok { + buf.WriteString(newVal) + continue + } + buf.WriteRune(old) + } + + return buf.String() +} + +// RestoreFlags mark the Restore format +type RestoreFlags uint64 + +// Mutually exclusive group of `RestoreFlags`: +// [RestoreStringSingleQuotes, RestoreStringDoubleQuotes] +// [RestoreKeyWordUppercase, RestoreKeyWordLowercase] +// [RestoreNameUppercase, RestoreNameLowercase] +// [RestoreNameDoubleQuotes, RestoreNameBackQuotes] +// The flag with the left position in each group has a higher priority. +const ( + RestoreStringSingleQuotes RestoreFlags = 1 << iota + RestoreStringDoubleQuotes + RestoreStringEscapeBackslash + + RestoreKeyWordUppercase + RestoreKeyWordLowercase + + RestoreNameUppercase + RestoreNameLowercase + RestoreNameDoubleQuotes + RestoreNameBackQuotes + + RestoreSpacesAroundBinaryOperation + RestoreBracketAroundBinaryOperation + + RestoreStringWithoutCharset + RestoreStringWithoutDefaultCharset + + RestoreWithoutSchemaName + RestoreWithoutTableName + + RestoreBracketAroundBetweenExpr + // RestoreSkipRedundantParentheses lets expression Restore omit parentheses + // that do not affect SQL semantics under the current restore context. It is + // meant for canonicalization paths — normalizing CHECK-constraint and + // generated-column expressions, for instance. Default SQL restore keeps + // user-written parentheses so a statement round-trips as written. + RestoreSkipRedundantParentheses +) + +const ( + // DefaultRestoreFlags is the default value of RestoreFlags. + DefaultRestoreFlags = RestoreStringSingleQuotes | RestoreKeyWordUppercase | RestoreNameBackQuotes +) + +func (rf RestoreFlags) has(flag RestoreFlags) bool { + return rf&flag != 0 +} + +// HasWithoutSchemaNameFlag returns a boolean indicating when `rf` has `RestoreWithoutSchemaName` flag. +func (rf RestoreFlags) HasWithoutSchemaNameFlag() bool { + return rf.has(RestoreWithoutSchemaName) +} + +// HasWithoutTableNameFlag returns a boolean indicating when `rf` has `RestoreWithoutTableName` flag. +func (rf RestoreFlags) HasWithoutTableNameFlag() bool { + return rf.has(RestoreWithoutTableName) +} + +// HasStringSingleQuotesFlag returns a boolean indicating when `rf` has `RestoreStringSingleQuotes` flag. +func (rf RestoreFlags) HasStringSingleQuotesFlag() bool { + return rf.has(RestoreStringSingleQuotes) +} + +// HasStringDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreStringDoubleQuotes` flag. +func (rf RestoreFlags) HasStringDoubleQuotesFlag() bool { + return rf.has(RestoreStringDoubleQuotes) +} + +// HasStringEscapeBackslashFlag returns a boolean indicating whether `rf` has `RestoreStringEscapeBackslash` flag. +func (rf RestoreFlags) HasStringEscapeBackslashFlag() bool { + return rf.has(RestoreStringEscapeBackslash) +} + +// HasKeyWordUppercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordUppercase` flag. +func (rf RestoreFlags) HasKeyWordUppercaseFlag() bool { + return rf.has(RestoreKeyWordUppercase) +} + +// HasKeyWordLowercaseFlag returns a boolean indicating whether `rf` has `RestoreKeyWordLowercase` flag. +func (rf RestoreFlags) HasKeyWordLowercaseFlag() bool { + return rf.has(RestoreKeyWordLowercase) +} + +// HasNameUppercaseFlag returns a boolean indicating whether `rf` has `RestoreNameUppercase` flag. +func (rf RestoreFlags) HasNameUppercaseFlag() bool { + return rf.has(RestoreNameUppercase) +} + +// HasNameLowercaseFlag returns a boolean indicating whether `rf` has `RestoreNameLowercase` flag. +func (rf RestoreFlags) HasNameLowercaseFlag() bool { + return rf.has(RestoreNameLowercase) +} + +// HasNameDoubleQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameDoubleQuotes` flag. +func (rf RestoreFlags) HasNameDoubleQuotesFlag() bool { + return rf.has(RestoreNameDoubleQuotes) +} + +// HasNameBackQuotesFlag returns a boolean indicating whether `rf` has `RestoreNameBackQuotes` flag. +func (rf RestoreFlags) HasNameBackQuotesFlag() bool { + return rf.has(RestoreNameBackQuotes) +} + +// HasSpacesAroundBinaryOperationFlag returns a boolean indicating +// whether `rf` has `RestoreSpacesAroundBinaryOperation` flag. +func (rf RestoreFlags) HasSpacesAroundBinaryOperationFlag() bool { + return rf.has(RestoreSpacesAroundBinaryOperation) +} + +// HasRestoreBracketAroundBinaryOperation returns a boolean indicating +// whether `rf` has `RestoreBracketAroundBinaryOperation` flag. +func (rf RestoreFlags) HasRestoreBracketAroundBinaryOperation() bool { + return rf.has(RestoreBracketAroundBinaryOperation) +} + +// HasStringWithoutDefaultCharset returns a boolean indicating +// whether `rf` has `RestoreStringWithoutDefaultCharset` flag. +func (rf RestoreFlags) HasStringWithoutDefaultCharset() bool { + return rf.has(RestoreStringWithoutDefaultCharset) +} + +// HasRestoreBracketAroundBetweenExpr returns a boolean indicating +// whether `rf` has `RestoreBracketAroundBetweenExpr` flag. +func (rf RestoreFlags) HasRestoreBracketAroundBetweenExpr() bool { + return rf.has(RestoreBracketAroundBetweenExpr) +} + +// HasRestoreSkipRedundantParentheses returns a boolean indicating whether +// `rf` has `RestoreSkipRedundantParentheses` flag. +func (rf RestoreFlags) HasRestoreSkipRedundantParentheses() bool { + return rf.has(RestoreSkipRedundantParentheses) +} + +// HasStringWithoutCharset returns a boolean indicating whether `rf` has `RestoreStringWithoutCharset` flag. +func (rf RestoreFlags) HasStringWithoutCharset() bool { + return rf.has(RestoreStringWithoutCharset) +} + +// RestoreWriter is the interface for `Restore` to write. +type RestoreWriter interface { + io.Writer + io.StringWriter +} + +// RestoreCtx is `Restore` context to hold flags and writer. +type RestoreCtx struct { + Flags RestoreFlags + In RestoreWriter + DefaultDB string + // ParentBinaryOp stores the parent opcode.Op as an int; 0 means no parent. + // Expression Restore callers set it while restoring a child so parentheses + // removal can compare the child expression's precedence with the surrounding + // operator. Callers must restore the previous value before returning. + ParentBinaryOp int + // ParentBinarySide records whether the current child is on the left or right + // side of ParentBinaryOp. It is interpreted by expression restore using the + // internal left/right constants in ast/expressions.go and is meaningful only + // together with ParentBinaryOp. + // + // Examples: + // - In `(a + b) * c`, the `(a + b)` child is the left side of `*`, so `+` + // must keep its parentheses. + // - In `a + (b * c)`, the `(b * c)` child is the right side of `+`, so `*` + // can drop its parentheses because it binds tighter. + // - In `a - (b - c)`, the right-side marker makes the same-precedence `-` + // child keep parentheses because subtraction is not associative. + // + // Callers must restore the previous value before returning. + ParentBinarySide int + // InUnaryOperation marks that a child expression is being restored as a unary + // operand. Callers must restore the previous value before returning. + InUnaryOperation bool + CTERestorer +} + +// NewRestoreCtx returns a new `RestoreCtx`. +func NewRestoreCtx(flags RestoreFlags, in RestoreWriter) *RestoreCtx { + return &RestoreCtx{Flags: flags, In: in, DefaultDB: ""} +} + +// WriteKeyWord writes the `keyWord` into writer. +// `keyWord` will be converted format(uppercase and lowercase for now) according to `RestoreFlags`. +func (ctx *RestoreCtx) WriteKeyWord(keyWord string) { + switch { + case ctx.Flags.HasKeyWordUppercaseFlag(): + keyWord = strings.ToUpper(keyWord) + case ctx.Flags.HasKeyWordLowercaseFlag(): + keyWord = strings.ToLower(keyWord) + } + _, _ = ctx.In.WriteString(keyWord) +} + +// WriteString writes the string into writer +// `str` may be wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteString(str string) { + if ctx.Flags.HasStringEscapeBackslashFlag() { + str = strings.ReplaceAll(str, `\`, `\\`) + } + quotes := "" + switch { + case ctx.Flags.HasStringSingleQuotesFlag(): + str = strings.ReplaceAll(str, `'`, `''`) + quotes = `'` + case ctx.Flags.HasStringDoubleQuotesFlag(): + str = strings.ReplaceAll(str, `"`, `""`) + quotes = `"` + } + _, _ = ctx.In.WriteString(quotes) + _, _ = ctx.In.WriteString(str) + _, _ = ctx.In.WriteString(quotes) +} + +// WriteName writes the name into writer +// `name` maybe wrapped in quotes and escaped according to RestoreFlags. +func (ctx *RestoreCtx) WriteName(name string) { + switch { + case ctx.Flags.HasNameUppercaseFlag(): + name = strings.ToUpper(name) + case ctx.Flags.HasNameLowercaseFlag(): + name = strings.ToLower(name) + } + quotes := "" + switch { + case ctx.Flags.HasNameDoubleQuotesFlag(): + name = strings.ReplaceAll(name, `"`, `""`) + quotes = `"` + case ctx.Flags.HasNameBackQuotesFlag(): + name = strings.ReplaceAll(name, "`", "``") + quotes = "`" + } + + // use `WriteString` directly instead of `fmt.Fprint` to get a better performance. + _, _ = ctx.In.WriteString(quotes) + _, _ = ctx.In.WriteString(name) + _, _ = ctx.In.WriteString(quotes) +} + +// WritePlain writes the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlain(plainText string) { + _, _ = ctx.In.WriteString(plainText) +} + +// WritePlainf write the plain text into writer without any handling. +func (ctx *RestoreCtx) WritePlainf(format string, a ...any) { + _, _ = fmt.Fprintf(ctx.In, format, a...) +} + +// CTERestorer is used by WithClause related nodes restore. +type CTERestorer struct { + CTENames []string +} + +// IsCTETableName returns true if the given tableName comes from CTE. +func (c *CTERestorer) IsCTETableName(nameL string) bool { + return slices.Contains(c.CTENames, nameL) +} + +// RecordCTEName records the CTE name. +func (c *CTERestorer) RecordCTEName(nameL string) { + c.CTENames = append(c.CTENames, nameL) +} + +// RestoreCTEFunc is used to restore CTE. +func (c *CTERestorer) RestoreCTEFunc() func() { + l := len(c.CTENames) + return func() { + if l == 0 { + c.CTENames = nil + } else { + c.CTENames = c.CTENames[:l] + } + } +} diff --git a/pkg/parser/format/format_test.go b/pkg/parser/format/format_test.go new file mode 100644 index 000000000..1989f73bb --- /dev/null +++ b/pkg/parser/format/format_test.go @@ -0,0 +1,83 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package format + +import ( + "bytes" + "io" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func checkFormat(t *testing.T, f Formatter, buf *bytes.Buffer, str, expect string) { + _, err := f.Format(str, 3) + require.NoError(t, err) + b, err := io.ReadAll(buf) + require.NoError(t, err) + require.Equal(t, expect, string(b)) +} + +func TestFormat(t *testing.T) { + str := "abc%d%%e%i\nx\ny\n%uz\n" + buf := &bytes.Buffer{} + f := IndentFormatter(buf, "\t") + expect := `abc3%e + x + y +z +` + checkFormat(t, f, buf, str, expect) + + str = "abc%d%%e%i\nx\ny\n%uz\n%i\n" + buf = &bytes.Buffer{} + f = FlatFormatter(buf) + expect = "abc3%e x y z\n " + checkFormat(t, f, buf, str, expect) +} + +func TestRestoreCtx(t *testing.T) { + testCases := []struct { + flag RestoreFlags + expect string + }{ + {0, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreStringSingleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, + {RestoreStringDoubleQuotes, "key`.'\"Word\\ \"str`.'\"\"ing\\\" na`.'\"Me\\"}, + {RestoreStringEscapeBackslash, "key`.'\"Word\\ str`.'\"ing\\\\ na`.'\"Me\\"}, + {RestoreKeyWordUppercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreKeyWordLowercase, "key`.'\"word\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreNameUppercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, + {RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ na`.'\"me\\"}, + {RestoreNameDoubleQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, + {RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ `na``.'\"Me\\`"}, + {DefaultRestoreFlags, "KEY`.'\"WORD\\ 'str`.''\"ing\\' `na``.'\"Me\\`"}, + {RestoreStringSingleQuotes | RestoreStringDoubleQuotes, "key`.'\"Word\\ 'str`.''\"ing\\' na`.'\"Me\\"}, + {RestoreKeyWordUppercase | RestoreKeyWordLowercase, "KEY`.'\"WORD\\ str`.'\"ing\\ na`.'\"Me\\"}, + {RestoreNameUppercase | RestoreNameLowercase, "key`.'\"Word\\ str`.'\"ing\\ NA`.'\"ME\\"}, + {RestoreNameDoubleQuotes | RestoreNameBackQuotes, "key`.'\"Word\\ str`.'\"ing\\ \"na`.'\"\"Me\\\""}, + } + var sb strings.Builder + for _, testCase := range testCases { + sb.Reset() + ctx := NewRestoreCtx(testCase.flag, &sb) + ctx.WriteKeyWord("key`.'\"Word\\") + ctx.WritePlain(" ") + ctx.WriteString("str`.'\"ing\\") + ctx.WritePlain(" ") + ctx.WriteName("na`.'\"Me\\") + require.Equalf(t, testCase.expect, sb.String(), "case: %#v", testCase) + } +} diff --git a/pkg/parser/goyacc/format_yacc.go b/pkg/parser/goyacc/format_yacc.go new file mode 100644 index 000000000..b3ca38814 --- /dev/null +++ b/pkg/parser/goyacc/format_yacc.go @@ -0,0 +1,574 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bufio" + "fmt" + gofmt "go/format" + "go/token" + "os" + "regexp" + "strings" + + parser "modernc.org/parser/yacc" + "modernc.org/strutil" +) + +func Format(inputFilename string, goldenFilename string) (err error) { + spec, err := parseFileToSpec(inputFilename) + if err != nil { + return err + } + + yFmt := &OutputFormatter{} + if err = yFmt.Setup(goldenFilename); err != nil { + return err + } + defer func() { + teardownErr := yFmt.Teardown() + if err == nil { + err = teardownErr + } + }() + + if err = printDefinitions(yFmt, spec.Defs); err != nil { + return err + } + + return printRules(yFmt, spec.Rules) +} + +func parseFileToSpec(inputFilename string) (*parser.Specification, error) { + src, err := os.ReadFile(inputFilename) + if err != nil { + return nil, err + } + return parser.Parse(token.NewFileSet(), inputFilename, src) +} + +// Definition represents data reduced by productions: +// +// Definition: +// START IDENTIFIER +// | UNION // Case 1 +// | LCURL RCURL // Case 2 +// | ReservedWord Tag NameList // Case 3 +// | ReservedWord Tag // Case 4 +// | ERROR_VERBOSE // Case 5 +const ( + StartIdentifierCase = iota + UnionDefinitionCase + LCURLRCURLCase + ReservedWordTagNameListCase + ReservedWordTagCase +) + +func printDefinitions(formatter Formatter, definitions []*parser.Definition) error { + for _, def := range definitions { + var err error + switch def.Case { + case StartIdentifierCase: + err = handleStart(formatter, def) + case UnionDefinitionCase: + err = handleUnion(formatter, def) + case LCURLRCURLCase: + err = handleProlog(formatter, def) + case ReservedWordTagNameListCase, ReservedWordTagCase: + err = handleReservedWordTagNameList(formatter, def) + } + if err != nil { + return err + } + } + _, err := formatter.Format("\n%%%%") + return err +} + +func handleStart(f Formatter, definition *parser.Definition) error { + if err := Ensure(definition). + and(definition.Token2). + and(definition.Token2).NotNil(); err != nil { + return err + } + cmt1 := strings.Join(definition.Token.Comments, "\n") + cmt2 := strings.Join(definition.Token2.Comments, "\n") + _, err := f.Format("\n%s%s\t%s%s\n", cmt1, definition.Token.Val, cmt2, definition.Token2.Val) + return err +} + +func handleUnion(f Formatter, definition *parser.Definition) error { + if err := Ensure(definition). + and(definition.Value).NotNil(); err != nil { + return err + } + if len(definition.Value) != 0 { + _, err := f.Format("%%union%i%s%u\n\n", definition.Value) + if err != nil { + return err + } + } + return nil +} + +func handleProlog(f Formatter, definition *parser.Definition) error { + if err := Ensure(definition). + and(definition.Value).NotNil(); err != nil { + return err + } + _, err := f.Format("%%{%s%%}\n\n", definition.Value) + return err +} + +func handleReservedWordTagNameList(f Formatter, def *parser.Definition) error { + if err := Ensure(def). + and(def.ReservedWord). + and(def.ReservedWord.Token).NotNil(); err != nil { + return err + } + comment := getTokenComment(def.ReservedWord.Token, divNewLineStringLayout) + directive := def.ReservedWord.Token.Val + + hasTag := def.Tag != nil + var wordAfterDirective string + if hasTag { + wordAfterDirective = joinTag(def.Tag) + } else { + wordAfterDirective = joinNames(def.Nlist) + } + + if _, err := f.Format("%s%s%s%i", comment, directive, wordAfterDirective); err != nil { + return err + } + if hasTag { + if _, err := f.Format("\n"); err != nil { + return err + } + if err := printNameListVertical(f, def.Nlist); err != nil { + return err + } + } + _, err := f.Format("%u\n") + return err +} + +func joinTag(tag *parser.Tag) string { + var sb strings.Builder + sb.WriteString("\t") + if tag.Token != nil { + sb.WriteString(tag.Token.Val) + } + if tag.Token2 != nil { + sb.WriteString(tag.Token2.Val) + } + if tag.Token3 != nil { + sb.WriteString(tag.Token3.Val) + } + return sb.String() +} + +type stringLayout int8 + +const ( + spanStringLayout stringLayout = iota + divStringLayout + divNewLineStringLayout +) + +func getTokenComment(token *parser.Token, layout stringLayout) string { + if len(token.Comments) == 0 { + return "" + } + var splitter, beforeComment string + switch layout { + case spanStringLayout: + splitter, beforeComment = " ", "" + case divStringLayout: + splitter, beforeComment = "\n", "" + case divNewLineStringLayout: + splitter, beforeComment = "\n", "\n" + default: + panic(fmt.Errorf("unsupported stringLayout: %v", layout)) + } + + var sb strings.Builder + sb.WriteString(beforeComment) + for _, comment := range token.Comments { + sb.WriteString(comment) + sb.WriteString(splitter) + } + return sb.String() +} + +func printNameListVertical(f Formatter, names NameArr) (err error) { + rest := names + for len(rest) != 0 { + var processing NameArr + processing, rest = rest[:1], rest[1:] + + var noComments NameArr + noComments, rest = rest.span(noComment) + processing = append(processing, noComments...) + + maxCharLength := processing.findMaxLength() + for _, name := range processing { + if err := printSingleName(f, name, maxCharLength); err != nil { + return err + } + } + } + return nil +} + +func joinNames(names NameArr) string { + var sb strings.Builder + for _, name := range names { + sb.WriteString(" ") + sb.WriteString(getTokenComment(name.Token, spanStringLayout)) + sb.WriteString(name.Token.Val) + } + return sb.String() +} + +func printSingleName(f Formatter, name *parser.Name, maxCharLength int) error { + cmt := getTokenComment(name.Token, divNewLineStringLayout) + if _, err := f.Format(escapePercent(cmt)); err != nil { + return err + } + strLit := name.LiteralStringOpt + if strLit != nil && strLit.Token != nil { + _, err := f.Format("%-*s %s\n", maxCharLength, name.Token.Val, strLit.Token.Val) + return err + } + _, err := f.Format("%s\n", name.Token.Val) + return err +} + +type NameArr []*parser.Name + +func (ns NameArr) span(pred func(*parser.Name) bool) (first NameArr, second NameArr) { + first = ns.takeWhile(pred) + second = ns[len(first):] + return first, second +} + +func (ns NameArr) takeWhile(pred func(*parser.Name) bool) NameArr { + for i, def := range ns { + if pred(def) { + continue + } + return ns[:i] + } + return ns +} + +func (ns NameArr) findMaxLength() int { + maxLen := -1 + for _, s := range ns { + if len(s.Token.Val) > maxLen { + maxLen = len(s.Token.Val) + } + } + return maxLen +} + +func hasComments(n *parser.Name) bool { + return len(n.Token.Comments) != 0 +} + +func noComment(n *parser.Name) bool { + return !hasComments(n) +} + +func containsActionInRule(rule *parser.Rule) bool { + for _, b := range rule.Body { + if _, ok := b.(*parser.Action); ok { + return true + } + } + return false +} + +type RuleArr []*parser.Rule + +func printRules(f Formatter, rules RuleArr) (err error) { + var lastRuleName string + for _, rule := range rules { + if rule.Name.Val == lastRuleName { + cmt := getTokenComment(rule.Token, divStringLayout) + _, err = f.Format("\n%s|\t%i", cmt) + } else { + cmt := getTokenComment(rule.Name, divStringLayout) + _, err = f.Format("\n\n%s%s:%i\n", cmt, rule.Name.Val) + } + if err != nil { + return err + } + lastRuleName = rule.Name.Val + + if err = printRuleBody(f, rule); err != nil { + return err + } + if _, err = f.Format("%u"); err != nil { + return err + } + } + _, err = f.Format("\n%%%%\n") + return err +} + +type ruleItemType int8 + +const ( + identRuleItemType ruleItemType = 1 + actionRuleItemType ruleItemType = 2 + strLiteralRuleItemType ruleItemType = 3 +) + +func printRuleBody(f Formatter, rule *parser.Rule) error { + firstRuleItem, counter := rule.RuleItemList, 0 + for ri := rule.RuleItemList; ri != nil; ri = ri.RuleItemList { + switch ruleItemType(ri.Case) { + case identRuleItemType, strLiteralRuleItemType: + term := fmt.Sprintf(" %s", ri.Token.Val) + if ri == firstRuleItem { + term = term[1:] + } + cmt := getTokenComment(ri.Token, divStringLayout) + + if _, err := f.Format(escapePercent(cmt)); err != nil { + return err + } + if _, err := f.Format("%s", term); err != nil { + return err + } + case actionRuleItemType: + isFirstRuleItem := ri == firstRuleItem + if err := handlePrecedence(f, rule.Precedence, isFirstRuleItem); err != nil { + return err + } + if err := handleAction(f, rule, ri.Action, isFirstRuleItem); err != nil { + return err + } + } + counter++ + } + if err := checkInconsistencyInYaccParser(f, rule, counter); err != nil { + return err + } + if !containsActionInRule(rule) { + if err := handlePrecedence(f, rule.Precedence, counter == 0); err != nil { + return err + } + } + return nil +} + +func handleAction(f Formatter, rule *parser.Rule, action *parser.Action, isFirstItem bool) error { + if !isFirstItem || rule.Precedence != nil { + if _, err := f.Format("\n"); err != nil { + return err + } + } + + cmt := getTokenComment(action.Token, divStringLayout) + if _, err := f.Format(escapePercent(cmt)); err != nil { + return err + } + + goSnippet, err := formatGoSnippet(action.Values) + goSnippet = escapePercent(goSnippet) + if err != nil { + return err + } + snippet := "{}" + if len(goSnippet) != 0 { + snippet = fmt.Sprintf("{%%i\n%s%%u\n}", goSnippet) + } + _, err = f.Format(snippet) + return err +} + +func handlePrecedence(f Formatter, p *parser.Precedence, isFirstItem bool) error { + if p == nil { + return nil + } + if err := Ensure(p.Token). + and(p.Token2).NotNil(); err != nil { + return err + } + cmt := getTokenComment(p.Token, spanStringLayout) + if !isFirstItem { + if _, err := f.Format(" "); err != nil { + return err + } + } + _, err := f.Format("%s%s %s", cmt, p.Token.Val, p.Token2.Val) + return err +} + +func formatGoSnippet(actVal []*parser.ActionValue) (string, error) { + tran := &SpecialActionValTransformer{ + store: map[string]string{}, + } + goSnippet := collectGoSnippet(tran, actVal) + formatted, err := gofmt.Source([]byte(goSnippet)) + if err != nil { + return "", err + } + formattedSnippet := tran.restore(string(formatted)) + return strings.TrimSpace(formattedSnippet), nil +} + +func collectGoSnippet(tran *SpecialActionValTransformer, actionValArr []*parser.ActionValue) string { + var sb strings.Builder + for _, value := range actionValArr { + trimTab := removeLineBeginBlanks(value.Src) + sb.WriteString(tran.transform(trimTab)) + } + snipWithPar := strings.TrimSpace(sb.String()) + if strings.HasPrefix(snipWithPar, "{") && strings.HasSuffix(snipWithPar, "}") { + return snipWithPar[1 : len(snipWithPar)-1] + } + return "" +} + +var lineBeginBlankRegex = regexp.MustCompile("(?m)^[\t ]+") + +func removeLineBeginBlanks(src string) string { + return lineBeginBlankRegex.ReplaceAllString(src, "") +} + +type SpecialActionValTransformer struct { + store map[string]string +} + +const yaccFmtVar = "_yaccfmt_var_" + +var yaccFmtVarRegex = regexp.MustCompile("_yaccfmt_var_[0-9]{1,5}") + +func (s *SpecialActionValTransformer) transform(val string) string { + if strings.HasPrefix(val, "$") { + generated := fmt.Sprintf("%s%d", yaccFmtVar, len(s.store)) + s.store[generated] = val + return generated + } + return val +} + +func (s *SpecialActionValTransformer) restore(src string) string { + return yaccFmtVarRegex.ReplaceAllStringFunc(src, func(matched string) string { + origin, ok := s.store[matched] + if !ok { + panic(fmt.Errorf("mismatch in SpecialActionValTransformer")) + } + return origin + }) +} + +type OutputFormatter struct { + file *os.File + out *bufio.Writer + formatter strutil.Formatter +} + +func (y *OutputFormatter) Setup(filename string) (err error) { + if y.file, err = os.Create(filename); err != nil { + return + } + y.out = bufio.NewWriter(y.file) + y.formatter = strutil.IndentFormatter(y.out, "\t") + return +} + +func (y *OutputFormatter) Teardown() error { + if y.out != nil { + if err := y.out.Flush(); err != nil { + return err + } + } + if y.file != nil { + if err := y.file.Close(); err != nil { + return err + } + } + return nil +} + +func (y *OutputFormatter) Format(format string, args ...any) (int, error) { + return y.formatter.Format(format, args...) +} + +func (y *OutputFormatter) Write(bytes []byte) (int, error) { + return y.formatter.Write(bytes) +} + +type NotNilAssert struct { + idx int + err error +} + +func (n *NotNilAssert) and(target any) *NotNilAssert { + if n.err != nil { + return n + } + if target == nil { + n.err = fmt.Errorf("encounter nil, index: %d", n.idx) + } + n.idx++ + return n +} + +func (n *NotNilAssert) NotNil() error { + return n.err +} + +func Ensure(target any) *NotNilAssert { + return (&NotNilAssert{}).and(target) +} + +func escapePercent(src string) string { + return strings.ReplaceAll(src, "%", "%%") +} + +func checkInconsistencyInYaccParser(f Formatter, rule *parser.Rule, counter int) error { + if counter == len(rule.Body) { + return nil + } + // pickup rule item in ruleBody + for i := counter; i < len(rule.Body); i++ { + body := rule.Body[i] + switch b := body.(type) { + case string, int: + if bInt, ok := b.(int); ok { + b = fmt.Sprintf("'%c'", bInt) + } + term := fmt.Sprintf(" %s", b) + if i == 0 { + term = term[1:] + } + _, err := f.Format("%s", term) + return err + case *parser.Action: + isFirstRuleItem := i == 0 + if err := handlePrecedence(f, rule.Precedence, isFirstRuleItem); err != nil { + return err + } + if err := handleAction(f, rule, b, isFirstRuleItem); err != nil { + return err + } + } + } + return nil +} diff --git a/pkg/parser/goyacc/formatter.go b/pkg/parser/goyacc/formatter.go new file mode 100644 index 000000000..68435a600 --- /dev/null +++ b/pkg/parser/goyacc/formatter.go @@ -0,0 +1,24 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import "io" + +// Formatter is an io.Writer extended by a fmt.Printf like function Format. +// It was previously imported from the parser's format package; goyacc keeps a +// local copy so it can live in its own module without depending on the parser. +type Formatter interface { + io.Writer + Format(format string, args ...any) (n int, errno error) +} diff --git a/pkg/parser/goyacc/go.mod b/pkg/parser/goyacc/go.mod new file mode 100644 index 000000000..3c43e6c83 --- /dev/null +++ b/pkg/parser/goyacc/go.mod @@ -0,0 +1,21 @@ +// goyacc is the parser generator used to regenerate parser.go and +// hintparser.go from the .y grammar files (see the Makefile one level up). +// It is a separate Go module so its dependencies (modernc.org/*) stay out of +// the main spirit module's dependency graph: goyacc is only ever built when +// regenerating the parser, never as part of a spirit build. +module github.com/block/spirit/pkg/parser/goyacc + +go 1.26 + +require ( + modernc.org/mathutil v1.6.0 + modernc.org/parser v1.1.0 + modernc.org/sortutil v1.2.0 + modernc.org/strutil v1.2.0 + modernc.org/y v1.1.0 +) + +require ( + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + modernc.org/golex v1.1.0 // indirect +) diff --git a/pkg/parser/goyacc/go.sum b/pkg/parser/goyacc/go.sum new file mode 100644 index 000000000..8c2316852 --- /dev/null +++ b/pkg/parser/goyacc/go.sum @@ -0,0 +1,24 @@ +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +modernc.org/fileutil v1.1.2/go.mod h1:HdjlliqRHrMAI4nVOvvpYVzVgvRSK7WnoCiG0GUWJNo= +modernc.org/golex v1.0.5/go.mod h1:pTY7KKjdvZbv2ROjfp6FFX5BXMM9QWZEnmCsl60aCfI= +modernc.org/golex v1.1.0 h1:dmSaksHMd+y6NkBsRsCShNPRaSNCNH+abrVm5/gZic8= +modernc.org/golex v1.1.0/go.mod h1:2pVlfqApurXhR1m0N+WDYu6Twnc4QuvO4+U8HnwoiRA= +modernc.org/lex v1.1.1/go.mod h1:6r8o8DLJkAnOsQaGi8fMoi+Vt6LTbDaCrkUK729D8xM= +modernc.org/lexer v1.0.4/go.mod h1:tOajb8S4sdfOYitzCgXDFmbVJ/LE0v1fNJ7annTw36U= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/parser v1.0.8/go.mod h1:gSb1YDm/lCtL9U4M6+HIk2JfFiGgguEJUjZlIdK3I0g= +modernc.org/parser v1.1.0 h1:XoClYpoz2xHEDIteSQ7tICOTFcNwBI7XRCeghUS6SNI= +modernc.org/parser v1.1.0/go.mod h1:CXl3OTJRZij8FeMpzI3Id/bjupHf0u9HSrCUP4Z9pbA= +modernc.org/scanner v1.1.0/go.mod h1:pDSh3vhQZeHFCjpcSzhDsvDIDOku2b/DdagPGXkK35o= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/y v1.1.0 h1:JdIvLry+rKeSsVNRCdr6YWYimwwNm0GXtzxid77VfWc= +modernc.org/y v1.1.0/go.mod h1:Iz3BmyIS4OwAbwGaUS7cqRrLsSsfp2sFWtpzX+P4CsE= diff --git a/pkg/parser/goyacc/main.go b/pkg/parser/goyacc/main.go new file mode 100644 index 000000000..72c3d82da --- /dev/null +++ b/pkg/parser/goyacc/main.go @@ -0,0 +1,841 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright 2014 The goyacc Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This source code uses portions of code previously published in the Go tool +// yacc[0] program, the respective license can be found in the LICENSE-GO-YACC +// file. + +// Goyacc is a version of yacc generating Go parsers. +// +// # Usage +// +// Note: If no non flag arguments are given, goyacc reads standard input. +// +// goyacc [options] [input] +// +// options and (defaults) +// -c Report state closures. (false) +// -cr Check all states are reducible. (false) +// -dlval Debug value when runtime yyDebug >= 3. ("lval") +// -dlvalf Debug format of -dlval. ("%+v") +// -ex Explain how were conflicts resolved. (false) +// -l Disable line directives, for compatibility only - ignored. (false) +// -la Report all lookahead sets. (false) +// -o outputFile Parser output. ("y.go") +// -p prefix Name prefix to use in generated code. ("yy") +// -v reportFile Create grammar report. ("y.output") +// -xe examplesFile Generate error messages by examples. ("") +// -xegen examplesFile Generate a file suitable for -xe automatically from the grammar. +// The file must not exist. ("") +// +// # Changelog +// +// 2015-03-24: The search for a custom error message is now extended to include +// also the last state that was shifted into, if any. This change resolves a +// problem in which a lookahead symbol is valid for a reduce action in state A, +// but the same symbol is later never accepted by any shift action in some +// state B which is popped from the state stack after the reduction is +// performed. The computed from example state is A but when the error is +// actually detected, the state is now B and the custom error was thus not +// used. +// +// 2015-02-23: Added -xegen flag. It can be used to automagically generate a +// skeleton errors by example file which can be, for example, edited and/or +// submited later as an argument of the -xe option. +// +// 2014-12-18: Support %precedence for better bison compatibility[3]. The +// actual changes are in packages goyacc is dependent on. Goyacc users should +// rebuild the binary: +// +// $ go get -u github.com/cznic/goyacc +// +// 2014-12-02: Added support for the optional yyLexerEx interface. The Reduced +// method can be useful for debugging and/or automatically producing examples +// by parsing code fragments. If it returns true the parser exits immediately +// with return value -1. +// +// # Overview +// +// The generated parser is reentrant and mostly backwards compatible with +// parsers generated by go tool yacc[0]. yyParse expects to be given an +// argument that conforms to the following interface: +// +// type yyLexer interface { +// Lex(lval *yySymType) int +// Errorf(format string, a ...interface{}) +// Errors() (warns []error, errs []error) +// } +// +// Optionally the argument to yyParse may implement the following interface: +// +// type yyLexerEx interface { +// yyLexer +// // Hook for recording a reduction. +// Reduced(rule, state int, lval *yySymType) (stop bool) // Client should copy *lval. +// } +// +// Lex should return the token identifier, and place other token information in +// lval (which replaces the usual yylval). Error is equivalent to yyerror in +// the original yacc. +// +// Code inside the parser may refer to the variable yylex, which holds the +// yyLexer passed to Parse. +// +// Multiple grammars compiled into a single program should be placed in +// distinct packages. If that is impossible, the "-p prefix" flag to yacc sets +// the prefix, by default yy, that begins the names of symbols, including +// types, the parser, and the lexer, generated and referenced by yacc's +// generated code. Setting it to distinct values allows multiple grammars to be +// placed in a single package. +// +// # Differences wrt go tool yacc +// +// - goyacc implements ideas from "Generating LR Syntax Error Messages from +// Examples"[1]. Use the -xe flag to pass a name of the example file. For more +// details about the example format please see [2]. +// +// - The grammar report includes example token sequences leading to the +// particular state. Can help understanding conflicts. +// +// - Minor changes in parser debug output. +// +// # Links +// +// Referenced from elsewhere: +// +// [0]: http://golang.org/cmd/yacc/ +// [1]: http://people.via.ecp.fr/~stilgar/doc/compilo/parser/Generating%20LR%20Syntax%20Error%20Messages.pdf +// [2]: http://godoc.org/github.com/cznic/y#hdr-Error_Examples +// [3]: http://www.gnu.org/software/bison/manual/html_node/Precedence-Only.html#Precedence-Only +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "go/scanner" + "go/token" + "io" + "log" + "os" + "runtime" + "slices" + "sort" + "strings" + + "modernc.org/mathutil" + parser "modernc.org/parser/yacc" + "modernc.org/sortutil" + "modernc.org/strutil" + "modernc.org/y" +) + +var ( + //oNoDefault = flag.Bool("nodefault", false, "disable generating $default actions") + oClosures = flag.Bool("c", false, "report state closures") + oReducible = flag.Bool("cr", false, "check all states are reducible") + oDlval = flag.String("dlval", "lval", "debug value (runtime yyDebug >= 3)") + oDlvalf = flag.String("dlvalf", "%+v", "debug format of -dlval (runtime yyDebug >= 3)") + oLA = flag.Bool("la", false, "report all lookahead sets") + oNoLines = flag.Bool("l", false, "disable line directives (for compatibility ony - ignored)") + oOut = flag.String("o", "y.go", "parser output") + oPref = flag.String("p", "yy", "name prefix to use in generated code") + oReport = flag.String("v", "y.output", "create grammar report") + oResolved = flag.Bool("ex", false, "explain how were conflicts resolved") + oXErrors = flag.String("xe", "", "generate eXtra errors from examples source file") + oXErrorsGen = flag.String("xegen", "", "generate error from examples source file automatically from the grammar") + oFormat = flag.Bool("fmt", false, "format the yacc file") + oFormatOut = flag.String("fmtout", "golden.y", "yacc formatter output") + oParserType = flag.String("t", "Parser", "name of the parser in the generated yyParse() function") +) + +func main() { + log.SetFlags(0) + + defer func() { + _, file, line, ok := runtime.Caller(2) + if e := recover(); e != nil { + switch { + case ok: + log.Fatalf("%s:%d: panic: %v", file, line, e) + default: + log.Fatalf("panic: %v", e) + } + } + }() + + flag.Parse() + var in string + switch flag.NArg() { + case 0: + in = os.Stdin.Name() + case 1: + in = flag.Arg(0) + default: + log.Fatal("expected at most one non flag argument") + } + + if *oFormat { + if err := Format(in, *oFormatOut); err != nil { + log.Fatal(err) + } + return + } + + if err := main1(in); err != nil { + switch x := err.(type) { + case scanner.ErrorList: + for _, v := range x { + fmt.Fprintf(os.Stderr, "%v\n", v) + } + os.Exit(1) + default: + log.Fatal(err) + } + } +} + +type symUsed struct { + sym *y.Symbol + used int +} + +type symsUsed []symUsed + +func (s symsUsed) Len() int { return len(s) } +func (s symsUsed) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +func (s symsUsed) Less(i, j int) bool { + if s[i].used > s[j].used { + return true + } + + if s[i].used < s[j].used { + return false + } + + caseFoldedCompare := strings.Compare(strings.ToLower(s[i].sym.Name), strings.ToLower(s[j].sym.Name)) + if caseFoldedCompare < 0 { + return true + } + if caseFoldedCompare > 0 { + return false + } + + return s[i].sym.Name < s[j].sym.Name +} + +func main1(in string) (err error) { + var out io.Writer + if nm := *oOut; nm != "" { + var f *os.File + var e error + if f, err = os.Create(nm); err != nil { + return err + } + + defer func() { + if e1 := f.Close(); e1 != nil && err == nil { + err = e1 + } + }() + w := bufio.NewWriter(f) + defer func() { + if e1 := w.Flush(); e1 != nil && err == nil { + err = e1 + } + }() + buf := bytes.NewBuffer(nil) + out = buf + defer func() { + var dest []byte + if dest, e = format.Source(buf.Bytes()); e != nil { + dest = buf.Bytes() + } + + if _, e = w.Write(dest); e != nil && err == nil { + err = e + } + }() + } + + var rep io.Writer + if nm := *oReport; nm != "" { + f, err1 := os.Create(nm) + if err1 != nil { + return err1 + } + + defer func() { + if e := f.Close(); e != nil && err == nil { + err = e + } + }() + w := bufio.NewWriter(f) + defer func() { + if e := w.Flush(); e != nil && err == nil { + err = e + } + }() + rep = w + } + + var xerrors []byte + if nm := *oXErrors; nm != "" { + b, err1 := os.ReadFile(nm) + if err1 != nil { + return err1 + } + + xerrors = b + } + + p, err := y.ProcessFile(token.NewFileSet(), in, &y.Options{ + //NoDefault: *oNoDefault, + AllowConflicts: false, + Closures: *oClosures, + LA: *oLA, + Reducible: *oReducible, + Report: rep, + Resolved: *oResolved, + XErrorsName: *oXErrors, + XErrorsSrc: xerrors, + }) + if err != nil { + return err + } + + if fn := *oXErrorsGen; fn != "" { + f, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE, 0600) + if err != nil { + return err + } + + b := bufio.NewWriter(f) + if err := p.SkeletonXErrors(b); err != nil { + return err + } + + if err := b.Flush(); err != nil { + return err + } + + if err := f.Close(); err != nil { + return err + } + } + + msu := make(map[*y.Symbol]int, len(p.Syms)) // sym -> usage + for nm, sym := range p.Syms { + if nm == "" || nm == "ε" || nm == "$accept" || nm == "#" { + continue + } + + msu[sym] = 0 + } + var minArg, maxArg int + for _, state := range p.Table { + for _, act := range state { + msu[act.Sym]++ + k, arg := act.Kind() + if k == 'a' { + continue + } + + if k == 'r' { + arg = -arg + } + minArg, maxArg = min(minArg, arg), max(maxArg, arg) + } + } + su := make(symsUsed, 0, len(msu)) + for sym, used := range msu { + su = append(su, symUsed{sym, used}) + } + sort.Sort(su) + + // ----------------------------------------------------------- Prologue + f := strutil.IndentFormatter(out, "\t") + mustFormat(f, "// Code generated by goyacc DO NOT EDIT.\n\n") + mustFormat(f, "%s", injectImport(p.Prologue)) + mustFormat(f, ` +type %[1]sSymType %i%s%u + +type %[1]sXError struct { + state, xsym int +} +`, *oPref, p.UnionSrc) + + // ---------------------------------------------------------- Constants + nsyms := map[string]*y.Symbol{} + a := make([]string, 0, len(msu)) + maxTokName := 0 + for sym := range msu { + nm := sym.Name + if nm == "$default" || nm == "$end" || sym.IsTerminal && nm[0] != '\'' && sym.Value > 0 { + maxTokName = max(maxTokName, len(nm)) + a = append(a, nm) + } + nsyms[nm] = sym + } + slices.Sort(a) + mustFormat(f, "\nconst (%i\n") + for _, v := range a { + nm := v + switch nm { + case "error": + nm = *oPref + "ErrCode" + case "$default": + nm = *oPref + "Default" + case "$end": + nm = *oPref + "EOFCode" + } + mustFormat(f, "%s%s = %d\n", nm, strings.Repeat(" ", maxTokName-len(nm)+1), nsyms[v].Value) + } + minArg-- // eg: [-13, 42], minArg -14 maps -13 to 1 so zero cell values -> empty. + mustFormat(f, "\n%sMaxDepth = 200\n", *oPref) + mustFormat(f, "%sTabOfs = %d\n", *oPref, minArg) + mustFormat(f, "%u)") + + // ---------------------------------------------------------- Variables + mustFormat(f, "\n\nvar (%i\n") + + // Lex translation table + mustFormat(f, "%sXLAT = map[int]int{%i\n", *oPref) + xlat := make(map[int]int, len(su)) + var errSym int + for i, v := range su { + if v.sym.Name == "error" { + errSym = i + } + xlat[v.sym.Value] = i + mustFormat(f, "%6d: %3d, // %s (%dx)\n", v.sym.Value, i, v.sym.Name, msu[v.sym]) + } + mustFormat(f, "%u}\n") + + // Symbol names + mustFormat(f, "\n%sSymNames = []string{%i\n", *oPref) + for _, v := range su { + mustFormat(f, "%q,\n", v.sym.Name) + } + mustFormat(f, "%u}\n") + + // Reduction table + mustFormat(f, "\n%sReductions = []struct{xsym, components int}{%i\n", *oPref) + for _, rule := range p.Rules { + mustFormat(f, "{%d, %d},\n", xlat[rule.Sym.Value], len(rule.Components)) + } + mustFormat(f, "%u}\n") + + // XError table + mustFormat(f, "\n%[1]sXErrors = map[%[1]sXError]string{%i\n", *oPref) + for _, xerr := range p.XErrors { + state := xerr.Stack[len(xerr.Stack)-1] + xsym := -1 + if xerr.Lookahead != nil { + xsym = xlat[xerr.Lookahead.Value] + } + mustFormat(f, "%[1]sXError{%d, %d}: \"%s\",\n", *oPref, state, xsym, xerr.Msg) + } + mustFormat(f, "%u}\n\n") + + // Parse table + tbits := 32 + switch n := mathutil.BitLen(maxArg - minArg + 1); { + case n < 8: + tbits = 8 + case n < 16: + tbits = 16 + } + mustFormat(f, "%sParseTab = [%d][]uint%d{%i\n", *oPref, len(p.Table), tbits) + nCells := 0 + var tabRow sortutil.Uint64Slice + for si, state := range p.Table { + tabRow = tabRow[:0] + maxv := 0 + for _, act := range state { + sym := act.Sym + xsym, ok := xlat[sym.Value] + if !ok { + panic("internal error 001") + } + + maxv = max(maxv, xsym) + kind, arg := act.Kind() + switch kind { + case 'a': + arg = 0 + case 'r': + arg *= -1 + } + tabRow = append(tabRow, uint64(xsym)<<32|uint64(arg-minArg)) + } + nCells += maxv + tabRow.Sort() + col := -1 + if si%5 == 0 { + mustFormat(f, "// %d\n", si) + } + mustFormat(f, "{") + for i, v := range tabRow { + xsym := int(uint32(v >> 32)) + arg := int(uint32(v)) + if col+1 != xsym { + mustFormat(f, "%d: ", xsym) + } + switch { + case i == len(tabRow)-1: + mustFormat(f, "%d", arg) + default: + mustFormat(f, "%d, ", arg) + } + col = xsym + } + mustFormat(f, "},\n") + } + mustFormat(f, "%u}\n") + fmt.Fprintf(os.Stderr, "Parse table entries: %d of %d, x %d bits == %d bytes\n", + nCells, len(p.Table)*len(msu), tbits, nCells*tbits/8) + if n := p.ConflictsSR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d shift/reduce\n", n) + } + if n := p.ConflictsRR; n != 0 { + fmt.Fprintf(os.Stderr, "conflicts: %d reduce/reduce\n", n) + } + + mustFormat(f, `%u) + +var %[1]sDebug = 0 + +type %[1]sLexer interface { + Lex(lval *%[1]sSymType) int + Errorf(format string, a ...interface{}) error + AppendError(err error) + AppendWarn(err error) + Errors() (warns []error, errs []error) +} + +type %[1]sLexerEx interface { + %[1]sLexer + Reduced(rule, state int, lval *%[1]sSymType) bool +} + +func %[1]sSymName(c int) (s string) { + x, ok := %[1]sXLAT[c] + if ok { + return %[1]sSymNames[x] + } + + return __yyfmt__.Sprintf("%%d", c) +} + +func %[1]slex1(yylex %[1]sLexer, lval *%[1]sSymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = %[1]sEOFCode + } + if %[1]sDebug >= 3 { + __yyfmt__.Printf("\nlex %%s(%%#x %%d), %[4]s: %[3]s\n", %[1]sSymName(n), n, n, %[4]s) + } + return n +} + +func %[1]sParse(yylex %[1]sLexer, parser *%[5]s) int { + const yyError = %[2]d + + yyEx, _ := yylex.(%[1]sLexerEx) + var yyn int + parser.yylval = %[1]sSymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if %[1]sDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp+1 >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = %[1]slex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = %[1]sXLAT[yychar]; !ok { + yyxchar = len(%[1]sSymNames) // > tab width + } + } + if %[1]sDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %%v\n", a) + } + row := %[1]sParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += %[1]sTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + *parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if %[1]sDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %%d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if %[1]sDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if %[1]sDebug >= 1 { + __yyfmt__.Printf("no action for %%s in state %%d\n", %[1]sSymName(yychar), yystate) + } + msg, ok := %[1]sXErrors[%[1]sXError{yystate, yyxchar}] + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = %[1]sXErrors[%[1]sXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.AppendError(yylex.Errorf("")) + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := %[1]sParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError])+%[1]sTabOfs + if yyn > 0 { // hit + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %%d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %%d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("error recovery discards %%s\n", %[1]sSymName(yychar)) + } + if yychar == %[1]sEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := %[1]sReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]%[1]sSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(%[1]sParseTab[yyS[yyp].yys][x])+%[1]sTabOfs + /* reduction by production r */ + if %[1]sDebug >= 2 { + __yyfmt__.Printf("reduce using rule %%v (%%s), and goto state %%d\n", r, %[1]sSymNames[x], yystate) + } + + switch r {%i +`, + *oPref, errSym, *oDlvalf, *oDlval, *oParserType) + for r, rule := range p.Rules { + if rule.Action == nil { + continue + } + + action := rule.Action.Values + if len(action) == 0 { + continue + } + + if len(action) == 1 { + part := action[0] + if part.Type == parser.ActionValueGo { + src := part.Src + src = src[1 : len(src)-1] // Remove lead '{' and trail '}' + if strings.TrimSpace(src) == "" { + continue + } + } + } + + components := rule.Components + typ := rule.Sym.Type + maxv := len(components) + if p1 := rule.Parent; p1 != nil { + maxv = rule.MaxParentDlr + components = p1.Components + } + mustFormat(f, "case %d: ", r) + for _, part := range action { + num := part.Num + switch part.Type { + case parser.ActionValueGo: + mustFormat(f, "%s", part.Src) + case parser.ActionValueDlrDlr: + mustFormat(f, "parser.yyVAL.%s", typ) + if typ == "" { + panic("internal error 002") + } + case parser.ActionValueDlrNum: + typ := p.Syms[components[num-1]].Type + if typ == "" { + panic("internal error 003") + } + mustFormat(f, "yyS[yypt-%d].%s", maxv-num, typ) + case parser.ActionValueDlrTagDlr: + mustFormat(f, "parser.yyVAL.%s", part.Tag) + case parser.ActionValueDlrTagNum: + mustFormat(f, "yyS[yypt-%d].%s", maxv-num, part.Tag) + } + } + mustFormat(f, "\n") + } + mustFormat(f, `%u + } + + if !parser.lexer.skipPositionRecording { + %[1]sSetOffset(parser.yyVAL, parser.yyVAL.offset) + } + + if yyEx != nil && yyEx.Reduced(r, exState, parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} + +%[2]s +`, *oPref, p.Tail) + _ = oNoLines //TODO Ignored for now + return nil +} + +func injectImport(src string) string { + const inj = ` + +import __yyfmt__ "fmt" +` + fset := token.NewFileSet() + file := fset.AddFile("", -1, len(src)) + var s scanner.Scanner + s.Init( + file, + []byte(src), + nil, + scanner.ScanComments, + ) + for { + switch _, tok, _ := s.Scan(); tok { + case token.EOF: + return inj + src + case token.PACKAGE: + s.Scan() // ident + pos, _, _ := s.Scan() + ofs := file.Offset(pos) + return src[:ofs] + inj + src[ofs:] + } + } +} + +func mustFormat(f strutil.Formatter, format string, args ...any) { + _, err := f.Format(format, args...) + if err != nil { + log.Fatalf("format error %v", err) + } +} diff --git a/pkg/parser/hintparser.go b/pkg/parser/hintparser.go new file mode 100644 index 000000000..9bce37434 --- /dev/null +++ b/pkg/parser/hintparser.go @@ -0,0 +1,1045 @@ +// Code generated by goyacc DO NOT EDIT. + +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import __yyfmt__ "fmt" + +import ( + "strconv" + + "github.com/block/spirit/pkg/parser/ast" +) + +type yyhintSymType struct { + yys int + offset int + ident string + number uint64 + hint *ast.TableOptimizerHint + hints []*ast.TableOptimizerHint + table ast.HintTable + modelIdents []ast.CIStr +} + +type yyhintXError struct { + state, xsym int +} + +const ( + yyhintDefault = 57384 + yyhintEOFCode = 57344 + yyhintErrCode = 57345 + hintBKA = 57356 + hintBNL = 57358 + hintDupsWeedOut = 57380 + hintFirstMatch = 57381 + hintHashJoin = 57360 + hintIdentifier = 57347 + hintIndexMerge = 57364 + hintIntLit = 57346 + hintInvalid = 57348 + hintJoinFixedOrder = 57352 + hintJoinOrder = 57353 + hintJoinPrefix = 57354 + hintJoinSuffix = 57355 + hintLooseScan = 57382 + hintMRR = 57366 + hintMaterialization = 57383 + hintMaxExecutionTime = 57376 + hintMerge = 57362 + hintNoBKA = 57357 + hintNoBNL = 57359 + hintNoHashJoin = 57361 + hintNoICP = 57368 + hintNoIndexMerge = 57365 + hintNoMRR = 57367 + hintNoMerge = 57363 + hintNoOrderIndex = 57375 + hintNoRangeOptimization = 57369 + hintNoSemijoin = 57373 + hintNoSkipScan = 57371 + hintNumericLit = 57351 + hintOrderIndex = 57374 + hintQBName = 57379 + hintResourceGroup = 57378 + hintSemijoin = 57372 + hintSetVar = 57377 + hintSingleAtIdentifier = 57349 + hintSkipScan = 57370 + hintStringLit = 57350 + + yyhintMaxDepth = 200 + yyhintTabOfs = -114 +) + +var ( + yyhintXLAT = map[int]int{ + 41: 0, // ')' (96x) + 57356: 1, // hintBKA (86x) + 57358: 2, // hintBNL (86x) + 57360: 3, // hintHashJoin (86x) + 57347: 4, // hintIdentifier (86x) + 57364: 5, // hintIndexMerge (86x) + 57352: 6, // hintJoinFixedOrder (86x) + 57353: 7, // hintJoinOrder (86x) + 57354: 8, // hintJoinPrefix (86x) + 57355: 9, // hintJoinSuffix (86x) + 57376: 10, // hintMaxExecutionTime (86x) + 57362: 11, // hintMerge (86x) + 57366: 12, // hintMRR (86x) + 57357: 13, // hintNoBKA (86x) + 57359: 14, // hintNoBNL (86x) + 57361: 15, // hintNoHashJoin (86x) + 57368: 16, // hintNoICP (86x) + 57365: 17, // hintNoIndexMerge (86x) + 57363: 18, // hintNoMerge (86x) + 57367: 19, // hintNoMRR (86x) + 57375: 20, // hintNoOrderIndex (86x) + 57369: 21, // hintNoRangeOptimization (86x) + 57373: 22, // hintNoSemijoin (86x) + 57371: 23, // hintNoSkipScan (86x) + 57374: 24, // hintOrderIndex (86x) + 57379: 25, // hintQBName (86x) + 57378: 26, // hintResourceGroup (86x) + 57372: 27, // hintSemijoin (86x) + 57377: 28, // hintSetVar (86x) + 57370: 29, // hintSkipScan (86x) + 44: 30, // ',' (77x) + 57380: 31, // hintDupsWeedOut (67x) + 57381: 32, // hintFirstMatch (67x) + 57382: 33, // hintLooseScan (67x) + 57383: 34, // hintMaterialization (67x) + 57349: 35, // hintSingleAtIdentifier (48x) + 57346: 36, // hintIntLit (47x) + 46: 37, // '.' (43x) + 40: 38, // '(' (36x) + 61: 39, // '=' (35x) + 57344: 40, // $end (21x) + 57390: 41, // Identifier (16x) + 57397: 42, // QueryBlockOpt (15x) + 57351: 43, // hintNumericLit (4x) + 57387: 44, // HintTable (4x) + 57385: 45, // CommaOpt (3x) + 57388: 46, // HintTableList (3x) + 43: 47, // '+' (2x) + 45: 48, // '-' (2x) + 57386: 49, // HintIndexList (2x) + 57350: 50, // hintStringLit (2x) + 57389: 51, // HintTableListOpt (2x) + 57393: 52, // JoinOrderOptimizerHintName (2x) + 57394: 53, // NullaryHintName (2x) + 57399: 54, // SubqueryOptimizerHintName (2x) + 57402: 55, // SubqueryStrategy (2x) + 57403: 56, // SupportedIndexLevelOptimizerHintName (2x) + 57404: 57, // SupportedTableLevelOptimizerHintName (2x) + 57405: 58, // TableOptimizerHintOpt (2x) + 57406: 59, // UnsupportedIndexLevelOptimizerHintName (2x) + 57407: 60, // UnsupportedTableLevelOptimizerHintName (2x) + 57408: 61, // Value (2x) + 57409: 62, // ViewName (2x) + 57391: 63, // IndexNameList (1x) + 57392: 64, // IndexNameListOpt (1x) + 57395: 65, // OptimizerHintList (1x) + 57396: 66, // PartitionList (1x) + 57398: 67, // Start (1x) + 57400: 68, // SubqueryStrategies (1x) + 57401: 69, // SubqueryStrategiesOpt (1x) + 57410: 70, // ViewNameList (1x) + 57384: 71, // $default (0x) + 57345: 72, // error (0x) + 57348: 73, // hintInvalid (0x) + } + + yyhintSymNames = []string{ + "')'", + "hintBKA", + "hintBNL", + "hintHashJoin", + "hintIdentifier", + "hintIndexMerge", + "hintJoinFixedOrder", + "hintJoinOrder", + "hintJoinPrefix", + "hintJoinSuffix", + "hintMaxExecutionTime", + "hintMerge", + "hintMRR", + "hintNoBKA", + "hintNoBNL", + "hintNoHashJoin", + "hintNoICP", + "hintNoIndexMerge", + "hintNoMerge", + "hintNoMRR", + "hintNoOrderIndex", + "hintNoRangeOptimization", + "hintNoSemijoin", + "hintNoSkipScan", + "hintOrderIndex", + "hintQBName", + "hintResourceGroup", + "hintSemijoin", + "hintSetVar", + "hintSkipScan", + "','", + "hintDupsWeedOut", + "hintFirstMatch", + "hintLooseScan", + "hintMaterialization", + "hintSingleAtIdentifier", + "hintIntLit", + "'.'", + "'('", + "'='", + "$end", + "Identifier", + "QueryBlockOpt", + "hintNumericLit", + "HintTable", + "CommaOpt", + "HintTableList", + "'+'", + "'-'", + "HintIndexList", + "hintStringLit", + "HintTableListOpt", + "JoinOrderOptimizerHintName", + "NullaryHintName", + "SubqueryOptimizerHintName", + "SubqueryStrategy", + "SupportedIndexLevelOptimizerHintName", + "SupportedTableLevelOptimizerHintName", + "TableOptimizerHintOpt", + "UnsupportedIndexLevelOptimizerHintName", + "UnsupportedTableLevelOptimizerHintName", + "Value", + "ViewName", + "IndexNameList", + "IndexNameListOpt", + "OptimizerHintList", + "PartitionList", + "Start", + "SubqueryStrategies", + "SubqueryStrategiesOpt", + "ViewNameList", + "$default", + "error", + "hintInvalid", + } + + yyhintReductions = []struct{ xsym, components int }{ + {0, 1}, + {67, 1}, + {65, 1}, + {65, 3}, + {58, 4}, + {58, 4}, + {58, 4}, + {58, 4}, + {58, 4}, + {58, 4}, + {58, 5}, + {58, 5}, + {58, 6}, + {58, 4}, + {58, 4}, + {58, 6}, + {58, 4}, + {58, 5}, + {58, 4}, + {58, 6}, + {58, 6}, + {42, 0}, + {42, 1}, + {45, 0}, + {45, 1}, + {66, 1}, + {66, 3}, + {51, 1}, + {51, 1}, + {46, 2}, + {46, 3}, + {44, 2}, + {44, 4}, + {70, 3}, + {70, 1}, + {62, 2}, + {62, 1}, + {49, 4}, + {64, 0}, + {64, 1}, + {63, 1}, + {63, 3}, + {69, 0}, + {69, 1}, + {68, 1}, + {68, 3}, + {61, 1}, + {61, 1}, + {61, 1}, + {61, 1}, + {61, 2}, + {61, 2}, + {61, 2}, + {61, 2}, + {52, 1}, + {52, 1}, + {52, 1}, + {60, 1}, + {60, 1}, + {60, 1}, + {60, 1}, + {60, 1}, + {57, 1}, + {57, 1}, + {57, 1}, + {59, 1}, + {59, 1}, + {59, 1}, + {59, 1}, + {59, 1}, + {59, 1}, + {59, 1}, + {56, 1}, + {56, 1}, + {54, 1}, + {54, 1}, + {55, 1}, + {55, 1}, + {55, 1}, + {55, 1}, + {53, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + {41, 1}, + } + + yyhintXErrors = map[yyhintXError]string{} + + yyhintParseTab = [177][]uint16{ + // 0 + {1: 134, 136, 140, 130, 142, 118, 131, 132, 133, 125, 139, 143, 135, 137, 141, 145, 153, 138, 144, 150, 146, 152, 148, 149, 128, 127, 151, 126, 147, 52: 119, 129, 124, 56: 123, 121, 117, 122, 120, 65: 116, 67: 115}, + {40: 114}, + {1: 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 207, 40: 113, 45: 289}, + {1: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 40: 112}, + {38: 286}, + // 5 + {38: 282}, + {38: 279}, + {38: 271}, + {38: 268}, + {38: 252}, + // 10 + {38: 240}, + {38: 236}, + {38: 231}, + {38: 228}, + {38: 216}, + // 15 + {38: 213}, + {38: 154}, + {38: 60}, + {38: 59}, + {38: 58}, + // 20 + {38: 57}, + {38: 56}, + {38: 55}, + {38: 54}, + {38: 53}, + // 25 + {38: 52}, + {38: 51}, + {38: 50}, + {38: 49}, + {38: 48}, + // 30 + {38: 47}, + {38: 46}, + {38: 45}, + {38: 44}, + {38: 43}, + // 35 + {38: 42}, + {38: 41}, + {38: 40}, + {38: 39}, + {38: 34}, + // 40 + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 158, 93, 41: 157, 155, 66: 156}, + {36: 211}, + {205, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 207, 91, 91, 91, 91, 36: 91, 45: 206}, + {89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 36: 89, 39: 192}, + {92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 36: 92, 92}, + // 45 + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 39: 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 39: 32}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 39: 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 39: 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 39: 29}, + // 50 + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 39: 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 39: 27}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 39: 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 39: 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 39: 24}, + // 55 + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 39: 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 39: 22}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 39: 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 39: 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 39: 19}, + // 60 + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 39: 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 39: 17}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 39: 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 39: 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 39: 14}, + // 65 + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 39: 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 39: 12}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 39: 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 39: 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 39: 9}, + // 70 + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 39: 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 39: 7}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 39: 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 39: 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 39: 4}, + // 75 + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 39: 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 39: 2}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39: 1}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 36: 197, 41: 195, 43: 196, 47: 198, 199, 50: 194, 61: 193}, + {204}, + // 80 + {68}, + {67}, + {66}, + {65}, + {36: 203, 43: 202}, + // 85 + {36: 201, 43: 200}, + {63}, + {61}, + {64}, + {62}, + // 90 + {1: 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 40: 94}, + {1: 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 40: 96}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 36: 208, 41: 209}, + {90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 31: 90, 90, 90, 90, 36: 90}, + {210}, + // 95 + {88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 36: 88}, + {1: 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 40: 95}, + {212}, + {1: 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 40: 97}, + {93, 35: 158, 42: 214}, + // 100 + {215}, + {1: 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 40: 98}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 217}, + {218, 30: 219}, + {1: 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 40: 100}, + // 105 + {93, 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 158, 37: 93, 41: 222, 223, 62: 221, 70: 220}, + {225, 37: 226}, + {80, 37: 80}, + {93, 35: 158, 37: 93, 42: 224}, + {78, 37: 78}, + // 110 + {79, 37: 79}, + {1: 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 40: 99}, + {93, 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 158, 37: 93, 41: 222, 223, 62: 227}, + {81, 37: 81}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 229}, + // 115 + {230}, + {1: 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 40: 101}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 232}, + {39: 233}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 36: 197, 41: 195, 43: 196, 47: 198, 199, 50: 194, 61: 234}, + // 120 + {235}, + {1: 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 40: 102}, + {35: 158, 93, 42: 237}, + {36: 238}, + {239}, + // 125 + {1: 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 40: 103}, + {93, 31: 93, 93, 93, 93, 158, 42: 241}, + {72, 31: 245, 246, 247, 248, 55: 244, 68: 243, 242}, + {251}, + {71, 30: 249}, + // 130 + {70, 30: 70}, + {38, 30: 38}, + {37, 30: 37}, + {36, 30: 36}, + {35, 30: 35}, + // 135 + {31: 245, 246, 247, 248, 55: 250}, + {69, 30: 69}, + {1: 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 40: 104}, + {1: 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 31: 93, 93, 93, 93, 158, 42: 254, 49: 253}, + {267}, + // 140 + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 255, 44: 256}, + {93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 158, 37: 264, 42: 263}, + {91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 207, 91, 91, 91, 91, 45: 257}, + {76, 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 260, 63: 259, 258}, + {77}, + // 145 + {75, 30: 261}, + {74, 30: 74}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 262}, + {73, 30: 73}, + {83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83}, + // 150 + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 265}, + {93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 158, 42: 266}, + {82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82}, + {1: 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 40: 105}, + {1: 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 31: 93, 93, 93, 93, 158, 42: 254, 49: 269}, + // 155 + {270}, + {1: 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 40: 106}, + {93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 31: 93, 93, 93, 93, 158, 42: 274, 46: 273, 51: 272}, + {278}, + {87, 30: 276}, + // 160 + {86, 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 255, 44: 275}, + {85, 30: 85}, + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 255, 44: 277}, + {84, 30: 84}, + {1: 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 40: 107}, + // 165 + {93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 31: 93, 93, 93, 93, 158, 42: 274, 46: 273, 51: 280}, + {281}, + {1: 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 40: 108}, + {1: 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 31: 93, 93, 93, 93, 158, 42: 284, 46: 283}, + {285, 30: 276}, + // 170 + {1: 164, 166, 168, 159, 172, 160, 161, 162, 163, 184, 170, 174, 165, 167, 169, 176, 173, 171, 175, 183, 177, 181, 179, 182, 187, 186, 180, 185, 178, 31: 188, 189, 190, 191, 41: 255, 44: 275}, + {1: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 40: 109}, + {93, 35: 158, 42: 287}, + {288}, + {1: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 40: 110}, + // 175 + {1: 134, 136, 140, 130, 142, 118, 131, 132, 133, 125, 139, 143, 135, 137, 141, 145, 153, 138, 144, 150, 146, 152, 148, 149, 128, 127, 151, 126, 147, 52: 119, 129, 124, 56: 123, 121, 290, 122, 120}, + {1: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 40: 111}, + } +) + +var yyhintDebug = 0 + +type yyhintLexer interface { + Lex(lval *yyhintSymType) int + Errorf(format string, a ...interface{}) error + AppendError(err error) + AppendWarn(err error) + Errors() (warns []error, errs []error) +} + +type yyhintLexerEx interface { + yyhintLexer + Reduced(rule, state int, lval *yyhintSymType) bool +} + +func yyhintSymName(c int) (s string) { + x, ok := yyhintXLAT[c] + if ok { + return yyhintSymNames[x] + } + + return __yyfmt__.Sprintf("%d", c) +} + +func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = yyhintEOFCode + } + if yyhintDebug >= 3 { + __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yyhintSymName(n), n, n, lval) + } + return n +} + +func yyhintParse(yylex yyhintLexer, parser *hintParser) int { + const yyError = 72 + + yyEx, _ := yylex.(yyhintLexerEx) + var yyn int + parser.yylval = yyhintSymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if yyhintDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp+1 >= len(yyS) { + nyys := make([]yyhintSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = yyhintlex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = yyhintXLAT[yychar]; !ok { + yyxchar = len(yyhintSymNames) // > tab width + } + } + if yyhintDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %v\n", a) + } + row := yyhintParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += yyhintTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + *parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if yyhintDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if yyhintDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if yyhintDebug >= 1 { + __yyfmt__.Printf("no action for %s in state %d\n", yyhintSymName(yychar), yystate) + } + msg, ok := yyhintXErrors[yyhintXError{yystate, yyxchar}] + if !ok { + msg, ok = yyhintXErrors[yyhintXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = yyhintXErrors[yyhintXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = yyhintXErrors[yyhintXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.AppendError(yylex.Errorf("")) + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := yyhintParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError]) + yyhintTabOfs + if yyn > 0 { // hit + if yyhintDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if yyhintDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if yyhintDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if yyhintDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", yyhintSymName(yychar)) + } + if yychar == yyhintEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := yyhintReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]yyhintSymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(yyhintParseTab[yyS[yyp].yys][x]) + yyhintTabOfs + /* reduction by production r */ + if yyhintDebug >= 2 { + __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yyhintSymNames[x], yystate) + } + + switch r { + case 1: + { + parser.result = yyS[yypt-0].hints + } + case 2: + { + if yyS[yypt-0].hint != nil { + parser.yyVAL.hints = []*ast.TableOptimizerHint{yyS[yypt-0].hint} + } + } + case 3: + { + if yyS[yypt-0].hint != nil { + parser.yyVAL.hints = append(yyS[yypt-2].hints, yyS[yypt-0].hint) + } else { + parser.yyVAL.hints = yyS[yypt-2].hints + } + } + case 4: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 5: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 6: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 7: + { + h := yyS[yypt-1].hint + h.HintName = ast.NewCIStr(yyS[yypt-3].ident) + parser.yyVAL.hint = h + } + case 8: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 9: + { + h := yyS[yypt-1].hint + h.HintName = ast.NewCIStr(yyS[yypt-3].ident) + parser.yyVAL.hint = h + } + case 10: + { + parser.warnUnsupportedHint(yyS[yypt-4].ident) + parser.yyVAL.hint = nil + } + case 11: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-4].ident), + QBName: ast.NewCIStr(yyS[yypt-2].ident), + HintData: yyS[yypt-1].number, + } + } + case 12: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-5].ident), + HintData: ast.HintSetVar{ + VarName: yyS[yypt-3].ident, + Value: yyS[yypt-1].ident, + }, + } + } + case 13: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-3].ident), + HintData: yyS[yypt-1].ident, + } + } + case 14: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-3].ident), + QBName: ast.NewCIStr(yyS[yypt-1].ident), + } + } + case 15: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-5].ident), + QBName: ast.NewCIStr(yyS[yypt-3].ident), + Tables: yyS[yypt-1].hint.Tables, + } + } + case 16: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr(yyS[yypt-3].ident), + QBName: ast.NewCIStr(yyS[yypt-1].ident), + } + } + case 17: + { + parser.warnUnsupportedHint(yyS[yypt-4].ident) + parser.yyVAL.hint = nil + } + case 18: + { + parser.warnUnsupportedHint(yyS[yypt-3].ident) + parser.yyVAL.hint = nil + } + case 19: + { + parser.warnUnsupportedHint(yyS[yypt-5].ident) + parser.yyVAL.hint = nil + } + case 20: + { + parser.warnUnsupportedHint(yyS[yypt-5].ident) + parser.yyVAL.hint = nil + } + case 21: + { + parser.yyVAL.ident = "" + } + case 25: + { + parser.yyVAL.modelIdents = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 26: + { + parser.yyVAL.modelIdents = append(yyS[yypt-2].modelIdents, ast.NewCIStr(yyS[yypt-0].ident)) + } + case 28: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + QBName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 29: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + Tables: []ast.HintTable{yyS[yypt-0].table}, + QBName: ast.NewCIStr(yyS[yypt-1].ident), + } + } + case 30: + { + h := yyS[yypt-2].hint + h.Tables = append(h.Tables, yyS[yypt-0].table) + parser.yyVAL.hint = h + } + case 31: + { + parser.yyVAL.table = ast.HintTable{ + TableName: ast.NewCIStr(yyS[yypt-1].ident), + QBName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 32: + { + parser.yyVAL.table = ast.HintTable{ + DBName: ast.NewCIStr(yyS[yypt-3].ident), + TableName: ast.NewCIStr(yyS[yypt-1].ident), + QBName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 33: + { + h := yyS[yypt-2].hint + h.Tables = append(h.Tables, yyS[yypt-0].table) + parser.yyVAL.hint = h + } + case 34: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + Tables: []ast.HintTable{yyS[yypt-0].table}, + } + } + case 35: + { + parser.yyVAL.table = ast.HintTable{ + TableName: ast.NewCIStr(yyS[yypt-1].ident), + QBName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 36: + { + parser.yyVAL.table = ast.HintTable{ + QBName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 37: + { + h := yyS[yypt-0].hint + h.Tables = []ast.HintTable{yyS[yypt-2].table} + h.QBName = ast.NewCIStr(yyS[yypt-3].ident) + parser.yyVAL.hint = h + } + case 38: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{} + } + case 40: + { + parser.yyVAL.hint = &ast.TableOptimizerHint{ + Indexes: []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)}, + } + } + case 41: + { + h := yyS[yypt-2].hint + h.Indexes = append(h.Indexes, ast.NewCIStr(yyS[yypt-0].ident)) + parser.yyVAL.hint = h + } + case 49: + { + parser.yyVAL.ident = strconv.FormatUint(yyS[yypt-0].number, 10) + } + case 50: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 51: + { + parser.yyVAL.ident = "-" + yyS[yypt-0].ident + } + case 52: + { + parser.yyVAL.ident = strconv.FormatUint(yyS[yypt-0].number, 10) + } + case 53: + { + if yyS[yypt-0].number > 9223372036854775808 { + yylex.AppendError(yylex.Errorf("the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807].")) + return 1 + } else if yyS[yypt-0].number == 9223372036854775808 { + signed_one := int64(1) + parser.yyVAL.ident = strconv.FormatInt(signed_one<<63, 10) + } else { + parser.yyVAL.ident = strconv.FormatInt(-int64(yyS[yypt-0].number), 10) + } + } + + } + + if !parser.lexer.skipPositionRecording { + yyhintSetOffset(parser.yyVAL, parser.yyVAL.offset) + } + + if yyEx != nil && yyEx.Reduced(r, exState, parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} diff --git a/pkg/parser/hintparser.y b/pkg/parser/hintparser.y new file mode 100644 index 000000000..a09508937 --- /dev/null +++ b/pkg/parser/hintparser.y @@ -0,0 +1,524 @@ +%{ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "strconv" + + "github.com/block/spirit/pkg/parser/ast" +) + +%} + +%union { + offset int + ident string + number uint64 + hint *ast.TableOptimizerHint + hints []*ast.TableOptimizerHint + table ast.HintTable + modelIdents []ast.CIStr +} + +%token + + /*yy:token "%d" */ + hintIntLit "a 64-bit unsigned integer" + +%token + + /*yy:token "%c" */ + hintIdentifier + hintInvalid "a special token never used by parser, used by lexer to indicate error" + + /*yy:token "@%c" */ + hintSingleAtIdentifier "identifier with single leading at" + + /*yy:token "'%c'" */ + hintStringLit + + /* SET_VAR-only decimal/float literal. Integer values still use hintIntLit. */ + hintNumericLit + + /* MySQL 8.0 hint names */ + hintJoinFixedOrder "JOIN_FIXED_ORDER" + hintJoinOrder "JOIN_ORDER" + hintJoinPrefix "JOIN_PREFIX" + hintJoinSuffix "JOIN_SUFFIX" + hintBKA "BKA" + hintNoBKA "NO_BKA" + hintBNL "BNL" + hintNoBNL "NO_BNL" + hintHashJoin "HASH_JOIN" + hintNoHashJoin "NO_HASH_JOIN" + hintMerge "MERGE" + hintNoMerge "NO_MERGE" + hintIndexMerge "INDEX_MERGE" + hintNoIndexMerge "NO_INDEX_MERGE" + hintMRR "MRR" + hintNoMRR "NO_MRR" + hintNoICP "NO_ICP" + hintNoRangeOptimization "NO_RANGE_OPTIMIZATION" + hintSkipScan "SKIP_SCAN" + hintNoSkipScan "NO_SKIP_SCAN" + hintSemijoin "SEMIJOIN" + hintNoSemijoin "NO_SEMIJOIN" + hintOrderIndex "ORDER_INDEX" + hintNoOrderIndex "NO_ORDER_INDEX" + hintMaxExecutionTime "MAX_EXECUTION_TIME" + hintSetVar "SET_VAR" + hintResourceGroup "RESOURCE_GROUP" + hintQBName "QB_NAME" + + /* SEMIJOIN() strategies */ + hintDupsWeedOut "DUPSWEEDOUT" + hintFirstMatch "FIRSTMATCH" + hintLooseScan "LOOSESCAN" + hintMaterialization "MATERIALIZATION" + +%type + Identifier "identifier (including keywords)" + QueryBlockOpt "Query block identifier optional" + JoinOrderOptimizerHintName + UnsupportedTableLevelOptimizerHintName + SupportedTableLevelOptimizerHintName + UnsupportedIndexLevelOptimizerHintName + SupportedIndexLevelOptimizerHintName + SubqueryOptimizerHintName + NullaryHintName "name of hints which take no input" + SubqueryStrategy + Value "the value in the SET_VAR() hint" + +%type + CommaOpt "optional ','" + +%type + OptimizerHintList "optimizer hint list" + +%type + TableOptimizerHintOpt "optimizer hint" + HintTableList "table list in optimizer hint" + HintTableListOpt "optional table list in optimizer hint" + HintIndexList "table name with index list in optimizer hint" + IndexNameList "index list in optimizer hint" + IndexNameListOpt "optional index list in optimizer hint" + ViewNameList "view name list in optimizer hint" + SubqueryStrategies "subquery strategies" + SubqueryStrategiesOpt "optional subquery strategies" + +%type + HintTable "Table in optimizer hint" + ViewName "View name in optimizer hint" + +%type + PartitionList "partition name list in optimizer hint" + + +%start Start + +%% + +Start: + OptimizerHintList + { + parser.result = $1 + } + +OptimizerHintList: + TableOptimizerHintOpt + { + if $1 != nil { + $$ = []*ast.TableOptimizerHint{$1} + } + } +| OptimizerHintList CommaOpt TableOptimizerHintOpt + { + if $3 != nil { + $$ = append($1, $3) + } else { + $$ = $1 + } + } + +TableOptimizerHintOpt: + "JOIN_FIXED_ORDER" '(' QueryBlockOpt ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| JoinOrderOptimizerHintName '(' HintTableList ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| UnsupportedTableLevelOptimizerHintName '(' HintTableListOpt ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| SupportedTableLevelOptimizerHintName '(' HintTableListOpt ')' + { + h := $3 + h.HintName = ast.NewCIStr($1) + $$ = h + } +| UnsupportedIndexLevelOptimizerHintName '(' HintIndexList ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| SupportedIndexLevelOptimizerHintName '(' HintIndexList ')' + { + h := $3 + h.HintName = ast.NewCIStr($1) + $$ = h + } +| SubqueryOptimizerHintName '(' QueryBlockOpt SubqueryStrategiesOpt ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| "MAX_EXECUTION_TIME" '(' QueryBlockOpt hintIntLit ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + QBName: ast.NewCIStr($3), + HintData: $4, + } + } +| "SET_VAR" '(' Identifier '=' Value ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + HintData: ast.HintSetVar{ + VarName: $3, + Value: $5, + }, + } + } +| "RESOURCE_GROUP" '(' Identifier ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + HintData: $3, + } + } +| "QB_NAME" '(' Identifier ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + QBName: ast.NewCIStr($3), + } + } +| "QB_NAME" '(' Identifier ',' ViewNameList ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + QBName: ast.NewCIStr($3), + Tables: $5.Tables, + } + } +| NullaryHintName '(' QueryBlockOpt ')' + { + $$ = &ast.TableOptimizerHint{ + HintName: ast.NewCIStr($1), + QBName: ast.NewCIStr($3), + } + } +| hintIdentifier '(' QueryBlockOpt hintIntLit ')' + /* The hints below are pseudo hint. They are unsupported hints */ + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' PartitionList ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' PartitionList CommaOpt hintIntLit ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } +| hintIdentifier '(' Identifier '=' Value ')' + { + parser.warnUnsupportedHint($1) + $$ = nil + } + +QueryBlockOpt: + /* empty */ + { + $$ = "" + } +| hintSingleAtIdentifier + +CommaOpt: + /*empty*/ + {} +| ',' + {} + +PartitionList: + Identifier + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| PartitionList CommaOpt Identifier + { + $$ = append($1, ast.NewCIStr($3)) + } + +/** + * HintTableListOpt: + * + * [@query_block_name] [tbl_name [, tbl_name] ...] + * [tbl_name@query_block_name [, tbl_name@query_block_name] ...] + * + */ +HintTableListOpt: + HintTableList +| QueryBlockOpt + { + $$ = &ast.TableOptimizerHint{ + QBName: ast.NewCIStr($1), + } + } + +HintTableList: + QueryBlockOpt HintTable + { + $$ = &ast.TableOptimizerHint{ + Tables: []ast.HintTable{$2}, + QBName: ast.NewCIStr($1), + } + } +| HintTableList ',' HintTable + { + h := $1 + h.Tables = append(h.Tables, $3) + $$ = h + } + +HintTable: + Identifier QueryBlockOpt + { + $$ = ast.HintTable{ + TableName: ast.NewCIStr($1), + QBName: ast.NewCIStr($2), + } + } +| Identifier '.' Identifier QueryBlockOpt + { + $$ = ast.HintTable{ + DBName: ast.NewCIStr($1), + TableName: ast.NewCIStr($3), + QBName: ast.NewCIStr($4), + } + } + +ViewNameList: + ViewNameList '.' ViewName + { + h := $1 + h.Tables = append(h.Tables, $3) + $$ = h + } +| ViewName + { + $$ = &ast.TableOptimizerHint{ + Tables: []ast.HintTable{$1}, + } + } + +ViewName: + Identifier QueryBlockOpt + { + $$ = ast.HintTable{ + TableName: ast.NewCIStr($1), + QBName: ast.NewCIStr($2), + } + } +| QueryBlockOpt + { + $$ = ast.HintTable{ + QBName: ast.NewCIStr($1), + } + } + +/** + * HintIndexList: + * + * [@query_block_name] tbl_name [index_name [, index_name] ...] + * tbl_name@query_block_name [index_name [, index_name] ...] + */ +HintIndexList: + QueryBlockOpt HintTable CommaOpt IndexNameListOpt + { + h := $4 + h.Tables = []ast.HintTable{$2} + h.QBName = ast.NewCIStr($1) + $$ = h + } + +IndexNameListOpt: + /* empty */ + { + $$ = &ast.TableOptimizerHint{} + } +| IndexNameList + +IndexNameList: + Identifier + { + $$ = &ast.TableOptimizerHint{ + Indexes: []ast.CIStr{ast.NewCIStr($1)}, + } + } +| IndexNameList ',' Identifier + { + h := $1 + h.Indexes = append(h.Indexes, ast.NewCIStr($3)) + $$ = h + } + +/** + * Miscellaneous rules + */ +SubqueryStrategiesOpt: + /* empty */ + {} +| SubqueryStrategies + +SubqueryStrategies: + SubqueryStrategy + {} +| SubqueryStrategies ',' SubqueryStrategy + +Value: + hintStringLit +| Identifier +| hintNumericLit +| hintIntLit + { + $$ = strconv.FormatUint($1, 10) + } +| '+' hintNumericLit + { + $$ = $2 + } +| '-' hintNumericLit + { + $$ = "-" + $2 + } +| '+' hintIntLit + { + $$ = strconv.FormatUint($2, 10) + } +| '-' hintIntLit + { + if $2 > 9223372036854775808 { + yylex.AppendError(yylex.Errorf("the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807].")) + return 1 + } else if $2 == 9223372036854775808 { + signed_one := int64(1) + $$ = strconv.FormatInt(signed_one<<63, 10) + } else { + $$ = strconv.FormatInt(-int64($2), 10) + } + } + +JoinOrderOptimizerHintName: + "JOIN_ORDER" +| "JOIN_PREFIX" +| "JOIN_SUFFIX" + +UnsupportedTableLevelOptimizerHintName: + "BKA" +| "NO_BKA" +| "BNL" +| "NO_BNL" +| "NO_MERGE" + +SupportedTableLevelOptimizerHintName: + "MERGE" +| "HASH_JOIN" +| "NO_HASH_JOIN" + +UnsupportedIndexLevelOptimizerHintName: + "INDEX_MERGE" +/* NO_INDEX_MERGE is accepted only in nullary form */ +| "MRR" +| "NO_MRR" +| "NO_ICP" +| "NO_RANGE_OPTIMIZATION" +| "SKIP_SCAN" +| "NO_SKIP_SCAN" + +SupportedIndexLevelOptimizerHintName: + "ORDER_INDEX" +| "NO_ORDER_INDEX" + +SubqueryOptimizerHintName: + "SEMIJOIN" +| "NO_SEMIJOIN" + +SubqueryStrategy: + "DUPSWEEDOUT" +| "FIRSTMATCH" +| "LOOSESCAN" +| "MATERIALIZATION" + +NullaryHintName: + "NO_INDEX_MERGE" + +Identifier: + hintIdentifier +/* MySQL 8.0 hint names */ +| "JOIN_FIXED_ORDER" +| "JOIN_ORDER" +| "JOIN_PREFIX" +| "JOIN_SUFFIX" +| "BKA" +| "NO_BKA" +| "BNL" +| "NO_BNL" +| "HASH_JOIN" +| "NO_HASH_JOIN" +| "MERGE" +| "NO_MERGE" +| "INDEX_MERGE" +| "NO_INDEX_MERGE" +| "MRR" +| "NO_MRR" +| "NO_ICP" +| "NO_RANGE_OPTIMIZATION" +| "SKIP_SCAN" +| "NO_SKIP_SCAN" +| "SEMIJOIN" +| "NO_SEMIJOIN" +| "ORDER_INDEX" +| "NO_ORDER_INDEX" +| "MAX_EXECUTION_TIME" +| "SET_VAR" +| "RESOURCE_GROUP" +| "QB_NAME" +/* SEMIJOIN() strategies */ +| "DUPSWEEDOUT" +| "FIRSTMATCH" +| "LOOSESCAN" +| "MATERIALIZATION" +%% diff --git a/pkg/parser/hintparser_test.go b/pkg/parser/hintparser_test.go new file mode 100644 index 000000000..be911ef7e --- /dev/null +++ b/pkg/parser/hintparser_test.go @@ -0,0 +1,331 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/stretchr/testify/require" +) + +func TestParseHint(t *testing.T) { + testCases := []struct { + input string + mode mysql.SQLMode + output []*ast.TableOptimizerHint + errs []string + }{ + { + input: "", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "QB_NAME(qb1) QB_NAME(`qb2`), QB_NAME(TRUE) QB_NAME(\"ANSI quoted\") QB_NAME(_utf8), QB_NAME(0b10) QB_NAME(0x1a)", + mode: mysql.ModeANSIQuotes, + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("qb1"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("qb2"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("TRUE"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("ANSI quoted"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("_utf8"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("0b10"), + }, + { + HintName: ast.NewCIStr("QB_NAME"), + QBName: ast.NewCIStr("0x1a"), + }, + }, + }, + { + input: "QB_NAME(1)", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "QB_NAME(1.5)", + errs: []string{ + `Cannot use decimal number`, + `Optimizer hint syntax error at line 1 `, + }, + }, + { + input: "QB_NAME('string literal')", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "QB_NAME(many identifiers)", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "QB_NAME(@qb1)", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "QB_NAME(b'10')", + errs: []string{ + `Cannot use bit-value literal`, + `Optimizer hint syntax error at line 1 `, + }, + }, + { + input: "QB_NAME(x'1a')", + errs: []string{ + `Cannot use hexadecimal literal`, + `Optimizer hint syntax error at line 1 `, + }, + }, + { + // MySQL hints TiDB never implemented parse but are reported + // (and dropped) as unsupported. + input: "JOIN_FIXED_ORDER() BKA()", + errs: []string{ + `Optimizer hint JOIN_FIXED_ORDER is not supported`, + `Optimizer hint BKA is not supported`, + }, + }, + { + input: "SEMIJOIN(@qb1 FIRSTMATCH, LOOSESCAN) NO_SEMIJOIN(DUPSWEEDOUT, MATERIALIZATION)", + errs: []string{ + `Optimizer hint SEMIJOIN is not supported`, + `Optimizer hint NO_SEMIJOIN is not supported`, + }, + }, + { + input: "HASH_JOIN() NO_HASH_JOIN(x, `y y`.z@qb) MERGE(@qb1)", + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("HASH_JOIN"), + }, + { + HintName: ast.NewCIStr("NO_HASH_JOIN"), + Tables: []ast.HintTable{ + {TableName: ast.NewCIStr("x")}, + {DBName: ast.NewCIStr("y y"), TableName: ast.NewCIStr("z"), QBName: ast.NewCIStr("qb")}, + }, + }, + { + HintName: ast.NewCIStr("MERGE"), + QBName: ast.NewCIStr("qb1"), + }, + }, + }, + { + input: "ORDER_INDEX(@qb1 tbl1 x, y, z) NO_ORDER_INDEX(tbl2@qb2 c1)", + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("ORDER_INDEX"), + Tables: []ast.HintTable{{TableName: ast.NewCIStr("tbl1")}}, + QBName: ast.NewCIStr("qb1"), + Indexes: []ast.CIStr{ast.NewCIStr("x"), ast.NewCIStr("y"), ast.NewCIStr("z")}, + }, + { + HintName: ast.NewCIStr("NO_ORDER_INDEX"), + Tables: []ast.HintTable{{TableName: ast.NewCIStr("tbl2"), QBName: ast.NewCIStr("qb2")}}, + Indexes: []ast.CIStr{ast.NewCIStr("c1")}, + }, + }, + }, + { + input: "MRR(tbl1 idx1) NO_ICP(tbl2) INDEX_MERGE(tbl3 x, y)", + errs: []string{ + `Optimizer hint MRR is not supported`, + `Optimizer hint NO_ICP is not supported`, + `Optimizer hint INDEX_MERGE is not supported`, + }, + }, + { + input: "MAX_EXECUTION_TIME(1000) MAX_EXECUTION_TIME(@qb1 3000)", + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("MAX_EXECUTION_TIME"), + HintData: uint64(1000), + }, + { + HintName: ast.NewCIStr("MAX_EXECUTION_TIME"), + QBName: ast.NewCIStr("qb1"), + HintData: uint64(3000), + }, + }, + }, + { + input: "NO_INDEX_MERGE() RESOURCE_GROUP(rg1)", + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("NO_INDEX_MERGE"), + }, + { + HintName: ast.NewCIStr("RESOURCE_GROUP"), + HintData: "rg1", + }, + }, + }, + { + input: `SET_VAR(sbs = 16M) SET_VAR(fkc=OFF) SET_VAR(os="mcb=off") set_var(abc=1) set_var(os2='mcb2=off') set_var(sel=0.3) set_var(sel_plus=+0.3) set_var(sel_minus=-0.3)`, + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("SET_VAR"), + HintData: ast.HintSetVar{ + VarName: "sbs", + Value: "16M", + }, + }, + { + HintName: ast.NewCIStr("SET_VAR"), + HintData: ast.HintSetVar{ + VarName: "fkc", + Value: "OFF", + }, + }, + { + HintName: ast.NewCIStr("SET_VAR"), + HintData: ast.HintSetVar{ + VarName: "os", + Value: "mcb=off", + }, + }, + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "abc", + Value: "1", + }, + }, + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "os2", + Value: "mcb2=off", + }, + }, + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "sel", + Value: "0.3", + }, + }, + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "sel_plus", + Value: "0.3", + }, + }, + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "sel_minus", + Value: "-0.3", + }, + }, + }, + }, + { + // TiDB-only hints are no longer recognized: hints with a plain + // identifier list degrade to an "unsupported" warning, ... + input: "INL_JOIN(x, z) USE_INDEX(tbl3, PRIMARY)", + errs: []string{ + `Optimizer hint INL_JOIN is not supported`, + `Optimizer hint USE_INDEX is not supported`, + }, + }, + { + // ... and TiDB-specific argument shapes are syntax errors. + input: "MEMORY_QUOTA(8 MB)", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "READ_FROM_STORAGE(TIKV[a, b])", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "LEADING(a, (b, c))", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "TIME_RANGE('2020-02-20 12:12:12','2020-02-20 13:12:12')", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "unknown_hint()", + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "set_var(timestamp = 1.5)", + output: []*ast.TableOptimizerHint{ + { + HintName: ast.NewCIStr("set_var"), + HintData: ast.HintSetVar{ + VarName: "timestamp", + Value: "1.5", + }, + }, + }, + }, + { + input: "set_var(timestamp = _utf8mb4'1234')", // Optimizer hint doesn't recognize _charset'strings'. + errs: []string{`Optimizer hint syntax error at line 1 `}, + }, + { + input: "set_var(timestamp = 9999999999999999999999999999999999999)", + errs: []string{ + `integer value is out of range`, + `Optimizer hint syntax error at line 1 `, + }, + }, + } + + for _, tc := range testCases { + output, errs := parser.ParseHint("/*+"+tc.input+"*/", tc.mode, parser.Pos{Line: 1}) + require.Lenf(t, errs, len(tc.errs), "input = %s,\n... errs = %q", tc.input, errs) + for i, err := range errs { + require.Errorf(t, err, "input = %s, i = %d", tc.input, i) + require.Containsf(t, err.Error(), tc.errs[i], "input = %s, i = %d", tc.input, i) + } + require.Equalf(t, tc.output, output, "input = %s,\n... output = %q", tc.input, output) + } +} + +func TestMaxOptimizerHintDepth(t *testing.T) { + // No hint accepts nested parentheses anymore (LEADING, the one TiDB + // hint that did, is gone), so deeply nested input degrades to a syntax + // error rather than reaching the lexer's depth guard. + input := "/*+HASH_JOIN(" + strings.Repeat("(", 10000) + "t" + strings.Repeat(")", 10000) + ")*/" + mode, err := mysql.GetSQLMode(mysql.DefaultSQLMode) + require.NoError(t, err) + output, errs := parser.ParseHint(input, mode, parser.Pos{Line: 1}) + require.NotEmpty(t, errs) + require.Contains(t, errs[0].Error(), "Optimizer hint syntax error") + require.Empty(t, output) +} diff --git a/pkg/parser/hintparserimpl.go b/pkg/parser/hintparserimpl.go new file mode 100644 index 000000000..8427c1511 --- /dev/null +++ b/pkg/parser/hintparserimpl.go @@ -0,0 +1,228 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "strconv" + "strings" + + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/mysql" +) + +//revive:disable:exported +var ( + ErrWarnOptimizerHintUnsupportedHint = mysql.NewStdErr("parser", mysql.ErrWarnOptimizerHintUnsupportedHint) + ErrWarnOptimizerHintInvalidToken = mysql.NewStdErr("parser", mysql.ErrWarnOptimizerHintInvalidToken) + ErrWarnOptimizerHintParseError = mysql.NewStdErr("parser", mysql.ErrWarnOptimizerHintParseError) + ErrWarnOptimizerHintInvalidInteger = mysql.NewStdErr("parser", mysql.ErrWarnOptimizerHintInvalidInteger) + ErrWarnOptimizerHintWrongPos = mysql.NewStdErr("parser", mysql.ErrWarnOptimizerHintWrongPos) +) + +//revive:enable:exported + +// hintScanner implements the yyhintLexer interface +type hintScanner struct { + Scanner + setVarValueState hintSetVarValueState +} + +// SET_VAR values are parsed with lexer context so decimal/float tokens are accepted only after +// SET_VAR(name = ...). Other hints, such as QB_NAME(1.5), must keep rejecting those tokens. +type hintSetVarValueState uint8 + +const ( + hintSetVarValueStateNone hintSetVarValueState = iota + hintSetVarValueStateAfterSetVar + hintSetVarValueStateAfterLParen + hintSetVarValueStateAfterName + hintSetVarValueStateExpectValue + hintSetVarValueStateAfterSign +) + +func (hs *hintScanner) acceptSetVarNumericValue() bool { + return hs.setVarValueState == hintSetVarValueStateExpectValue || + hs.setVarValueState == hintSetVarValueStateAfterSign +} + +func (hs *hintScanner) updateSetVarValueState(tok int) { + switch hs.setVarValueState { + case hintSetVarValueStateNone: + if tok == hintSetVar { + hs.setVarValueState = hintSetVarValueStateAfterSetVar + } + case hintSetVarValueStateAfterSetVar: + if tok == '(' { + hs.setVarValueState = hintSetVarValueStateAfterLParen + } else if tok != hintSetVar { + hs.setVarValueState = hintSetVarValueStateNone + } + case hintSetVarValueStateAfterLParen: + if tok == ')' || tok == ',' || tok == '=' || tok <= 0 { + hs.setVarValueState = hintSetVarValueStateNone + } else { + hs.setVarValueState = hintSetVarValueStateAfterName + } + case hintSetVarValueStateAfterName: + if tok == '=' { + hs.setVarValueState = hintSetVarValueStateExpectValue + } else { + hs.setVarValueState = hintSetVarValueStateNone + } + case hintSetVarValueStateExpectValue: + if tok == '+' || tok == '-' { + hs.setVarValueState = hintSetVarValueStateAfterSign + } else { + hs.setVarValueState = hintSetVarValueStateNone + } + case hintSetVarValueStateAfterSign: + hs.setVarValueState = hintSetVarValueStateNone + } +} + +func (hs *hintScanner) Errorf(format string, args ...interface{}) error { + inner := hs.Scanner.Errorf(format, args...) + return ErrParse.GenByArgs("Optimizer hint syntax error at", inner) +} + +func (hs *hintScanner) Lex(lval *yyhintSymType) int { + tok, pos, lit := hs.scan() + hs.lastScanOffset = pos.Offset + if !hs.updateParenthesesDepth(tok) { + return hintInvalid + } + var errorTokenType string + returnToken := func(tok int) int { + hs.updateSetVarValueState(tok) + return tok + } + + switch tok { + case intLit: + n, e := strconv.ParseUint(lit, 10, 64) + if e != nil { + hs.AppendError(ErrWarnOptimizerHintInvalidInteger.GenByArgs(lit)) + return returnToken(hintInvalid) + } + lval.number = n + return returnToken(hintIntLit) + + case singleAtIdentifier: + lval.ident = lit + return returnToken(hintSingleAtIdentifier) + + case identifier: + lval.ident = lit + if tok1, ok := hintTokenMap[strings.ToUpper(lit)]; ok { + return returnToken(tok1) + } + return returnToken(hintIdentifier) + + case stringLit: + lval.ident = lit + if hs.sqlMode.HasANSIQuotesMode() && hs.r.s[pos.Offset] == '"' { + return returnToken(hintIdentifier) + } + return returnToken(hintStringLit) + + case bitLit: + if strings.HasPrefix(lit, "0b") { + lval.ident = lit + return returnToken(hintIdentifier) + } + errorTokenType = "bit-value literal" + + case hexLit: + if strings.HasPrefix(lit, "0x") { + lval.ident = lit + return returnToken(hintIdentifier) + } + errorTokenType = "hexadecimal literal" + + case quotedIdentifier: + lval.ident = lit + return returnToken(hintIdentifier) + + case eq: + return returnToken('=') + + case floatLit: + if hs.acceptSetVarNumericValue() { + lval.ident = lit + return returnToken(hintNumericLit) + } + errorTokenType = "floating point number" + case decLit: + if hs.acceptSetVarNumericValue() { + lval.ident = lit + return returnToken(hintNumericLit) + } + errorTokenType = "decimal number" + + default: + if tok <= 0x7f { + return returnToken(tok) + } + errorTokenType = "unknown token" + } + + hs.AppendError(ErrWarnOptimizerHintInvalidToken.GenByArgs(errorTokenType, lit, tok)) + return returnToken(hintInvalid) +} + +type hintParser struct { + lexer hintScanner + result []*ast.TableOptimizerHint + + // the following fields are used by yyParse to reduce allocation. + cache []yyhintSymType + yylval yyhintSymType + yyVAL *yyhintSymType +} + +func newHintParser() *hintParser { + return &hintParser{cache: make([]yyhintSymType, 50)} +} + +func (hp *hintParser) parse(input string, sqlMode mysql.SQLMode, initPos Pos) ([]*ast.TableOptimizerHint, []error) { + hp.result = nil + hp.lexer.reset(input[3:]) + hp.lexer.setVarValueState = hintSetVarValueStateNone + hp.lexer.SetSQLMode(sqlMode) + hp.lexer.r.updatePos(Pos{ + Line: initPos.Line, + Col: initPos.Col + 3, // skipped the initial '/*+' + Offset: 0, + }) + hp.lexer.inBangComment = true // skip the final '*/' (we need the '*/' for reporting warnings) + + yyhintParse(&hp.lexer, hp) + + warns, errs := hp.lexer.Errors() + if len(errs) == 0 { + errs = warns + } + return hp.result, errs +} + +// ParseHint parses an optimizer hint (the interior of `/*+ ... */`). +func ParseHint(input string, sqlMode mysql.SQLMode, initPos Pos) ([]*ast.TableOptimizerHint, []error) { + hp := newHintParser() + return hp.parse(input, sqlMode, initPos) +} + +func (hp *hintParser) warnUnsupportedHint(name string) { + warn := ErrWarnOptimizerHintUnsupportedHint.GenByArgs(name) + hp.lexer.warns = append(hp.lexer.warns, warn) +} diff --git a/pkg/parser/lateral_test.go b/pkg/parser/lateral_test.go new file mode 100644 index 000000000..fb54042cc --- /dev/null +++ b/pkg/parser/lateral_test.go @@ -0,0 +1,208 @@ +// Copyright 2026 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" + "github.com/stretchr/testify/require" +) + +func TestLateralParsing(t *testing.T) { + p := parser.New() + + testCases := []struct { + name string + sql string + expectError bool + checkLateral bool // whether to verify Lateral flag is set + columnNames []string + }{ + { + name: "LATERAL with comma syntax", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a) AS dt", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with LEFT JOIN", + sql: "SELECT * FROM t1 LEFT JOIN LATERAL (SELECT t1.b) AS dt ON true", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with CROSS JOIN", + sql: "SELECT * FROM t1 CROSS JOIN LATERAL (SELECT t1.c) AS dt", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with RIGHT JOIN", + sql: "SELECT * FROM t1 RIGHT JOIN LATERAL (SELECT t1.d) AS dt ON true", + expectError: false, // Parser allows it, planner will reject + checkLateral: true, + }, + { + name: "LATERAL with INNER JOIN", + sql: "SELECT * FROM t1 JOIN LATERAL (SELECT t1.e) AS dt ON true", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with complex subquery", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a, COUNT(*) FROM t2 WHERE t2.x = t1.x GROUP BY t1.a) AS dt", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with nested subquery", + sql: "SELECT * FROM t1, LATERAL (SELECT * FROM (SELECT t1.a) AS inner_dt) AS dt", + expectError: false, + checkLateral: true, + }, + { + name: "Multiple LATERAL joins", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a) AS dt1, LATERAL (SELECT t1.b) AS dt2", + expectError: false, + checkLateral: true, + }, + { + name: "Non-LATERAL derived table", + sql: "SELECT * FROM t1, (SELECT a FROM t2) AS dt", + expectError: false, + // Lateral flag should be false for non-LATERAL + }, + { + name: "LATERAL with WHERE clause", + sql: "SELECT * FROM t1, LATERAL (SELECT * FROM t2 WHERE t2.x = t1.x) AS dt WHERE dt.y > 10", + expectError: false, + checkLateral: true, + }, + { + name: "LATERAL with column list", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a, t1.b) AS dt(c1, c2)", + expectError: false, + checkLateral: true, + columnNames: []string{"c1", "c2"}, + }, + { + name: "LATERAL with column list no AS", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a) dt(col1)", + expectError: false, + checkLateral: true, + columnNames: []string{"col1"}, + }, + { + name: "LATERAL with column list and JOIN", + sql: "SELECT * FROM t1 LEFT JOIN LATERAL (SELECT t1.a, t1.b, t1.c) AS dt(x, y, z) ON true", + expectError: false, + checkLateral: true, + columnNames: []string{"x", "y", "z"}, + }, + { + name: "LATERAL without alias is rejected", + sql: "SELECT * FROM t1, LATERAL (SELECT t1.a)", + expectError: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + stmt, err := p.ParseOneStmt(tc.sql, "", "") + + if tc.expectError { + require.Error(t, err, "Expected parsing to fail for: %s", tc.sql) + return + } + + require.NoError(t, err, "Failed to parse: %s", tc.sql) + require.NotNil(t, stmt) + + // Test round-trip: parse -> restore -> parse again + var sb strings.Builder + restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes, &sb) + err = stmt.Restore(restoreCtx) + require.NoError(t, err, "Failed to restore statement") + + restored := sb.String() + if tc.checkLateral { + // Verify LATERAL keyword is preserved in restoration + require.Contains(t, restored, "LATERAL", "LATERAL keyword missing in restored SQL: %s", restored) + } + + // Parse the restored SQL to ensure it's valid (round-trip test) + stmt2, err := p.ParseOneStmt(restored, "", "") + require.NoError(t, err, "Failed to parse restored SQL: %s", restored) + require.NotNil(t, stmt2) + + // Verify AST flags on both original and round-tripped statements. + for _, stmtToCheck := range []struct { + label string + node ast.StmtNode + }{ + {"original", stmt}, + {"round-trip", stmt2}, + } { + selectStmt, ok := stmtToCheck.node.(*ast.SelectStmt) + require.True(t, ok, "[%s] Statement should be SelectStmt", stmtToCheck.label) + require.NotNil(t, selectStmt.From, "[%s] FROM clause should not be nil", stmtToCheck.label) + + if tc.checkLateral { + lateralTS := findLateralTableSource(selectStmt.From.TableRefs) + require.NotNil(t, lateralTS, "[%s] LATERAL TableSource not found for: %s", stmtToCheck.label, tc.sql) + + if len(tc.columnNames) > 0 { + require.Len(t, lateralTS.ColumnNames, len(tc.columnNames), + "[%s] column name count mismatch", stmtToCheck.label) + for i, expected := range tc.columnNames { + require.Equal(t, expected, lateralTS.ColumnNames[i].L, + "[%s] column name mismatch at index %d", stmtToCheck.label, i) + } + } + } else { + lateralTS := findLateralTableSource(selectStmt.From.TableRefs) + require.Nil(t, lateralTS, "[%s] Lateral should be false for non-LATERAL query: %s", + stmtToCheck.label, tc.sql) + } + } + }) + } +} + +// findLateralTableSource recursively searches for the first LATERAL TableSource in a ResultSetNode. +func findLateralTableSource(node ast.ResultSetNode) *ast.TableSource { + if node == nil { + return nil + } + + switch n := node.(type) { + case *ast.TableSource: + if n.Lateral { + return n + } + return findLateralTableSource(n.Source) + case *ast.Join: + if ts := findLateralTableSource(n.Left); ts != nil { + return ts + } + return findLateralTableSource(n.Right) + } + + return nil +} diff --git a/pkg/parser/lexer.go b/pkg/parser/lexer.go new file mode 100644 index 000000000..897077b52 --- /dev/null +++ b/pkg/parser/lexer.go @@ -0,0 +1,1003 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "strings" + "unicode" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/util" +) + +var _ = yyLexer(&Scanner{}) + +// maxParenthesesDepth bounds user-controlled nesting before it can build an +// AST that is too deep for recursive visitors. +const maxParenthesesDepth = 10000 + +// Pos represents the position of a token. +type Pos struct { + Line int + Col int + Offset int +} + +// Scanner implements the yyLexer interface. +type Scanner struct { + r reader + buf bytes.Buffer + + client charset.Encoding + connection charset.Encoding + + errs []error + warns []error + stmtStartPos int + + // inBangComment is true if we are inside a `/*! ... */` block. + // It is used to ignore a stray `*/` when scanning. + inBangComment bool + + sqlMode mysql.SQLMode + + // If the lexer should recognize keywords for window function. + // It may break the compatibility when support those keywords, + // because some application may already use them as identifiers. + supportWindowFunc bool + + // Whether record the original text keyword position to the AST node. + skipPositionRecording bool + + // lastScanOffset indicates last offset returned by scan(). + // It's used to substring sql in syntax error message. + lastScanOffset int + + // lastKeyword records the previous keyword returned by scan(). + // determine whether an optimizer hint should be parsed or ignored. + lastKeyword int + // lastKeyword2 records the keyword before lastKeyword, it is used + // to disambiguate hint after for update, which should be ignored. + lastKeyword2 int + // lastKeyword3 records the keyword before lastKeyword2, it is used + // to disambiguate hint after create binding for update, which should + // be pertained. + lastKeyword3 int + + // hintPos records the start position of the previous optimizer hint. + lastHintPos Pos + + // true if a dot follows an identifier + identifierDot bool + + // keepHint, if true, Scanner will keep hint when normalizing . + keepHint bool + + parenDepth int +} + +// Errors returns the errors and warns during a scan. +func (s *Scanner) Errors() (warns []error, errs []error) { + return s.warns, s.errs +} + +// reset resets the sql string to be scanned. +func (s *Scanner) reset(sql string) { + s.client = charset.FindEncoding(mysql.DefaultCharset) + s.connection = charset.FindEncoding(mysql.DefaultCharset) + s.r = reader{s: sql, p: Pos{Line: 1}, l: len(sql)} + s.buf.Reset() + s.errs = s.errs[:0] + s.warns = s.warns[:0] + s.stmtStartPos = 0 + s.inBangComment = false + s.lastKeyword = 0 + s.identifierDot = false + s.parenDepth = 0 +} + +func (s *Scanner) stmtText() string { + endPos := s.r.pos().Offset + if s.r.s[endPos-1] == '\n' { + endPos-- // trim new line + } + if s.r.s[s.stmtStartPos] == '\n' { + s.stmtStartPos++ + } + + text := s.r.s[s.stmtStartPos:endPos] + + s.stmtStartPos = endPos + return text +} + +// Errorf tells scanner something is wrong. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) Errorf(format string, a ...interface{}) (err error) { + str := fmt.Sprintf(format, a...) + val := s.r.s[s.lastScanOffset:] + var lenStr = "" + if len(val) > 2048 { + lenStr = "(total length " + strconv.Itoa(len(val)) + ")" + val = val[:2048] + } + err = fmt.Errorf("line %d column %d near \"%s\"%s %s", + s.r.p.Line, s.r.p.Col, val, str, lenStr) + return +} + +// AppendError sets error into scanner. +// Scanner satisfies yyLexer interface which need this function. +func (s *Scanner) AppendError(err error) { + if err == nil { + return + } + s.errs = append(s.errs, err) +} + +// AppendWarn sets warning into scanner. +func (s *Scanner) AppendWarn(err error) { + if err == nil { + return + } + s.warns = append(s.warns, err) +} + +// convert2System convert lit from client encoding to system encoding which is utf8mb4. +func (s *Scanner) convert2System(tok int, lit string) (int, string) { + utf8Lit, err := s.client.Transform(nil, charset.HackSlice(lit), charset.OpDecodeReplace) + if err != nil { + s.AppendWarn(err) + } + + return tok, charset.HackString(utf8Lit) +} + +// convert2Connection convert lit from client encoding to connection encoding. +func (s *Scanner) convert2Connection(tok int, lit string) (int, string) { + if mysql.IsUTF8Charset(s.client.Name()) { + return tok, lit + } + utf8Lit, err := s.client.Transform(nil, charset.HackSlice(lit), charset.OpDecodeReplace) + if err != nil { + s.AppendError(err) + if s.sqlMode.HasStrictMode() && s.client.Tp() == s.connection.Tp() { + return invalid, lit + } + s.lastErrorAsWarn() + } + + // It is definitely valid if `client` is the same with `connection`, so just transform if they are not the same. + if s.client.Tp() != s.connection.Tp() { + utf8Lit, _ = s.connection.Transform(nil, utf8Lit, charset.OpReplaceNoErr) + } + return tok, charset.HackString(utf8Lit) +} + +func (s *Scanner) getNextToken() int { + r := s.r + tok, pos, lit := s.scan() + if tok == identifier { + tok = s.handleIdent(&yySymType{}) + } + if tok == identifier { + if tok1 := s.isTokenIdentifier(lit, pos.Offset); tok1 != 0 { + tok = tok1 + } + } + s.r = r + return tok +} + +func (s *Scanner) getNextTwoTokens() (tok1 int, tok2 int) { + r := s.r + tok1, pos, lit := s.scan() + if tok1 == identifier { + tok1 = s.handleIdent(&yySymType{}) + } + if tok1 == identifier { + if tmpToken := s.isTokenIdentifier(lit, pos.Offset); tmpToken != 0 { + tok1 = tmpToken + } + } + tok2, pos, lit = s.scan() + if tok2 == identifier { + tok2 = s.handleIdent(&yySymType{}) + } + if tok2 == identifier { + if tmpToken := s.isTokenIdentifier(lit, pos.Offset); tmpToken != 0 { + tok2 = tmpToken + } + } + s.r = r + return tok1, tok2 +} + +// Lex returns a token and store the token value in v. +// Scanner satisfies yyLexer interface. +// 0 and invalid are special token id this function would return: +// return 0 tells parser that scanner meets EOF, +// return invalid tells parser that scanner meets illegal character. +func (s *Scanner) Lex(v *yySymType) int { + tok, pos, lit := s.scan() + s.lastScanOffset = pos.Offset + if !s.updateParenthesesDepth(tok) { + return invalid + } + s.lastKeyword3 = s.lastKeyword2 + s.lastKeyword2 = s.lastKeyword + s.lastKeyword = 0 + v.offset = pos.Offset + v.ident = lit + if tok == identifier { + tok = s.handleIdent(v) + } + if tok == identifier { + if tok1 := s.isTokenIdentifier(lit, pos.Offset); tok1 != 0 { + tok = tok1 + s.lastKeyword = tok1 + } + } + if s.sqlMode.HasANSIQuotesMode() && + tok == stringLit && + s.r.s[v.offset] == '"' { + tok = identifier + } + + if tok == pipes && !(s.sqlMode.HasPipesAsConcatMode()) { + return pipesAsOr + } + + if tok == not && s.sqlMode.HasHighNotPrecedenceMode() { + return not2 + } + if tok == member && s.getNextToken() == of { + _, pos, lit = s.scan() + v.ident = fmt.Sprintf("%s %s", v.ident, lit) + s.lastScanOffset = pos.Offset + v.offset = pos.Offset + s.lastKeyword = memberof + return memberof + } + // fix shift/reduce conflict with DEFINED NULL BY xxx OPTIONALLY ENCLOSED + if tok == optionally { + tok1, tok2 := s.getNextTwoTokens() + if tok1 == enclosed && tok2 == by { + _, _, lit = s.scan() + _, pos2, lit2 := s.scan() + v.ident = fmt.Sprintf("%s %s %s", v.ident, lit, lit2) + s.lastKeyword = optionallyEnclosedBy + s.lastScanOffset = pos2.Offset + v.offset = pos2.Offset + return optionallyEnclosedBy + } + } + + switch tok { + case intLit: + return toInt(s, v, lit) + case floatLit: + return toFloat(s, v, lit) + case decLit: + return toDecimal(s, v, lit) + case hexLit: + return toHex(s, v, lit) + case bitLit: + return toBit(s, v, lit) + case singleAtIdentifier, doubleAtIdentifier: + v.item = lit + return tok + case null: + v.item = nil + case quotedIdentifier, identifier: + tok = identifier + s.identifierDot = s.r.peek() == '.' + tok, v.ident = s.convert2System(tok, lit) + case stringLit: + tok, v.ident = s.convert2Connection(tok, lit) + } + + return tok +} + +func (s *Scanner) updateParenthesesDepth(tok int) bool { + if tok == int('(') { + s.parenDepth++ + if s.parenDepth > maxParenthesesDepth { + s.AppendError(newParserDepthLimitError("parentheses nesting depth exceeds maximum", maxParenthesesDepth)) + return false + } + } else if tok == int(')') && s.parenDepth > 0 { + s.parenDepth-- + } + return true +} + +// LexLiteral returns the value of the converted literal +func (s *Scanner) LexLiteral() interface{} { + symType := &yySymType{} + s.Lex(symType) + if symType.item == nil { + return symType.ident + } + return symType.item +} + +// SetSQLMode sets the SQL mode for scanner. +func (s *Scanner) SetSQLMode(mode mysql.SQLMode) { + s.sqlMode = mode +} + +// GetSQLMode return the SQL mode of scanner. +func (s *Scanner) GetSQLMode() mysql.SQLMode { + return s.sqlMode +} + +// EnableWindowFunc controls whether the scanner recognize the keywords of window function. +func (s *Scanner) EnableWindowFunc(val bool) { + s.supportWindowFunc = val +} + +// InheritScanner returns a new scanner object which inherits configurations from the parent scanner. +func (s *Scanner) InheritScanner(sql string) *Scanner { + return &Scanner{ + r: reader{s: sql}, + client: s.client, + sqlMode: s.sqlMode, + supportWindowFunc: s.supportWindowFunc, + } +} + +// NewScanner returns a new scanner object. +func NewScanner(s string) *Scanner { + lexer := &Scanner{r: reader{s: s}} + lexer.reset(s) + return lexer +} + +func (*Scanner) handleIdent(lval *yySymType) int { + str := lval.ident + // A character string literal may have an optional character set introducer and COLLATE clause: + // [_charset_name]'string' [COLLATE collation_name] + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + if !strings.HasPrefix(str, "_") { + return identifier + } + cs, _ := charset.GetCharsetInfo(str[1:]) + if cs == nil { + return identifier + } + lval.ident = cs.Name + return underscoreCS +} + +func (s *Scanner) skipWhitespace() byte { + return s.r.incAsLongAs(func(b byte) bool { + return unicode.IsSpace(rune(b)) + }) +} + +func (s *Scanner) scan() (tok int, pos Pos, lit string) { + ch0 := s.r.peek() + if unicode.IsSpace(rune(ch0)) { + ch0 = s.skipWhitespace() + } + pos = s.r.pos() + if s.r.eof() { + // when scanner meets EOF, the returned token should be 0, + // because 0 is a special token id to remind the parser that stream is end. + return 0, pos, "" + } + + if isIdentExtend(ch0) { + return scanIdentifier(s) + } + + // search a trie to get a token. + node := &ruleTable + for node.childs[ch0] != nil && !s.r.eof() { + node = node.childs[ch0] + if node.fn != nil { + return node.fn(s) + } + s.r.inc() + ch0 = s.r.peek() + } + + tok, lit = node.token, s.r.data(&pos) + return +} + +func startWithXx(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanHex() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = hexLit, s.r.data(&pos) + } else { + tok = invalid + } + return + } + s.r.updatePos(pos) + return scanIdentifier(s) +} + +func startWithNn(s *Scanner) (tok int, pos Pos, lit string) { + tok, pos, lit = scanIdentifier(s) + // The National Character Set, N'some text' or n'some test'. + // See https://dev.mysql.com/doc/refman/5.7/en/string-literals.html + // and https://dev.mysql.com/doc/refman/5.7/en/charset-national.html + if lit == "N" || lit == "n" { + if s.r.peek() == '\'' { + tok = underscoreCS + lit = "utf8" + } + } + return +} + +func startWithBb(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() == '\'' { + s.r.inc() + s.scanBit() + if s.r.peek() == '\'' { + s.r.inc() + tok, lit = bitLit, s.r.data(&pos) + } else { + tok = invalid + } + return + } + s.r.updatePos(pos) + return scanIdentifier(s) +} + +func startWithSharp(s *Scanner) (tok int, pos Pos, lit string) { + s.r.incAsLongAs(func(ch byte) bool { + return ch != '\n' + }) + return s.scan() +} + +func startWithDash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + if strings.HasPrefix(s.r.s[pos.Offset:], "--") { + remainLen := len(s.r.s[pos.Offset:]) + if remainLen == 2 || (remainLen > 2 && unicode.IsSpace(rune(s.r.s[pos.Offset+2]))) { + s.r.incAsLongAs(func(ch byte) bool { + return ch != '\n' + }) + return s.scan() + } + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->>") { + tok = juss + s.r.incN(3) + return + } + if strings.HasPrefix(s.r.s[pos.Offset:], "->") { + tok = jss + s.r.incN(2) + return + } + tok = int('-') + lit = "-" + s.r.inc() + return +} + +func startWithSlash(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.r.peek() != '*' { + tok = int('/') + lit = "/" + return + } + + isOptimizerHint := false + currentCharIsStar := false + + s.r.inc() // we see '/*' so far. + switch s.r.readByte() { + case '!': // '/*!' MySQL-specific comments + // See http://dev.mysql.com/doc/refman/5.7/en/comments.html + // in '/*!', which we always recognize regardless of version. + s.scanVersionDigits(5, 5) + s.inBangComment = true + return s.scan() + + case '+': // '/*+' optimizer hints + // See https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html + if _, ok := hintedTokens[s.lastKeyword]; ok || s.keepHint { + // only recognize optimizers hints directly followed by certain + // keywords like SELECT, INSERT, etc., only a special case "FOR UPDATE" needs to be handled + // we will report a warning in order to match MySQL's behavior, but the hint content will be ignored + if s.lastKeyword2 == forKwd { + s.warns = append(s.warns, ParseErrorWith(s.r.data(&pos), s.r.p.Line)) + } else { + isOptimizerHint = true + } + } else { + s.AppendWarn(ErrWarnOptimizerHintWrongPos) + } + + case '*': // '/**' if the next char is '/' it would close the comment. + currentCharIsStar = true + + default: + } + + // standard C-like comment. read until we see '*/' then drop it. + for { + if currentCharIsStar || s.r.incAsLongAs(func(ch byte) bool { return ch != '*' }) == '*' { + switch s.r.readByte() { + case '/': + // Meets */, means comment end. + if isOptimizerHint { + s.lastHintPos = pos + return hintComment, pos, s.r.data(&pos) + } + return s.scan() + case '*': + currentCharIsStar = true + continue + default: + currentCharIsStar = false + continue + } + } + // unclosed comment or other errors. + s.errs = append(s.errs, ParseErrorWith(s.r.data(&pos), s.r.p.Line)) + return + } +} + +func startWithStar(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + + // skip and exit '/*!' if we see '*/' + if s.inBangComment && s.r.peek() == '/' { + s.inBangComment = false + s.r.inc() + return s.scan() + } + // otherwise it is just a normal star. + s.identifierDot = false + return '*', pos, "*" +} + +func startWithAt(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + + tok, lit = scanIdentifierOrString(s) + switch tok { + case '@': + s.r.inc() + stream := s.r.s[pos.Offset+2:] + var prefix string + for _, v := range []string{"global.", "session.", "local."} { + if len(v) > len(stream) { + continue + } + if strings.EqualFold(stream[:len(v)], v) { + prefix = v + s.r.incN(len(v)) + break + } + } + tok, lit = scanIdentifierOrString(s) + switch tok { + case stringLit, quotedIdentifier: + var sb strings.Builder + sb.WriteString("@@") + sb.WriteString(prefix) + sb.WriteString(lit) + tok, lit = doubleAtIdentifier, sb.String() + case identifier: + tok, lit = doubleAtIdentifier, s.r.data(&pos) + } + case invalid: + return + default: + tok = singleAtIdentifier + } + + return +} + +func scanIdentifier(s *Scanner) (int, Pos, string) { + pos := s.r.pos() + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) +} + +func scanIdentifierOrString(s *Scanner) (tok int, lit string) { + ch1 := s.r.peek() + switch ch1 { + case '\'', '"': + tok, _, lit = startString(s) + case '`': + tok, _, lit = scanQuotedIdent(s) + default: + if isUserVarChar(ch1) { + pos := s.r.pos() + s.r.incAsLongAs(isUserVarChar) + tok, lit = identifier, s.r.data(&pos) + } else { + tok = int(ch1) + } + } + return +} + +var ( + quotedIdentifier = -identifier +) + +func scanQuotedIdent(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + s.buf.Reset() + for !s.r.eof() { + tPos := s.r.pos() + if s.r.skipRune(s.client) { + s.buf.WriteString(s.r.data(&tPos)) + continue + } + ch := s.r.readByte() + if ch == '`' { + if s.r.peek() != '`' { + // don't return identifier in case that it's interpreted as keyword token later. + tok, lit = quotedIdentifier, s.buf.String() + return + } + s.r.inc() + } + s.buf.WriteByte(ch) + } + tok = invalid + return +} + +func startString(s *Scanner) (tok int, pos Pos, lit string) { + return s.scanString() +} + +func (s *Scanner) scanString() (tok int, pos Pos, lit string) { + tok, pos = stringLit, s.r.pos() + ending := s.r.readByte() + s.buf.Reset() +scan: + for !s.r.eof() { + tPos := s.r.pos() + if s.r.skipRune(s.client) { + s.buf.WriteString(s.r.data(&tPos)) + continue + } + ch0 := s.r.readByte() + switch { + case ch0 == ending: + if s.r.peek() != ending { + lit = s.buf.String() + return + } + s.r.inc() + s.buf.WriteByte(ch0) + case ch0 == '\\' && !s.sqlMode.HasNoBackslashEscapesMode(): + if s.r.eof() { + break scan + } + s.handleEscape(s.r.peek(), &s.buf) + s.r.inc() + default: + s.buf.WriteByte(ch0) + } + } + + tok = invalid + return +} + +// handleEscape handles the case in scanString when previous char is '\'. +func (*Scanner) handleEscape(b byte, buf *bytes.Buffer) { + /* + \" \' \\ \n \0 \b \Z \r \t ==> escape to one char + \% \_ ==> preserve both char + other ==> remove \ + */ + buf.Write(util.UnescapeChar(b)) +} + +func startWithNumber(s *Scanner) (tok int, pos Pos, lit string) { + if s.identifierDot { + return scanIdentifier(s) + } + pos = s.r.pos() + tok = intLit + ch0 := s.r.readByte() + if ch0 == '0' { + tok = intLit + ch1 := s.r.peek() + switch { + case ch1 >= '0' && ch1 <= '7': + s.r.inc() + s.scanOct() + case ch1 == 'x' || ch1 == 'X': + s.r.inc() + p1 := s.r.pos() + s.scanHex() + p2 := s.r.pos() + // 0x, 0x7fz3 are identifier + if p1 == p2 || isDigit(s.r.peek()) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + tok = hexLit + case ch1 == 'b': + s.r.inc() + p1 := s.r.pos() + s.scanBit() + p2 := s.r.pos() + // 0b, 0b123, 0b1ab are identifier + if p1 == p2 || isDigit(s.r.peek()) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + tok = bitLit + case ch1 == '.': + return s.scanFloat(&pos) + case ch1 == 'B': + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + } + + s.scanDigits() + ch0 = s.r.peek() + if ch0 == '.' || ch0 == 'e' || ch0 == 'E' { + return s.scanFloat(&pos) + } + + // Identifiers may begin with a digit but unless quoted may not consist solely of digits. + if !s.r.eof() && isIdentChar(ch0) { + s.r.incAsLongAs(isIdentChar) + return identifier, pos, s.r.data(&pos) + } + lit = s.r.data(&pos) + return +} + +func startWithDot(s *Scanner) (tok int, pos Pos, lit string) { + pos = s.r.pos() + s.r.inc() + if s.identifierDot { + return int('.'), pos, "." + } + if isDigit(s.r.peek()) { + tok, p, l := s.scanFloat(&pos) + if tok == identifier { + return invalid, p, l + } + return tok, p, l + } + tok, lit = int('.'), "." + return +} + +func (s *Scanner) scanOct() { + s.r.incAsLongAs(func(ch byte) bool { + return ch >= '0' && ch <= '7' + }) +} + +func (s *Scanner) scanHex() { + s.r.incAsLongAs(func(ch byte) bool { + return ch >= '0' && ch <= '9' || + ch >= 'a' && ch <= 'f' || + ch >= 'A' && ch <= 'F' + }) +} + +func (s *Scanner) scanBit() { + s.r.incAsLongAs(func(ch byte) bool { + return ch == '0' || ch == '1' + }) +} + +func (s *Scanner) scanFloat(beg *Pos) (tok int, pos Pos, lit string) { + s.r.updatePos(*beg) + // float = D1 . D2 e D3 + s.scanDigits() + ch0 := s.r.peek() + if ch0 == '.' { + s.r.inc() + s.scanDigits() + ch0 = s.r.peek() + } + if ch0 == 'e' || ch0 == 'E' { + s.r.inc() + ch0 = s.r.peek() + if ch0 == '-' || ch0 == '+' { + s.r.inc() + } + if isDigit(s.r.peek()) { + s.scanDigits() + tok = floatLit + } else { + // D1 . D2 e XX when XX is not D3, parse the result to an identifier. + // 9e9e = 9e9(float) + e(identifier) + // 9est = 9est(identifier) + s.r.updatePos(*beg) + s.r.incAsLongAs(isIdentChar) + tok = identifier + } + } else { + tok = decLit + } + pos, lit = *beg, s.r.data(beg) + return +} + +func (s *Scanner) scanDigits() string { + pos := s.r.pos() + s.r.incAsLongAs(isDigit) + return s.r.data(&pos) +} + +// scanVersionDigits scans for `min` to `max` digits (range inclusive) used in +// `/*!12345 ... */` comments. +func (s *Scanner) scanVersionDigits(minv, maxv int) { + pos := s.r.pos() + for i := range maxv { + ch := s.r.peek() + switch { + case isDigit(ch): + s.r.inc() + case i < minv: + s.r.updatePos(pos) + return + default: + return + } + } +} + +func (s *Scanner) lastErrorAsWarn() { + if len(s.errs) == 0 { + return + } + if isParserDepthLimitError(s.errs[len(s.errs)-1]) { + return + } + s.warns = append(s.warns, s.errs[len(s.errs)-1]) + s.errs = s.errs[:len(s.errs)-1] +} + +type parserDepthLimitError struct { + err error +} + +func newParserDepthLimitError(message string, maxDepth int) error { + return &parserDepthLimitError{ + err: ErrParse.GenByArgs(message, strconv.Itoa(maxDepth)), + } +} + +func (e *parserDepthLimitError) Error() string { + return e.err.Error() +} + +func (e *parserDepthLimitError) Unwrap() error { + return e.err +} + +func isParserDepthLimitError(err error) bool { + var e *parserDepthLimitError + return errors.As(err, &e) +} + +type reader struct { + s string + p Pos + l int +} + +func (r *reader) eof() bool { + return r.p.Offset >= r.l +} + +// peek() peeks a rune from underlying reader. +// if reader meets EOF, it will return 0. to distinguish from +// the real 0, the caller should call r.eof() again to check. +func (r *reader) peek() byte { + if r.eof() { + return 0 + } + return r.s[r.p.Offset] +} + +// inc increase the position offset of the reader. +// peek must be called before calling inc! +func (r *reader) inc() { + if r.s[r.p.Offset] == '\n' { + r.p.Line++ + r.p.Col = 0 + } + r.p.Offset++ + r.p.Col++ +} + +func (r *reader) incN(n int) { + for range n { + r.inc() + } +} + +func (r *reader) readByte() (ch byte) { + ch = r.peek() + if r.eof() { + return + } + r.inc() + return +} + +func (r *reader) pos() Pos { + return r.p +} + +func (r *reader) updatePos(pos Pos) { + r.p = pos +} + +func (r *reader) data(from *Pos) string { + return r.s[from.Offset:r.p.Offset] +} + +func (r *reader) incAsLongAs(fn func(b byte) bool) byte { + for { + ch := r.peek() + if !fn(ch) { + return ch + } + if r.eof() { + return 0 + } + r.inc() + } +} + +// skipRune skip mb character, return true indicate something has been skipped. +func (r *reader) skipRune(enc charset.Encoding) bool { + if r.s[r.p.Offset] <= unicode.MaxASCII { + return false + } + c := enc.MbLen(r.s[r.p.Offset:]) + r.incN(c) + return c > 0 +} diff --git a/pkg/parser/lexer_test.go b/pkg/parser/lexer_test.go new file mode 100644 index 000000000..9bf62bd02 --- /dev/null +++ b/pkg/parser/lexer_test.go @@ -0,0 +1,628 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "fmt" + "testing" + "unicode" + + "github.com/block/spirit/pkg/parser/mysql" + requires "github.com/stretchr/testify/require" +) + +func TestTokenID(t *testing.T) { + for str, tok := range tokenMap { + l := NewScanner(str) + var v yySymType + tok1 := l.Lex(&v) + requires.Equal(t, tok1, tok) + } +} + +func TestSingleChar(t *testing.T) { + table := []byte{'|', '&', '-', '+', '*', '/', '%', '^', '~', '(', ',', ')'} + for _, tok := range table { + l := NewScanner(string(tok)) + var v yySymType + tok1 := l.Lex(&v) + requires.Equal(t, tok1, int(tok)) + } +} + +type testCaseItem struct { + str string + tok int +} + +type testLiteralValue struct { + str string + val interface{} +} + +func TestSingleCharOther(t *testing.T) { + table := []testCaseItem{ + {"AT", identifier}, + {"?", paramMarker}, + {"PLACEHOLDER", identifier}, + {"=", eq}, + {".", int('.')}, + } + runTest(t, table) +} + +func TestAtLeadingIdentifier(t *testing.T) { + table := []testCaseItem{ + {"@", singleAtIdentifier}, + {"@''", singleAtIdentifier}, + {"@1", singleAtIdentifier}, + {"@.1_", singleAtIdentifier}, + {"@-1.", singleAtIdentifier}, + {"@~", singleAtIdentifier}, + {"@$", singleAtIdentifier}, + {"@a_3cbbc", singleAtIdentifier}, + {"@`a_3cbbc`", singleAtIdentifier}, + {"@-3cbbc", singleAtIdentifier}, + {"@!3cbbc", singleAtIdentifier}, + {"@@global.test", doubleAtIdentifier}, + {"@@session.test", doubleAtIdentifier}, + {"@@local.test", doubleAtIdentifier}, + {"@@test", doubleAtIdentifier}, + {"@@global.`test`", doubleAtIdentifier}, + {"@@session.`test`", doubleAtIdentifier}, + {"@@local.`test`", doubleAtIdentifier}, + {"@@`test`", doubleAtIdentifier}, + } + runTest(t, table) +} + +func TestUnderscoreCS(t *testing.T) { + var v yySymType + scanner := NewScanner(`_utf8"string"`) + tok := scanner.Lex(&v) + requires.Equal(t, underscoreCS, tok) + tok = scanner.Lex(&v) + requires.Equal(t, stringLit, tok) + + scanner.reset("N'string'") + tok = scanner.Lex(&v) + requires.Equal(t, underscoreCS, tok) + tok = scanner.Lex(&v) + requires.Equal(t, stringLit, tok) +} + +func TestLiteral(t *testing.T) { + table := []testCaseItem{ + {`'''a'''`, stringLit}, + {`''a''`, stringLit}, + {`""a""`, stringLit}, + {`\'a\'`, int('\\')}, + {`\"a\"`, int('\\')}, + {"0.2314", decLit}, + {"1234567890123456789012345678901234567890", decLit}, + {"132.313", decLit}, + {"132.3e231", floatLit}, + {"132.3e-231", floatLit}, + {"001e-12", floatLit}, + {"23416", intLit}, + {"123test", identifier}, + {"123" + string(unicode.ReplacementChar) + "xxx", identifier}, + {"0", intLit}, + {"0x3c26", hexLit}, + {"x'13181C76734725455A'", hexLit}, + {"0b01", bitLit}, + {fmt.Sprintf("t1%c", 0), identifier}, + {"N'some text'", underscoreCS}, + {"n'some text'", underscoreCS}, + {"\\N", null}, + {".*", int('.')}, // `.`, `*` + {".1_t_1_x", decLit}, // `.1`, `_t_1_x` + {"9e9e", floatLit}, // 9e9e = 9e9 + e + {".1e", invalid}, + // Issue #3954 + {".1e23", floatLit}, // `.1e23` + {".123", decLit}, // `.123` + {".1*23", decLit}, // `.1`, `*`, `23` + {".1,23", decLit}, // `.1`, `,`, `23` + {".1 23", decLit}, // `.1`, `23` + {".1$23", decLit}, // `.1`, `$23` + {".1a23", decLit}, // `.1`, `a23` + {".1e23$23", floatLit}, // `.1e23`, `$23` + {".1e23a23", floatLit}, // `.1e23`, `a23` + {".1C23", decLit}, // `.1`, `C23` + {".1\u0081", decLit}, // `.1`, `\u0081` + {".1\uff34", decLit}, // `.1`, `\uff34` + {`b''`, bitLit}, + {`b'0101'`, bitLit}, + {`0b0101`, bitLit}, + } + runTest(t, table) +} + +func TestLiteralValue(t *testing.T) { + table := []testLiteralValue{ + {`'''a'''`, `'a'`}, + {`''a''`, ``}, + {`""a""`, ``}, + {`\'a\'`, `\`}, + {`\"a\"`, `\`}, + {"0.2314", "0.2314"}, + {"1234567890123456789012345678901234567890", "1234567890123456789012345678901234567890"}, + {"132.313", "132.313"}, + {"132.3e231", 1.323e+233}, + {"132.3e-231", 1.323e-229}, + {"001e-12", 1e-12}, + {"23416", int64(23416)}, + {"123test", "123test"}, + {"123" + string(unicode.ReplacementChar) + "xxx", "123" + string(unicode.ReplacementChar) + "xxx"}, + {"0", int64(0)}, + {"0x3c26", "[60 38]"}, + {"x'13181C76734725455A'", "[19 24 28 118 115 71 37 69 90]"}, + {"0b01", "[1]"}, + {fmt.Sprintf("t1%c", 0), "t1"}, + {"N'some text'", "utf8"}, + {"n'some text'", "utf8"}, + {"\\N", `\N`}, + {".*", `.`}, // `.`, `*` + {".1_t_1_x", "0.1"}, // `.1`, `_t_1_x` + {"9e9e", float64(9000000000)}, // 9e9e = 9e9 + e + {".1e", ""}, + // Issue #3954 + {".1e23", float64(10000000000000000000000)}, // `.1e23` + {".123", "0.123"}, // `.123` + {".1*23", "0.1"}, // `.1`, `*`, `23` + {".1,23", "0.1"}, // `.1`, `,`, `23` + {".1 23", "0.1"}, // `.1`, `23` + {".1$23", "0.1"}, // `.1`, `$23` + {".1a23", "0.1"}, // `.1`, `a23` + {".1e23$23", float64(10000000000000000000000)}, // `.1e23`, `$23` + {".1e23a23", float64(10000000000000000000000)}, // `.1e23`, `a23` + {".1C23", "0.1"}, // `.1`, `C23` + {".1\u0081", "0.1"}, // `.1`, `\u0081` + {".1\uff34", "0.1"}, // `.1`, `\uff34` + {`b''`, "[]"}, + {`b'0101'`, "[5]"}, + {`0b0101`, "[5]"}, + } + runLiteralTest(t, table) +} + +func runTest(t *testing.T, table []testCaseItem) { + var val yySymType + for _, v := range table { + l := NewScanner(v.str) + tok := l.Lex(&val) + requires.Equal(t, v.tok, tok, v.str) + } +} + +func runLiteralTest(t *testing.T, table []testLiteralValue) { + for _, v := range table { + l := NewScanner(v.str) + val := l.LexLiteral() + switch val.(type) { + case int64: + requires.Equal(t, v.val, val, v.str) + case float64: + requires.Equal(t, v.val, val, v.str) + case string: + requires.Equal(t, v.val, val, v.str) + default: + requires.Equal(t, v.val, fmt.Sprint(val), v.str) + } + } +} + +func TestComment(t *testing.T) { + table := []testCaseItem{ + {"-- select --\n1", intLit}, + {"/*!40101 SET character_set_client = utf8 */;", set}, + {"/* SET character_set_client = utf8 */;", int(';')}, + {"/* some comments */ SELECT ", selectKwd}, + {`-- comment continues to the end of line +SELECT`, selectKwd}, + {`# comment continues to the end of line +SELECT`, selectKwd}, + {"#comment\n123", intLit}, + {"--5", int('-')}, + {"--\nSELECT", selectKwd}, + {"--\tSELECT", 0}, + {"--\r\nSELECT", selectKwd}, + {"--", 0}, + + // The odd behavior of '*/' inside conditional comment is the same as + // that of MySQL. + // /*T![...] ... */ is a TiDB feature comment; it is treated as a plain + // C comment now, so everything through the first `*/` is skipped. + {"/*T![unsupported] '*/0 -- ' */", intLit}, // equivalent to 0 + } + runTest(t, table) +} + +func TestScanQuotedIdent(t *testing.T) { + l := NewScanner("`fk`") + l.r.peek() + tok, pos, lit := scanQuotedIdent(l) + requires.Zero(t, pos.Offset) + requires.Equal(t, quotedIdentifier, tok) + requires.Equal(t, "fk", lit) +} + +func TestScanString(t *testing.T) { + table := []struct { + raw string + expect string + }{ + {`' \n\tTest String'`, " \n\tTest String"}, + {`'\x\B'`, "xB"}, + {`'\0\'\"\b\n\r\t\\'`, "\000'\"\b\n\r\t\\"}, + {`'\Z'`, "\x1a"}, + {`'\%\_'`, `\%\_`}, + {`'hello'`, "hello"}, + {`'"hello"'`, `"hello"`}, + {`'""hello""'`, `""hello""`}, + {`'hel''lo'`, "hel'lo"}, + {`'\'hello'`, "'hello"}, + {`"hello"`, "hello"}, + {`"'hello'"`, "'hello'"}, + {`"''hello''"`, "''hello''"}, + {`"hel""lo"`, `hel"lo`}, + {`"\"hello"`, `"hello`}, + {`'disappearing\ backslash'`, "disappearing backslash"}, + {"'한국의中文UTF8およびテキストトラック'", "한국의中文UTF8およびテキストトラック"}, + {"'\\a\x90'", "a\x90"}, + {"'\\a\x18èàø»\x05'", "a\x18èàø»\x05"}, + } + + for _, v := range table { + l := NewScanner(v.raw) + tok, pos, lit := l.scan() + requires.Zero(t, pos.Offset) + requires.Equal(t, stringLit, tok) + requires.Equal(t, v.expect, lit) + } +} + +func TestScanStringWithNoBackslashEscapesMode(t *testing.T) { + table := []struct { + raw string + expect string + }{ + {`' \n\tTest String'`, ` \n\tTest String`}, + {`'\x\B'`, `\x\B`}, + {`'\0\\''"\b\n\r\t\'`, `\0\\'"\b\n\r\t\`}, + {`'\Z'`, `\Z`}, + {`'\%\_'`, `\%\_`}, + {`'hello'`, "hello"}, + {`'"hello"'`, `"hello"`}, + {`'""hello""'`, `""hello""`}, + {`'hel''lo'`, "hel'lo"}, + {`'\'hello'`, `\`}, + {`"hello"`, "hello"}, + {`"'hello'"`, "'hello'"}, + {`"''hello''"`, "''hello''"}, + {`"hel""lo"`, `hel"lo`}, + {`"\"hello"`, `\`}, + {"'한국의中文UTF8およびテキストトラック'", "한국의中文UTF8およびテキストトラック"}, + } + l := NewScanner("") + l.SetSQLMode(mysql.ModeNoBackslashEscapes) + for _, v := range table { + l.reset(v.raw) + tok, pos, lit := l.scan() + requires.Zero(t, pos.Offset) + requires.Equal(t, stringLit, tok) + requires.Equal(t, v.expect, lit) + } +} + +func TestIdentifier(t *testing.T) { + table := [][2]string{ + {`哈哈`, "哈哈"}, + {"`numeric`", "numeric"}, + {"\r\n \r \n \tthere\t \n", "there"}, + {`5number`, `5number`}, + {"1_x", "1_x"}, + {"0_x", "0_x"}, + {string(unicode.ReplacementChar) + "xxx", string(unicode.ReplacementChar) + "xxx"}, + {"9e", "9e"}, + {"0b", "0b"}, + {"0b123", "0b123"}, + {"0b1ab", "0b1ab"}, + {"0B01", "0B01"}, + {"0x", "0x"}, + {"0x7fz3", "0x7fz3"}, + {"023a4", "023a4"}, + {"9eTSs", "9eTSs"}, + {fmt.Sprintf("t1%cxxx", 0), "t1"}, + } + l := &Scanner{} + for _, item := range table { + l.reset(item[0]) + var v yySymType + tok := l.Lex(&v) + requires.Equal(t, identifier, tok, item) + requires.Equal(t, item[1], v.ident, item) + } +} + +func TestSpecialComment(t *testing.T) { + l := NewScanner("/*!40101 select\n5*/") + tok, pos, lit := l.scan() + requires.Equal(t, identifier, tok) + requires.Equal(t, "select", lit) + requires.Equal(t, Pos{1, 9, 9}, pos) + + tok, pos, lit = l.scan() + requires.Equal(t, intLit, tok) + requires.Equal(t, "5", lit) + requires.Equal(t, Pos{2, 1, 16}, pos) +} + +func TestOptimizerHint(t *testing.T) { + l := NewScanner("SELECT /*+ BKA(t1) */ 0;") + tokens := []struct { + tok int + ident string + pos int + }{ + {selectKwd, "SELECT", 0}, + {hintComment, "/*+ BKA(t1) */", 7}, + {intLit, "0", 22}, + {';', ";", 23}, + } + for i := 0; ; i++ { + var sym yySymType + tok := l.Lex(&sym) + if tok == 0 { + return + } + requires.Equal(t, tokens[i].tok, tok, i) + requires.Equal(t, tokens[i].ident, sym.ident, i) + requires.Equal(t, tokens[i].pos, sym.offset, i) + } +} + +func TestOptimizerHintAfterCertainKeywordOnly(t *testing.T) { + tests := []struct { + input string + tokens []int + }{ + { + input: "SELECT /*+ hint */ *", + tokens: []int{selectKwd, hintComment, '*', 0}, + }, + { + input: "UPDATE /*+ hint */", + tokens: []int{update, hintComment, 0}, + }, + { + input: "INSERT /*+ hint */", + tokens: []int{insert, hintComment, 0}, + }, + { + input: "REPLACE /*+ hint */", + tokens: []int{replace, hintComment, 0}, + }, + { + input: "DELETE /*+ hint */", + tokens: []int{deleteKwd, hintComment, 0}, + }, + { + input: "CREATE /*+ hint */", + tokens: []int{create, hintComment, 0}, + }, + { + input: "/*+ hint */ SELECT *", + tokens: []int{selectKwd, '*', 0}, + }, + { + input: "SELECT /* comment */ /*+ hint */ *", + tokens: []int{selectKwd, hintComment, '*', 0}, + }, + { + input: "SELECT * /*+ hint */", + tokens: []int{selectKwd, '*', 0}, + }, + { + input: "SELECT /*T![auto_rand] * */ /*+ hint */", + tokens: []int{selectKwd, hintComment, 0}, + }, + { + input: "SELECT /*+ hint1 */ /*+ hint2 */ *", + tokens: []int{selectKwd, hintComment, '*', 0}, + }, + { + input: "SELECT * FROM /*+ hint */", + tokens: []int{selectKwd, '*', from, 0}, + }, + { + input: "`SELECT` /*+ hint */", + tokens: []int{identifier, 0}, + }, + { + input: "'SELECT' /*+ hint */", + tokens: []int{stringLit, 0}, + }, + } + + for _, tc := range tests { + scanner := NewScanner(tc.input) + var sym yySymType + for i := 0; ; i++ { + tok := scanner.Lex(&sym) + requires.Equalf(t, tc.tokens[i], tok, "input = [%s], i = %d", tc.input, i) + if tok == 0 { + break + } + } + } +} + +func TestInt(t *testing.T) { + tests := []struct { + input string + expect uint64 + }{ + {"01000001783", 1000001783}, + {"00001783", 1783}, + {"0", 0}, + {"0000", 0}, + {"01", 1}, + {"10", 10}, + } + scanner := NewScanner("") + for _, test := range tests { + var v yySymType + scanner.reset(test.input) + tok := scanner.Lex(&v) + requires.Equal(t, intLit, tok) + switch i := v.item.(type) { + case int64: + requires.Equal(t, test.expect, uint64(i)) + case uint64: + requires.Equal(t, test.expect, i) + default: + t.Fail() + } + } +} + +func TestSQLModeANSIQuotes(t *testing.T) { + tests := []struct { + input string + tok int + ident string + }{ + {`"identifier"`, identifier, "identifier"}, + {"`identifier`", identifier, "identifier"}, + {`"identifier""and"`, identifier, `identifier"and`}, + {`'string''string'`, stringLit, "string'string"}, + {`"identifier"'and'`, identifier, "identifier"}, + {`'string'"identifier"`, stringLit, "string"}, + } + scanner := NewScanner("") + scanner.SetSQLMode(mysql.ModeANSIQuotes) + for _, test := range tests { + var v yySymType + scanner.reset(test.input) + tok := scanner.Lex(&v) + requires.Equal(t, test.tok, tok) + requires.Equal(t, test.ident, v.ident) + } + scanner.reset(`'string' 'string'`) + var v yySymType + tok := scanner.Lex(&v) + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) + tok = scanner.Lex(&v) + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) +} + +func TestIllegal(t *testing.T) { + table := []testCaseItem{ + {"'", invalid}, + {"'fu", invalid}, + {"'\\n", invalid}, + {"'\\", invalid}, + {fmt.Sprintf("%c", 0), invalid}, + {"`", invalid}, + {`"`, invalid}, + {"@`", invalid}, + {"@'", invalid}, + {`@"`, invalid}, + {"@@`", invalid}, + {"@@global.`", invalid}, + } + runTest(t, table) +} + +func TestVersionDigits(t *testing.T) { + tests := []struct { + input string + min int + max int + nextChar byte + }{ + { + input: "12345", + min: 5, + max: 5, + nextChar: 0, + }, + { + input: "12345xyz", + min: 5, + max: 5, + nextChar: 'x', + }, + { + input: "1234xyz", + min: 5, + max: 5, + nextChar: '1', + }, + { + input: "123456", + min: 5, + max: 5, + nextChar: '6', + }, + { + input: "1234", + min: 5, + max: 5, + nextChar: '1', + }, + { + input: "", + min: 5, + max: 5, + nextChar: 0, + }, + { + input: "1234567xyz", + min: 5, + max: 6, + nextChar: '7', + }, + { + input: "12345xyz", + min: 5, + max: 6, + nextChar: 'x', + }, + { + input: "12345", + min: 5, + max: 6, + nextChar: 0, + }, + { + input: "1234xyz", + min: 5, + max: 6, + nextChar: '1', + }, + } + + scanner := NewScanner("") + for _, test := range tests { + scanner.reset(test.input) + scanner.scanVersionDigits(test.min, test.max) + nextChar := scanner.r.readByte() + requires.Equalf(t, test.nextChar, nextChar, "input = %s", test.input) + } +} diff --git a/pkg/parser/main_test.go b/pkg/parser/main_test.go new file mode 100644 index 000000000..cb47cc918 --- /dev/null +++ b/pkg/parser/main_test.go @@ -0,0 +1,25 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/pkg/parser/misc.go b/pkg/parser/misc.go new file mode 100644 index 000000000..934e7ffdc --- /dev/null +++ b/pkg/parser/misc.go @@ -0,0 +1,855 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +func isLetter(ch byte) bool { + return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') +} + +func isDigit(ch byte) bool { + return ch >= '0' && ch <= '9' +} + +func isIdentChar(ch byte) bool { + return isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || isIdentExtend(ch) +} + +func isIdentExtend(ch byte) bool { + return ch >= 0x80 +} + +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +func isInCorrectIdentifierName(name string) bool { + if len(name) == 0 { + return true + } + if name[len(name)-1] == ' ' { + return true + } + return false +} + +// Initialize a lookup table for isUserVarChar +var isUserVarCharTable [256]bool + +func init() { + for i := range 256 { + ch := byte(i) + isUserVarCharTable[i] = isLetter(ch) || isDigit(ch) || ch == '_' || ch == '$' || ch == '.' || isIdentExtend(ch) + } +} + +func isUserVarChar(ch byte) bool { + return isUserVarCharTable[ch] +} + +type trieNode struct { + childs [256]*trieNode + token int + fn func(s *Scanner) (int, Pos, string) +} + +var ruleTable trieNode + +func initTokenByte(c byte, tok int) { + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].token = tok +} + +func initTokenString(str string, tok int) { + node := &ruleTable + for _, c := range str { + if node.childs[c] == nil { + node.childs[c] = &trieNode{} + } + node = node.childs[c] + } + node.token = tok +} + +func initTokenFunc(str string, fn func(s *Scanner) (int, Pos, string)) { + for i := range len(str) { + c := str[i] + if ruleTable.childs[c] == nil { + ruleTable.childs[c] = &trieNode{} + } + ruleTable.childs[c].fn = fn + } +} + +func init() { + // invalid is a special token defined in parser.y, when parser meet + // this token, it will throw an error. + // set root trie node's token to invalid, so when input match nothing + // in the trie, invalid will be the default return token. + ruleTable.token = invalid + initTokenByte('/', int('/')) + initTokenByte('+', int('+')) + initTokenByte('>', int('>')) + initTokenByte('<', int('<')) + initTokenByte('(', int('(')) + initTokenByte(')', int(')')) + initTokenByte('[', int('[')) + initTokenByte(']', int(']')) + initTokenByte(';', int(';')) + initTokenByte(',', int(',')) + initTokenByte('&', int('&')) + initTokenByte('%', int('%')) + initTokenByte(':', int(':')) + initTokenByte('|', int('|')) + initTokenByte('!', int('!')) + initTokenByte('^', int('^')) + initTokenByte('~', int('~')) + initTokenByte('\\', int('\\')) + initTokenByte('?', paramMarker) + initTokenByte('=', eq) + initTokenByte('{', int('{')) + initTokenByte('}', int('}')) + + initTokenString("||", pipes) + initTokenString("&&", andand) + initTokenString(":=", assignmentEq) + initTokenString("<=>", nulleq) + initTokenString(">=", ge) + initTokenString("<=", le) + initTokenString("!=", neq) + initTokenString("<>", neqSynonym) + initTokenString("<<", lsh) + initTokenString(">>", rsh) + initTokenString("\\N", null) + + initTokenFunc("@", startWithAt) + initTokenFunc("/", startWithSlash) + initTokenFunc("*", startWithStar) + initTokenFunc("-", startWithDash) + initTokenFunc("#", startWithSharp) + initTokenFunc("Xx", startWithXx) + initTokenFunc("Nn", startWithNn) + initTokenFunc("Bb", startWithBb) + initTokenFunc(".", startWithDot) + initTokenFunc("_$ACDEFGHIJKLMOPQRSTUVWYZacdefghijklmopqrstuvwyz", scanIdentifier) + initTokenFunc("`", scanQuotedIdent) + initTokenFunc("0123456789", startWithNumber) + initTokenFunc("'\"", startString) +} + +// isInTokenMap indicates whether the target string is contained in tokenMap. +func isInTokenMap(target string) bool { + _, ok := tokenMap[target] + return ok +} + +// tokenMap is a map of known identifiers to the parser token ID. +// Please try to keep the map in alphabetical order. +var tokenMap = map[string]int{ + "ACCOUNT": account, + "ACTION": action, + "ACTIVE": active, + "ADD": add, + "ADDDATE": addDate, + "AFTER": after, + "AGAINST": against, + "ALGORITHM": algorithm, + "ALL": all, + "ALTER": alter, + "ALWAYS": always, + "ANALYZE": analyze, + "AND": and, + "ANY": any, + "ARRAY": array, + "AS": as, + "ASC": asc, + "ASCII": ascii, + "ATTRIBUTE": attribute, + "AUTO": auto, + "AUTO_INCREMENT": autoIncrement, + "AUTOEXTEND_SIZE": autoextendSize, + "AVG_ROW_LENGTH": avgRowLength, + "AVG": avg, + "BEGIN": begin, + "BETWEEN": between, + "BIGINT": bigIntType, + "BINARY": binaryType, + "BINLOG": binlog, + "BIT": bitType, + "BLOB": blobType, + "BLOCK": block, + "BOOL": boolType, + "BOOLEAN": booleanType, + "BOTH": both, + "BTREE": btree, + "BUCKETS": buckets, + "BY": by, + "BYTE": byteType, + "CALL": call, + "CASCADE": cascade, + "CASCADED": cascaded, + "CASE": caseKwd, + "CHAIN": chain, + "CHANGE": change, + "CHANNEL": channel, + "CHAR": charType, + "CHARACTER": character, + "CHARSET": charsetKwd, + "CHECK": check, + "CHECKSUM": checksum, + "CIPHER": cipher, + "CLIENT": client, + "COALESCE": coalesce, + "COLLATE": collate, + "COLLATION": collation, + "COLUMN_FORMAT": columnFormat, + "COLUMN": column, + "COLUMNS": columns, + "COMMENT": comment, + "COMMIT": commit, + "COMMITTED": committed, + "COMPACT": compact, + "COMPRESS": compress, + "COMPRESSED": compressed, + "COMPRESSION": compression, + "CONFIG": config, + "CONNECTION": connection, + "CONSISTENT": consistent, + "CONSTRAINT": constraint, + "CONTEXT": context, + "CONVERT": convert, + "COPY": copyKwd, + "CPU": cpu, + "CREATE": create, + "CROSS": cross, + "CURRENT_DATE": currentDate, + "CURRENT_ROLE": currentRole, + "CURRENT_TIME": currentTime, + "CURRENT_TIMESTAMP": currentTs, + "CURRENT_USER": currentUser, + "CURRENT": current, + "DATA": data, + "DATABASE": database, + "DATABASES": databases, + "DATAFILE": datafile, + "DATE": dateType, + "DATETIME": datetimeType, + "DAY_HOUR": dayHour, + "DAY_MICROSECOND": dayMicrosecond, + "DAY_MINUTE": dayMinute, + "DAY_SECOND": daySecond, + "DAY": day, + "DEALLOCATE": deallocate, + "DEC": decimalType, + "DECIMAL": decimalType, + "DEFAULT": defaultKwd, + "DEFINED": defined, + "DEFINER": definer, + "DEFINITION": definition, + "DELAY_KEY_WRITE": delayKeyWrite, + "DELAYED": delayed, + "DELETE": deleteKwd, + "DESC": desc, + "DESCRIBE": describe, + "DESCRIPTION": description, + "DIRECTORY": directory, + "DISABLE": disable, + "DISCARD": discard, + "DISK": disk, + "DISTINCT": distinct, + "DISTINCTROW": distinct, + "DIV": div, + "DO": do, + "DOUBLE": doubleType, + "DROP": drop, + "DUAL": dual, + "DUPLICATE": duplicate, + "DYNAMIC": dynamic, + "ELSE": elseKwd, + "ENABLE": enable, + "ENCLOSED": enclosed, + "ENCRYPTION": encryption, + "END": end, + "ENFORCED": enforced, + "ENGINE": engine, + "ENGINES": engines, + "ENGINE_ATTRIBUTE": engine_attribute, + "EXPORT": export, + "EXTENT_SIZE": extentSize, + "FILE_BLOCK_SIZE": fileBlockSize, + "INACTIVE": inactive, + "INITIAL_SIZE": initialSize, + "KEYRING": keyring, + "LOGFILE": logfile, + "MANUAL": manual, + "MAX_SIZE": maxSize, + "MIGRATE": migrate, + "NAME": nameKwd, + "ONE": one, + "OPTIMIZER_COSTS": optimizerCosts, + "ORGANIZATION": organization, + "PHASE": phase, + "RECOVER": recover, + "REFERENCE": reference, + "RELAY": relay, + "RESUME": resume, + "ROTATE": rotate, + "SECONDARY_ENGINE_ATTRIBUTE": secondaryEngineAttribute, + "ENUM": enum, + "ERROR": errorKwd, + "ERRORS": identSQLErrors, + "ESCAPE": escape, + "ESCAPED": escaped, + "EVENT": event, + "EVENTS": events, + "EXCEPT": except, + "EXCHANGE": exchange, + "EXECUTE": execute, + "EXISTS": exists, + "EXPANSION": expansion, + "EXPIRE": expire, + "EXPLAIN": explain, + "EXTENDED": extended, + "EXPLORE": explore, + "FALSE": falseKwd, + "FAULTS": faultsSym, + "FETCH": fetch, + "FIELDS": fields, + "FILE": file, + "FIRST": first, + "FIXED": fixed, + "FLOAT": floatType, + "FLOAT4": float4Type, + "FLOAT8": float8Type, + "FLUSH": flush, + "FOLLOWING": following, + "FOR": forKwd, + "FORCE": force, + "FOREIGN": foreign, + "FORMAT": format, + "FOUND": found, + "FROM": from, + "FULL": full, + "FULLTEXT": fulltext, + "FUNCTION": function, + "GENERAL": general, + "GENERATED": generated, + "GEOMETRY": geometry, + "GEOMETRYCOLLECTION": geometryCollection, + "GET_FORMAT": getFormat, + "GLOBAL": global, + "GRANT": grant, + "GRANTS": grants, + "GROUP": group, + "HASH": hash, + "HAVING": having, + "HIGH_PRIORITY": highPriority, + "HISTORY": history, + "HISTOGRAM": histogram, + "HOSTS": hosts, + "HOUR_MICROSECOND": hourMicrosecond, + "HOUR_MINUTE": hourMinute, + "HOUR_SECOND": hourSecond, + "HOUR": hour, + "IDENTIFIED": identified, + "IF": ifKwd, + "IGNORE": ignore, + "IMPORT": importKwd, + "IN": in, + "INDEX": index, + "INDEXES": indexes, + "INFILE": infile, + "INNER": inner, + "INPLACE": inplace, + "INSERT_METHOD": insertMethod, + "INSERT": insert, + "INSTANCE": instance, + "INSTANT": instant, + "INT": intType, + "INT1": int1Type, + "INT2": int2Type, + "INT3": int3Type, + "INT4": int4Type, + "INT8": int8Type, + "INTEGER": integerType, + "INTERSECT": intersect, + "INTERVAL": interval, + "INTO": into, + "INVISIBLE": invisible, + "INVOKER": invoker, + "IO": io, + "IPC": ipc, + "IS": is, + "ISOLATION": isolation, + "ISSUER": issuer, + "JOIN": join, + "JSON_ARRAYAGG": jsonArrayagg, + "JSON_OBJECTAGG": jsonObjectAgg, + "JSON_SUM_CRC32": jsonSumCrc32, + "JSON": jsonType, + "KEY_BLOCK_SIZE": keyBlockSize, + "KEY": key, + "KEYS": keys, + "KILL": kill, + "LANGUAGE": language, + "LAST": last, + "LATERAL": lateral, + "LEADING": leading, + "LEFT": left, + "LESS": less, + "LEVEL": level, + "LIKE": like, + "LIMIT": limit, + "LINEAR": linear, + "LINES": lines, + "LINESTRING": lineString, + "LIST": list, + "LOAD": load, + "LOCAL": local, + "LOCALTIME": localTime, + "LOCALTIMESTAMP": localTs, + "LOCK": lock, + "LOCKED": locked, + "LOG": log, + "LOGS": logs, + "LONG": long, + "LONGBLOB": longblobType, + "LONGTEXT": longtextType, + "LOW_PRIORITY": lowPriority, + "MASTER": master, + "MATCH": match, + "MAX_CONNECTIONS_PER_HOUR": maxConnectionsPerHour, + "MAX_QUERIES_PER_HOUR": maxQueriesPerHour, + "MAX_ROWS": maxRows, + "MAX_UPDATES_PER_HOUR": maxUpdatesPerHour, + "MAX_USER_CONNECTIONS": maxUserConnections, + "MAXVALUE": maxValue, + "MEDIUMBLOB": mediumblobType, + "MEDIUMINT": mediumIntType, + "MEDIUMTEXT": mediumtextType, + "MEMORY": memory, + "MEMBER": member, + "MERGE": merge, + "MICROSECOND": microsecond, + "MIDDLEINT": middleIntType, + "MIN_ROWS": minRows, + "MINUTE_MICROSECOND": minuteMicrosecond, + "MINUTE_SECOND": minuteSecond, + "MINUTE": minute, + "MOD": mod, + "MODE": mode, + "MODIFY": modify, + "MONTH": month, + "MULTILINESTRING": multiLineString, + "MULTIPOINT": multiPoint, + "MULTIPOLYGON": multiPolygon, + "NAMES": names, + "NATIONAL": national, + "NATURAL": natural, + "NCHAR": ncharType, + "NEVER": never, + "NEXT": next, + "NO_WRITE_TO_BINLOG": noWriteToBinLog, + "NO": no, + "NODEGROUP": nodegroup, + "NONE": none, + "NOT": not, + "NOWAIT": nowait, + "NO_WAIT": noWaitTablespace, + "REDO_BUFFER_SIZE": redoBufferSize, + "UNDO_BUFFER_SIZE": undoBufferSize, + "NULL": null, + "NULLS": nulls, + "NUMERIC": numericType, + "NVARCHAR": nvarcharType, + "OF": of, + "OFFSET": offset, + "OLD": old, + "ON": on, + "ONLY": only, + "OPEN": open, + "OPTIMIZE": optimize, + "OPTION": option, + "OPTIONALLY": optionally, + "OR": or, + "ORDER": order, + "OUTER": outer, + "OUTFILE": outfile, + "PACK_KEYS": packKeys, + "PAGE": pageSym, + "PARSER": parser, + "PARTIAL": partial, + "PARTITION": partition, + "PARTITIONING": partitioning, + "PARTITIONS": partitions, + "PASSWORD": password, + "PLUGINS": plugins, + "POINT": point, + "POLYGON": polygon, + "PRECEDING": preceding, + "PRECISION": precisionType, + "PREPARE": prepare, + "PRIMARY": primary, + "PRIVILEGES": privileges, + "PROCEDURE": procedure, + "PROCESS": process, + "PROCESSLIST": processlist, + "PROFILE": profile, + "PROFILES": profiles, + "PROXY": proxy, + "QUARTER": quarter, + "QUERY": query, + "QUICK": quick, + "RANGE": rangeKwd, + "READ": read, + "REAL": realType, + "REBUILD": rebuild, + "RECURSIVE": recursive, + "REDUNDANT": redundant, + "REFERENCES": references, + "REGEXP": regexpKwd, + "RELEASE": release, + "RELOAD": reload, + "REMOVE": remove, + "RENAME": rename, + "REORGANIZE": reorganize, + "REPAIR": repair, + "REPEAT": repeat, + "REPEATABLE": repeatable, + "REPLACE": replace, + "REPLICA": replica, + "REPLICATION": replication, + "REQUIRE": requireKwd, + "RESOURCE": resource, + "RESPECT": respect, + "RESTART": restart, + "RETAIN": retain, + "RESTRICT": restrict, + "REVERSE": reverse, + "REVOKE": revoke, + "RIGHT": right, + "RLIKE": rlike, + "ROLE": role, + "ROLLBACK": rollback, + "ROLLUP": rollup, + "ROUTINE": routine, + "ROW_COUNT": rowCount, + "ROW_FORMAT": rowFormat, + "ROW": row, + "ROWS": rows, + "RTREE": rtree, + "S3": s3, + "SAN": san, + "SAVEPOINT": savepoint, + "SCHEMA": database, + "SCHEMAS": databases, + "SECOND_MICROSECOND": secondMicrosecond, + "SECOND": second, + "SECONDARY_ENGINE": secondaryEngine, + "SECONDARY_LOAD": secondaryLoad, + "SECONDARY_UNLOAD": secondaryUnload, + "SECURITY": security, + "SELECT": selectKwd, + "SEPARATOR": separator, + "SERIAL": serial, + "SERIALIZABLE": serializable, + "SESSION": session, + "SET": set, + "SHARE": share, + "SHOW": show, + "SHUTDOWN": shutdown, + "SIGNED": signed, + "SIMPLE": simple, + "SKIP": skip, + "SLAVE": slave, + "SLOW": slow, + "SMALLINT": smallIntType, + "SNAPSHOT": snapshot, + "SOME": some, + "SOURCE": source, + "SPATIAL": spatial, + "SQL_BIG_RESULT": sqlBigResult, + "SQL_BUFFER_RESULT": sqlBufferResult, + "SQL_CACHE": sqlCache, + "SQL_CALC_FOUND_ROWS": sqlCalcFoundRows, + "SQL_NO_CACHE": sqlNoCache, + "SQL_SMALL_RESULT": sqlSmallResult, + "SQL_TSI_DAY": sqlTsiDay, + "SQL_TSI_HOUR": sqlTsiHour, + "SQL_TSI_MINUTE": sqlTsiMinute, + "SQL_TSI_MONTH": sqlTsiMonth, + "SQL_TSI_QUARTER": sqlTsiQuarter, + "SQL_TSI_SECOND": sqlTsiSecond, + "SQL_TSI_WEEK": sqlTsiWeek, + "SQL_TSI_YEAR": sqlTsiYear, + "SQL": sql, + "SRID": srid, + "SSL": ssl, + "START": start, + "STARTING": starting, + "STATS_AUTO_RECALC": statsAutoRecalc, + "STATS_PERSISTENT": statsPersistent, + "STATS_SAMPLE_PAGES": statsSamplePages, + "STATUS": status, + "STORAGE": storage, + "STORED": stored, + "STRAIGHT_JOIN": straightJoin, + "SUBDATE": subDate, + "SUBJECT": subject, + "SUBPARTITION": subpartition, + "SUBPARTITIONS": subpartitions, + "SUPER": super, + "SUSPEND": suspend, + "SWAPS": swaps, + "SWITCHES": switchesSym, + "SYSTEM": system, + "TABLE": tableKwd, + "TABLES": tables, + "TABLESPACE": tablespace, + "TEMPORARY": temporary, + "TEMPTABLE": temptable, + "TERMINATED": terminated, + "TEXT": textType, + "THAN": than, + "THEN": then, + "TIME": timeType, + "TIMESTAMP": timestampType, + "TIMESTAMPADD": timestampAdd, + "TIMESTAMPDIFF": timestampDiff, + "TINYBLOB": tinyblobType, + "TINYINT": tinyIntType, + "TINYTEXT": tinytextType, + "TLS": tls, + "TO": to, + "TOKEN_ISSUER": tokenIssuer, + "TRADITIONAL": traditional, + "TRAILING": trailing, + "TRANSACTION": transaction, + "TRIGGER": trigger, + "TRIGGERS": triggers, + "TRUE": trueKwd, + "TRUNCATE": truncate, + "TYPE": tp, + "UNBOUNDED": unbounded, + "UNCOMMITTED": uncommitted, + "UNDEFINED": undefined, + "UNDO": undo, + "UNDOFILE": undofile, + "UNICODE": unicodeSym, + "UNION": union, + "UNIQUE": unique, + "UNKNOWN": unknown, + "UNLOCK": unlock, + "UNSIGNED": unsigned, + "UPDATE": update, + "USAGE": usage, + "USE": use, + "USER": user, + "USER_RESOURCES": userResources, + "USE_FRM": useFrm, + "USING": using, + "UTC_DATE": utcDate, + "UTC_TIME": utcTime, + "UTC_TIMESTAMP": utcTimestamp, + "VALIDATION": validation, + "VALUE": value, + "VALUES": values, + "VARBINARY": varbinaryType, + "VARCHAR": varcharType, + "VARCHARACTER": varcharacter, + "VARIABLES": variables, + "VARYING": varying, + "VIEW": view, + "VIRTUAL": virtual, + "VISIBLE": visible, + "WARNINGS": warnings, + "WEEK": week, + "WEIGHT_STRING": weightString, + "WHEN": when, + "WHERE": where, + "WITH": with, + "WITHOUT": without, + "WORK": work, + "WRITE": write, + "X509": x509, + "XA": xa, + "XID": xid, + "XOR": xor, + "YEAR_MONTH": yearMonth, + "YEAR": yearType, + "ZEROFILL": zerofill, + "WAIT": wait, + "FAILED_LOGIN_ATTEMPTS": failedLoginAttempts, + "PASSWORD_LOCK_TIME": passwordLockTime, + "REUSE": reuse, +} + +// See https://dev.mysql.com/doc/refman/8.0/en/function-resolution.html for details. +// ADDDATE, SESSION_USER, SUBDATE, and SYSTEM_USER are exceptions because they are actually recognized as +// identifiers even in `create table adddate (a int)`. +var btFuncTokenMap = map[string]int{ + "BIT_AND": builtinBitAnd, + "BIT_OR": builtinBitOr, + "BIT_XOR": builtinBitXor, + "CAST": builtinCast, + "COUNT": builtinCount, + "APPROX_COUNT_DISTINCT": builtinApproxCountDistinct, + "APPROX_PERCENTILE": builtinApproxPercentile, + "CURDATE": builtinCurDate, + "CURTIME": builtinCurTime, + "DATE_ADD": builtinDateAdd, + "DATE_SUB": builtinDateSub, + "EXTRACT": builtinExtract, + "GROUP_CONCAT": builtinGroupConcat, + "MAX": builtinMax, + "MID": builtinSubstring, + "MIN": builtinMin, + "NOW": builtinNow, + "POSITION": builtinPosition, + "STD": builtinStddevPop, + "STDDEV": builtinStddevPop, + "STDDEV_POP": builtinStddevPop, + "STDDEV_SAMP": builtinStddevSamp, + "SUBSTR": builtinSubstring, + "SUBSTRING": builtinSubstring, + "SUM": builtinSum, + "SYSDATE": builtinSysDate, + "TRANSLATE": builtinTranslate, + "TRIM": builtinTrim, + "VARIANCE": builtinVarPop, + "VAR_POP": builtinVarPop, + "VAR_SAMP": builtinVarSamp, +} + +var windowFuncTokenMap = map[string]int{ + "CUME_DIST": cumeDist, + "DENSE_RANK": denseRank, + "FIRST_VALUE": firstValue, + "GROUPS": groups, + "LAG": lag, + "LAST_VALUE": lastValue, + "LEAD": lead, + "NTH_VALUE": nthValue, + "NTILE": ntile, + "OVER": over, + "PERCENT_RANK": percentRank, + "RANK": rank, + "ROW_NUMBER": rowNumber, + "WINDOW": window, +} + +// aliases are strings directly map to another string and use the same token. +var aliases = map[string]string{ + "SCHEMA": "DATABASE", + "SCHEMAS": "DATABASES", + "DEC": "DECIMAL", +} + +// hintedTokens is a set of tokens which recognizes a hint. +// According to https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html, +// only SELECT, INSERT, REPLACE, UPDATE and DELETE accept optimizer hints. +// additionally we support CREATE and PARTITION for hints at table creation. +var hintedTokens = map[int]struct{}{ + selectKwd: {}, + insert: {}, + replace: {}, + update: {}, + deleteKwd: {}, + create: {}, + partition: {}, +} + +var hintTokenMap = map[string]int{ + // MySQL 8.0 hint names + "JOIN_FIXED_ORDER": hintJoinFixedOrder, + "JOIN_ORDER": hintJoinOrder, + "JOIN_PREFIX": hintJoinPrefix, + "JOIN_SUFFIX": hintJoinSuffix, + "BKA": hintBKA, + "NO_BKA": hintNoBKA, + "BNL": hintBNL, + "NO_BNL": hintNoBNL, + "HASH_JOIN": hintHashJoin, + "NO_HASH_JOIN": hintNoHashJoin, + "MERGE": hintMerge, + "NO_MERGE": hintNoMerge, + "INDEX_MERGE": hintIndexMerge, + "NO_INDEX_MERGE": hintNoIndexMerge, + "MRR": hintMRR, + "NO_MRR": hintNoMRR, + "NO_ICP": hintNoICP, + "NO_RANGE_OPTIMIZATION": hintNoRangeOptimization, + "SKIP_SCAN": hintSkipScan, + "NO_SKIP_SCAN": hintNoSkipScan, + "SEMIJOIN": hintSemijoin, + "NO_SEMIJOIN": hintNoSemijoin, + "ORDER_INDEX": hintOrderIndex, + "NO_ORDER_INDEX": hintNoOrderIndex, + "MAX_EXECUTION_TIME": hintMaxExecutionTime, + "SET_VAR": hintSetVar, + "RESOURCE_GROUP": hintResourceGroup, + "QB_NAME": hintQBName, + + // SEMIJOIN() strategies + "DUPSWEEDOUT": hintDupsWeedOut, + "FIRSTMATCH": hintFirstMatch, + "LOOSESCAN": hintLooseScan, + "MATERIALIZATION": hintMaterialization, +} + +func (s *Scanner) isTokenIdentifier(lit string, offset int) int { + // An identifier before or after '.' means it is part of a qualified identifier. + // We do not parse it as keyword. + if s.r.peek() == '.' { + return 0 + } + + for idx := offset - 1; idx >= 0; idx-- { + if s.r.s[idx] == ' ' { + continue + } else if s.r.s[idx] == '.' { + return 0 + } + break + } + + buf := &s.buf + buf.Reset() + buf.Grow(len(lit)) + data := buf.Bytes()[:len(lit)] + + for i := range len(lit) { + c := lit[i] + if c >= 'a' && c <= 'z' { + data[i] = c + 'A' - 'a' + } else { + data[i] = c + } + } + + checkBtFuncToken := s.r.peek() == '(' + if !checkBtFuncToken && s.sqlMode.HasIgnoreSpaceMode() { + s.skipWhitespace() + checkBtFuncToken = s.r.peek() == '(' + } + + if checkBtFuncToken { + if tok := btFuncTokenMap[string(data)]; tok != 0 { + return tok + } + } + tok, ok := tokenMap[string(data)] + if !ok && s.supportWindowFunc { + tok = windowFuncTokenMap[string(data)] + } + return tok +} diff --git a/pkg/parser/mysql/charset.go b/pkg/parser/mysql/charset.go new file mode 100644 index 000000000..add31ea7a --- /dev/null +++ b/pkg/parser/mysql/charset.go @@ -0,0 +1,29 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL collation information. +const ( + UTF8Charset = "utf8" + UTF8MB4Charset = "utf8mb4" + DefaultCharset = UTF8MB4Charset + + UTF8MB4DefaultCollation = "utf8mb4_bin" + DefaultCollationName = UTF8MB4DefaultCollation +) + +// IsUTF8Charset checks if charset is utf8, utf8mb4. +func IsUTF8Charset(charset string) bool { + return charset == UTF8Charset || charset == UTF8MB4Charset +} diff --git a/pkg/parser/mysql/const.go b/pkg/parser/mysql/const.go new file mode 100644 index 000000000..3c18a3199 --- /dev/null +++ b/pkg/parser/mysql/const.go @@ -0,0 +1,341 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" + "strings" + + "github.com/block/spirit/pkg/parser/format" +) + +func newInvalidModeErr(s string) error { + // The capitalization matches MySQL's ER_WRONG_VALUE_FOR_VAR message. + return fmt.Errorf("Variable 'sql_mode' can't be set to the value of '%s'", s) //nolint:staticcheck +} + +// Identifier length limitations. +// See https://dev.mysql.com/doc/refman/5.7/en/identifiers.html +const ( + // MaxPayloadLen is the max packet payload length. + MaxPayloadLen = 1<<24 - 1 + // MaxTableNameLength is max length of table name identifier. + MaxTableNameLength = 64 + // MaxDatabaseNameLength is max length of database name identifier. + MaxDatabaseNameLength = 64 + // MaxColumnNameLength is max length of column name identifier. + MaxColumnNameLength = 64 + // MaxKeyParts is max length of key parts. + MaxKeyParts = 16 + // MaxIndexIdentifierLen is max length of index identifier. + MaxIndexIdentifierLen = 64 + // MaxForeignKeyIdentifierLen is max length of foreign key identifier. + MaxForeignKeyIdentifierLen = 64 + // MaxConstraintIdentifierLen is max length of constrain identifier. + MaxConstraintIdentifierLen = 64 + // MaxViewIdentifierLen is max length of view identifier. + MaxViewIdentifierLen = 64 + // MaxAliasIdentifierLen is max length of alias identifier. + MaxAliasIdentifierLen = 256 + // MaxUserDefinedVariableLen is max length of user-defined variable. + MaxUserDefinedVariableLen = 64 +) + +// ErrTextLength error text length limit. +const ErrTextLength = 80 + +// Auth name information. +const ( + AuthNativePassword = "mysql_native_password" // #nosec G101 +) + +// MySQL type maximum length. +const ( + // NotFixedDec For arguments that have no fixed number of decimals, the decimals value is set to 31, + // which is 1 more than the maximum number of decimals permitted for the DECIMAL, FLOAT, and DOUBLE data types. + NotFixedDec = 31 + + MaxDecimalScale = 30 + MaxDecimalWidth = 65 + MaxDatetimeWidthNoFsp = 19 // YYYY-MM-DD HH:MM:SS + MaxDurationWidthNoFsp = 10 // HH:MM:SS + MaxFloatPrecisionLength = 24 + MaxDoublePrecisionLength = 53 +) + +// MaxTypeSetMembers is the number of set members. +const MaxTypeSetMembers = 64 + +// DefaultSQLMode for GLOBAL_VARIABLES +const DefaultSQLMode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" + +// DefaultLengthOfMysqlTypes is the map for default physical length of MySQL data types. +// See http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +var DefaultLengthOfMysqlTypes = map[byte]int{ + TypeYear: 1, + TypeDate: 3, + TypeDuration: 3, + TypeDatetime: 8, + TypeTimestamp: 4, + + TypeTiny: 1, + TypeShort: 2, + TypeInt24: 3, + TypeLong: 4, + TypeLonglong: 8, + TypeFloat: 4, + TypeDouble: 8, + + TypeEnum: 2, + TypeString: 1, + TypeSet: 8, +} + +// DefaultLengthOfTimeFraction is the map for default physical length of time fractions. +var DefaultLengthOfTimeFraction = map[int]int{ + 0: 0, + + 1: 1, + 2: 1, + + 3: 2, + 4: 2, + + 5: 3, + 6: 3, +} + +// SQLMode is the type for MySQL sql_mode. +// See https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html +type SQLMode int64 + +// HasNoZeroDateMode detects if 'NO_ZERO_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroDateMode() bool { + return m&ModeNoZeroDate == ModeNoZeroDate +} + +// HasNoZeroInDateMode detects if 'NO_ZERO_IN_DATE' mode is set in SQLMode +func (m SQLMode) HasNoZeroInDateMode() bool { + return m&ModeNoZeroInDate == ModeNoZeroInDate +} + +// HasErrorForDivisionByZeroMode detects if 'ERROR_FOR_DIVISION_BY_ZERO' mode is set in SQLMode +func (m SQLMode) HasErrorForDivisionByZeroMode() bool { + return m&ModeErrorForDivisionByZero == ModeErrorForDivisionByZero +} + +// HasOnlyFullGroupBy detects if 'ONLY_FULL_GROUP_BY' mode is set in SQLMode +func (m SQLMode) HasOnlyFullGroupBy() bool { + return m&ModeOnlyFullGroupBy == ModeOnlyFullGroupBy +} + +// HasStrictMode detects if 'STRICT_TRANS_TABLES' or 'STRICT_ALL_TABLES' mode is set in SQLMode +func (m SQLMode) HasStrictMode() bool { + return m&ModeStrictTransTables == ModeStrictTransTables || m&ModeStrictAllTables == ModeStrictAllTables +} + +// HasPipesAsConcatMode detects if 'PIPES_AS_CONCAT' mode is set in SQLMode +func (m SQLMode) HasPipesAsConcatMode() bool { + return m&ModePipesAsConcat == ModePipesAsConcat +} + +// HasNoUnsignedSubtractionMode detects if 'NO_UNSIGNED_SUBTRACTION' mode is set in SQLMode +func (m SQLMode) HasNoUnsignedSubtractionMode() bool { + return m&ModeNoUnsignedSubtraction == ModeNoUnsignedSubtraction +} + +// HasHighNotPrecedenceMode detects if 'HIGH_NOT_PRECEDENCE' mode is set in SQLMode +func (m SQLMode) HasHighNotPrecedenceMode() bool { + return m&ModeHighNotPrecedence == ModeHighNotPrecedence +} + +// HasANSIQuotesMode detects if 'ANSI_QUOTES' mode is set in SQLMode +func (m SQLMode) HasANSIQuotesMode() bool { + return m&ModeANSIQuotes == ModeANSIQuotes +} + +// HasRealAsFloatMode detects if 'REAL_AS_FLOAT' mode is set in SQLMode +func (m SQLMode) HasRealAsFloatMode() bool { + return m&ModeRealAsFloat == ModeRealAsFloat +} + +// HasPadCharToFullLengthMode detects if 'PAD_CHAR_TO_FULL_LENGTH' mode is set in SQLMode +func (m SQLMode) HasPadCharToFullLengthMode() bool { + return m&ModePadCharToFullLength == ModePadCharToFullLength +} + +// HasNoBackslashEscapesMode detects if 'NO_BACKSLASH_ESCAPES' mode is set in SQLMode +func (m SQLMode) HasNoBackslashEscapesMode() bool { + return m&ModeNoBackslashEscapes == ModeNoBackslashEscapes +} + +// HasIgnoreSpaceMode detects if 'IGNORE_SPACE' mode is set in SQLMode +func (m SQLMode) HasIgnoreSpaceMode() bool { + return m&ModeIgnoreSpace == ModeIgnoreSpace +} + +// HasNoAutoCreateUserMode detects if 'NO_AUTO_CREATE_USER' mode is set in SQLMode +func (m SQLMode) HasNoAutoCreateUserMode() bool { + return m&ModeNoAutoCreateUser == ModeNoAutoCreateUser +} + +// HasAllowInvalidDatesMode detects if 'ALLOW_INVALID_DATES' mode is set in SQLMode +func (m SQLMode) HasAllowInvalidDatesMode() bool { + return m&ModeAllowInvalidDates == ModeAllowInvalidDates +} + +// consts for sql modes. +// see https://dev.mysql.com/doc/internals/en/query-event.html#q-sql-mode-code +const ( + ModeRealAsFloat SQLMode = 1 << iota + ModePipesAsConcat + ModeANSIQuotes + ModeIgnoreSpace + ModeNotUsed + ModeOnlyFullGroupBy + ModeNoUnsignedSubtraction + ModeNoDirInCreate + ModePostgreSQL + ModeOracle + ModeMsSQL + ModeDb2 + ModeMaxdb + ModeNoKeyOptions + ModeNoTableOptions + ModeNoFieldOptions + ModeMySQL323 + ModeMySQL40 + ModeANSI + ModeNoAutoValueOnZero + ModeNoBackslashEscapes + ModeStrictTransTables + ModeStrictAllTables + ModeNoZeroInDate + ModeNoZeroDate + ModeInvalidDates + ModeErrorForDivisionByZero + ModeTraditional + ModeNoAutoCreateUser + ModeHighNotPrecedence + ModeNoEngineSubstitution + ModePadCharToFullLength + ModeAllowInvalidDates +) + +// GetSQLMode gets the sql mode for string literal. SQL_mode is a list of different modes separated by commas. +func GetSQLMode(s string) (SQLMode, error) { + strs := strings.Split(s, ",") + var sqlMode SQLMode + for i, length := 0, len(strs); i < length; i++ { + mode, ok := Str2SQLMode[strs[i]] + if !ok && strs[i] != "" { + return sqlMode, newInvalidModeErr(strs[i]) + } + sqlMode |= mode + } + return sqlMode, nil +} + +// Str2SQLMode is the string represent of sql_mode to sql_mode map. +var Str2SQLMode = map[string]SQLMode{ + "REAL_AS_FLOAT": ModeRealAsFloat, + "PIPES_AS_CONCAT": ModePipesAsConcat, + "ANSI_QUOTES": ModeANSIQuotes, + "IGNORE_SPACE": ModeIgnoreSpace, + "NOT_USED": ModeNotUsed, + "ONLY_FULL_GROUP_BY": ModeOnlyFullGroupBy, + "NO_UNSIGNED_SUBTRACTION": ModeNoUnsignedSubtraction, + "NO_DIR_IN_CREATE": ModeNoDirInCreate, + "POSTGRESQL": ModePostgreSQL, + "ORACLE": ModeOracle, + "MSSQL": ModeMsSQL, + "DB2": ModeDb2, + "MAXDB": ModeMaxdb, + "NO_KEY_OPTIONS": ModeNoKeyOptions, + "NO_TABLE_OPTIONS": ModeNoTableOptions, + "NO_FIELD_OPTIONS": ModeNoFieldOptions, + "MYSQL323": ModeMySQL323, + "MYSQL40": ModeMySQL40, + "ANSI": ModeANSI, + "NO_AUTO_VALUE_ON_ZERO": ModeNoAutoValueOnZero, + "NO_BACKSLASH_ESCAPES": ModeNoBackslashEscapes, + "STRICT_TRANS_TABLES": ModeStrictTransTables, + "STRICT_ALL_TABLES": ModeStrictAllTables, + "NO_ZERO_IN_DATE": ModeNoZeroInDate, + "NO_ZERO_DATE": ModeNoZeroDate, + "INVALID_DATES": ModeInvalidDates, + "ERROR_FOR_DIVISION_BY_ZERO": ModeErrorForDivisionByZero, + "TRADITIONAL": ModeTraditional, + "NO_AUTO_CREATE_USER": ModeNoAutoCreateUser, + "HIGH_NOT_PRECEDENCE": ModeHighNotPrecedence, + "NO_ENGINE_SUBSTITUTION": ModeNoEngineSubstitution, + "PAD_CHAR_TO_FULL_LENGTH": ModePadCharToFullLength, + "ALLOW_INVALID_DATES": ModeAllowInvalidDates, +} + +// PriorityEnum is defined for Priority const values. +type PriorityEnum int + +// Priority const values. +// See https://dev.mysql.com/doc/refman/5.7/en/insert.html +const ( + NoPriority PriorityEnum = iota + LowPriority + HighPriority + DelayedPriority +) + +// Priority2Str is used to convert the statement priority to string. +var Priority2Str = map[PriorityEnum]string{ + NoPriority: "NO_PRIORITY", + LowPriority: "LOW_PRIORITY", + HighPriority: "HIGH_PRIORITY", + DelayedPriority: "DELAYED", +} + +// Restore implements Node interface. +func (n *PriorityEnum) Restore(ctx *format.RestoreCtx) error { + switch *n { + case NoPriority: + return nil + case LowPriority: + ctx.WriteKeyWord("LOW_PRIORITY") + case HighPriority: + ctx.WriteKeyWord("HIGH_PRIORITY") + case DelayedPriority: + ctx.WriteKeyWord("DELAYED") + default: + return fmt.Errorf("undefined PriorityEnum Type[%d]", *n) + } + return nil +} + +const ( + // PrimaryKeyName defines primary key name. + PrimaryKeyName = "PRIMARY" + // DefaultDecimal defines the default decimal value when the value out of range. + DefaultDecimal = "99999999999999999999999999999999999999999999999999999999999999999" + // PartitionCountLimit is limit of the number of partitions in a table. + // Reference linking https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html. + PartitionCountLimit = 8192 +) + +const ( + // CompressionNone is no compression in use + CompressionNone = iota + // CompressionZlib is zlib/deflate + CompressionZlib + // CompressionZstd is Facebook's Zstandard + CompressionZstd +) diff --git a/pkg/parser/mysql/const_test.go b/pkg/parser/mysql/const_test.go new file mode 100644 index 000000000..3290e58ab --- /dev/null +++ b/pkg/parser/mysql/const_test.go @@ -0,0 +1,96 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSQLMode(t *testing.T) { + // ref https://dev.mysql.com/doc/internals/en/query-event.html#q-sql-mode-code, + hardCode := []struct { + code SQLMode + value int + }{{ + ModeRealAsFloat, 0x00000001, + }, { + ModePipesAsConcat, 0x00000002, + }, { + ModeANSIQuotes, 0x00000004, + }, { + ModeIgnoreSpace, 0x00000008, + }, { + ModeNotUsed, 0x00000010, + }, { + ModeOnlyFullGroupBy, 0x00000020, + }, { + ModeNoUnsignedSubtraction, 0x00000040, + }, { + ModeNoDirInCreate, 0x00000080, + }, { + ModePostgreSQL, 0x00000100, + }, { + ModeOracle, 0x00000200, + }, { + ModeMsSQL, 0x00000400, + }, { + ModeDb2, 0x00000800, + }, { + ModeMaxdb, 0x00001000, + }, { + ModeNoKeyOptions, 0x00002000, + }, { + ModeNoTableOptions, 0x00004000, + }, { + ModeNoFieldOptions, 0x00008000, + }, { + ModeMySQL323, 0x00010000, + }, { + ModeMySQL40, 0x00020000, + }, { + ModeANSI, 0x00040000, + }, { + ModeNoAutoValueOnZero, 0x00080000, + }, { + ModeNoBackslashEscapes, 0x00100000, + }, { + ModeStrictTransTables, 0x00200000, + }, { + ModeStrictAllTables, 0x00400000, + }, { + ModeNoZeroInDate, 0x00800000, + }, { + ModeNoZeroDate, 0x01000000, + }, { + ModeInvalidDates, 0x02000000, + }, { + ModeErrorForDivisionByZero, 0x04000000, + }, { + ModeTraditional, 0x08000000, + }, { + ModeNoAutoCreateUser, 0x10000000, + }, { + ModeHighNotPrecedence, 0x20000000, + }, { + ModeNoEngineSubstitution, 0x40000000, + }, { + ModePadCharToFullLength, 0x80000000, + }} + + for _, ca := range hardCode { + require.Equal(t, ca.value, int(ca.code)) + } +} diff --git a/pkg/parser/mysql/errcode.go b/pkg/parser/mysql/errcode.go new file mode 100644 index 000000000..dd62f98ff --- /dev/null +++ b/pkg/parser/mysql/errcode.go @@ -0,0 +1,964 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL error code. +// This value is numeric. It is not portable to other database systems. +const ( + ErrErrorFirst = 1000 + ErrHashchk = 1000 + ErrNisamchk = 1001 + ErrNo = 1002 + ErrYes = 1003 + ErrCantCreateFile = 1004 + ErrCantCreateTable = 1005 + ErrCantCreateDB = 1006 + ErrDBCreateExists = 1007 + ErrDBDropExists = 1008 + ErrDBDropDelete = 1009 + ErrDBDropRmdir = 1010 + ErrCantDeleteFile = 1011 + ErrCantFindSystemRec = 1012 + ErrCantGetStat = 1013 + ErrCantGetWd = 1014 + ErrCantLock = 1015 + ErrCantOpenFile = 1016 + ErrFileNotFound = 1017 + ErrCantReadDir = 1018 + ErrCantSetWd = 1019 + ErrCheckread = 1020 + ErrDiskFull = 1021 + ErrDupKey = 1022 + ErrErrorOnClose = 1023 + ErrErrorOnRead = 1024 + ErrErrorOnRename = 1025 + ErrErrorOnWrite = 1026 + ErrFileUsed = 1027 + ErrFilsortAbort = 1028 + ErrFormNotFound = 1029 + ErrGetErrno = 1030 + ErrIllegalHa = 1031 + ErrKeyNotFound = 1032 + ErrNotFormFile = 1033 + ErrNotKeyFile = 1034 + ErrOldKeyFile = 1035 + ErrOpenAsReadonly = 1036 + ErrOutofMemory = 1037 + ErrOutOfSortMemory = 1038 + ErrUnexpectedEOF = 1039 + ErrConCount = 1040 + ErrOutOfResources = 1041 + ErrBadHost = 1042 + ErrHandshake = 1043 + ErrDBaccessDenied = 1044 + ErrAccessDenied = 1045 + ErrNoDB = 1046 + ErrUnknownCom = 1047 + ErrBadNull = 1048 + ErrBadDB = 1049 + ErrTableExists = 1050 + ErrBadTable = 1051 + ErrNonUniq = 1052 + ErrServerShutdown = 1053 + ErrBadField = 1054 + ErrFieldNotInGroupBy = 1055 + ErrWrongGroupField = 1056 + ErrWrongSumSelect = 1057 + ErrWrongValueCount = 1058 + ErrTooLongIdent = 1059 + ErrDupFieldName = 1060 + ErrDupKeyName = 1061 + ErrDupEntry = 1062 + ErrWrongFieldSpec = 1063 + ErrParse = 1064 + ErrEmptyQuery = 1065 + ErrNonuniqTable = 1066 + ErrInvalidDefault = 1067 + ErrMultiplePriKey = 1068 + ErrTooManyKeys = 1069 + ErrTooManyKeyParts = 1070 + ErrTooLongKey = 1071 + ErrKeyColumnDoesNotExits = 1072 + ErrBlobUsedAsKey = 1073 + ErrTooBigFieldlength = 1074 + ErrWrongAutoKey = 1075 + ErrReady = 1076 + ErrNormalShutdown = 1077 + ErrGotSignal = 1078 + ErrShutdownComplete = 1079 + ErrForcingClose = 1080 + ErrIpsock = 1081 + ErrNoSuchIndex = 1082 + ErrWrongFieldTerminators = 1083 + ErrBlobsAndNoTerminated = 1084 + ErrTextFileNotReadable = 1085 + ErrFileExists = 1086 + ErrLoadInfo = 1087 + ErrAlterInfo = 1088 + ErrWrongSubKey = 1089 + ErrCantRemoveAllFields = 1090 + ErrCantDropFieldOrKey = 1091 + ErrInsertInfo = 1092 + ErrUpdateTableUsed = 1093 + ErrNoSuchThread = 1094 + ErrKillDenied = 1095 + ErrNoTablesUsed = 1096 + ErrTooBigSet = 1097 + ErrNoUniqueLogFile = 1098 + ErrTableNotLockedForWrite = 1099 + ErrTableNotLocked = 1100 + ErrBlobCantHaveDefault = 1101 + ErrWrongDBName = 1102 + ErrWrongTableName = 1103 + ErrTooBigSelect = 1104 + ErrUnknown = 1105 + ErrUnknownProcedure = 1106 + ErrWrongParamcountToProcedure = 1107 + ErrWrongParametersToProcedure = 1108 + ErrUnknownTable = 1109 + ErrFieldSpecifiedTwice = 1110 + ErrInvalidGroupFuncUse = 1111 + ErrUnsupportedExtension = 1112 + ErrTableMustHaveColumns = 1113 + ErrRecordFileFull = 1114 + ErrUnknownCharacterSet = 1115 + ErrTooManyTables = 1116 + ErrTooManyFields = 1117 + ErrTooBigRowsize = 1118 + ErrStackOverrun = 1119 + ErrWrongOuterJoin = 1120 + ErrNullColumnInIndex = 1121 + ErrCantFindUdf = 1122 + ErrCantInitializeUdf = 1123 + ErrUdfNoPaths = 1124 + ErrUdfExists = 1125 + ErrCantOpenLibrary = 1126 + ErrCantFindDlEntry = 1127 + ErrFunctionNotDefined = 1128 + ErrHostIsBlocked = 1129 + ErrHostNotPrivileged = 1130 + ErrPasswordAnonymousUser = 1131 + ErrPasswordNotAllowed = 1132 + ErrPasswordNoMatch = 1133 + ErrUpdateInfo = 1134 + ErrCantCreateThread = 1135 + ErrWrongValueCountOnRow = 1136 + ErrCantReopenTable = 1137 + ErrInvalidUseOfNull = 1138 + ErrRegexp = 1139 + ErrMixOfGroupFuncAndFields = 1140 + ErrNonexistingGrant = 1141 + ErrTableaccessDenied = 1142 + ErrColumnaccessDenied = 1143 + ErrIllegalGrantForTable = 1144 + ErrGrantWrongHostOrUser = 1145 + ErrNoSuchTable = 1146 + ErrNonexistingTableGrant = 1147 + ErrNotAllowedCommand = 1148 + ErrSyntax = 1149 + ErrDelayedCantChangeLock = 1150 + ErrTooManyDelayedThreads = 1151 + ErrAbortingConnection = 1152 + ErrNetPacketTooLarge = 1153 + ErrNetReadErrorFromPipe = 1154 + ErrNetFcntl = 1155 + ErrNetPacketsOutOfOrder = 1156 + ErrNetUncompress = 1157 + ErrNetRead = 1158 + ErrNetReadInterrupted = 1159 + ErrNetErrorOnWrite = 1160 + ErrNetWriteInterrupted = 1161 + ErrTooLongString = 1162 + ErrTableCantHandleBlob = 1163 + ErrTableCantHandleAutoIncrement = 1164 + ErrDelayedInsertTableLocked = 1165 + ErrWrongColumnName = 1166 + ErrWrongKeyColumn = 1167 + ErrWrongMrgTable = 1168 + ErrDupUnique = 1169 + ErrBlobKeyWithoutLength = 1170 + ErrPrimaryCantHaveNull = 1171 + ErrTooManyRows = 1172 + ErrRequiresPrimaryKey = 1173 + ErrNoRaidCompiled = 1174 + ErrUpdateWithoutKeyInSafeMode = 1175 + ErrKeyDoesNotExist = 1176 + ErrCheckNoSuchTable = 1177 + ErrCheckNotImplemented = 1178 + ErrCantDoThisDuringAnTransaction = 1179 + ErrErrorDuringCommit = 1180 + ErrErrorDuringRollback = 1181 + ErrErrorDuringFlushLogs = 1182 + ErrErrorDuringCheckpoint = 1183 + ErrNewAbortingConnection = 1184 + ErrDumpNotImplemented = 1185 + ErrFlushMasterBinlogClosed = 1186 + ErrIndexRebuild = 1187 + ErrMaster = 1188 + ErrMasterNetRead = 1189 + ErrMasterNetWrite = 1190 + ErrFtMatchingKeyNotFound = 1191 + ErrLockOrActiveTransaction = 1192 + ErrUnknownSystemVariable = 1193 + ErrCrashedOnUsage = 1194 + ErrCrashedOnRepair = 1195 + ErrWarningNotCompleteRollback = 1196 + ErrTransCacheFull = 1197 + ErrSlaveMustStop = 1198 + ErrSlaveNotRunning = 1199 + ErrBadSlave = 1200 + ErrMasterInfo = 1201 + ErrSlaveThread = 1202 + ErrTooManyUserConnections = 1203 + ErrSetConstantsOnly = 1204 + ErrLockWaitTimeout = 1205 + ErrLockTableFull = 1206 + ErrReadOnlyTransaction = 1207 + ErrDropDBWithReadLock = 1208 + ErrCreateDBWithReadLock = 1209 + ErrWrongArguments = 1210 + ErrNoPermissionToCreateUser = 1211 + ErrUnionTablesInDifferentDir = 1212 + ErrLockDeadlock = 1213 + ErrTableCantHandleFt = 1214 + ErrCannotAddForeign = 1215 + ErrNoReferencedRow = 1216 + ErrRowIsReferenced = 1217 + ErrConnectToMaster = 1218 + ErrQueryOnMaster = 1219 + ErrErrorWhenExecutingCommand = 1220 + ErrWrongUsage = 1221 + ErrWrongNumberOfColumnsInSelect = 1222 + ErrCantUpdateWithReadlock = 1223 + ErrMixingNotAllowed = 1224 + ErrDupArgument = 1225 + ErrUserLimitReached = 1226 + ErrSpecificAccessDenied = 1227 + ErrLocalVariable = 1228 + ErrGlobalVariable = 1229 + ErrNoDefault = 1230 + ErrWrongValueForVar = 1231 + ErrWrongTypeForVar = 1232 + ErrVarCantBeRead = 1233 + ErrCantUseOptionHere = 1234 + ErrNotSupportedYet = 1235 + ErrMasterFatalErrorReadingBinlog = 1236 + ErrSlaveIgnoredTable = 1237 + ErrIncorrectGlobalLocalVar = 1238 + ErrWrongFkDef = 1239 + ErrKeyRefDoNotMatchTableRef = 1240 + ErrOperandColumns = 1241 + ErrSubqueryNo1Row = 1242 + ErrUnknownStmtHandler = 1243 + ErrCorruptHelpDB = 1244 + ErrCyclicReference = 1245 + ErrAutoConvert = 1246 + ErrIllegalReference = 1247 + ErrDerivedMustHaveAlias = 1248 + ErrSelectReduced = 1249 + ErrTablenameNotAllowedHere = 1250 + ErrNotSupportedAuthMode = 1251 + ErrSpatialCantHaveNull = 1252 + ErrCollationCharsetMismatch = 1253 + ErrSlaveWasRunning = 1254 + ErrSlaveWasNotRunning = 1255 + ErrTooBigForUncompress = 1256 + ErrZlibZMem = 1257 + ErrZlibZBuf = 1258 + ErrZlibZData = 1259 + ErrCutValueGroupConcat = 1260 + ErrWarnTooFewRecords = 1261 + ErrWarnTooManyRecords = 1262 + ErrWarnNullToNotnull = 1263 + ErrWarnDataOutOfRange = 1264 + WarnDataTruncated = 1265 + ErrWarnUsingOtherHandler = 1266 + ErrCantAggregate2collations = 1267 + ErrDropUser = 1268 + ErrRevokeGrants = 1269 + ErrCantAggregate3collations = 1270 + ErrCantAggregateNcollations = 1271 + ErrVariableIsNotStruct = 1272 + ErrUnknownCollation = 1273 + ErrSlaveIgnoredSslParams = 1274 + ErrServerIsInSecureAuthMode = 1275 + ErrWarnFieldResolved = 1276 + ErrBadSlaveUntilCond = 1277 + ErrMissingSkipSlave = 1278 + ErrUntilCondIgnored = 1279 + ErrWrongNameForIndex = 1280 + ErrWrongNameForCatalog = 1281 + ErrWarnQcResize = 1282 + ErrBadFtColumn = 1283 + ErrUnknownKeyCache = 1284 + ErrWarnHostnameWontWork = 1285 + ErrUnknownStorageEngine = 1286 + ErrWarnDeprecatedSyntax = 1287 + ErrNonUpdatableTable = 1288 + ErrFeatureDisabled = 1289 + ErrOptionPreventsStatement = 1290 + ErrDuplicatedValueInType = 1291 + ErrTruncatedWrongValue = 1292 + ErrTooMuchAutoTimestampCols = 1293 + ErrInvalidOnUpdate = 1294 + ErrUnsupportedPs = 1295 + ErrGetErrmsg = 1296 + ErrGetTemporaryErrmsg = 1297 + ErrUnknownTimeZone = 1298 + ErrWarnInvalidTimestamp = 1299 + ErrInvalidCharacterString = 1300 + ErrWarnAllowedPacketOverflowed = 1301 + ErrConflictingDeclarations = 1302 + ErrSpNoRecursiveCreate = 1303 + ErrSpAlreadyExists = 1304 + ErrSpDoesNotExist = 1305 + ErrSpDropFailed = 1306 + ErrSpStoreFailed = 1307 + ErrSpLilabelMismatch = 1308 + ErrSpLabelRedefine = 1309 + ErrSpLabelMismatch = 1310 + ErrSpUninitVar = 1311 + ErrSpBadselect = 1312 + ErrSpBadreturn = 1313 + ErrSpBadstatement = 1314 + ErrUpdateLogDeprecatedIgnored = 1315 + ErrUpdateLogDeprecatedTranslated = 1316 + ErrQueryInterrupted = 1317 + ErrSpWrongNoOfArgs = 1318 + ErrSpCondMismatch = 1319 + ErrSpNoreturn = 1320 + ErrSpNoreturnend = 1321 + ErrSpBadCursorQuery = 1322 + ErrSpBadCursorSelect = 1323 + ErrSpCursorMismatch = 1324 + ErrSpCursorAlreadyOpen = 1325 + ErrSpCursorNotOpen = 1326 + ErrSpUndeclaredVar = 1327 + ErrSpWrongNoOfFetchArgs = 1328 + ErrSpFetchNoData = 1329 + ErrSpDupParam = 1330 + ErrSpDupVar = 1331 + ErrSpDupCond = 1332 + ErrSpDupCurs = 1333 + ErrSpCantAlter = 1334 + ErrSpSubselectNyi = 1335 + ErrStmtNotAllowedInSfOrTrg = 1336 + ErrSpVarcondAfterCurshndlr = 1337 + ErrSpCursorAfterHandler = 1338 + ErrSpCaseNotFound = 1339 + ErrFparserTooBigFile = 1340 + ErrFparserBadHeader = 1341 + ErrFparserEOFInComment = 1342 + ErrFparserErrorInParameter = 1343 + ErrFparserEOFInUnknownParameter = 1344 + ErrViewNoExplain = 1345 + ErrFrmUnknownType = 1346 + ErrWrongObject = 1347 + ErrNonupdateableColumn = 1348 + ErrViewSelectDerived = 1349 + ErrViewSelectClause = 1350 + ErrViewSelectVariable = 1351 + ErrViewSelectTmptable = 1352 + ErrViewWrongList = 1353 + ErrWarnViewMerge = 1354 + ErrWarnViewWithoutKey = 1355 + ErrViewInvalid = 1356 + ErrSpNoDropSp = 1357 + ErrSpGotoInHndlr = 1358 + ErrTrgAlreadyExists = 1359 + ErrTrgDoesNotExist = 1360 + ErrTrgOnViewOrTempTable = 1361 + ErrTrgCantChangeRow = 1362 + ErrTrgNoSuchRowInTrg = 1363 + ErrNoDefaultForField = 1364 + ErrDivisionByZero = 1365 + ErrTruncatedWrongValueForField = 1366 + ErrIllegalValueForType = 1367 + ErrViewNonupdCheck = 1368 + ErrViewCheckFailed = 1369 + ErrProcaccessDenied = 1370 + ErrRelayLogFail = 1371 + ErrPasswdLength = 1372 + ErrUnknownTargetBinlog = 1373 + ErrIoErrLogIndexRead = 1374 + ErrBinlogPurgeProhibited = 1375 + ErrFseekFail = 1376 + ErrBinlogPurgeFatalErr = 1377 + ErrLogInUse = 1378 + ErrLogPurgeUnknownErr = 1379 + ErrRelayLogInit = 1380 + ErrNoBinaryLogging = 1381 + ErrReservedSyntax = 1382 + ErrWsasFailed = 1383 + ErrDiffGroupsProc = 1384 + ErrNoGroupForProc = 1385 + ErrOrderWithProc = 1386 + ErrLoggingProhibitChangingOf = 1387 + ErrNoFileMapping = 1388 + ErrWrongMagic = 1389 + ErrPsManyParam = 1390 + ErrKeyPart0 = 1391 + ErrViewChecksum = 1392 + ErrViewMultiupdate = 1393 + ErrViewNoInsertFieldList = 1394 + ErrViewDeleteMergeView = 1395 + ErrCannotUser = 1396 + ErrXaerNota = 1397 + ErrXaerInval = 1398 + ErrXaerRmfail = 1399 + ErrXaerOutside = 1400 + ErrXaerRmerr = 1401 + ErrXaRbrollback = 1402 + ErrNonexistingProcGrant = 1403 + ErrProcAutoGrantFail = 1404 + ErrProcAutoRevokeFail = 1405 + ErrDataTooLong = 1406 + ErrSpBadSQLstate = 1407 + ErrStartup = 1408 + ErrLoadFromFixedSizeRowsToVar = 1409 + ErrCantCreateUserWithGrant = 1410 + ErrWrongValueForType = 1411 + ErrTableDefChanged = 1412 + ErrSpDupHandler = 1413 + ErrSpNotVarArg = 1414 + ErrSpNoRetset = 1415 + ErrCantCreateGeometryObject = 1416 + ErrFailedRoutineBreakBinlog = 1417 + ErrBinlogUnsafeRoutine = 1418 + ErrBinlogCreateRoutineNeedSuper = 1419 + ErrExecStmtWithOpenCursor = 1420 + ErrStmtHasNoOpenCursor = 1421 + ErrCommitNotAllowedInSfOrTrg = 1422 + ErrNoDefaultForViewField = 1423 + ErrSpNoRecursion = 1424 + ErrTooBigScale = 1425 + ErrTooBigPrecision = 1426 + ErrMBiggerThanD = 1427 + ErrWrongLockOfSystemTable = 1428 + ErrConnectToForeignDataSource = 1429 + ErrQueryOnForeignDataSource = 1430 + ErrForeignDataSourceDoesntExist = 1431 + ErrForeignDataStringInvalidCantCreate = 1432 + ErrForeignDataStringInvalid = 1433 + ErrCantCreateFederatedTable = 1434 + ErrTrgInWrongSchema = 1435 + ErrStackOverrunNeedMore = 1436 + ErrTooLongBody = 1437 + ErrWarnCantDropDefaultKeycache = 1438 + ErrTooBigDisplaywidth = 1439 + ErrXaerDupid = 1440 + ErrDatetimeFunctionOverflow = 1441 + ErrCantUpdateUsedTableInSfOrTrg = 1442 + ErrViewPreventUpdate = 1443 + ErrPsNoRecursion = 1444 + ErrSpCantSetAutocommit = 1445 + ErrMalformedDefiner = 1446 + ErrViewFrmNoUser = 1447 + ErrViewOtherUser = 1448 + ErrNoSuchUser = 1449 + ErrForbidSchemaChange = 1450 + ErrRowIsReferenced2 = 1451 + ErrNoReferencedRow2 = 1452 + ErrSpBadVarShadow = 1453 + ErrTrgNoDefiner = 1454 + ErrOldFileFormat = 1455 + ErrSpRecursionLimit = 1456 + ErrSpProcTableCorrupt = 1457 + ErrSpWrongName = 1458 + ErrTableNeedsUpgrade = 1459 + ErrSpNoAggregate = 1460 + ErrMaxPreparedStmtCountReached = 1461 + ErrViewRecursive = 1462 + ErrNonGroupingFieldUsed = 1463 + ErrTableCantHandleSpkeys = 1464 + ErrNoTriggersOnSystemSchema = 1465 + ErrRemovedSpaces = 1466 + ErrAutoincReadFailed = 1467 + ErrUsername = 1468 + ErrHostname = 1469 + ErrWrongStringLength = 1470 + ErrNonInsertableTable = 1471 + ErrAdminWrongMrgTable = 1472 + ErrTooHighLevelOfNestingForSelect = 1473 + ErrNameBecomesEmpty = 1474 + ErrAmbiguousFieldTerm = 1475 + ErrForeignServerExists = 1476 + ErrForeignServerDoesntExist = 1477 + ErrIllegalHaCreateOption = 1478 + ErrPartitionRequiresValues = 1479 + ErrPartitionWrongValues = 1480 + ErrPartitionMaxvalue = 1481 + ErrPartitionSubpartition = 1482 + ErrPartitionSubpartMix = 1483 + ErrPartitionWrongNoPart = 1484 + ErrPartitionWrongNoSubpart = 1485 + ErrWrongExprInPartitionFunc = 1486 + ErrNoConstExprInRangeOrList = 1487 + ErrFieldNotFoundPart = 1488 + ErrListOfFieldsOnlyInHash = 1489 + ErrInconsistentPartitionInfo = 1490 + ErrPartitionFuncNotAllowed = 1491 + ErrPartitionsMustBeDefined = 1492 + ErrRangeNotIncreasing = 1493 + ErrInconsistentTypeOfFunctions = 1494 + ErrMultipleDefConstInListPart = 1495 + ErrPartitionEntry = 1496 + ErrMixHandler = 1497 + ErrPartitionNotDefined = 1498 + ErrTooManyPartitions = 1499 + ErrSubpartition = 1500 + ErrCantCreateHandlerFile = 1501 + ErrBlobFieldInPartFunc = 1502 + ErrUniqueKeyNeedAllFieldsInPf = 1503 + ErrNoParts = 1504 + ErrPartitionMgmtOnNonpartitioned = 1505 + ErrForeignKeyOnPartitioned = 1506 + ErrDropPartitionNonExistent = 1507 + ErrDropLastPartition = 1508 + ErrCoalesceOnlyOnHashPartition = 1509 + ErrReorgHashOnlyOnSameNo = 1510 + ErrReorgNoParam = 1511 + ErrOnlyOnRangeListPartition = 1512 + ErrAddPartitionSubpart = 1513 + ErrAddPartitionNoNewPartition = 1514 + ErrCoalescePartitionNoPartition = 1515 + ErrReorgPartitionNotExist = 1516 + ErrSameNamePartition = 1517 + ErrNoBinlog = 1518 + ErrConsecutiveReorgPartitions = 1519 + ErrReorgOutsideRange = 1520 + ErrPartitionFunctionFailure = 1521 + ErrPartState = 1522 + ErrLimitedPartRange = 1523 + ErrPluginIsNotLoaded = 1524 + ErrWrongValue = 1525 + ErrNoPartitionForGivenValue = 1526 + ErrFilegroupOptionOnlyOnce = 1527 + ErrCreateFilegroupFailed = 1528 + ErrDropFilegroupFailed = 1529 + ErrTablespaceAutoExtend = 1530 + ErrWrongSizeNumber = 1531 + ErrSizeOverflow = 1532 + ErrAlterFilegroupFailed = 1533 + ErrBinlogRowLoggingFailed = 1534 + ErrBinlogRowWrongTableDef = 1535 + ErrBinlogRowRbrToSbr = 1536 + ErrEventAlreadyExists = 1537 + ErrEventStoreFailed = 1538 + ErrEventDoesNotExist = 1539 + ErrEventCantAlter = 1540 + ErrEventDropFailed = 1541 + ErrEventIntervalNotPositiveOrTooBig = 1542 + ErrEventEndsBeforeStarts = 1543 + ErrEventExecTimeInThePast = 1544 + ErrEventOpenTableFailed = 1545 + ErrEventNeitherMExprNorMAt = 1546 + ErrObsoleteColCountDoesntMatchCorrupted = 1547 + ErrObsoleteCannotLoadFromTable = 1548 + ErrEventCannotDelete = 1549 + ErrEventCompile = 1550 + ErrEventSameName = 1551 + ErrEventDataTooLong = 1552 + ErrDropIndexNeededInForeignKey = 1553 + ErrWarnDeprecatedSyntaxWithVer = 1554 + ErrCantWriteLockLogTable = 1555 + ErrCantLockLogTable = 1556 + ErrForeignDuplicateKeyOldUnused = 1557 + ErrColCountDoesntMatchPleaseUpdate = 1558 + ErrTempTablePreventsSwitchOutOfRbr = 1559 + ErrStoredFunctionPreventsSwitchBinlogFormat = 1560 + ErrNdbCantSwitchBinlogFormat = 1561 + ErrPartitionNoTemporary = 1562 + ErrPartitionConstDomain = 1563 + ErrPartitionFunctionIsNotAllowed = 1564 + ErrDdlLog = 1565 + ErrNullInValuesLessThan = 1566 + ErrWrongPartitionName = 1567 + ErrCantChangeTxCharacteristics = 1568 + ErrDupEntryAutoincrementCase = 1569 + ErrEventModifyQueue = 1570 + ErrEventSetVar = 1571 + ErrPartitionMerge = 1572 + ErrCantActivateLog = 1573 + ErrRbrNotAvailable = 1574 + ErrBase64Decode = 1575 + ErrEventRecursionForbidden = 1576 + ErrEventsDB = 1577 + ErrOnlyIntegersAllowed = 1578 + ErrUnsuportedLogEngine = 1579 + ErrBadLogStatement = 1580 + ErrCantRenameLogTable = 1581 + ErrWrongParamcountToNativeFct = 1582 + ErrWrongParametersToNativeFct = 1583 + ErrWrongParametersToStoredFct = 1584 + ErrNativeFctNameCollision = 1585 + ErrDupEntryWithKeyName = 1586 + ErrBinlogPurgeEmFile = 1587 + ErrEventCannotCreateInThePast = 1588 + ErrEventCannotAlterInThePast = 1589 + ErrSlaveIncident = 1590 + ErrNoPartitionForGivenValueSilent = 1591 + ErrBinlogUnsafeStatement = 1592 + ErrSlaveFatal = 1593 + ErrSlaveRelayLogReadFailure = 1594 + ErrSlaveRelayLogWriteFailure = 1595 + ErrSlaveCreateEventFailure = 1596 + ErrSlaveMasterComFailure = 1597 + ErrBinlogLoggingImpossible = 1598 + ErrViewNoCreationCtx = 1599 + ErrViewInvalidCreationCtx = 1600 + ErrSrInvalidCreationCtx = 1601 + ErrTrgCorruptedFile = 1602 + ErrTrgNoCreationCtx = 1603 + ErrTrgInvalidCreationCtx = 1604 + ErrEventInvalidCreationCtx = 1605 + ErrTrgCantOpenTable = 1606 + ErrCantCreateSroutine = 1607 + ErrNeverUsed = 1608 + ErrNoFormatDescriptionEventBeforeBinlogStatement = 1609 + ErrSlaveCorruptEvent = 1610 + ErrLoadDataInvalidColumn = 1611 + ErrLogPurgeNoFile = 1612 + ErrXaRbtimeout = 1613 + ErrXaRbdeadlock = 1614 + ErrNeedReprepare = 1615 + ErrDelayedNotSupported = 1616 + WarnNoMasterInfo = 1617 + WarnOptionIgnored = 1618 + WarnPluginDeleteBuiltin = 1619 + WarnPluginBusy = 1620 + ErrVariableIsReadonly = 1621 + ErrWarnEngineTransactionRollback = 1622 + ErrSlaveHeartbeatFailure = 1623 + ErrSlaveHeartbeatValueOutOfRange = 1624 + ErrNdbReplicationSchema = 1625 + ErrConflictFnParse = 1626 + ErrExceptionsWrite = 1627 + ErrTooLongTableComment = 1628 + ErrTooLongFieldComment = 1629 + ErrFuncInexistentNameCollision = 1630 + ErrDatabaseName = 1631 + ErrTableName = 1632 + ErrPartitionName = 1633 + ErrSubpartitionName = 1634 + ErrTemporaryName = 1635 + ErrRenamedName = 1636 + ErrTooManyConcurrentTrxs = 1637 + WarnNonASCIISeparatorNotImplemented = 1638 + ErrDebugSyncTimeout = 1639 + ErrDebugSyncHitLimit = 1640 + ErrDupSignalSet = 1641 + ErrSignalWarn = 1642 + ErrSignalNotFound = 1643 + ErrSignalException = 1644 + ErrResignalWithoutActiveHandler = 1645 + ErrSignalBadConditionType = 1646 + WarnCondItemTruncated = 1647 + ErrCondItemTooLong = 1648 + ErrUnknownLocale = 1649 + ErrSlaveIgnoreServerIDs = 1650 + ErrQueryCacheDisabled = 1651 + ErrSameNamePartitionField = 1652 + ErrPartitionColumnList = 1653 + ErrWrongTypeColumnValue = 1654 + ErrTooManyPartitionFuncFields = 1655 + ErrMaxvalueInValuesIn = 1656 + ErrTooManyValues = 1657 + ErrRowSinglePartitionField = 1658 + ErrFieldTypeNotAllowedAsPartitionField = 1659 + ErrPartitionFieldsTooLong = 1660 + ErrBinlogRowEngineAndStmtEngine = 1661 + ErrBinlogRowModeAndStmtEngine = 1662 + ErrBinlogUnsafeAndStmtEngine = 1663 + ErrBinlogRowInjectionAndStmtEngine = 1664 + ErrBinlogStmtModeAndRowEngine = 1665 + ErrBinlogRowInjectionAndStmtMode = 1666 + ErrBinlogMultipleEnginesAndSelfLoggingEngine = 1667 + ErrBinlogUnsafeLimit = 1668 + ErrBinlogUnsafeInsertDelayed = 1669 + ErrBinlogUnsafeSystemTable = 1670 + ErrBinlogUnsafeAutoincColumns = 1671 + ErrBinlogUnsafeUdf = 1672 + ErrBinlogUnsafeSystemVariable = 1673 + ErrBinlogUnsafeSystemFunction = 1674 + ErrBinlogUnsafeNontransAfterTrans = 1675 + ErrMessageAndStatement = 1676 + ErrSlaveConversionFailed = 1677 + ErrSlaveCantCreateConversion = 1678 + ErrInsideTransactionPreventsSwitchBinlogFormat = 1679 + ErrPathLength = 1680 + ErrWarnDeprecatedSyntaxNoReplacement = 1681 + ErrWrongNativeTableStructure = 1682 + ErrWrongPerfSchemaUsage = 1683 + ErrWarnISSkippedTable = 1684 + ErrInsideTransactionPreventsSwitchBinlogDirect = 1685 + ErrStoredFunctionPreventsSwitchBinlogDirect = 1686 + ErrSpatialMustHaveGeomCol = 1687 + ErrTooLongIndexComment = 1688 + ErrLockAborted = 1689 + ErrDataOutOfRange = 1690 + ErrWrongSpvarTypeInLimit = 1691 + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine = 1692 + ErrBinlogUnsafeMixedStatement = 1693 + ErrInsideTransactionPreventsSwitchSQLLogBin = 1694 + ErrStoredFunctionPreventsSwitchSQLLogBin = 1695 + ErrFailedReadFromParFile = 1696 + ErrValuesIsNotIntType = 1697 + ErrAccessDeniedNoPassword = 1698 + ErrSetPasswordAuthPlugin = 1699 + ErrGrantPluginUserExists = 1700 + ErrTruncateIllegalForeignKey = 1701 + ErrPluginIsPermanent = 1702 + ErrSlaveHeartbeatValueOutOfRangeMin = 1703 + ErrSlaveHeartbeatValueOutOfRangeMax = 1704 + ErrStmtCacheFull = 1705 + ErrMultiUpdateKeyConflict = 1706 + ErrTableNeedsRebuild = 1707 + WarnOptionBelowLimit = 1708 + ErrIndexColumnTooLong = 1709 + ErrErrorInTriggerBody = 1710 + ErrErrorInUnknownTriggerBody = 1711 + ErrIndexCorrupt = 1712 + ErrUndoRecordTooBig = 1713 + ErrBinlogUnsafeInsertIgnoreSelect = 1714 + ErrBinlogUnsafeInsertSelectUpdate = 1715 + ErrBinlogUnsafeReplaceSelect = 1716 + ErrBinlogUnsafeCreateIgnoreSelect = 1717 + ErrBinlogUnsafeCreateReplaceSelect = 1718 + ErrBinlogUnsafeUpdateIgnore = 1719 + ErrPluginNoUninstall = 1720 + ErrPluginNoInstall = 1721 + ErrBinlogUnsafeWriteAutoincSelect = 1722 + ErrBinlogUnsafeCreateSelectAutoinc = 1723 + ErrBinlogUnsafeInsertTwoKeys = 1724 + ErrTableInFkCheck = 1725 + ErrUnsupportedEngine = 1726 + ErrBinlogUnsafeAutoincNotFirst = 1727 + ErrCannotLoadFromTableV2 = 1728 + ErrMasterDelayValueOutOfRange = 1729 + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement = 1730 + ErrPartitionExchangeDifferentOption = 1731 + ErrPartitionExchangePartTable = 1732 + ErrPartitionExchangeTempTable = 1733 + ErrPartitionInsteadOfSubpartition = 1734 + ErrUnknownPartition = 1735 + ErrTablesDifferentMetadata = 1736 + ErrRowDoesNotMatchPartition = 1737 + ErrBinlogCacheSizeGreaterThanMax = 1738 + ErrWarnIndexNotApplicable = 1739 + ErrPartitionExchangeForeignKey = 1740 + ErrNoSuchKeyValue = 1741 + ErrRplInfoDataTooLong = 1742 + ErrNetworkReadEventChecksumFailure = 1743 + ErrBinlogReadEventChecksumFailure = 1744 + ErrBinlogStmtCacheSizeGreaterThanMax = 1745 + ErrCantUpdateTableInCreateTableSelect = 1746 + ErrPartitionClauseOnNonpartitioned = 1747 + ErrRowDoesNotMatchGivenPartitionSet = 1748 + ErrNoSuchPartitionunused = 1749 + ErrChangeRplInfoRepositoryFailure = 1750 + ErrWarningNotCompleteRollbackWithCreatedTempTable = 1751 + ErrWarningNotCompleteRollbackWithDroppedTempTable = 1752 + ErrMtsFeatureIsNotSupported = 1753 + ErrMtsUpdatedDBsGreaterMax = 1754 + ErrMtsCantParallel = 1755 + ErrMtsInconsistentData = 1756 + ErrFulltextNotSupportedWithPartitioning = 1757 + ErrDaInvalidConditionNumber = 1758 + ErrInsecurePlainText = 1759 + ErrInsecureChangeMaster = 1760 + ErrForeignDuplicateKeyWithChildInfo = 1761 + ErrForeignDuplicateKeyWithoutChildInfo = 1762 + ErrSQLthreadWithSecureSlave = 1763 + ErrTableHasNoFt = 1764 + ErrVariableNotSettableInSfOrTrigger = 1765 + ErrVariableNotSettableInTransaction = 1766 + ErrGtidNextIsNotInGtidNextList = 1767 + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull = 1768 + ErrSetStatementCannotInvokeFunction = 1769 + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull = 1770 + ErrSkippingLoggedTransaction = 1771 + ErrMalformedGtidSetSpecification = 1772 + ErrMalformedGtidSetEncoding = 1773 + ErrMalformedGtidSpecification = 1774 + ErrGnoExhausted = 1775 + ErrBadSlaveAutoPosition = 1776 + ErrAutoPositionRequiresGtidModeOn = 1777 + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet = 1778 + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn = 1779 + ErrGtidModeRequiresBinlog = 1780 + ErrCantSetGtidNextToGtidWhenGtidModeIsOff = 1781 + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn = 1782 + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff = 1783 + ErrFoundGtidEventWhenGtidModeIsOff = 1784 + ErrGtidUnsafeNonTransactionalTable = 1785 + ErrGtidUnsafeCreateSelect = 1786 + ErrGtidUnsafeCreateDropTemporaryTableInTransaction = 1787 + ErrGtidModeCanOnlyChangeOneStepAtATime = 1788 + ErrMasterHasPurgedRequiredGtids = 1789 + ErrCantSetGtidNextWhenOwningGtid = 1790 + ErrUnknownExplainFormat = 1791 + ErrCantExecuteInReadOnlyTransaction = 1792 + ErrTooLongTablePartitionComment = 1793 + ErrSlaveConfiguration = 1794 + ErrInnodbFtLimit = 1795 + ErrInnodbNoFtTempTable = 1796 + ErrInnodbFtWrongDocidColumn = 1797 + ErrInnodbFtWrongDocidIndex = 1798 + ErrInnodbOnlineLogTooBig = 1799 + ErrUnknownAlterAlgorithm = 1800 + ErrUnknownAlterLock = 1801 + ErrMtsChangeMasterCantRunWithGaps = 1802 + ErrMtsRecoveryFailure = 1803 + ErrMtsResetWorkers = 1804 + ErrColCountDoesntMatchCorruptedV2 = 1805 + ErrSlaveSilentRetryTransaction = 1806 + ErrDiscardFkChecksRunning = 1807 + ErrTableSchemaMismatch = 1808 + ErrTableInSystemTablespace = 1809 + ErrIoRead = 1810 + ErrIoWrite = 1811 + ErrTablespaceMissing = 1812 + ErrTablespaceExists = 1813 + ErrTablespaceDiscarded = 1814 + ErrInternal = 1815 + ErrInnodbImport = 1816 + ErrInnodbIndexCorrupt = 1817 + ErrInvalidYearColumnLength = 1818 + ErrNotValidPassword = 1819 + ErrMustChangePassword = 1820 + ErrFkNoIndexChild = 1821 + ErrForeignKeyNoIndexInParent = 1822 + ErrFkFailAddSystem = 1823 + ErrForeignKeyCannotOpenParent = 1824 + ErrFkIncorrectOption = 1825 + ErrFkDupName = 1826 + ErrPasswordFormat = 1827 + ErrFkColumnCannotDrop = 1828 + ErrFkColumnCannotDropChild = 1829 + ErrForeignKeyColumnNotNull = 1830 + ErrDupIndex = 1831 + ErrForeignKeyColumnCannotChange = 1832 + ErrForeignKeyColumnCannotChangeChild = 1833 + ErrFkCannotDeleteParent = 1834 + ErrMalformedPacket = 1835 + ErrReadOnlyMode = 1836 + ErrGtidNextTypeUndefinedGroup = 1837 + ErrVariableNotSettableInSp = 1838 + ErrCantSetGtidPurgedWhenGtidModeIsOff = 1839 + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty = 1840 + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty = 1841 + ErrGtidPurgedWasChanged = 1842 + ErrGtidExecutedWasChanged = 1843 + ErrBinlogStmtModeAndNoReplTables = 1844 + ErrAlterOperationNotSupported = 1845 + ErrAlterOperationNotSupportedReason = 1846 + ErrAlterOperationNotSupportedReasonCopy = 1847 + ErrAlterOperationNotSupportedReasonPartition = 1848 + ErrAlterOperationNotSupportedReasonFkRename = 1849 + ErrAlterOperationNotSupportedReasonColumnType = 1850 + ErrAlterOperationNotSupportedReasonFkCheck = 1851 + ErrAlterOperationNotSupportedReasonIgnore = 1852 + ErrAlterOperationNotSupportedReasonNopk = 1853 + ErrAlterOperationNotSupportedReasonAutoinc = 1854 + ErrAlterOperationNotSupportedReasonHiddenFts = 1855 + ErrAlterOperationNotSupportedReasonChangeFts = 1856 + ErrAlterOperationNotSupportedReasonFts = 1857 + ErrSQLSlaveSkipCounterNotSettableInGtidMode = 1858 + ErrDupUnknownInIndex = 1859 + ErrIdentCausesTooLongPath = 1860 + ErrAlterOperationNotSupportedReasonNotNull = 1861 + ErrMustChangePasswordLogin = 1862 + ErrRowInWrongPartition = 1863 + ErrErrorLast = 1863 + ErrInvalidFieldSize = 3013 + ErrPasswordExpireAnonymousUser = 3016 + ErrMaxExecTimeExceeded = 3024 + ErrIncorrectType = 3064 + ErrInvalidJSONData = 3069 + ErrGeneratedColumnFunctionIsNotAllowed = 3102 + ErrUnsupportedAlterInplaceOnVirtualColumn = 3103 + ErrWrongFKOptionForGeneratedColumn = 3104 + ErrBadGeneratedColumn = 3105 + ErrUnsupportedOnGeneratedColumn = 3106 + ErrGeneratedColumnNonPrior = 3107 + ErrDependentByGeneratedColumn = 3108 + ErrGeneratedColumnRefAutoInc = 3109 + ErrInvalidJSONText = 3140 + ErrInvalidJSONTextInParam = 3141 + ErrInvalidJSONPath = 3143 + ErrInvalidJSONCharset = 3144 + ErrInvalidTypeForJSON = 3146 + ErrInvalidJSONPathWildcard = 3149 + ErrInvalidJSONContainsPathType = 3150 + ErrJSONUsedAsKey = 3152 + ErrJSONVacuousPath = 3153 + ErrJSONBadOneOrAllArg = 3154 + ErrJSONDocumentTooDeep = 3157 + ErrJSONDocumentNULLKey = 3158 + ErrBadUser = 3162 + ErrUserAlreadyExists = 3163 + ErrInvalidJSONPathArrayCell = 3165 + ErrInvalidEncryptionOption = 3184 + ErrRoleNotGranted = 3530 + ErrLockAcquireFailAndNoWaitSet = 3572 + ErrWindowNoSuchWindow = 3579 + ErrWindowCircularityInWindowGraph = 3580 + ErrWindowNoChildPartitioning = 3581 + ErrWindowNoInherentFrame = 3582 + ErrWindowNoRedefineOrderBy = 3583 + ErrWindowFrameStartIllegal = 3584 + ErrWindowFrameEndIllegal = 3585 + ErrWindowFrameIllegal = 3586 + ErrWindowRangeFrameOrderType = 3587 + ErrWindowRangeFrameTemporalType = 3588 + ErrWindowRangeFrameNumericType = 3589 + ErrWindowRangeBoundNotConstant = 3590 + ErrWindowDuplicateName = 3591 + ErrWindowIllegalOrderBy = 3592 + ErrWindowInvalidWindowFuncUse = 3593 + ErrWindowInvalidWindowFuncAliasUse = 3594 + ErrWindowNestedWindowFuncUseInWindowSpec = 3595 + ErrWindowRowsIntervalUse = 3596 + ErrWindowNoGroupOrderUnused = 3597 + ErrWindowExplainJson = 3598 //nolint: revive + ErrWindowFunctionIgnoresFrame = 3599 + ErrDataTruncatedFunctionalIndex = 3751 + ErrDataOutOfRangeFunctionalIndex = 3752 + ErrFunctionalIndexOnJsonOrGeometryFunction = 3753 //nolint: revive + ErrFunctionalIndexRefAutoIncrement = 3754 + ErrCannotDropColumnFunctionalIndex = 3755 + ErrFunctionalIndexPrimaryKey = 3756 + ErrFunctionalIndexOnLob = 3757 + ErrFunctionalIndexFunctionIsNotAllowed = 3758 + ErrFulltextFunctionalIndex = 3759 + ErrSpatialFunctionalIndex = 3760 + ErrWrongKeyColumnFunctionalIndex = 3761 + ErrFunctionalIndexOnField = 3762 + ErrFKIncompatibleColumns = 3780 + ErrFunctionalIndexRowValueIsNotAllowed = 3800 + ErrDependentByFunctionalIndex = 3837 + ErrInvalidJSONType = 3853 + ErrInvalidJsonValueForFuncIndex = 3903 //nolint: revive + ErrJsonValueOutOfRangeForFuncIndex = 3904 //nolint: revive + ErrFunctionalIndexDataIsTooLong = 3907 + ErrFunctionalIndexNotApplicable = 3909 + + // Optimizer-hint warning codes, inherited from the TiDB fork base. + ErrWarnOptimizerHintUnsupportedHint = 8061 + ErrWarnOptimizerHintInvalidToken = 8062 + ErrWarnOptimizerHintParseError = 8064 + ErrWarnOptimizerHintInvalidInteger = 8065 + ErrWarnOptimizerHintWrongPos = 8066 +) diff --git a/pkg/parser/mysql/errname.go b/pkg/parser/mysql/errname.go new file mode 100644 index 000000000..95cb82d01 --- /dev/null +++ b/pkg/parser/mysql/errname.go @@ -0,0 +1,961 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQLErrName maps error code to MySQL error message templates. +var MySQLErrName = map[uint16]string{ + ErrHashchk: "hashchk", + ErrNisamchk: "isamchk", + ErrNo: "NO", + ErrYes: "YES", + ErrCantCreateFile: "Can't create file '%-.200s' (errno: %d - %s)", + ErrCantCreateTable: "Can't create table '%-.200s' (errno: %d)", + ErrCantCreateDB: "Can't create database '%-.192s' (errno: %d)", + ErrDBCreateExists: "Can't create database '%-.192s'; database exists", + ErrDBDropExists: "Can't drop database '%-.192s'; database doesn't exist", + ErrDBDropDelete: "Error dropping database (can't delete '%-.192s', errno: %d)", + ErrDBDropRmdir: "Error dropping database (can't rmdir '%-.192s', errno: %d)", + ErrCantDeleteFile: "Error on delete of '%-.192s' (errno: %d - %s)", + ErrCantFindSystemRec: "Can't read record in system table", + ErrCantGetStat: "Can't get status of '%-.200s' (errno: %d - %s)", + ErrCantGetWd: "Can't get working directory (errno: %d - %s)", + ErrCantLock: "Can't lock file (errno: %d - %s)", + ErrCantOpenFile: "Can't open file: '%-.200s' (errno: %d - %s)", + ErrFileNotFound: "Can't find file: '%-.200s' (errno: %d - %s)", + ErrCantReadDir: "Can't read dir of '%-.192s' (errno: %d - %s)", + ErrCantSetWd: "Can't change dir to '%-.192s' (errno: %d - %s)", + ErrCheckread: "Record has changed since last read in table '%-.192s'", + ErrDiskFull: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", + ErrDupKey: "Can't write; duplicate key in table '%-.192s'", + ErrErrorOnClose: "Error on close of '%-.192s' (errno: %d - %s)", + ErrErrorOnRead: "Error reading file '%-.200s' (errno: %d - %s)", + ErrErrorOnRename: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", + ErrErrorOnWrite: "Error writing file '%-.200s' (errno: %d - %s)", + ErrFileUsed: "'%-.192s' is locked against change", + ErrFilsortAbort: "Sort aborted", + ErrFormNotFound: "View '%-.192s' doesn't exist for '%-.192s'", + ErrGetErrno: "Got error %d from storage engine", + ErrIllegalHa: "Table storage engine for '%-.192s' doesn't have this option", + ErrKeyNotFound: "Can't find record in '%-.192s'", + ErrNotFormFile: "Incorrect information in file: '%-.200s'", + ErrNotKeyFile: "Incorrect key file for table '%-.200s'; try to repair it", + ErrOldKeyFile: "Old key file for table '%-.192s'; repair it!", + ErrOpenAsReadonly: "Table '%-.192s' is read only", + ErrOutofMemory: "Out of memory; restart server and try again (needed %d bytes)", + ErrOutOfSortMemory: "Out of sort memory, consider increasing server sort buffer size", + ErrUnexpectedEOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", + ErrConCount: "Too many connections", + ErrOutOfResources: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", + ErrBadHost: "Can't get hostname for your address", + ErrHandshake: "Bad handshake", + ErrDBaccessDenied: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", + ErrAccessDenied: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", + ErrNoDB: "No database selected", + ErrUnknownCom: "Unknown command", + ErrBadNull: "Column '%-.192s' cannot be null", + ErrBadDB: "Unknown database '%-.192s'", + ErrTableExists: "Table '%-.192s' already exists", + ErrBadTable: "Unknown table '%-.100s'", + ErrNonUniq: "Column '%-.192s' in %-.192s is ambiguous", + ErrServerShutdown: "Server shutdown in progress", + ErrBadField: "Unknown column '%-.192s' in '%-.192s'", + ErrFieldNotInGroupBy: "Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", + ErrWrongGroupField: "Can't group on '%-.192s'", + ErrWrongSumSelect: "Statement has sum functions and columns in same statement", + ErrWrongValueCount: "Column count doesn't match value count", + ErrTooLongIdent: "Identifier name '%-.100s' is too long", + ErrDupFieldName: "Duplicate column name '%-.192s'", + ErrDupKeyName: "Duplicate key name '%-.192s'", + ErrDupEntry: "Duplicate entry '%-.64s' for key '%-.192s'", + ErrWrongFieldSpec: "Incorrect column specifier for column '%-.192s'", + ErrParse: "%s %s", + ErrEmptyQuery: "Query was empty", + ErrNonuniqTable: "Not unique table/alias: '%-.192s'", + ErrInvalidDefault: "Invalid default value for '%-.192s'", + ErrMultiplePriKey: "Multiple primary key defined", + ErrTooManyKeys: "Too many keys specified; max %d keys allowed", + ErrTooManyKeyParts: "Too many key parts specified; max %d parts allowed", + ErrTooLongKey: "Specified key was too long (%d bytes); max key length is %d bytes", + ErrKeyColumnDoesNotExits: "Key column '%-.192s' doesn't exist in table", + ErrBlobUsedAsKey: "BLOB column '%-.192s' can't be used in key specification with the used table type", + ErrJSONVacuousPath: "The path expression '$' is not allowed in this context.", + ErrJSONBadOneOrAllArg: "The oneOrAll argument to %s may take these values: 'one' or 'all'.", + ErrTooBigFieldlength: "Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead", + ErrWrongAutoKey: "Incorrect table definition; there can be only one auto column and it must be defined as a key", + ErrReady: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", + ErrNormalShutdown: "%s: Normal shutdown\n", + ErrGotSignal: "%s: Got signal %d. Aborting!\n", + ErrShutdownComplete: "%s: Shutdown complete\n", + ErrForcingClose: "%s: Forcing close of thread %d user: '%-.48s'\n", + ErrIpsock: "Can't create IP socket", + ErrNoSuchIndex: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", + ErrWrongFieldTerminators: "Field separator argument is not what is expected; check the manual", + ErrBlobsAndNoTerminated: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", + ErrTextFileNotReadable: "The file '%-.128s' must be in the database directory or be readable by all", + ErrFileExists: "File '%-.200s' already exists", + ErrLoadInfo: "Records: %d Deleted: %d Skipped: %d Warnings: %d", + ErrAlterInfo: "Records: %d Duplicates: %d", + ErrWrongSubKey: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", + ErrCantRemoveAllFields: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", + ErrCantDropFieldOrKey: "Can't DROP '%-.192s'; check that column/key exists", + ErrInsertInfo: "Records: %d Duplicates: %d Warnings: %d", + ErrUpdateTableUsed: "You can't specify target table '%-.192s' for update in FROM clause", + ErrNoSuchThread: "Unknown thread id: %d", + ErrKillDenied: "You are not owner of thread %d", + ErrNoTablesUsed: "No tables used", + ErrTooBigSet: "Too many strings for column %-.192s and SET", + ErrNoUniqueLogFile: "Can't generate a unique log-filename %-.200s.(1-999)\n", + ErrTableNotLockedForWrite: "Table '%-.192s' was locked with a READ lock and can't be updated", + ErrTableNotLocked: "Table '%-.192s' was not locked with LOCK TABLES", + ErrBlobCantHaveDefault: "BLOB/TEXT/JSON column '%-.192s' can't have a default value", + ErrWrongDBName: "Incorrect database name '%-.100s'", + ErrWrongTableName: "Incorrect table name '%-.100s'", + ErrTooBigSelect: "The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", + ErrUnknown: "Unknown error", + ErrUnknownProcedure: "Unknown procedure '%-.192s'", + ErrWrongParamcountToProcedure: "Incorrect parameter count to procedure '%-.192s'", + ErrWrongParametersToProcedure: "Incorrect parameters to procedure '%-.192s'", + ErrUnknownTable: "Unknown table '%-.192s' in %-.32s", + ErrFieldSpecifiedTwice: "Column '%-.192s' specified twice", + ErrInvalidGroupFuncUse: "Invalid use of group function", + ErrUnsupportedExtension: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", + ErrTableMustHaveColumns: "A table must have at least 1 column", + ErrRecordFileFull: "The table '%-.192s' is full", + ErrUnknownCharacterSet: "Unknown character set: '%-.64s'", + ErrTooManyTables: "Too many tables; MySQL can only use %d tables in a join", + ErrTooManyFields: "Too many columns", + ErrTooBigRowsize: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %d. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", + ErrStackOverrun: "Thread stack overrun: Used: %d of a %d stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", + ErrWrongOuterJoin: "Cross dependency found in OUTER JOIN; examine your ON conditions", + ErrNullColumnInIndex: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", + ErrCantFindUdf: "Can't load function '%-.192s'", + ErrCantInitializeUdf: "Can't initialize function '%-.192s'; %-.80s", + ErrUdfNoPaths: "No paths allowed for shared library", + ErrUdfExists: "Function '%-.192s' already exists", + ErrCantOpenLibrary: "Can't open shared library '%-.192s' (errno: %d %-.128s)", + ErrCantFindDlEntry: "Can't find symbol '%-.128s' in library", + ErrFunctionNotDefined: "Function '%-.192s' is not defined", + ErrHostIsBlocked: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", + ErrHostNotPrivileged: "Host '%-.64s' is not allowed to connect to this MySQL server", + ErrPasswordAnonymousUser: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", + ErrPasswordNotAllowed: "You must have privileges to update tables in the mysql database to be able to change passwords for others", + ErrPasswordNoMatch: "Can't find any matching row in the user table", + ErrUpdateInfo: "Rows matched: %d Changed: %d Warnings: %d", + ErrCantCreateThread: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", + ErrWrongValueCountOnRow: "Column count doesn't match value count at row %d", + ErrCantReopenTable: "Can't reopen table: '%-.192s'", + ErrInvalidUseOfNull: "Invalid use of NULL value", + ErrRegexp: "Got error '%-.64s' from regexp", + ErrMixOfGroupFuncAndFields: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", + ErrNonexistingGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s'", + ErrTableaccessDenied: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", + ErrColumnaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", + ErrIllegalGrantForTable: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", + ErrGrantWrongHostOrUser: "The host or user argument to GRANT is too long", + ErrNoSuchTable: "Table '%-.192s.%-.192s' doesn't exist", + ErrNonexistingTableGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", + ErrNotAllowedCommand: "The used command is not allowed with this MySQL version", + ErrSyntax: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", + ErrDelayedCantChangeLock: "Delayed insert thread couldn't get requested lock for table %-.192s", + ErrTooManyDelayedThreads: "Too many delayed threads in use", + ErrAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' (%-.64s)", + ErrNetPacketTooLarge: "Got a packet bigger than 'max_allowed_packet' bytes", + ErrNetReadErrorFromPipe: "Got a read error from the connection pipe", + ErrNetFcntl: "Got an error from fcntl()", + ErrNetPacketsOutOfOrder: "Got packets out of order", + ErrNetUncompress: "Couldn't uncompress communication packet", + ErrNetRead: "Got an error reading communication packets", + ErrNetReadInterrupted: "Got timeout reading communication packets", + ErrNetErrorOnWrite: "Got an error writing communication packets", + ErrNetWriteInterrupted: "Got timeout writing communication packets", + ErrTooLongString: "Result string is longer than 'maxAllowedPacket' bytes", + ErrTableCantHandleBlob: "The used table type doesn't support BLOB/TEXT columns", + ErrTableCantHandleAutoIncrement: "The used table type doesn't support AUTOINCREMENT columns", + ErrDelayedInsertTableLocked: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", + ErrWrongColumnName: "Incorrect column name '%-.100s'", + ErrWrongKeyColumn: "The used storage engine can't index column '%-.192s'", + ErrWrongMrgTable: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", + ErrDupUnique: "Can't write, because of unique constraint, to table '%-.192s'", + ErrBlobKeyWithoutLength: "BLOB/TEXT column '%-.192s' used in key specification without a key length", + ErrPrimaryCantHaveNull: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", + ErrTooManyRows: "Result consisted of more than one row", + ErrRequiresPrimaryKey: "This table type requires a primary key", + ErrNoRaidCompiled: "This version of MySQL is not compiled with RAID support", + ErrUpdateWithoutKeyInSafeMode: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", + ErrKeyDoesNotExist: "Key '%-.192s' doesn't exist in table '%-.192s'", + ErrCheckNoSuchTable: "Can't open table", + ErrCheckNotImplemented: "The storage engine for the table doesn't support %s", + ErrCantDoThisDuringAnTransaction: "You are not allowed to execute this command in a transaction", + ErrErrorDuringCommit: "Got error %d during COMMIT", + ErrErrorDuringRollback: "Got error %d during ROLLBACK", + ErrErrorDuringFlushLogs: "Got error %d during FLUSHLOGS", + ErrErrorDuringCheckpoint: "Got error %d during CHECKPOINT", + ErrNewAbortingConnection: "Aborted connection %d to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", + ErrDumpNotImplemented: "The storage engine for the table does not support binary table dump", + ErrFlushMasterBinlogClosed: "Binlog closed, cannot RESET MASTER", + ErrIndexRebuild: "Failed rebuilding the index of dumped table '%-.192s'", + ErrMaster: "Error from master: '%-.64s'", + ErrMasterNetRead: "Net error reading from master", + ErrMasterNetWrite: "Net error writing to master", + ErrFtMatchingKeyNotFound: "Can't find FULLTEXT index matching the column list", + ErrLockOrActiveTransaction: "Can't execute the given command because you have active locked tables or an active transaction", + ErrUnknownSystemVariable: "Unknown system variable '%-.64s'", + ErrCrashedOnUsage: "Table '%-.192s' is marked as crashed and should be repaired", + ErrCrashedOnRepair: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", + ErrWarningNotCompleteRollback: "Some non-transactional changed tables couldn't be rolled back", + ErrTransCacheFull: "Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrSlaveMustStop: "This operation cannot be performed with a running slave; run STOP SLAVE first", + ErrSlaveNotRunning: "This operation requires a running slave; configure slave and do START SLAVE", + ErrBadSlave: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", + ErrMasterInfo: "Could not initialize master info structure; more error messages can be found in the MySQL error log", + ErrSlaveThread: "Could not create slave thread; check system resources", + ErrTooManyUserConnections: "User %-.64s already has more than 'maxUserConnections' active connections", + ErrSetConstantsOnly: "You may only use constant expressions with SET", + ErrLockWaitTimeout: "Lock wait timeout exceeded; try restarting transaction", + ErrLockTableFull: "The total number of locks exceeds the lock table size", + ErrReadOnlyTransaction: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", + ErrDropDBWithReadLock: "DROP DATABASE not allowed while thread is holding global read lock", + ErrCreateDBWithReadLock: "CREATE DATABASE not allowed while thread is holding global read lock", + ErrWrongArguments: "Incorrect arguments to %s", + ErrNoPermissionToCreateUser: "'%-.48s'@'%-.64s' is not allowed to create new users", + ErrUnionTablesInDifferentDir: "Incorrect table definition; all MERGE tables must be in the same database", + ErrLockDeadlock: "Deadlock found when trying to get lock; try restarting transaction", + ErrTableCantHandleFt: "The used table type doesn't support FULLTEXT indexes", + ErrCannotAddForeign: "Cannot add foreign key constraint", + ErrNoReferencedRow: "Cannot add or update a child row: a foreign key constraint fails", + ErrRowIsReferenced: "Cannot delete or update a parent row: a foreign key constraint fails", + ErrConnectToMaster: "Error connecting to master: %-.128s", + ErrQueryOnMaster: "Error running query on master: %-.128s", + ErrErrorWhenExecutingCommand: "Error when executing command %s: %-.128s", + ErrWrongUsage: "Incorrect usage of %s and %s", + ErrWrongNumberOfColumnsInSelect: "The used SELECT statements have a different number of columns", + ErrCantUpdateWithReadlock: "Can't execute the query because you have a conflicting read lock", + ErrMixingNotAllowed: "Mixing of transactional and non-transactional tables is disabled", + ErrDupArgument: "Option '%s' used twice in statement", + ErrUserLimitReached: "User '%-.64s' has exceeded the '%s' resource (current value: %d)", + ErrSpecificAccessDenied: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", + ErrLocalVariable: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", + ErrGlobalVariable: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", + ErrNoDefault: "Variable '%-.64s' doesn't have a default value", + ErrWrongValueForVar: "Variable '%-.64s' can't be set to the value of '%-.200s'", + ErrWrongTypeForVar: "Incorrect argument type to variable '%-.64s'", + ErrVarCantBeRead: "Variable '%-.64s' can only be set, not read", + ErrCantUseOptionHere: "Incorrect usage/placement of '%s'", + ErrNotSupportedYet: "This version of the parser doesn't yet support '%s'", + ErrMasterFatalErrorReadingBinlog: "Got fatal error %d from master when reading data from binary log: '%-.320s'", + ErrSlaveIgnoredTable: "Slave SQL thread ignored the query because of replicate-*-table rules", + ErrIncorrectGlobalLocalVar: "Variable '%-.192s' is a %s variable", + ErrWrongFkDef: "Incorrect foreign key definition for '%-.192s': %s", + ErrKeyRefDoNotMatchTableRef: "Key reference and table reference don't match", + ErrOperandColumns: "Operand should contain %d column(s)", + ErrSubqueryNo1Row: "Subquery returns more than 1 row", + ErrUnknownStmtHandler: "Unknown prepared statement handler %s given to %s", + ErrCorruptHelpDB: "Help database is corrupt or does not exist", + ErrCyclicReference: "Cyclic reference on subqueries", + ErrAutoConvert: "Converting column '%s' from %s to %s", + ErrIllegalReference: "Reference '%-.64s' not supported (%s)", + ErrDerivedMustHaveAlias: "Every derived table must have its own alias", + ErrSelectReduced: "Select %d was reduced during optimization", + ErrTablenameNotAllowedHere: "Table '%s' from one of the %ss cannot be used in %s", + ErrNotSupportedAuthMode: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", + ErrSpatialCantHaveNull: "All parts of a SPATIAL index must be NOT NULL", + ErrCollationCharsetMismatch: "COLLATION '%s' is not valid for CHARACTER SET '%s'", + ErrSlaveWasRunning: "Slave is already running", + ErrSlaveWasNotRunning: "Slave already has been stopped", + ErrTooBigForUncompress: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", + ErrZlibZMem: "ZLIB: Not enough memory", + ErrZlibZBuf: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", + ErrZlibZData: "ZLIB: Input data corrupted", + ErrCutValueGroupConcat: "Some rows were cut by GROUPCONCAT(%s)", + ErrWarnTooFewRecords: "Row %d doesn't contain data for all columns", + ErrWarnTooManyRecords: "Row %d was truncated; it contained more data than there were input columns", + ErrWarnNullToNotnull: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %d", + ErrWarnDataOutOfRange: "Out of range value for column '%s' at row %d", + WarnDataTruncated: "Data truncated for column '%s' at row %d", + ErrWarnUsingOtherHandler: "Using storage engine %s for table '%s'", + ErrCantAggregate2collations: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", + ErrDropUser: "Cannot drop one or more of the requested users", + ErrRevokeGrants: "Can't revoke all privileges for one or more of the requested users", + ErrCantAggregate3collations: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", + ErrCantAggregateNcollations: "Illegal mix of collations for operation '%s'", + ErrVariableIsNotStruct: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", + ErrUnknownCollation: "Unknown collation: '%-.64s'", + ErrSlaveIgnoredSslParams: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", + ErrServerIsInSecureAuthMode: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", + ErrWarnFieldResolved: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", + ErrBadSlaveUntilCond: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", + ErrMissingSkipSlave: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", + ErrUntilCondIgnored: "SQL thread is not to be started so UNTIL options are ignored", + ErrWrongNameForIndex: "Incorrect index name '%-.100s'", + ErrWrongNameForCatalog: "Incorrect catalog name '%-.100s'", + ErrWarnQcResize: "Query cache failed to set size %d; new query cache size is %d", + ErrBadFtColumn: "Column '%-.192s' cannot be part of FULLTEXT index", + ErrUnknownKeyCache: "Unknown key cache '%-.100s'", + ErrWarnHostnameWontWork: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", + ErrUnknownStorageEngine: "Unknown storage engine '%s'", + ErrWarnDeprecatedSyntax: "'%s' is deprecated and will be removed in a future release. Please use %s instead", + ErrNonUpdatableTable: "The target table %-.100s of the %s is not updatable", + ErrFeatureDisabled: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", + ErrOptionPreventsStatement: "The MySQL server is running with the %s option so it cannot execute this statement", + ErrDuplicatedValueInType: "Column '%-.100s' has duplicated value '%-.64s' in %s", + ErrTruncatedWrongValue: "Truncated incorrect %-.64s value: '%-.128s'", + ErrTooMuchAutoTimestampCols: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", + ErrInvalidOnUpdate: "Invalid ON UPDATE clause for '%-.192s' column", + ErrUnsupportedPs: "This command is not supported in the prepared statement protocol yet", + ErrGetErrmsg: "Got error %d '%-.100s' from %s", + ErrGetTemporaryErrmsg: "Got temporary error %d '%-.100s' from %s", + ErrUnknownTimeZone: "Unknown or incorrect time zone: '%-.64s'", + ErrWarnInvalidTimestamp: "Invalid TIMESTAMP value in column '%s' at row %d", + ErrInvalidCharacterString: "Invalid %s character string: '%.64s'", + ErrWarnAllowedPacketOverflowed: "Result of %s() was larger than max_allowed_packet (%d) - truncated", + ErrConflictingDeclarations: "Conflicting declarations: '%s%s' and '%s%s'", + ErrSpNoRecursiveCreate: "Can't create a %s from within another stored routine", + ErrSpAlreadyExists: "%s %s already exists", + ErrSpDoesNotExist: "%s %s does not exist", + ErrSpDropFailed: "Failed to DROP %s %s", + ErrSpStoreFailed: "Failed to CREATE %s %s", + ErrSpLilabelMismatch: "%s with no matching label: %s", + ErrSpLabelRedefine: "Redefining label %s", + ErrSpLabelMismatch: "End-label %s without match", + ErrSpUninitVar: "Referring to uninitialized variable %s", + ErrSpBadselect: "PROCEDURE %s can't return a result set in the given context", + ErrSpBadreturn: "RETURN is only allowed in a FUNCTION", + ErrSpBadstatement: "%s is not allowed in stored procedures", + ErrUpdateLogDeprecatedIgnored: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", + ErrUpdateLogDeprecatedTranslated: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", + ErrQueryInterrupted: "Query execution was interrupted", + ErrSpWrongNoOfArgs: "Incorrect number of arguments for %s %s; expected %d, got %d", + ErrSpCondMismatch: "Undefined CONDITION: %s", + ErrSpNoreturn: "No RETURN found in FUNCTION %s", + ErrSpNoreturnend: "FUNCTION %s ended without RETURN", + ErrSpBadCursorQuery: "Cursor statement must be a SELECT", + ErrSpBadCursorSelect: "Cursor SELECT must not have INTO", + ErrSpCursorMismatch: "Undefined CURSOR: %s", + ErrSpCursorAlreadyOpen: "Cursor is already open", + ErrSpCursorNotOpen: "Cursor is not open", + ErrSpUndeclaredVar: "Undeclared variable: %s", + ErrSpWrongNoOfFetchArgs: "Incorrect number of FETCH variables", + ErrSpFetchNoData: "No data - zero rows fetched, selected, or processed", + ErrSpDupParam: "Duplicate parameter: %s", + ErrSpDupVar: "Duplicate variable: %s", + ErrSpDupCond: "Duplicate condition: %s", + ErrSpDupCurs: "Duplicate cursor: %s", + ErrSpCantAlter: "Failed to ALTER %s %s", + ErrSpSubselectNyi: "Subquery value not supported", + ErrStmtNotAllowedInSfOrTrg: "%s is not allowed in stored function or trigger", + ErrSpVarcondAfterCurshndlr: "Variable or condition declaration after cursor or handler declaration", + ErrSpCursorAfterHandler: "Cursor declaration after handler declaration", + ErrSpCaseNotFound: "Case not found for CASE statement", + ErrFparserTooBigFile: "Configuration file '%-.192s' is too big", + ErrFparserBadHeader: "Malformed file type header in file '%-.192s'", + ErrFparserEOFInComment: "Unexpected end of file while parsing comment '%-.200s'", + ErrFparserErrorInParameter: "Error while parsing parameter '%-.192s' (line: '%-.192s')", + ErrFparserEOFInUnknownParameter: "Unexpected end of file while skipping unknown parameter '%-.192s'", + ErrViewNoExplain: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", + ErrFrmUnknownType: "File '%-.192s' has unknown type '%-.64s' in its header", + ErrWrongObject: "'%-.192s.%-.192s' is not %s", + ErrNonupdateableColumn: "Column '%-.192s' is not updatable", + ErrViewSelectDerived: "View's SELECT contains a subquery in the FROM clause", + ErrViewSelectClause: "View's SELECT contains a '%s' clause", + ErrViewSelectVariable: "View's SELECT contains a variable or parameter", + ErrViewSelectTmptable: "View's SELECT refers to a temporary table '%-.192s'", + ErrViewWrongList: "View's SELECT and view's field list have different column counts", + ErrWarnViewMerge: "View merge algorithm can't be used here for now (assumed undefined algorithm)", + ErrWarnViewWithoutKey: "View being updated does not have complete key of underlying table in it", + ErrViewInvalid: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + ErrSpNoDropSp: "Can't drop or alter a %s from within another stored routine", + ErrSpGotoInHndlr: "GOTO is not allowed in a stored procedure handler", + ErrTrgAlreadyExists: "Trigger already exists", + ErrTrgDoesNotExist: "Trigger does not exist", + ErrTrgOnViewOrTempTable: "Trigger's '%-.192s' is view or temporary table", + ErrTrgCantChangeRow: "Updating of %s row is not allowed in %strigger", + ErrTrgNoSuchRowInTrg: "There is no %s row in %s trigger", + ErrNoDefaultForField: "Field '%-.192s' doesn't have a default value", + ErrDivisionByZero: "Division by 0", + ErrTruncatedWrongValueForField: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", + ErrIllegalValueForType: "Illegal %s '%-.192s' value found during parsing", + ErrViewNonupdCheck: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", + ErrViewCheckFailed: "CHECK OPTION failed '%-.192s.%-.192s'", + ErrProcaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", + ErrRelayLogFail: "Failed purging old relay logs: %s", + ErrPasswdLength: "Password hash should be a %d-digit hexadecimal number", + ErrUnknownTargetBinlog: "Target log not found in binlog index", + ErrIoErrLogIndexRead: "I/O error reading log index file", + ErrBinlogPurgeProhibited: "Server configuration does not permit binlog purge", + ErrFseekFail: "Failed on fseek()", + ErrBinlogPurgeFatalErr: "Fatal error during log purge", + ErrLogInUse: "A purgeable log is in use, will not purge", + ErrLogPurgeUnknownErr: "Unknown error during log purge", + ErrRelayLogInit: "Failed initializing relay log position: %s", + ErrNoBinaryLogging: "You are not using binary logging", + ErrReservedSyntax: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", + ErrWsasFailed: "WSAStartup Failed", + ErrDiffGroupsProc: "Can't handle procedures with different groups yet", + ErrNoGroupForProc: "Select must have a group with this procedure", + ErrOrderWithProc: "Can't use ORDER clause with this procedure", + ErrLoggingProhibitChangingOf: "Binary logging and replication forbid changing the global server %s", + ErrNoFileMapping: "Can't map file: %-.200s, errno: %d", + ErrWrongMagic: "Wrong magic in %-.64s", + ErrPsManyParam: "Prepared statement contains too many placeholders", + ErrKeyPart0: "Key part '%-.192s' length cannot be 0", + ErrViewChecksum: "View text checksum failed", + ErrViewMultiupdate: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", + ErrViewNoInsertFieldList: "Can not insert into join view '%-.192s.%-.192s' without fields list", + ErrViewDeleteMergeView: "Can not delete from join view '%-.192s.%-.192s'", + ErrCannotUser: "Operation %s failed for %.256s", + ErrXaerNota: "XAERNOTA: Unknown XID", + ErrXaerInval: "XAERINVAL: Invalid arguments (or unsupported command)", + ErrXaerRmfail: "XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", + ErrXaerOutside: "XAEROUTSIDE: Some work is done outside global transaction", + ErrXaerRmerr: "XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", + ErrXaRbrollback: "XARBROLLBACK: Transaction branch was rolled back", + ErrNonexistingProcGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", + ErrProcAutoGrantFail: "Failed to grant EXECUTE and ALTER ROUTINE privileges", + ErrProcAutoRevokeFail: "Failed to revoke all privileges to dropped routine", + ErrDataTooLong: "Data too long for column '%s' at row %d", + ErrSpBadSQLstate: "Bad SQLSTATE: '%s'", + ErrStartup: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", + ErrLoadFromFixedSizeRowsToVar: "Can't load value from file with fixed size rows to variable", + ErrCantCreateUserWithGrant: "You are not allowed to create a user with GRANT", + ErrWrongValueForType: "Incorrect %-.32s value: '%-.128s' for function %-.32s", + ErrTableDefChanged: "Table definition has changed, please retry transaction", + ErrSpDupHandler: "Duplicate handler declared in the same block", + ErrSpNotVarArg: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", + ErrSpNoRetset: "Not allowed to return a result set from a %s", + ErrCantCreateGeometryObject: "Cannot get geometry object from data you send to the GEOMETRY field", + ErrFailedRoutineBreakBinlog: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", + ErrBinlogUnsafeRoutine: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrBinlogCreateRoutineNeedSuper: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", + ErrExecStmtWithOpenCursor: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", + ErrStmtHasNoOpenCursor: "The statement (%d) has no open cursor.", + ErrCommitNotAllowedInSfOrTrg: "Explicit or implicit commit is not allowed in stored function or trigger.", + ErrNoDefaultForViewField: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", + ErrSpNoRecursion: "Recursive stored functions and triggers are not allowed.", + ErrTooBigScale: "Too big scale %d specified for column '%-.192s'. Maximum is %d.", + ErrTooBigPrecision: "Too-big precision %d specified for '%-.192s'. Maximum is %d.", + ErrMBiggerThanD: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", + ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", + ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", + ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", + ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", + ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", + ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", + ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", + ErrTrgInWrongSchema: "Trigger in wrong schema", + ErrStackOverrunNeedMore: "Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", + ErrTooLongBody: "Routine body for '%-.100s' is too long", + ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", + ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %d)", + ErrXaerDupid: "XAERDUPID: The XID already exists", + ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", + ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", + ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", + ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", + ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", + ErrMalformedDefiner: "Definer is not fully qualified", + ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", + ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", + ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", + ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", + ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", + ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", + ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", + ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", + ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", + ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", + ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", + ErrSpWrongName: "Incorrect routine name '%-.192s'", + ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", + ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", + ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %d)", + ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", + ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", + ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", + ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", + ErrRemovedSpaces: "Leading spaces are removed from name '%s'", + ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", + ErrUsername: "user name", + ErrHostname: "host name", + ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", + ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", + ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", + ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", + ErrNameBecomesEmpty: "Name '%-.64s' has become ''", + ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", + ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", + ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", + ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", + ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", + ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", + ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", + ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", + ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", + ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", + ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", + ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", + ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", + ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", + ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", + ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", + ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", + ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", + ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", + ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", + ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", + ErrPartitionEntry: "Partitioning can not be used stand-alone in query", + ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", + ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", + ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", + ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", + ErrCantCreateHandlerFile: "Failed to create specific handler file", + ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", + ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", + ErrNoParts: "Number of %-.64s = 0 is not an allowed value", + ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", + ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", + ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", + ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", + ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", + ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", + ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", + ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", + ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", + ErrAddPartitionNoNewPartition: "At least one partition must be added", + ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", + ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", + ErrSameNamePartition: "Duplicate partition name %-.192s", + ErrNoBinlog: "It is not allowed to shut off binlog on this command", + ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", + ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", + ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", + ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", + ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", + ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", + ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", + ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", + ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", + ErrCreateFilegroupFailed: "Failed to create %s", + ErrDropFilegroupFailed: "Failed to drop %s", + ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", + ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", + ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", + ErrAlterFilegroupFailed: "Failed to alter: %s", + ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", + ErrBinlogRowWrongTableDef: "Table definition on master and slave does not match: %s", + ErrBinlogRowRbrToSbr: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", + ErrEventAlreadyExists: "Event '%-.192s' already exists", + ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", + ErrEventDoesNotExist: "Unknown event '%-.192s'", + ErrEventCantAlter: "Failed to alter event '%-.192s'", + ErrEventDropFailed: "Failed to drop %s", + ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", + ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", + ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", + ErrEventOpenTableFailed: "Failed to open mysql.event", + ErrEventNeitherMExprNorMAt: "No datetime expression provided", + ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", + ErrEventCannotDelete: "Failed to delete the event from mysql.event", + ErrEventCompile: "Error during compilation of event's body", + ErrEventSameName: "Same old and new event name", + ErrEventDataTooLong: "Data for column '%s' too long", + ErrDropIndexNeededInForeignKey: "Cannot drop index '%-.192s': needed in a foreign key constraint", + ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", + ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", + ErrCantLockLogTable: "You can't use locks with log tables.", + ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", + ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", + ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", + ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", + ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", + ErrPartitionNoTemporary: "Cannot create temporary table with partitions", + ErrPartitionConstDomain: "Partition constant is out of partition function domain", + ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", + ErrDdlLog: "Error in DDL log", + ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", + ErrWrongPartitionName: "Incorrect partition name", + ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", + ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", + ErrEventModifyQueue: "Internal scheduler error %d", + ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %d", + ErrPartitionMerge: "Engine cannot be used in partitioned tables", + ErrCantActivateLog: "Cannot activate '%-.64s' log", + ErrRbrNotAvailable: "The server was not built with row-based replication", + ErrBase64Decode: "Decoding of base64 string failed", + ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", + ErrEventsDB: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", + ErrOnlyIntegersAllowed: "Only integers allowed as number here", + ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", + ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", + ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", + ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", + ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", + ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", + ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", + ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", + ErrBinlogPurgeEmFile: "Too many files opened, please execute the command again", + ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", + ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", + ErrSlaveIncident: "The incident %s occurred on the master. Message: %-.64s", + ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", + ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", + ErrSlaveFatal: "Fatal : %s", + ErrSlaveRelayLogReadFailure: "Relay log read failure: %s", + ErrSlaveRelayLogWriteFailure: "Relay log write failure: %s", + ErrSlaveCreateEventFailure: "Failed to create %s", + ErrSlaveMasterComFailure: "Master command %s failed: %s", + ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", + ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", + ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", + ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", + ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", + ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", + ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", + ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", + ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", + ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", + ErrNeverUsed: "Ambiguous slave modes combination. %s", + ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", + ErrSlaveCorruptEvent: "Corrupted replication event was detected", + ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", + ErrLogPurgeNoFile: "Being purged log %s was not found", + ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", + ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", + ErrNeedReprepare: "Prepared statement needs to be re-prepared", + ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", + WarnNoMasterInfo: "The master info structure does not exist", + WarnOptionIgnored: "<%-.64s> option ignored", + WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", + WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", + ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", + ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", + ErrSlaveHeartbeatFailure: "Unexpected master's heartbeat data: %s", + ErrSlaveHeartbeatValueOutOfRange: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", + ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", + ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", + ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", + ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %d)", + ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %d)", + ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", + ErrDatabaseName: "Database", + ErrTableName: "Table", + ErrPartitionName: "Partition", + ErrSubpartitionName: "Subpartition", + ErrTemporaryName: "Temporary", + ErrRenamedName: "Renamed", + ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", + WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", + ErrDebugSyncTimeout: "debug sync point wait timed out", + ErrDebugSyncHitLimit: "debug sync point hit limit reached", + ErrDupSignalSet: "Duplicate condition information item '%s'", + ErrSignalWarn: "Unhandled user-defined warning condition", + ErrSignalNotFound: "Unhandled user-defined not found condition", + ErrSignalException: "Unhandled user-defined exception condition", + ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", + ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", + WarnCondItemTruncated: "Data truncated for condition item '%s'", + ErrCondItemTooLong: "Data too long for condition item '%s'", + ErrUnknownLocale: "Unknown locale: '%-.64s'", + ErrSlaveIgnoreServerIDs: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", + ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", + ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", + ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", + ErrWrongTypeColumnValue: "Partition column values of incorrect type", + ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", + ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", + ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", + ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", + ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", + ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", + ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", + ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", + ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", + ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", + ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", + ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", + ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", + ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", + ErrBinlogUnsafeSystemTable: "The statement is unsafe because it uses the general log, slow query log, or performanceSchema table(s). This is unsafe because system tables may differ on slaves.", + ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", + ErrBinlogUnsafeUdf: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", + ErrBinlogUnsafeSystemVariable: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", + ErrBinlogUnsafeSystemFunction: "Statement is unsafe because it uses a system function that may return a different value on the slave.", + ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", + ErrMessageAndStatement: "%s Statement: %s", + ErrSlaveConversionFailed: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", + ErrSlaveCantCreateConversion: "Can't create conversion table for table '%-.192s.%-.192s'", + ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", + ErrPathLength: "The path specified for %.64s is too long.", + ErrWarnDeprecatedSyntaxNoReplacement: "%s is deprecated and will be removed in a future release.%s", + ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", + ErrWrongPerfSchemaUsage: "Invalid performanceSchema usage.", + ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", + ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", + ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", + ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", + ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %d)", + ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", + ErrDataOutOfRange: "%s value is out of range in '%s'", + ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", + ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", + ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", + ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", + ErrFailedReadFromParFile: "Failed to read from the .par file", + ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", + ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", + ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for user '%-.48s'@'%-.255s' as authentication plugin does not support it.", + ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", + ErrTruncateIllegalForeignKey: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", + ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", + ErrSlaveHeartbeatValueOutOfRangeMin: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", + ErrSlaveHeartbeatValueOutOfRangeMax: "The requested value for the heartbeat period exceeds the value of `slaveNetTimeout' seconds. A sensible value for the period should be less than the timeout.", + ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", + ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", + ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", + WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", + ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %d bytes.", + ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", + ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", + ErrIndexCorrupt: "Index %s is corrupted", + ErrUndoRecordTooBig: "Undo log record is too big.", + ErrBinlogUnsafeInsertIgnoreSelect: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertSelectUpdate: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeReplaceSelect: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateIgnoreSelect: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateReplaceSelect: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeUpdateIgnore: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", + ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", + ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", + ErrBinlogUnsafeWriteAutoincSelect: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeCreateSelectAutoinc: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", + ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", + ErrTableInFkCheck: "Table is being used in foreign key check.", + ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", + ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", + ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", + ErrMasterDelayValueOutOfRange: "The requested value %d for the master delay exceeds the maximum %d", + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", + ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", + ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", + ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", + ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", + ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", + ErrTablesDifferentMetadata: "Tables have different definitions", + ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", + ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%d) is greater than maxBinlogCacheSize (%d); setting binlogCacheSize equal to maxBinlogCacheSize.", + ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", + ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", + ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", + ErrRplInfoDataTooLong: "Data for column '%s' too long", + ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", + ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", + ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%d) is greater than maxBinlogStmtCacheSize (%d); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", + ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", + ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", + ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", + ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", + ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", + ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", + ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", + ErrMtsFeatureIsNotSupported: "%s is not supported in multi-threaded slave mode. %s", + ErrMtsUpdatedDBsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", + ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", + ErrMtsInconsistentData: "%s", + ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", + ErrDaInvalidConditionNumber: "Invalid condition number", + ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", + ErrInsecureChangeMaster: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", + ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", + ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", + ErrSQLthreadWithSecureSlave: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", + ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", + ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", + ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", + ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", + ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", + ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", + ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", + ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", + ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", + ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", + ErrBadSlaveAutoPosition: "Parameters MASTERLOGFILE, MASTERLOGPOS, RELAYLOGFILE and RELAYLOGPOS cannot be set when MASTERAUTOPOSITION is active.", + ErrAutoPositionRequiresGtidModeOn: "CHANGE MASTER TO MASTERAUTOPOSITION = 1 can only be executed when @@GLOBAL.GTIDMODE = ON.", + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidModeRequiresBinlog: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP1 or UPGRADESTEP2 requires --log-bin and --log-slave-updates.", + ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", + ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", + ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", + ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", + ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", + ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", + ErrMasterHasPurgedRequiredGtids: "The slave is connecting using CHANGE MASTER TO MASTERAUTOPOSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", + ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", + ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", + ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", + ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %d)", + ErrSlaveConfiguration: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", + ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", + ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", + ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", + ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", + ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", + ErrUnknownAlterLock: "Unknown LOCK type '%s'", + ErrMtsChangeMasterCantRunWithGaps: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", + ErrMtsRecoveryFailure: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", + ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", + ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", + ErrSlaveSilentRetryTransaction: "Slave must silently retry current transaction", + ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", + ErrTableSchemaMismatch: "Schema mismatch (%s)", + ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", + ErrIoRead: "IO Read : (%d, %s) %s", + ErrIoWrite: "IO Write : (%d, %s) %s", + ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", + ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", + ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", + ErrInternal: "Internal : %s", + ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %d : '%s'", + ErrInnodbIndexCorrupt: "Index corrupt: %s", + ErrInvalidYearColumnLength: "Supports only YEAR or YEAR(4) column", + ErrNotValidPassword: "Your password does not satisfy the current policy requirements (%s)", + ErrMustChangePassword: "You must SET PASSWORD before executing this statement", + ErrFkNoIndexChild: "Failed to add the foreign key constraint. Missing index for constraint '%s' in the foreign table '%s'", + ErrForeignKeyNoIndexInParent: "Failed to add the foreign key constraint. Missing index for constraint '%s' in the referenced table '%s'", + ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", + ErrForeignKeyCannotOpenParent: "Failed to open the referenced table '%s'", + ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", + ErrFkDupName: "Duplicate foreign key constraint name '%s'", + ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", + ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", + ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrForeignKeyColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", + ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", + ErrForeignKeyColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", + ErrForeignKeyColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", + ErrMalformedPacket: "Malformed communication packet.", + ErrReadOnlyMode: "Running in read-only mode", + ErrGtidNextTypeUndefinedGroup: "When @@SESSION.GTIDNEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTIDNEXT before a transaction and forgot to set @@SESSION.GTIDNEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTIDNEXT is '%s'.", + ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", + ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", + ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", + ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", + ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", + ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", + ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", + ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", + ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", + ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", + ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", + ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", + ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", + ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", + ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", + ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", + ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", + ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", + ErrSQLSlaveSkipCounterNotSettableInGtidMode: "sqlSlaveSkipCounter can not be set when the server is running with @@GLOBAL.GTIDMODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", + ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", + ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", + ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", + ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", + ErrRowInWrongPartition: "Found a row in wrong partition %s", + ErrGeneratedColumnFunctionIsNotAllowed: "Expression of generated column '%s' contains a disallowed function.", + ErrUnsupportedAlterInplaceOnVirtualColumn: "INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions.", + ErrWrongFKOptionForGeneratedColumn: "Cannot define foreign key with %s clause on a generated column.", + ErrBadGeneratedColumn: "The value specified for generated column '%s' in table '%s' is not allowed.", + ErrUnsupportedOnGeneratedColumn: "'%s' is not supported for generated columns.", + ErrGeneratedColumnNonPrior: "Generated column can refer only to generated columns defined prior to it.", + ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.", + ErrGeneratedColumnRefAutoInc: "Generated column '%s' cannot refer to auto-increment column.", + ErrInvalidFieldSize: "Invalid size for column '%s'.", + ErrPasswordExpireAnonymousUser: "The password for anonymous user cannot be expired.", + ErrIncorrectType: "Incorrect type for argument %s in function %s.", + ErrInvalidJSONData: "Invalid JSON data provided to function %s: %s", + ErrInvalidJSONText: "Invalid JSON text: %-.192s", + ErrInvalidJSONTextInParam: "Invalid JSON text in argument %d to function %s: \"%s\" at position %d.", + ErrInvalidJSONPath: "Invalid JSON path expression %s.", + ErrInvalidJSONCharset: "Cannot create a JSON value from a string with CHARACTER SET '%s'.", + ErrInvalidTypeForJSON: "Invalid data type for JSON data in argument %d to function %s; a JSON string or JSON type is required.", + ErrInvalidJSONPathWildcard: "In this situation, path expressions may not contain the * and ** tokens or an array range.", + ErrInvalidJSONContainsPathType: "The second argument can only be either 'one' or 'all'.", + ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", + ErrJSONDocumentTooDeep: "The JSON document exceeds the maximum depth.", + ErrJSONDocumentNULLKey: "JSON documents may not contain NULL member names.", + ErrBadUser: "User %s does not exist.", + ErrUserAlreadyExists: "User %s already exists.", + ErrInvalidJSONPathArrayCell: "A path expression is not a path to a cell in an array.", + ErrInvalidEncryptionOption: "Invalid encryption option.", + ErrWindowNoSuchWindow: "Window name '%s' is not defined.", + ErrWindowCircularityInWindowGraph: "There is a circularity in the window dependency graph.", + ErrWindowNoChildPartitioning: "A window which depends on another cannot define partitioning.", + ErrWindowNoInherentFrame: "Window '%s' has a frame definition, so cannot be referenced by another window.", + ErrWindowNoRedefineOrderBy: "Window '%s' cannot inherit '%s' since both contain an ORDER BY clause.", + ErrWindowFrameStartIllegal: "Window '%s': frame start cannot be UNBOUNDED FOLLOWING.", + ErrWindowFrameEndIllegal: "Window '%s': frame end cannot be UNBOUNDED PRECEDING.", + ErrWindowFrameIllegal: "Window '%s': frame start or end is negative, NULL or of non-integral type", + ErrWindowRangeFrameOrderType: "Window '%s' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", + ErrWindowRangeFrameTemporalType: "Window '%s' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.", + ErrWindowRangeFrameNumericType: "Window '%s' with RANGE frame has ORDER BY expression of numeric type, INTERVAL bound value not allowed.", + ErrWindowRangeBoundNotConstant: "Window '%s' has a non-constant frame bound.", + ErrWindowDuplicateName: "Window '%s' is defined twice.", + ErrWindowIllegalOrderBy: "Window '%s': ORDER BY or PARTITION BY uses legacy position indication which is not supported, use expression.", + ErrWindowInvalidWindowFuncUse: "You cannot use the window function '%s' in this context.'", + ErrWindowInvalidWindowFuncAliasUse: "You cannot use the alias '%s' of an expression containing a window function in this context.'", + ErrWindowNestedWindowFuncUseInWindowSpec: "You cannot nest a window function in the specification of window '%s'.", + ErrWindowRowsIntervalUse: "Window '%s': INTERVAL can only be used with RANGE frames.", + ErrWindowNoGroupOrderUnused: "ASC or DESC with GROUP BY isn't allowed with window functions; put ASC or DESC in ORDER BY", + ErrWindowExplainJson: "To get information about window functions use EXPLAIN FORMAT=JSON", + ErrWindowFunctionIgnoresFrame: "Window function '%s' ignores the frame clause of window '%s' and aggregates over the whole partition", + ErrRoleNotGranted: "%s is not granted to %s", + ErrMaxExecTimeExceeded: "Query execution was interrupted, maximum statement execution time exceeded", + ErrLockAcquireFailAndNoWaitSet: "Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.", + ErrDataTruncatedFunctionalIndex: "Data truncated for functional index '%s' at row %d", + ErrDataOutOfRangeFunctionalIndex: "Value is out of range for functional index '%s' at row %d", + ErrFunctionalIndexOnJsonOrGeometryFunction: "Cannot create a functional index on a function that returns a JSON or GEOMETRY value", + ErrFunctionalIndexRefAutoIncrement: "Functional index '%s' cannot refer to an auto-increment column", + ErrCannotDropColumnFunctionalIndex: "Cannot drop column '%s' because it is used by a functional index. In order to drop the column, you must remove the functional index", + ErrFunctionalIndexPrimaryKey: "The primary key cannot be a functional index", + ErrFunctionalIndexOnLob: "Cannot create a functional index on an expression that returns a BLOB or TEXT. Please consider using CAST", + ErrFunctionalIndexFunctionIsNotAllowed: "Expression of functional index '%s' contains a disallowed function", + ErrFulltextFunctionalIndex: "Fulltext functional index is not supported", + ErrSpatialFunctionalIndex: "Spatial functional index is not supported", + ErrWrongKeyColumnFunctionalIndex: "The used storage engine cannot index the expression '%s'", + ErrFunctionalIndexOnField: "Functional index on a column is not supported. Consider using a regular index instead", + ErrFKIncompatibleColumns: "Referencing column '%s' and referenced column '%s' in foreign key constraint '%s' are incompatible.", + ErrFunctionalIndexRowValueIsNotAllowed: "Expression of functional index '%s' cannot refer to a row value", + ErrDependentByFunctionalIndex: "Column '%s' has a functional index dependency and cannot be dropped or renamed", + ErrInvalidJSONType: "Invalid JSON type in argument %d to function %s; an %s is required.", + ErrInvalidJsonValueForFuncIndex: "Invalid JSON value for CAST for functional index '%s'", + ErrJsonValueOutOfRangeForFuncIndex: "Out of range JSON value for CAST for functional index '%s'", + ErrFunctionalIndexDataIsTooLong: "Data too long for functional index '%s'", + ErrFunctionalIndexNotApplicable: "Cannot use functional index '%s' due to type or collation conversion", + + // Optimizer-hint warnings. + ErrWarnOptimizerHintInvalidInteger: "integer value is out of range in '%s'", + ErrWarnOptimizerHintUnsupportedHint: "Optimizer hint %s is not supported and is ignored", + ErrWarnOptimizerHintInvalidToken: "Cannot use %s '%s' (tok = %d) in an optimizer hint", + ErrWarnOptimizerHintParseError: "Optimizer hint syntax error at %v", + ErrWarnOptimizerHintWrongPos: "Optimizer hint can only be followed by certain keywords like SELECT, INSERT, etc.", +} diff --git a/pkg/parser/mysql/error.go b/pkg/parser/mysql/error.go new file mode 100644 index 000000000..54dc3ce6c --- /dev/null +++ b/pkg/parser/mysql/error.go @@ -0,0 +1,76 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "fmt" +) + +// ParseError is an error emitted by the parser, carrying a MySQL error +// code. The package-level Err* variables declared across the parser, ast, +// types and charset packages are message templates that double as +// sentinels: errors created from them with GenByArgs or GenByFormat match +// their template via errors.Is. +type ParseError struct { + class string + code uint16 + message string // format template on sentinels, final text on instances + base *ParseError // template this instance was created from; nil on sentinels +} + +// NewStdErr creates a sentinel error for the given MySQL error code, using +// the standard message template from MySQLErrName. class only provides the +// "[class:code]" prefix of the rendered message (e.g. "parser", "ddl"). +func NewStdErr(class string, code uint16) *ParseError { + return &ParseError{class: class, code: code, message: MySQLErrName[code]} +} + +// Error implements the error interface. +func (e *ParseError) Error() string { + return fmt.Sprintf("[%s:%d]%s", e.class, e.code, e.message) +} + +// GenByArgs creates an instance of the error with its message template +// filled in. +func (e *ParseError) GenByArgs(args ...any) error { + msg := e.message + if len(args) > 0 { + msg = fmt.Sprintf(e.message, args...) + } + return &ParseError{class: e.class, code: e.code, message: msg, base: e.template()} +} + +// GenByFormat is GenByArgs with the standard message template replaced. +func (e *ParseError) GenByFormat(format string, args ...any) error { + return &ParseError{class: e.class, code: e.code, message: fmt.Sprintf(format, args...), base: e.template()} +} + +// Is reports whether target is the same error template (or another +// instance of it), so errors.Is(err, ErrSentinel) matches independent of +// the formatted message. +func (e *ParseError) Is(target error) bool { + t, ok := target.(*ParseError) + if !ok { + return false + } + return e.template() == t.template() +} + +func (e *ParseError) template() *ParseError { + if e.base != nil { + return e.base + } + return e +} diff --git a/pkg/parser/mysql/error_test.go b/pkg/parser/mysql/error_test.go new file mode 100644 index 000000000..8289b0a22 --- /dev/null +++ b/pkg/parser/mysql/error_test.go @@ -0,0 +1,39 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseError(t *testing.T) { + base := NewStdErr("parser", ErrNoDB) + require.Equal(t, "[parser:1046]No database selected", base.Error()) + + inst := base.GenByArgs() + require.Equal(t, "[parser:1046]No database selected", inst.Error()) + require.ErrorIs(t, inst, base) + + withArgs := NewStdErr("parser", ErrUnknownCharacterSet).GenByArgs("utf9") + require.Equal(t, "[parser:1115]Unknown character set: 'utf9'", withArgs.Error()) + + custom := base.GenByFormat("something %s happened", "odd") + require.Equal(t, "[parser:1046]something odd happened", custom.Error()) + require.ErrorIs(t, custom, base) + + other := NewStdErr("parser", ErrParse) + require.NotErrorIs(t, inst, other) +} diff --git a/pkg/parser/mysql/privs.go b/pkg/parser/mysql/privs.go new file mode 100644 index 000000000..c384a1ccd --- /dev/null +++ b/pkg/parser/mysql/privs.go @@ -0,0 +1,326 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import "slices" + +// AllPrivilegeLiteral is the string literal for All Privilege. +const AllPrivilegeLiteral = "ALL PRIVILEGES" + +// Priv2Str is the map for privilege to string. +var Priv2Str = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + ShowDBPriv: "Show Databases", + SuperPriv: "Super", + CreateUserPriv: "Create User", + CreateTablespacePriv: "Create Tablespace", + TriggerPriv: "Trigger", + DropPriv: "Drop", + ProcessPriv: "Process", + GrantPriv: "Grant Option", + ReferencesPriv: "References", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", + CreateViewPriv: "Create View", + ShowViewPriv: "Show View", + CreateRolePriv: "Create Role", + DropRolePriv: "Drop Role", + CreateTMPTablePriv: "CREATE TEMPORARY TABLES", + LockTablesPriv: "LOCK TABLES", + CreateRoutinePriv: "CREATE ROUTINE", + AlterRoutinePriv: "ALTER ROUTINE", + EventPriv: "EVENT", + ShutdownPriv: "SHUTDOWN", + ReloadPriv: "RELOAD", + FilePriv: "FILE", + ConfigPriv: "CONFIG", + UsagePriv: "USAGE", + ReplicationClientPriv: "REPLICATION CLIENT", + ReplicationSlavePriv: "REPLICATION SLAVE", + AllPriv: AllPrivilegeLiteral, +} + +// Priv2SetStr is the map for privilege to string. +var Priv2SetStr = map[PrivilegeType]string{ + CreatePriv: "Create", + SelectPriv: "Select", + InsertPriv: "Insert", + UpdatePriv: "Update", + DeletePriv: "Delete", + DropPriv: "Drop", + GrantPriv: "Grant", + ReferencesPriv: "References", + LockTablesPriv: "Lock Tables", + CreateTMPTablePriv: "Create Temporary Tables", + EventPriv: "Event", + CreateRoutinePriv: "Create Routine", + AlterRoutinePriv: "Alter Routine", + AlterPriv: "Alter", + ExecutePriv: "Execute", + IndexPriv: "Index", + CreateViewPriv: "Create View", + ShowViewPriv: "Show View", + CreateRolePriv: "Create Role", + DropRolePriv: "Drop Role", + ShutdownPriv: "Shutdown Role", + TriggerPriv: "Trigger", +} + +// SetStr2Priv is the map for privilege set string to privilege type. +var SetStr2Priv = map[string]PrivilegeType{ + "Create": CreatePriv, + "Select": SelectPriv, + "Insert": InsertPriv, + "Update": UpdatePriv, + "Delete": DeletePriv, + "Drop": DropPriv, + "Grant": GrantPriv, + "References": ReferencesPriv, + "Lock Tables": LockTablesPriv, + "Create Temporary Tables": CreateTMPTablePriv, + "Event": EventPriv, + "Create Routine": CreateRoutinePriv, + "Alter Routine": AlterRoutinePriv, + "Alter": AlterPriv, + "Execute": ExecutePriv, + "Index": IndexPriv, + "Create View": CreateViewPriv, + "Show View": ShowViewPriv, + "Trigger": TriggerPriv, +} + +// Priv2UserCol is the privilege to mysql.user table column name. +var Priv2UserCol = map[PrivilegeType]string{ + CreatePriv: "Create_priv", + SelectPriv: "Select_priv", + InsertPriv: "Insert_priv", + UpdatePriv: "Update_priv", + DeletePriv: "Delete_priv", + ShowDBPriv: "Show_db_priv", + SuperPriv: "Super_priv", + CreateUserPriv: "Create_user_priv", + CreateTablespacePriv: "Create_tablespace_priv", + TriggerPriv: "Trigger_priv", + DropPriv: "Drop_priv", + ProcessPriv: "Process_priv", + GrantPriv: "Grant_priv", + ReferencesPriv: "References_priv", + AlterPriv: "Alter_priv", + ExecutePriv: "Execute_priv", + IndexPriv: "Index_priv", + CreateViewPriv: "Create_view_priv", + ShowViewPriv: "Show_view_priv", + CreateRolePriv: "Create_role_priv", + DropRolePriv: "Drop_role_priv", + CreateTMPTablePriv: "Create_tmp_table_priv", + LockTablesPriv: "Lock_tables_priv", + CreateRoutinePriv: "Create_routine_priv", + AlterRoutinePriv: "Alter_routine_priv", + EventPriv: "Event_priv", + ShutdownPriv: "Shutdown_priv", + ReloadPriv: "Reload_priv", + FilePriv: "File_priv", + ConfigPriv: "Config_priv", + ReplicationClientPriv: "Repl_client_priv", + ReplicationSlavePriv: "Repl_slave_priv", +} + +// Col2PrivType is the privilege tables column name to privilege type. +var Col2PrivType = map[string]PrivilegeType{ + "Create_priv": CreatePriv, + "Select_priv": SelectPriv, + "Insert_priv": InsertPriv, + "Update_priv": UpdatePriv, + "Delete_priv": DeletePriv, + "Show_db_priv": ShowDBPriv, + "Super_priv": SuperPriv, + "Create_user_priv": CreateUserPriv, + "Create_tablespace_priv": CreateTablespacePriv, + "Trigger_priv": TriggerPriv, + "Drop_priv": DropPriv, + "Process_priv": ProcessPriv, + "Grant_priv": GrantPriv, + "References_priv": ReferencesPriv, + "Alter_priv": AlterPriv, + "Execute_priv": ExecutePriv, + "Index_priv": IndexPriv, + "Create_view_priv": CreateViewPriv, + "Show_view_priv": ShowViewPriv, + "Create_role_priv": CreateRolePriv, + "Drop_role_priv": DropRolePriv, + "Create_tmp_table_priv": CreateTMPTablePriv, + "Lock_tables_priv": LockTablesPriv, + "Create_routine_priv": CreateRoutinePriv, + "Alter_routine_priv": AlterRoutinePriv, + "Event_priv": EventPriv, + "Shutdown_priv": ShutdownPriv, + "Reload_priv": ReloadPriv, + "File_priv": FilePriv, + "Config_priv": ConfigPriv, + "Repl_client_priv": ReplicationClientPriv, + "Repl_slave_priv": ReplicationSlavePriv, +} + +// PrivilegeType privilege +type PrivilegeType uint64 + +// NewPrivFromColumn constructs priv from a column name. False means invalid priv column name. +func NewPrivFromColumn(col string) (PrivilegeType, bool) { + p, o := Col2PrivType[col] + return p, o +} + +// NewPrivFromSetEnum constructs priv from a set enum. False means invalid priv enum. +func NewPrivFromSetEnum(e string) (PrivilegeType, bool) { + p, o := SetStr2Priv[e] + return p, o +} + +// String returns the corresponding identifier in SQLs. +func (p PrivilegeType) String() string { + if s, ok := Priv2Str[p]; ok { + return s + } + return "" +} + +// ColumnString returns the corresponding name of columns in mysql.user/mysql.db. +func (p PrivilegeType) ColumnString() string { + if s, ok := Priv2UserCol[p]; ok { + return s + } + return "" +} + +// SetString returns the corresponding set enum string in Table_priv/Column_priv of mysql.tables_priv/mysql.columns_priv. +func (p PrivilegeType) SetString() string { + if s, ok := Priv2SetStr[p]; ok { + return s + } + return "" +} + +const ( + // UsagePriv is a synonym for “no privileges” + UsagePriv PrivilegeType = 1 << iota + // CreatePriv is the privilege to create schema/table. + CreatePriv + // SelectPriv is the privilege to read from table. + SelectPriv + // InsertPriv is the privilege to insert data into table. + InsertPriv + // UpdatePriv is the privilege to update data in table. + UpdatePriv + // DeletePriv is the privilege to delete data from table. + DeletePriv + // ShowDBPriv is the privilege to run show databases statement. + ShowDBPriv + // SuperPriv enables many operations and server behaviors. + SuperPriv + // CreateUserPriv is the privilege to create user. + CreateUserPriv + // TriggerPriv is not checked yet. + TriggerPriv + // DropPriv is the privilege to drop schema/table. + DropPriv + // ProcessPriv pertains to display of information about the threads executing within the server. + ProcessPriv + // GrantPriv is the privilege to grant privilege to user. + GrantPriv + // ReferencesPriv is not checked yet. + ReferencesPriv + // AlterPriv is the privilege to run alter statement. + AlterPriv + // ExecutePriv is the privilege to run execute statement. + ExecutePriv + // IndexPriv is the privilege to create/drop index. + IndexPriv + // CreateViewPriv is the privilege to create view. + CreateViewPriv + // ShowViewPriv is the privilege to show create view. + ShowViewPriv + // CreateRolePriv the privilege to create a role. + CreateRolePriv + // DropRolePriv is the privilege to drop a role. + DropRolePriv + // CreateTMPTablePriv is the privilege to create a local temporary table. + CreateTMPTablePriv + // LockTablesPriv is the privilege to lock tables. + LockTablesPriv + // CreateRoutinePriv is the privilege to create a stored routine. + CreateRoutinePriv + // AlterRoutinePriv is the privilege to alter a stored routine. + AlterRoutinePriv + // EventPriv is the privilege to event. + EventPriv + + // ShutdownPriv the privilege to shutdown a server. + ShutdownPriv + // ReloadPriv is the privilege to enable the use of the FLUSH statement. + ReloadPriv + // FilePriv is the privilege to enable the use of LOAD DATA and SELECT ... INTO OUTFILE. + FilePriv + // ConfigPriv is the privilege to enable the use SET CONFIG statements. + ConfigPriv + + // CreateTablespacePriv is the privilege to create tablespace. + CreateTablespacePriv + + // ReplicationClientPriv is used in MySQL replication + ReplicationClientPriv + // ReplicationSlavePriv is used in MySQL replication + ReplicationSlavePriv + + // AllPriv is the privilege for all actions. + AllPriv + /* + * Please add the new priv before AllPriv to keep the values consistent across versions. + */ + + // ExtendedPriv is used to successful parse privileges not included above. + // these are dynamic privileges in MySQL 8.0 and other extended privileges like LOAD FROM S3 in Aurora. + ExtendedPriv +) + +// AllPrivMask is the mask for PrivilegeType with all bits set to 1. +// If it's passed to RequestVerification, it means any privilege would be OK. +const AllPrivMask = AllPriv - 1 + +// Privileges is the list of all privileges. +type Privileges []PrivilegeType + +// Has checks whether PrivilegeType has the privilege. +func (privs Privileges) Has(p PrivilegeType) bool { + return slices.Contains(privs, p) +} + +// AllGlobalPrivs is all the privileges in global scope. +var AllGlobalPrivs = Privileges{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ProcessPriv, ReferencesPriv, AlterPriv, ShowDBPriv, SuperPriv, ExecutePriv, IndexPriv, CreateUserPriv, CreateTablespacePriv, TriggerPriv, CreateViewPriv, ShowViewPriv, CreateRolePriv, DropRolePriv, CreateTMPTablePriv, LockTablesPriv, CreateRoutinePriv, AlterRoutinePriv, EventPriv, ShutdownPriv, ReloadPriv, FilePriv, ConfigPriv, ReplicationClientPriv, ReplicationSlavePriv} + +// AllDBPrivs is all the privileges in database scope. +var AllDBPrivs = Privileges{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, ReferencesPriv, LockTablesPriv, CreateTMPTablePriv, EventPriv, CreateRoutinePriv, AlterRoutinePriv, AlterPriv, ExecutePriv, IndexPriv, CreateViewPriv, ShowViewPriv, TriggerPriv} + +// AllTablePrivs is all the privileges in table scope. +var AllTablePrivs = Privileges{SelectPriv, InsertPriv, UpdatePriv, DeletePriv, CreatePriv, DropPriv, IndexPriv, ReferencesPriv, AlterPriv, CreateViewPriv, ShowViewPriv, TriggerPriv} + +// AllColumnPrivs is all the privileges in column scope. +var AllColumnPrivs = Privileges{SelectPriv, InsertPriv, UpdatePriv, ReferencesPriv} + +// StaticGlobalOnlyPrivs is all the privileges only in global scope and different from dynamic privileges. +var StaticGlobalOnlyPrivs = Privileges{ProcessPriv, ShowDBPriv, SuperPriv, CreateUserPriv, CreateTablespacePriv, ShutdownPriv, ReloadPriv, FilePriv, ReplicationClientPriv, ReplicationSlavePriv, ConfigPriv} diff --git a/pkg/parser/mysql/privs_test.go b/pkg/parser/mysql/privs_test.go new file mode 100644 index 000000000..8e654655d --- /dev/null +++ b/pkg/parser/mysql/privs_test.go @@ -0,0 +1,94 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPrivString(t *testing.T) { + for i := 0; ; i++ { + p := PrivilegeType(1 << i) + if p > AllPriv { + break + } + require.NotEmptyf(t, p.String(), "%d-th", i) + } +} + +func TestPrivColumn(t *testing.T) { + for _, p := range AllGlobalPrivs { + require.NotEmptyf(t, p.ColumnString(), "%s", p) + np, ok := NewPrivFromColumn(p.ColumnString()) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) + } + for _, p := range StaticGlobalOnlyPrivs { + require.NotEmptyf(t, p.ColumnString(), "%s", p) + np, ok := NewPrivFromColumn(p.ColumnString()) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) + } + for _, p := range AllDBPrivs { + require.NotEmptyf(t, p.ColumnString(), "%s", p) + np, ok := NewPrivFromColumn(p.ColumnString()) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) + } +} + +func TestPrivSetString(t *testing.T) { + for _, p := range AllTablePrivs { + require.NotEmptyf(t, p.SetString(), "%s", p) + np, ok := NewPrivFromSetEnum(p.SetString()) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) + } + for _, p := range AllColumnPrivs { + require.NotEmptyf(t, p.SetString(), "%s", p) + np, ok := NewPrivFromSetEnum(p.SetString()) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) + } +} + +func TestPrivsHas(t *testing.T) { + // it is a simple helper, does not handle all&dynamic privs + privs := Privileges{AllPriv} + require.True(t, privs.Has(AllPriv)) + require.False(t, privs.Has(InsertPriv)) + + // multiple privs + privs = Privileges{InsertPriv, SelectPriv} + require.True(t, privs.Has(SelectPriv)) + require.True(t, privs.Has(InsertPriv)) + require.False(t, privs.Has(DropPriv)) +} + +func TestPrivAllConsistency(t *testing.T) { + // AllPriv in mysql.user columns. + for priv := CreatePriv; priv != AllPriv; priv <<= 1 { + _, ok := Priv2UserCol[priv] + require.Truef(t, ok, "priv fail %d", priv) + } + + require.Len(t, Priv2UserCol, len(AllGlobalPrivs)+1) + + // USAGE privilege doesn't have a column in Priv2UserCol + // ALL privilege doesn't have a column in Priv2UserCol + // so it's +2 + require.Len(t, Priv2Str, len(Priv2UserCol)+2) +} diff --git a/pkg/parser/mysql/type.go b/pkg/parser/mysql/type.go new file mode 100644 index 000000000..56e604613 --- /dev/null +++ b/pkg/parser/mysql/type.go @@ -0,0 +1,133 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +// MySQL type information. +const ( + TypeUnspecified byte = 0 + TypeTiny byte = 1 // TINYINT + TypeShort byte = 2 // SMALLINT + TypeLong byte = 3 // INT + TypeFloat byte = 4 + TypeDouble byte = 5 + TypeNull byte = 6 + TypeTimestamp byte = 7 + TypeLonglong byte = 8 // BIGINT + TypeInt24 byte = 9 // MEDIUMINT + TypeDate byte = 10 + /* TypeDuration original name was TypeTime, renamed to TypeDuration to resolve the conflict with Go type Time.*/ + TypeDuration byte = 11 + TypeDatetime byte = 12 + TypeYear byte = 13 + TypeNewDate byte = 14 + TypeVarchar byte = 15 + TypeBit byte = 16 + + TypeJSON byte = 0xf5 + TypeNewDecimal byte = 0xf6 + TypeEnum byte = 0xf7 + TypeSet byte = 0xf8 + TypeTinyBlob byte = 0xf9 + TypeMediumBlob byte = 0xfa + TypeLongBlob byte = 0xfb + TypeBlob byte = 0xfc + TypeVarString byte = 0xfd + TypeString byte = 0xfe /* TypeString is char type */ + TypeGeometry byte = 0xff +) + +// Flag information. +const ( + NotNullFlag uint = 1 << 0 /* Field can't be NULL */ + PriKeyFlag uint = 1 << 1 /* Field is part of a primary key */ + UniqueKeyFlag uint = 1 << 2 /* Field is part of a unique key */ + MultipleKeyFlag uint = 1 << 3 /* Field is part of a key */ + BlobFlag uint = 1 << 4 /* Field is a blob */ + UnsignedFlag uint = 1 << 5 /* Field is unsigned */ + ZerofillFlag uint = 1 << 6 /* Field is zerofill */ + BinaryFlag uint = 1 << 7 /* Field is binary */ + EnumFlag uint = 1 << 8 /* Field is an enum */ + AutoIncrementFlag uint = 1 << 9 /* Field is an auto increment field */ + TimestampFlag uint = 1 << 10 /* Field is a timestamp */ + SetFlag uint = 1 << 11 /* Field is a set */ + NoDefaultValueFlag uint = 1 << 12 /* Field doesn't have a default value */ + OnUpdateNowFlag uint = 1 << 13 /* Field is set to NOW on UPDATE */ + PartKeyFlag uint = 1 << 14 /* Intern: Part of some keys */ + SridFlag uint = 1 << 15 /* Field has a SRID */ + + UniqueFlag uint = 1 << 16 /* Internal: Used by sql_yacc */ + BinCmpFlag uint = 1 << 17 /* Internal: Used by sql_yacc */ + ParseToJSONFlag uint = 1 << 18 /* Internal: Used when we want to parse string to JSON in CAST */ + IsBooleanFlag uint = 1 << 19 /* Internal: Used for telling boolean literal from integer */ + PreventNullInsertFlag uint = 1 << 20 /* Prevent this Field from inserting NULL values */ + EnumSetAsIntFlag uint = 1 << 21 /* Internal: Used for inferring enum eval type. */ + DropColumnIndexFlag uint = 1 << 22 /* Internal: Used for indicate the column is being dropped with index */ + GeneratedColumnFlag uint = 1 << 23 /* Internal: marks a generated column */ + UnderScoreCharsetFlag uint = 1 << 24 /* Internal: Indicate whether charset is specified by underscore like _latin1'abc' */ +) + +// HasNotNullFlag checks if NotNullFlag is set. +func HasNotNullFlag(flag uint) bool { + return (flag & NotNullFlag) > 0 +} + +// HasNoDefaultValueFlag checks if NoDefaultValueFlag is set. +func HasNoDefaultValueFlag(flag uint) bool { + return (flag & NoDefaultValueFlag) > 0 +} + +// HasAutoIncrementFlag checks if AutoIncrementFlag is set. +func HasAutoIncrementFlag(flag uint) bool { + return (flag & AutoIncrementFlag) > 0 +} + +// HasUnsignedFlag checks if UnsignedFlag is set. +func HasUnsignedFlag(flag uint) bool { + return (flag & UnsignedFlag) > 0 +} + +// HasZerofillFlag checks if ZerofillFlag is set. +func HasZerofillFlag(flag uint) bool { + return (flag & ZerofillFlag) > 0 +} + +// HasBinaryFlag checks if BinaryFlag is set. +func HasBinaryFlag(flag uint) bool { + return (flag & BinaryFlag) > 0 +} + +// HasPriKeyFlag checks if PriKeyFlag is set. +func HasPriKeyFlag(flag uint) bool { + return (flag & PriKeyFlag) > 0 +} + +// HasUniKeyFlag checks if UniqueKeyFlag is set. +func HasUniKeyFlag(flag uint) bool { + return (flag & UniqueKeyFlag) > 0 +} + +// HasMultipleKeyFlag checks if MultipleKeyFlag is set. +func HasMultipleKeyFlag(flag uint) bool { + return (flag & MultipleKeyFlag) > 0 +} + +// HasTimestampFlag checks if HasTimestampFlag is set. +func HasTimestampFlag(flag uint) bool { + return (flag & TimestampFlag) > 0 +} + +// HasOnUpdateNowFlag checks if OnUpdateNowFlag is set. +func HasOnUpdateNowFlag(flag uint) bool { + return (flag & OnUpdateNowFlag) > 0 +} diff --git a/pkg/parser/mysql/type_test.go b/pkg/parser/mysql/type_test.go new file mode 100644 index 000000000..644f96baf --- /dev/null +++ b/pkg/parser/mysql/type_test.go @@ -0,0 +1,35 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestFlags(t *testing.T) { + require.True(t, HasNotNullFlag(NotNullFlag)) + require.True(t, HasUniKeyFlag(UniqueKeyFlag)) + require.True(t, HasNotNullFlag(NotNullFlag)) + require.True(t, HasNoDefaultValueFlag(NoDefaultValueFlag)) + require.True(t, HasAutoIncrementFlag(AutoIncrementFlag)) + require.True(t, HasUnsignedFlag(UnsignedFlag)) + require.True(t, HasZerofillFlag(ZerofillFlag)) + require.True(t, HasBinaryFlag(BinaryFlag)) + require.True(t, HasPriKeyFlag(PriKeyFlag)) + require.True(t, HasMultipleKeyFlag(MultipleKeyFlag)) + require.True(t, HasTimestampFlag(TimestampFlag)) + require.True(t, HasOnUpdateNowFlag(OnUpdateNowFlag)) +} diff --git a/pkg/parser/mysql/util.go b/pkg/parser/mysql/util.go new file mode 100644 index 000000000..f19fb30fc --- /dev/null +++ b/pkg/parser/mysql/util.go @@ -0,0 +1,95 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +type lengthAndDecimal struct { + length int64 + decimal int +} + +// defaultLengthAndDecimal provides default flen and decimal for fields +// from CREATE TABLE when they are unspecified. +var defaultLengthAndDecimal = map[byte]lengthAndDecimal{ + TypeBit: {1, 0}, + TypeTiny: {4, 0}, + TypeShort: {6, 0}, + TypeInt24: {9, 0}, + TypeLong: {11, 0}, + TypeLonglong: {20, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeNewDecimal: {10, 0}, + TypeDuration: {10, 0}, + TypeDate: {10, 0}, + TypeTimestamp: {19, 0}, + TypeDatetime: {19, 0}, + TypeYear: {4, 0}, + TypeString: {1, 0}, + TypeVarchar: {5, 0}, + TypeVarString: {5, 0}, + TypeTinyBlob: {255, 0}, + TypeBlob: {65535, 0}, + TypeMediumBlob: {16777215, 0}, + TypeLongBlob: {4294967295, 0}, + TypeJSON: {4294967295, 0}, + TypeNull: {0, 0}, + TypeSet: {-1, 0}, + TypeEnum: {-1, 0}, +} + +// IsIntegerType indicate whether tp is an integer type. +func IsIntegerType(tp byte) bool { + switch tp { + case TypeTiny, TypeShort, TypeInt24, TypeLong, TypeLonglong: + return true + } + return false +} + +// GetDefaultFieldLengthAndDecimal returns the default display length (flen) and decimal length for column. +// Call this when no flen assigned in ddl. +// or column value is calculated from an expression. +// For example: "select count(*) from t;", the column type is int64 and flen in ResultField will be 21. +// See https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html +func GetDefaultFieldLengthAndDecimal(tp byte) (flen, decimal int) { + val, ok := defaultLengthAndDecimal[tp] + if ok { + return int(val.length), val.decimal + } + return -1, -1 +} + +// defaultLengthAndDecimal provides default flen and decimal for fields +// from CAST when they are unspecified. +var defaultLengthAndDecimalForCast = map[byte]lengthAndDecimal{ + TypeString: {0, -1}, // flen & decimal differs. + TypeDate: {10, 0}, + TypeDatetime: {19, 0}, + TypeNewDecimal: {10, 0}, + TypeDuration: {10, 0}, + TypeLonglong: {22, 0}, + TypeDouble: {22, -1}, + TypeFloat: {12, -1}, + TypeJSON: {4194304, 0}, // flen differs. +} + +// GetDefaultFieldLengthAndDecimalForCast returns the default display length (flen) and decimal length for casted column +// when flen or decimal is not specified. +func GetDefaultFieldLengthAndDecimalForCast(tp byte) (flen, decimal int) { + val, ok := defaultLengthAndDecimalForCast[tp] + if ok { + return int(val.length), val.decimal + } + return -1, -1 +} diff --git a/pkg/parser/opcode/opcode.go b/pkg/parser/opcode/opcode.go new file mode 100644 index 000000000..29f1dffe4 --- /dev/null +++ b/pkg/parser/opcode/opcode.go @@ -0,0 +1,239 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "github.com/block/spirit/pkg/parser/format" +) + +// Op is opcode type. +type Op int + +// List operators. +const ( + LogicAnd Op = iota + 1 + LeftShift + RightShift + LogicOr + GE + LE + EQ + NE + LT + GT + Plus + Minus + And + Or + Mod + Xor + Div + Mul + Not + Not2 + BitNeg + IntDiv + LogicXor + NullEQ + In + Like + Case + Regexp + IsNull + IsTruth + IsFalsity +) + +var ops = [...]struct { + name string + literal string + isKeyword bool +}{ + LogicAnd: { + name: "and", + literal: "AND", + isKeyword: true, + }, + LogicOr: { + name: "or", + literal: "OR", + isKeyword: true, + }, + LogicXor: { + name: "xor", + literal: "XOR", + isKeyword: true, + }, + LeftShift: { + name: "leftshift", + literal: "<<", + isKeyword: false, + }, + RightShift: { + name: "rightshift", + literal: ">>", + isKeyword: false, + }, + GE: { + name: "ge", + literal: ">=", + isKeyword: false, + }, + LE: { + name: "le", + literal: "<=", + isKeyword: false, + }, + EQ: { + name: "eq", + literal: "=", + isKeyword: false, + }, + NE: { + name: "ne", + literal: "!=", // perhaps should use `<>` here + isKeyword: false, + }, + LT: { + name: "lt", + literal: "<", + isKeyword: false, + }, + GT: { + name: "gt", + literal: ">", + isKeyword: false, + }, + Plus: { + name: "plus", + literal: "+", + isKeyword: false, + }, + Minus: { + name: "minus", + literal: "-", + isKeyword: false, + }, + And: { + name: "bitand", + literal: "&", + isKeyword: false, + }, + Or: { + name: "bitor", + literal: "|", + isKeyword: false, + }, + Mod: { + name: "mod", + literal: "%", + isKeyword: false, + }, + Xor: { + name: "bitxor", + literal: "^", + isKeyword: false, + }, + Div: { + name: "div", + literal: "/", + isKeyword: false, + }, + Mul: { + name: "mul", + literal: "*", + isKeyword: false, + }, + Not: { + name: "not", + literal: "not ", + isKeyword: true, + }, + Not2: { + name: "!", + literal: "!", + isKeyword: false, + }, + BitNeg: { + name: "bitneg", + literal: "~", + isKeyword: false, + }, + IntDiv: { + name: "intdiv", + literal: "DIV", + isKeyword: true, + }, + NullEQ: { + name: "nulleq", + literal: "<=>", + isKeyword: false, + }, + In: { + name: "in", + literal: "IN", + isKeyword: true, + }, + Like: { + name: "like", + literal: "LIKE", + isKeyword: true, + }, + Case: { + name: "case", + literal: "CASE", + isKeyword: true, + }, + Regexp: { + name: "regexp", + literal: "REGEXP", + isKeyword: true, + }, + IsNull: { + name: "isnull", + literal: "IS NULL", + isKeyword: true, + }, + IsTruth: { + name: "istrue", + literal: "IS TRUE", + isKeyword: true, + }, + IsFalsity: { + name: "isfalse", + literal: "IS FALSE", + isKeyword: true, + }, +} + +// String implements Stringer interface. +func (o Op) String() string { + return ops[o].name +} + +// IsKeyword returns whether the operator is a keyword. +func (o Op) IsKeyword() bool { + return ops[o].isKeyword +} + +// Restore the Op into a Writer +func (o Op) Restore(ctx *format.RestoreCtx) error { + info := &ops[o] + if info.isKeyword { + ctx.WriteKeyWord(info.literal) + } else { + ctx.WritePlain(info.literal) + } + return nil +} diff --git a/pkg/parser/opcode/opcode_test.go b/pkg/parser/opcode/opcode_test.go new file mode 100644 index 000000000..85713b68b --- /dev/null +++ b/pkg/parser/opcode/opcode_test.go @@ -0,0 +1,36 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package opcode + +import ( + "testing" +) + +func TestT(t *testing.T) { + op := Plus + if op.String() != "plus" { + t.Fatalf("invalid op code") + } + + // Test invalid opcode + defer func() { + _ = recover() + }() + + op = 0 + s := op.String() + if len(s) > 0 { + t.Fail() + } +} diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go new file mode 100644 index 000000000..aac6b791b --- /dev/null +++ b/pkg/parser/parser.go @@ -0,0 +1,18993 @@ +// Code generated by goyacc DO NOT EDIT. + +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import __yyfmt__ "fmt" + +import ( + "strings" + + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/opcode" + "github.com/block/spirit/pkg/parser/types" +) + +type insertRowAlias struct { + rowAlias ast.CIStr + columnAliases []ast.CIStr +} + +type likeEscapeSpec struct { + escape string + explicit bool +} + +type yySymType struct { + yys int + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +type yyXError struct { + state, xsym int +} + +const ( + yyDefault = 57976 + yyEOFCode = 57344 + account = 57577 + action = 57578 + active = 57579 + add = 57357 + addDate = 57889 + after = 57580 + against = 57581 + algorithm = 57582 + all = 57358 + alter = 57359 + always = 57583 + analyze = 57360 + and = 57361 + andand = 57355 + any = 57584 + array = 57362 + as = 57363 + asc = 57364 + ascii = 57585 + assignmentEq = 57937 + attribute = 57586 + auto = 57587 + autoIncrement = 57589 + autoextendSize = 57588 + avg = 57590 + avgRowLength = 57591 + begin = 57592 + between = 57365 + bigIntType = 57366 + binaryType = 57367 + binlog = 57593 + bitLit = 57936 + bitType = 57594 + blobType = 57368 + block = 57595 + boolType = 57596 + booleanType = 57597 + both = 57369 + btree = 57598 + buckets = 57599 + builtinApproxCountDistinct = 57905 + builtinApproxPercentile = 57906 + builtinBitAnd = 57907 + builtinBitOr = 57908 + builtinBitXor = 57909 + builtinCast = 57910 + builtinCount = 57911 + builtinCurDate = 57912 + builtinCurTime = 57913 + builtinDateAdd = 57914 + builtinDateSub = 57915 + builtinExtract = 57916 + builtinGroupConcat = 57917 + builtinMax = 57918 + builtinMin = 57919 + builtinNow = 57920 + builtinPosition = 57921 + builtinStddevPop = 57922 + builtinStddevSamp = 57923 + builtinSubstring = 57924 + builtinSum = 57925 + builtinSysDate = 57926 + builtinTranslate = 57927 + builtinTrim = 57928 + builtinUser = 57929 + builtinVarPop = 57930 + builtinVarSamp = 57931 + by = 57370 + byteType = 57600 + call = 57371 + cascade = 57372 + cascaded = 57601 + caseKwd = 57373 + chain = 57602 + change = 57374 + channel = 57603 + charType = 57375 + character = 57376 + charsetKwd = 57604 + check = 57377 + checksum = 57605 + cipher = 57606 + client = 57607 + coalesce = 57608 + collate = 57378 + collation = 57609 + column = 57379 + columnFormat = 57611 + columns = 57610 + comment = 57612 + commit = 57613 + committed = 57614 + compact = 57615 + compress = 57890 + compressed = 57616 + compression = 57617 + config = 57618 + connection = 57619 + consistent = 57620 + constraint = 57380 + context = 57621 + convert = 57381 + copyKwd = 57891 + cpu = 57622 + create = 57382 + createTableSelect = 57960 + cross = 57383 + cumeDist = 57384 + current = 57623 + currentDate = 57385 + currentRole = 57386 + currentTime = 57387 + currentTs = 57388 + currentUser = 57389 + data = 57624 + database = 57390 + databases = 57391 + datafile = 57625 + dateType = 57626 + datetimeType = 57627 + day = 57628 + dayHour = 57392 + dayMicrosecond = 57393 + dayMinute = 57394 + daySecond = 57395 + deallocate = 57629 + decLit = 57933 + decimalType = 57396 + defaultKwd = 57397 + defined = 57892 + definer = 57630 + definition = 57631 + delayKeyWrite = 57632 + delayed = 57398 + deleteKwd = 57399 + denseRank = 57400 + desc = 57401 + describe = 57402 + description = 57633 + directory = 57634 + disable = 57635 + discard = 57636 + disk = 57637 + distinct = 57403 + distinctRow = 57404 + div = 57405 + do = 57638 + doubleAtIdentifier = 57352 + doubleType = 57406 + drop = 57407 + dual = 57408 + duplicate = 57639 + dynamic = 57640 + elseKwd = 57409 + empty = 57950 + enable = 57641 + enclosed = 57410 + encryption = 57642 + end = 57643 + enforced = 57644 + engine = 57645 + engine_attribute = 57647 + engines = 57646 + enum = 57648 + eq = 57938 + yyErrCode = 57345 + errorKwd = 57649 + escape = 57651 + escaped = 57411 + event = 57652 + events = 57653 + except = 57412 + exchange = 57654 + execute = 57655 + exists = 57413 + expansion = 57656 + expire = 57657 + explain = 57414 + explore = 57658 + export = 57659 + extended = 57660 + extentSize = 57661 + failedLoginAttempts = 57662 + falseKwd = 57415 + faultsSym = 57663 + fetch = 57416 + fields = 57664 + file = 57665 + fileBlockSize = 57666 + first = 57667 + firstValue = 57417 + fixed = 57668 + float4Type = 57419 + float8Type = 57420 + floatLit = 57932 + floatType = 57418 + flush = 57669 + following = 57670 + forKwd = 57421 + force = 57422 + foreign = 57423 + format = 57671 + found = 57672 + from = 57424 + full = 57673 + fulltext = 57425 + function = 57674 + ge = 57939 + general = 57675 + generated = 57426 + geometry = 57676 + geometryCollection = 57677 + getFormat = 57893 + global = 57678 + grant = 57427 + grants = 57679 + group = 57428 + groups = 57429 + hash = 57680 + having = 57430 + hexLit = 57935 + highPriority = 57431 + higherThanComma = 57975 + higherThanParenthese = 57969 + hintComment = 57354 + histogram = 57681 + history = 57682 + hosts = 57683 + hour = 57684 + hourMicrosecond = 57432 + hourMinute = 57433 + hourSecond = 57434 + identSQLErrors = 57650 + identified = 57685 + identifier = 57346 + ifKwd = 57435 + ignore = 57436 + importKwd = 57686 + in = 57437 + inactive = 57687 + index = 57438 + indexes = 57688 + infile = 57439 + initialSize = 57689 + inner = 57440 + inplace = 57894 + insert = 57441 + insertMethod = 57690 + insertValues = 57958 + instance = 57691 + instant = 57895 + int1Type = 57443 + int2Type = 57444 + int3Type = 57445 + int4Type = 57446 + int8Type = 57447 + intLit = 57934 + intType = 57442 + integerType = 57448 + intersect = 57449 + interval = 57450 + into = 57451 + invalid = 57353 + invisible = 57692 + invoker = 57693 + io = 57694 + ipc = 57695 + is = 57452 + isolation = 57696 + issuer = 57697 + join = 57453 + jsonArrayagg = 57896 + jsonObjectAgg = 57897 + jsonSumCrc32 = 57898 + jsonType = 57698 + jss = 57941 + juss = 57942 + key = 57454 + keyBlockSize = 57700 + keyring = 57699 + keys = 57455 + kill = 57456 + lag = 57457 + language = 57701 + last = 57702 + lastValue = 57458 + lateral = 57459 + le = 57940 + lead = 57460 + leading = 57461 + left = 57462 + less = 57703 + level = 57704 + like = 57463 + limit = 57464 + lineString = 57705 + linear = 57465 + lines = 57466 + list = 57706 + load = 57467 + local = 57707 + localTime = 57468 + localTs = 57469 + lock = 57470 + locked = 57708 + log = 57899 + logfile = 57709 + logs = 57710 + long = 57471 + longblobType = 57472 + longtextType = 57473 + lowPriority = 57474 + lowerThanCharsetKwd = 57961 + lowerThanComma = 57974 + lowerThanCreateTableSelect = 57959 + lowerThanEq = 57971 + lowerThanFunction = 57966 + lowerThanInsertValues = 57957 + lowerThanKey = 57962 + lowerThanLocal = 57963 + lowerThanNot = 57973 + lowerThanOn = 57970 + lowerThanParenthese = 57968 + lowerThanRemove = 57964 + lowerThanSelectOpt = 57951 + lowerThanSelectStmt = 57956 + lowerThanSetKeyword = 57955 + lowerThanStringLitToken = 57954 + lowerThanValueKeyword = 57952 + lowerThanWith = 57953 + lowerThenOrder = 57965 + lsh = 57943 + manual = 57711 + master = 57712 + match = 57475 + maxConnectionsPerHour = 57713 + maxQueriesPerHour = 57714 + maxRows = 57715 + maxSize = 57716 + maxUpdatesPerHour = 57717 + maxUserConnections = 57718 + maxValue = 57476 + mediumIntType = 57478 + mediumblobType = 57477 + mediumtextType = 57479 + member = 57719 + memberof = 57347 + memory = 57720 + merge = 57721 + microsecond = 57722 + middleIntType = 57480 + migrate = 57723 + minRows = 57725 + minute = 57724 + minuteMicrosecond = 57481 + minuteSecond = 57482 + mod = 57483 + mode = 57726 + modify = 57727 + month = 57728 + multiLineString = 57729 + multiPoint = 57730 + multiPolygon = 57731 + nameKwd = 57732 + names = 57733 + national = 57734 + natural = 57484 + ncharType = 57735 + neg = 57972 + neq = 57944 + neqSynonym = 57945 + never = 57736 + next = 57737 + no = 57738 + noWaitTablespace = 57742 + noWriteToBinLog = 57486 + nodegroup = 57739 + none = 57740 + not = 57485 + not2 = 57949 + nowait = 57741 + nthValue = 57487 + ntile = 57488 + null = 57489 + nulleq = 57946 + nulls = 57743 + numericType = 57490 + nvarcharType = 57744 + of = 57491 + offset = 57745 + old = 57746 + on = 57492 + one = 57747 + only = 57748 + open = 57749 + optimize = 57493 + optimizerCosts = 57494 + option = 57495 + optionally = 57496 + optionallyEnclosedBy = 57348 + or = 57497 + order = 57498 + organization = 57750 + outer = 57499 + outfile = 57500 + over = 57501 + packKeys = 57751 + pageSym = 57752 + paramMarker = 57947 + parser = 57753 + partial = 57754 + partition = 57502 + partitioning = 57755 + partitions = 57756 + password = 57757 + passwordLockTime = 57758 + percentRank = 57503 + phase = 57759 + pipes = 57356 + pipesAsOr = 57760 + plugins = 57761 + point = 57762 + polygon = 57763 + preceding = 57764 + precisionType = 57504 + prepare = 57765 + primary = 57505 + privileges = 57766 + procedure = 57506 + process = 57767 + processlist = 57768 + profile = 57769 + profiles = 57770 + proxy = 57771 + quarter = 57772 + query = 57773 + quick = 57774 + rangeKwd = 57507 + rank = 57508 + read = 57509 + realType = 57510 + rebuild = 57775 + recover = 57776 + recursive = 57511 + redoBufferSize = 57777 + redundant = 57778 + reference = 57779 + references = 57512 + regexpKwd = 57513 + relay = 57780 + release = 57514 + reload = 57781 + remove = 57782 + rename = 57515 + reorganize = 57783 + repair = 57784 + repeat = 57516 + repeatable = 57785 + replace = 57517 + replica = 57786 + replication = 57787 + requireKwd = 57518 + resource = 57788 + respect = 57789 + restart = 57790 + restrict = 57519 + resume = 57791 + retain = 57792 + reuse = 57793 + reverse = 57794 + revoke = 57520 + right = 57521 + rlike = 57522 + role = 57795 + rollback = 57796 + rollup = 57797 + rotate = 57798 + routine = 57799 + row = 57523 + rowCount = 57800 + rowFormat = 57801 + rowNumber = 57525 + rows = 57524 + rsh = 57948 + rtree = 57802 + s3 = 57900 + san = 57803 + savepoint = 57804 + second = 57805 + secondMicrosecond = 57526 + secondaryEngine = 57806 + secondaryEngineAttribute = 57807 + secondaryLoad = 57808 + secondaryUnload = 57809 + security = 57810 + selectKwd = 57527 + separator = 57811 + serial = 57812 + serializable = 57813 + session = 57814 + set = 57528 + share = 57815 + show = 57529 + shutdown = 57816 + signed = 57817 + simple = 57818 + singleAtIdentifier = 57351 + skip = 57819 + slave = 57820 + slow = 57821 + smallIntType = 57530 + snapshot = 57822 + some = 57823 + source = 57824 + spatial = 57531 + sql = 57532 + sqlBigResult = 57533 + sqlBufferResult = 57825 + sqlCache = 57826 + sqlCalcFoundRows = 57534 + sqlNoCache = 57827 + sqlSmallResult = 57535 + sqlTsiDay = 57828 + sqlTsiHour = 57829 + sqlTsiMinute = 57830 + sqlTsiMonth = 57831 + sqlTsiQuarter = 57832 + sqlTsiSecond = 57833 + sqlTsiWeek = 57834 + sqlTsiYear = 57835 + srid = 57836 + ssl = 57536 + start = 57837 + starting = 57537 + statsAutoRecalc = 57838 + statsPersistent = 57839 + statsSamplePages = 57840 + status = 57841 + storage = 57842 + stored = 57538 + straightJoin = 57539 + stringLit = 57350 + subDate = 57901 + subject = 57843 + subpartition = 57844 + subpartitions = 57845 + super = 57846 + suspend = 57847 + swaps = 57848 + switchesSym = 57849 + system = 57540 + tableKwd = 57541 + tableRefPriority = 57967 + tables = 57850 + tablespace = 57851 + temporary = 57852 + temptable = 57853 + terminated = 57542 + textType = 57854 + than = 57855 + then = 57543 + timeType = 57856 + timestampAdd = 57902 + timestampDiff = 57903 + timestampType = 57857 + tinyIntType = 57545 + tinyblobType = 57544 + tinytextType = 57546 + tls = 57904 + to = 57547 + tokenIssuer = 57858 + tp = 57863 + traditional = 57859 + trailing = 57548 + transaction = 57860 + trigger = 57549 + triggers = 57861 + trueKwd = 57550 + truncate = 57862 + unbounded = 57864 + uncommitted = 57865 + undefined = 57866 + underscoreCS = 57349 + undo = 57551 + undoBufferSize = 57868 + undofile = 57867 + unicodeSym = 57869 + union = 57552 + unique = 57553 + unknown = 57870 + unlock = 57554 + unsigned = 57555 + update = 57556 + usage = 57557 + use = 57558 + useFrm = 57872 + user = 57871 + userResources = 57873 + using = 57559 + utcDate = 57560 + utcTime = 57561 + utcTimestamp = 57562 + validation = 57874 + value = 57875 + values = 57563 + varbinaryType = 57564 + varcharType = 57565 + varcharacter = 57566 + variables = 57876 + varying = 57567 + view = 57877 + virtual = 57568 + visible = 57878 + wait = 57879 + warnings = 57880 + week = 57881 + weightString = 57882 + when = 57569 + where = 57570 + window = 57571 + with = 57572 + without = 57883 + work = 57884 + write = 57573 + x509 = 57885 + xa = 57886 + xid = 57887 + xor = 57574 + yearMonth = 57575 + yearType = 57888 + zerofill = 57576 + + yyMaxDepth = 200 + yyTabOfs = -2121 +) + +var ( + yyXLAT = map[int]int{ + 57344: 0, // $end (1862x) + 59: 1, // ';' (1861x) + 57612: 2, // comment (1672x) + 57782: 3, // remove (1632x) + 57783: 4, // reorganize (1632x) + 57807: 5, // secondaryEngineAttribute (1557x) + 57842: 6, // storage (1531x) + 57589: 7, // autoIncrement (1525x) + 44: 8, // ',' (1471x) + 57667: 9, // first (1471x) + 57580: 10, // after (1469x) + 57812: 11, // serial (1465x) + 57611: 12, // columnFormat (1464x) + 57836: 13, // srid (1464x) + 57757: 14, // password (1395x) + 57642: 15, // encryption (1370x) + 57604: 16, // charsetKwd (1368x) + 57645: 17, // engine (1367x) + 41: 18, // ')' (1364x) + 57647: 19, // engine_attribute (1363x) + 57739: 20, // nodegroup (1363x) + 57588: 21, // autoextendSize (1354x) + 57700: 22, // keyBlockSize (1339x) + 57851: 23, // tablespace (1337x) + 57788: 24, // resource (1331x) + 57586: 25, // attribute (1327x) + 57577: 26, // account (1325x) + 57662: 27, // failedLoginAttempts (1325x) + 57758: 28, // passwordLockTime (1325x) + 57624: 29, // data (1324x) + 57690: 30, // insertMethod (1322x) + 57715: 31, // maxRows (1322x) + 57725: 32, // minRows (1322x) + 57619: 33, // connection (1316x) + 57591: 34, // avgRowLength (1313x) + 57605: 35, // checksum (1313x) + 57617: 36, // compression (1313x) + 57632: 37, // delayKeyWrite (1313x) + 57751: 38, // packKeys (1313x) + 57801: 39, // rowFormat (1313x) + 57806: 40, // secondaryEngine (1313x) + 57838: 41, // statsAutoRecalc (1313x) + 57839: 42, // statsPersistent (1313x) + 57840: 43, // statsSamplePages (1313x) + 57817: 44, // signed (1303x) + 57879: 45, // wait (1299x) + 57661: 46, // extentSize (1294x) + 57666: 47, // fileBlockSize (1294x) + 57689: 48, // initialSize (1294x) + 57716: 49, // maxSize (1294x) + 57742: 50, // noWaitTablespace (1294x) + 57777: 51, // redoBufferSize (1294x) + 57868: 52, // undoBufferSize (1294x) + 57863: 53, // tp (1282x) + 57582: 54, // algorithm (1281x) + 57692: 55, // invisible (1281x) + 57878: 56, // visible (1281x) + 57877: 57, // view (1277x) + 57585: 58, // ascii (1272x) + 57850: 59, // tables (1272x) + 57628: 60, // day (1270x) + 57892: 61, // defined (1270x) + 57888: 62, // yearType (1270x) + 57600: 63, // byteType (1268x) + 57869: 64, // unicodeSym (1268x) + 57684: 65, // hour (1266x) + 57722: 66, // microsecond (1266x) + 57724: 67, // minute (1266x) + 57728: 68, // month (1266x) + 57772: 69, // quarter (1266x) + 57805: 70, // second (1266x) + 57844: 71, // subpartition (1266x) + 57881: 72, // week (1266x) + 57610: 73, // columns (1265x) + 57664: 74, // fields (1265x) + 57738: 75, // no (1265x) + 57707: 76, // local (1264x) + 57811: 77, // separator (1264x) + 57841: 78, // status (1264x) + 57606: 79, // cipher (1263x) + 57623: 80, // current (1263x) + 57697: 81, // issuer (1263x) + 57713: 82, // maxConnectionsPerHour (1263x) + 57714: 83, // maxQueriesPerHour (1263x) + 57717: 84, // maxUpdatesPerHour (1263x) + 57718: 85, // maxUserConnections (1263x) + 57764: 86, // preceding (1263x) + 57803: 87, // san (1263x) + 57835: 88, // sqlTsiYear (1263x) + 57843: 89, // subject (1263x) + 57858: 90, // tokenIssuer (1263x) + 57630: 91, // definer (1262x) + 57631: 92, // definition (1262x) + 57633: 93, // description (1262x) + 57636: 94, // discard (1262x) + 57685: 95, // identified (1262x) + 57732: 96, // nameKwd (1262x) + 57750: 97, // organization (1262x) + 57756: 98, // partitions (1262x) + 57828: 99, // sqlTsiDay (1262x) + 57829: 100, // sqlTsiHour (1262x) + 57830: 101, // sqlTsiMinute (1262x) + 57831: 102, // sqlTsiMonth (1262x) + 57832: 103, // sqlTsiQuarter (1262x) + 57833: 104, // sqlTsiSecond (1262x) + 57834: 105, // sqlTsiWeek (1262x) + 57871: 106, // user (1262x) + 57587: 107, // auto (1261x) + 57626: 108, // dateType (1261x) + 57346: 109, // identifier (1261x) + 57710: 110, // logs (1261x) + 57711: 111, // manual (1261x) + 57747: 112, // one (1261x) + 57791: 113, // resume (1261x) + 57792: 114, // retain (1261x) + 57847: 115, // suspend (1261x) + 57856: 116, // timeType (1261x) + 57660: 117, // extended (1260x) + 57680: 118, // hash (1260x) + 57789: 119, // respect (1260x) + 57862: 120, // truncate (1260x) + 57643: 121, // end (1259x) + 57644: 122, // enforced (1259x) + 57670: 123, // following (1259x) + 57741: 124, // nowait (1259x) + 57774: 125, // quick (1259x) + 57819: 126, // skip (1259x) + 57864: 127, // unbounded (1259x) + 57872: 128, // useFrm (1259x) + 57608: 129, // coalesce (1258x) + 57698: 130, // jsonType (1258x) + 57748: 131, // only (1258x) + 57765: 132, // prepare (1258x) + 57857: 133, // timestampType (1258x) + 57875: 134, // value (1258x) + 57609: 135, // collation (1257x) + 57627: 136, // datetimeType (1257x) + 57671: 137, // format (1257x) + 57677: 138, // geometryCollection (1257x) + 57705: 139, // lineString (1257x) + 57899: 140, // log (1257x) + 57729: 141, // multiLineString (1257x) + 57730: 142, // multiPoint (1257x) + 57731: 143, // multiPolygon (1257x) + 57745: 144, // offset (1257x) + 57762: 145, // point (1257x) + 57763: 146, // polygon (1257x) + 57795: 147, // role (1257x) + 57870: 148, // unknown (1257x) + 57598: 149, // btree (1256x) + 57668: 150, // fixed (1256x) + 57696: 151, // isolation (1256x) + 57709: 152, // logfile (1256x) + 57720: 153, // memory (1256x) + 57766: 154, // privileges (1256x) + 57773: 155, // query (1256x) + 57784: 156, // repair (1256x) + 57794: 157, // reverse (1256x) + 57796: 158, // rollback (1256x) + 57800: 159, // rowCount (1256x) + 57802: 160, // rtree (1256x) + 57874: 161, // validation (1256x) + 57876: 162, // variables (1256x) + 57592: 163, // begin (1255x) + 57613: 164, // commit (1255x) + 57625: 165, // datafile (1255x) + 57635: 166, // disable (1255x) + 57640: 167, // dynamic (1255x) + 57641: 168, // enable (1255x) + 57649: 169, // errorKwd (1255x) + 57673: 170, // full (1255x) + 57726: 171, // mode (1255x) + 57768: 172, // processlist (1255x) + 57779: 173, // reference (1255x) + 57804: 174, // savepoint (1255x) + 57837: 175, // start (1255x) + 57845: 176, // subpartitions (1255x) + 57852: 177, // temporary (1255x) + 57883: 178, // without (1255x) + 57884: 179, // work (1255x) + 57579: 180, // active (1254x) + 57593: 181, // binlog (1254x) + 57595: 182, // block (1254x) + 57597: 183, // booleanType (1254x) + 57599: 184, // buckets (1254x) + 57602: 185, // chain (1254x) + 57603: 186, // channel (1254x) + 57615: 187, // compact (1254x) + 57616: 188, // compressed (1254x) + 57621: 189, // context (1254x) + 57891: 190, // copyKwd (1254x) + 57622: 191, // cpu (1254x) + 57629: 192, // deallocate (1254x) + 57634: 193, // directory (1254x) + 57637: 194, // disk (1254x) + 57638: 195, // do (1254x) + 57654: 196, // exchange (1254x) + 57655: 197, // execute (1254x) + 57656: 198, // expansion (1254x) + 57669: 199, // flush (1254x) + 57675: 200, // general (1254x) + 57681: 201, // histogram (1254x) + 57683: 202, // hosts (1254x) + 57650: 203, // identSQLErrors (1254x) + 57686: 204, // importKwd (1254x) + 57687: 205, // inactive (1254x) + 57894: 206, // inplace (1254x) + 57895: 207, // instant (1254x) + 57695: 208, // ipc (1254x) + 57708: 209, // locked (1254x) + 57712: 210, // master (1254x) + 57727: 211, // modify (1254x) + 57743: 212, // nulls (1254x) + 57746: 213, // old (1254x) + 57752: 214, // pageSym (1254x) + 57775: 215, // rebuild (1254x) + 57778: 216, // redundant (1254x) + 57780: 217, // relay (1254x) + 57790: 218, // restart (1254x) + 57799: 219, // routine (1254x) + 57900: 220, // s3 (1254x) + 57808: 221, // secondaryLoad (1254x) + 57809: 222, // secondaryUnload (1254x) + 57815: 223, // share (1254x) + 57816: 224, // shutdown (1254x) + 57820: 225, // slave (1254x) + 57821: 226, // slow (1254x) + 57824: 227, // source (1254x) + 57848: 228, // swaps (1254x) + 57859: 229, // traditional (1254x) + 57867: 230, // undofile (1254x) + 57873: 231, // userResources (1254x) + 57880: 232, // warnings (1254x) + 57886: 233, // xa (1254x) + 57578: 234, // action (1253x) + 57581: 235, // against (1253x) + 57583: 236, // always (1253x) + 57594: 237, // bitType (1253x) + 57596: 238, // boolType (1253x) + 57601: 239, // cascaded (1253x) + 57607: 240, // client (1253x) + 57614: 241, // committed (1253x) + 57620: 242, // consistent (1253x) + 57639: 243, // duplicate (1253x) + 57646: 244, // engines (1253x) + 57648: 245, // enum (1253x) + 57653: 246, // events (1253x) + 57657: 247, // expire (1253x) + 57659: 248, // export (1253x) + 57663: 249, // faultsSym (1253x) + 57676: 250, // geometry (1253x) + 57678: 251, // global (1253x) + 57679: 252, // grants (1253x) + 57682: 253, // history (1253x) + 57688: 254, // indexes (1253x) + 57691: 255, // instance (1253x) + 57693: 256, // invoker (1253x) + 57694: 257, // io (1253x) + 57699: 258, // keyring (1253x) + 57701: 259, // language (1253x) + 57702: 260, // last (1253x) + 57703: 261, // less (1253x) + 57704: 262, // level (1253x) + 57706: 263, // list (1253x) + 57721: 264, // merge (1253x) + 57723: 265, // migrate (1253x) + 57734: 266, // national (1253x) + 57735: 267, // ncharType (1253x) + 57736: 268, // never (1253x) + 57737: 269, // next (1253x) + 57740: 270, // none (1253x) + 57744: 271, // nvarcharType (1253x) + 57749: 272, // open (1253x) + 57753: 273, // parser (1253x) + 57754: 274, // partial (1253x) + 57755: 275, // partitioning (1253x) + 57759: 276, // phase (1253x) + 57761: 277, // plugins (1253x) + 57769: 278, // profile (1253x) + 57770: 279, // profiles (1253x) + 57776: 280, // recover (1253x) + 57781: 281, // reload (1253x) + 57785: 282, // repeatable (1253x) + 57786: 283, // replica (1253x) + 57793: 284, // reuse (1253x) + 57797: 285, // rollup (1253x) + 57798: 286, // rotate (1253x) + 57810: 287, // security (1253x) + 57813: 288, // serializable (1253x) + 57814: 289, // session (1253x) + 57818: 290, // simple (1253x) + 57822: 291, // snapshot (1253x) + 57849: 292, // switchesSym (1253x) + 57853: 293, // temptable (1253x) + 57854: 294, // textType (1253x) + 57855: 295, // than (1253x) + 57904: 296, // tls (1253x) + 57860: 297, // transaction (1253x) + 57861: 298, // triggers (1253x) + 57865: 299, // uncommitted (1253x) + 57866: 300, // undefined (1253x) + 57885: 301, // x509 (1253x) + 57887: 302, // xid (1253x) + 57889: 303, // addDate (1252x) + 57584: 304, // any (1252x) + 57590: 305, // avg (1252x) + 57890: 306, // compress (1252x) + 57618: 307, // config (1252x) + 57651: 308, // escape (1252x) + 57652: 309, // event (1252x) + 57658: 310, // explore (1252x) + 57665: 311, // file (1252x) + 57672: 312, // found (1252x) + 57674: 313, // function (1252x) + 57893: 314, // getFormat (1252x) + 57896: 315, // jsonArrayagg (1252x) + 57897: 316, // jsonObjectAgg (1252x) + 57898: 317, // jsonSumCrc32 (1252x) + 57719: 318, // member (1252x) + 57733: 319, // names (1252x) + 57767: 320, // process (1252x) + 57771: 321, // proxy (1252x) + 57787: 322, // replication (1252x) + 57823: 323, // some (1252x) + 57825: 324, // sqlBufferResult (1252x) + 57826: 325, // sqlCache (1252x) + 57827: 326, // sqlNoCache (1252x) + 57901: 327, // subDate (1252x) + 57846: 328, // super (1252x) + 57902: 329, // timestampAdd (1252x) + 57903: 330, // timestampDiff (1252x) + 57882: 331, // weightString (1252x) + 40: 332, // '(' (1126x) + 57492: 333, // on (1108x) + 57949: 334, // not2 (1056x) + 57350: 335, // stringLit (1031x) + 57485: 336, // not (1002x) + 57572: 337, // with (1002x) + 57363: 338, // as (959x) + 57397: 339, // defaultKwd (905x) + 57462: 340, // left (901x) + 57521: 341, // right (901x) + 57552: 342, // union (868x) + 57378: 343, // collate (863x) + 43: 344, // '+' (849x) + 45: 345, // '-' (847x) + 57483: 346, // mod (844x) + 57412: 347, // except (810x) + 57449: 348, // intersect (809x) + 57489: 349, // null (808x) + 57421: 350, // forKwd (780x) + 57451: 351, // into (780x) + 57464: 352, // limit (773x) + 57470: 353, // lock (772x) + 57502: 354, // partition (767x) + 57416: 355, // fetch (757x) + 57424: 356, // from (755x) + 57498: 357, // order (755x) + 57361: 358, // and (747x) + 42: 359, // '*' (740x) + 57570: 360, // where (737x) + 57559: 361, // using (723x) + 57497: 362, // or (722x) + 57355: 363, // andand (721x) + 57760: 364, // pipesAsOr (721x) + 57574: 365, // xor (721x) + 57938: 366, // eq (719x) + 57528: 367, // set (717x) + 57428: 368, // group (699x) + 57430: 369, // having (696x) + 57375: 370, // charType (692x) + 57563: 371, // values (692x) + 57539: 372, // straightJoin (688x) + 57453: 373, // join (685x) + 57571: 374, // window (682x) + 57934: 375, // intLit (678x) + 57484: 376, // natural (666x) + 57383: 377, // cross (665x) + 57440: 378, // inner (665x) + 125: 379, // '}' (662x) + 57517: 380, // replace (661x) + 57463: 381, // like (650x) + 57524: 382, // rows (649x) + 57507: 383, // rangeKwd (641x) + 57429: 384, // groups (640x) + 57401: 385, // desc (639x) + 57364: 386, // asc (637x) + 57392: 387, // dayHour (635x) + 57393: 388, // dayMicrosecond (635x) + 57394: 389, // dayMinute (635x) + 57395: 390, // daySecond (635x) + 57432: 391, // hourMicrosecond (635x) + 57433: 392, // hourMinute (635x) + 57434: 393, // hourSecond (635x) + 57481: 394, // minuteMicrosecond (635x) + 57482: 395, // minuteSecond (635x) + 57526: 396, // secondMicrosecond (635x) + 57575: 397, // yearMonth (635x) + 57437: 398, // in (634x) + 57569: 399, // when (634x) + 57367: 400, // binaryType (633x) + 57409: 401, // elseKwd (631x) + 57543: 402, // then (628x) + 60: 403, // '<' (621x) + 62: 404, // '>' (621x) + 57939: 405, // ge (621x) + 57452: 406, // is (621x) + 57940: 407, // le (621x) + 57944: 408, // neq (621x) + 57945: 409, // neqSynonym (621x) + 57946: 410, // nulleq (621x) + 37: 411, // '%' (614x) + 38: 412, // '&' (614x) + 47: 413, // '/' (614x) + 94: 414, // '^' (614x) + 124: 415, // '|' (614x) + 57365: 416, // between (614x) + 57405: 417, // div (614x) + 57943: 418, // lsh (614x) + 57948: 419, // rsh (614x) + 57513: 420, // regexpKwd (610x) + 57522: 421, // rlike (610x) + 57347: 422, // memberof (607x) + 57454: 423, // key (591x) + 57351: 424, // singleAtIdentifier (587x) + 57389: 425, // currentUser (585x) + 57935: 426, // hexLit (585x) + 57936: 427, // bitLit (582x) + 57435: 428, // ifKwd (582x) + 57377: 429, // check (578x) + 57441: 430, // insert (575x) + 57450: 431, // interval (574x) + 57947: 432, // paramMarker (574x) + 57505: 433, // primary (574x) + 57523: 434, // row (574x) + 123: 435, // '{' (572x) + 57933: 436, // decLit (572x) + 57932: 437, // floatLit (572x) + 57553: 438, // unique (572x) + 57380: 439, // constraint (569x) + 57390: 440, // database (569x) + 57415: 441, // falseKwd (568x) + 57356: 442, // pipes (568x) + 57550: 443, // trueKwd (568x) + 57413: 444, // exists (567x) + 57512: 445, // references (567x) + 57381: 446, // convert (566x) + 57516: 447, // repeat (565x) + 57912: 448, // builtinCurDate (564x) + 57920: 449, // builtinNow (564x) + 57385: 450, // currentDate (564x) + 57388: 451, // currentTs (564x) + 57468: 452, // localTime (564x) + 57469: 453, // localTs (564x) + 57426: 454, // generated (563x) + 57349: 455, // underscoreCS (563x) + 57352: 456, // doubleAtIdentifier (562x) + 57911: 457, // builtinCount (561x) + 33: 458, // '!' (560x) + 126: 459, // '~' (560x) + 57905: 460, // builtinApproxCountDistinct (560x) + 57906: 461, // builtinApproxPercentile (560x) + 57907: 462, // builtinBitAnd (560x) + 57908: 463, // builtinBitOr (560x) + 57909: 464, // builtinBitXor (560x) + 57910: 465, // builtinCast (560x) + 57913: 466, // builtinCurTime (560x) + 57914: 467, // builtinDateAdd (560x) + 57915: 468, // builtinDateSub (560x) + 57916: 469, // builtinExtract (560x) + 57917: 470, // builtinGroupConcat (560x) + 57918: 471, // builtinMax (560x) + 57919: 472, // builtinMin (560x) + 57921: 473, // builtinPosition (560x) + 57922: 474, // builtinStddevPop (560x) + 57923: 475, // builtinStddevSamp (560x) + 57924: 476, // builtinSubstring (560x) + 57925: 477, // builtinSum (560x) + 57926: 478, // builtinSysDate (560x) + 57927: 479, // builtinTranslate (560x) + 57928: 480, // builtinTrim (560x) + 57929: 481, // builtinUser (560x) + 57930: 482, // builtinVarPop (560x) + 57931: 483, // builtinVarSamp (560x) + 57373: 484, // caseKwd (560x) + 57384: 485, // cumeDist (560x) + 57386: 486, // currentRole (560x) + 57387: 487, // currentTime (560x) + 57400: 488, // denseRank (560x) + 57417: 489, // firstValue (560x) + 57457: 490, // lag (560x) + 57458: 491, // lastValue (560x) + 57460: 492, // lead (560x) + 57487: 493, // nthValue (560x) + 57488: 494, // ntile (560x) + 57503: 495, // percentRank (560x) + 57508: 496, // rank (560x) + 57525: 497, // rowNumber (560x) + 57560: 498, // utcDate (560x) + 57561: 499, // utcTime (560x) + 57562: 500, // utcTimestamp (560x) + 57475: 501, // match (512x) + 57541: 502, // tableKwd (496x) + 57436: 503, // ignore (481x) + 57527: 504, // selectKwd (470x) + 57376: 505, // character (463x) + 58167: 506, // Identifier (454x) + 58235: 507, // NotKeywordToken (454x) + 58450: 508, // UnReservedKeyword (454x) + 57438: 509, // index (434x) + 57547: 510, // to (419x) + 57422: 511, // force (414x) + 46: 512, // '.' (409x) + 57941: 513, // jss (380x) + 57942: 514, // juss (380x) + 57362: 515, // array (373x) + 57937: 516, // assignmentEq (369x) + 57556: 517, // update (368x) + 57509: 518, // read (367x) + 57518: 519, // requireKwd (365x) + 57466: 520, // lines (360x) + 57459: 521, // lateral (355x) + 57370: 522, // by (354x) + 57558: 523, // use (354x) + 64: 524, // '@' (350x) + 57359: 525, // alter (350x) + 57532: 526, // sql (350x) + 57407: 527, // drop (348x) + 57372: 528, // cascade (344x) + 57519: 529, // restrict (344x) + 57531: 530, // spatial (341x) + 57357: 531, // add (340x) + 57360: 532, // analyze (340x) + 57423: 533, // foreign (339x) + 57425: 534, // fulltext (339x) + 57515: 535, // rename (338x) + 57396: 536, // decimalType (337x) + 57406: 537, // doubleType (337x) + 57418: 538, // floatType (337x) + 57493: 539, // optimize (337x) + 57510: 540, // realType (337x) + 57566: 541, // varcharacter (337x) + 57565: 542, // varcharType (337x) + 57448: 543, // integerType (336x) + 57442: 544, // intType (336x) + 57573: 545, // write (336x) + 57374: 546, // change (335x) + 57564: 547, // varbinaryType (335x) + 57366: 548, // bigIntType (334x) + 57368: 549, // blobType (334x) + 57419: 550, // float4Type (334x) + 57420: 551, // float8Type (334x) + 57443: 552, // int1Type (334x) + 57444: 553, // int2Type (334x) + 57445: 554, // int3Type (334x) + 57446: 555, // int4Type (334x) + 57447: 556, // int8Type (334x) + 57471: 557, // long (334x) + 57472: 558, // longblobType (334x) + 57473: 559, // longtextType (334x) + 57477: 560, // mediumblobType (334x) + 57478: 561, // mediumIntType (334x) + 57479: 562, // mediumtextType (334x) + 57480: 563, // middleIntType (334x) + 57490: 564, // numericType (334x) + 57530: 565, // smallIntType (334x) + 57544: 566, // tinyblobType (334x) + 57545: 567, // tinyIntType (334x) + 57546: 568, // tinytextType (334x) + 58405: 569, // SubSelect (204x) + 58150: 570, // FunctionNameConflictNonNow (174x) + 58459: 571, // UserVariable (174x) + 58387: 572, // SimpleIdent (173x) + 58215: 573, // Literal (172x) + 58396: 574, // StringLiteral (172x) + 58146: 575, // FunctionCallGeneric (169x) + 58147: 576, // FunctionCallKeyword (169x) + 58148: 577, // FunctionCallNonKeyword (169x) + 58149: 578, // FunctionNameConflict (169x) + 58151: 579, // FunctionNameDateArith (169x) + 58152: 580, // FunctionNameDateArithMultiForms (169x) + 58153: 581, // FunctionNameDatetimePrecision (169x) + 58154: 582, // FunctionNameOptionalBraces (169x) + 58386: 583, // SimpleExpr (169x) + 58406: 584, // SumExpr (169x) + 58408: 585, // SystemVariable (169x) + 58470: 586, // Variable (169x) + 58493: 587, // WindowFuncCall (169x) + 58011: 588, // BitExpr (155x) + 58295: 589, // PredicateExpr (134x) + 58014: 590, // BoolPri (131x) + 58114: 591, // Expression (131x) + 58510: 592, // logAnd (96x) + 58511: 593, // logOr (96x) + 57358: 594, // all (72x) + 58231: 595, // NUM (66x) + 58397: 596, // StringName (60x) + 58105: 597, // EqOpt (53x) + 58419: 598, // TableName (51x) + 57555: 599, // unsigned (51x) + 57576: 600, // zerofill (48x) + 57501: 601, // over (45x) + 58033: 602, // ColumnName (40x) + 57403: 603, // distinct (36x) + 57404: 604, // distinctRow (36x) + 58498: 605, // WindowingClause (35x) + 57474: 606, // lowPriority (33x) + 57398: 607, // delayed (32x) + 57431: 608, // highPriority (32x) + 57399: 609, // deleteKwd (27x) + 57354: 610, // hintComment (27x) + 58125: 611, // FieldLen (25x) + 58270: 612, // OptWindowingClause (24x) + 58206: 613, // LengthNum (23x) + 57533: 614, // sqlBigResult (23x) + 57534: 615, // sqlCalcFoundRows (23x) + 57535: 616, // sqlSmallResult (23x) + 58346: 617, // SelectStmt (22x) + 58347: 618, // SelectStmtBasic (22x) + 58349: 619, // SelectStmtFromDualTable (22x) + 58350: 620, // SelectStmtFromTable (22x) + 58115: 621, // ExpressionList (21x) + 58364: 622, // SetOprClause (21x) + 57542: 623, // terminated (21x) + 58461: 624, // Username (21x) + 58365: 625, // SetOprClauseList (20x) + 58368: 626, // SetOprStmtWithLimitOrderBy (20x) + 58369: 627, // SetOprStmtWoutLimitOrderBy (20x) + 58023: 628, // CharsetKw (19x) + 57410: 629, // enclosed (19x) + 58275: 630, // OrderBy (19x) + 58353: 631, // SelectStmtLimit (19x) + 57411: 632, // escaped (18x) + 57348: 633, // optionallyEnclosedBy (18x) + 58359: 634, // SelectStmtWithClause (18x) + 58367: 635, // SetOprStmt (18x) + 58499: 636, // WithClause (18x) + 58436: 637, // TablespaceOption (17x) + 58086: 638, // DistinctKwd (15x) + 58087: 639, // DistinctOpt (14x) + 58255: 640, // OptFieldLen (14x) + 58437: 641, // TablespaceOptionList (14x) + 58438: 642, // TablespaceOptionListOpt (13x) + 58080: 643, // DefaultKwdOpt (12x) + 58106: 644, // EqOrAssignmentEq (12x) + 58113: 645, // ExprOrDefault (12x) + 58201: 646, // JoinTable (12x) + 58250: 647, // OptBinary (12x) + 58334: 648, // RolenameComposed (12x) + 58416: 649, // TableFactor (12x) + 58428: 650, // TableRef (12x) + 58141: 651, // FromOrIn (11x) + 58286: 652, // PartitionNameList (11x) + 57514: 653, // release (11x) + 58024: 654, // CharsetName (10x) + 58116: 655, // ExpressionListOpt (10x) + 57486: 656, // noWriteToBinLog (10x) + 58234: 657, // NoWriteToBinLogAliasOpt (10x) + 58440: 658, // TextString (10x) + 58444: 659, // TimestampUnit (10x) + 58016: 660, // BuggyDefaultFalseDistinctOpt (9x) + 58034: 661, // ColumnNameList (9x) + 58079: 662, // DefaultFalseDistinctOpt (9x) + 58186: 663, // IndexPartSpecification (9x) + 58202: 664, // JoinType (9x) + 58203: 665, // KeyOrIndex (9x) + 58236: 666, // NotSym (9x) + 58333: 667, // Rolename (9x) + 58328: 668, // RoleNameString (9x) + 58420: 669, // TableNameList (9x) + 58068: 670, // CrossOpt (8x) + 58085: 671, // DeleteWithoutUsingStmt (8x) + 58084: 672, // DeleteWithUsingStmt (8x) + 58187: 673, // IndexPartSpecificationList (8x) + 58196: 674, // Int64Num (8x) + 58276: 675, // OrderByOptional (8x) + 58278: 676, // PartDefOption (8x) + 58443: 677, // TimeUnit (8x) + 58453: 678, // UpdateStmtNoWith (8x) + 58473: 679, // VariableName (8x) + 58483: 680, // WhereClause (8x) + 58484: 681, // WhereClauseOptional (8x) + 57978: 682, // AllOrPartitionNameList (7x) + 57988: 683, // AlterTableStmt (7x) + 58055: 684, // ConstraintKeywordOpt (7x) + 58083: 685, // DeleteFromStmt (7x) + 58169: 686, // IfNotExists (7x) + 58178: 687, // IndexInvisible (7x) + 58189: 688, // IndexType (7x) + 58192: 689, // InsertIntoStmt (7x) + 58316: 690, // ReplaceIntoStmt (7x) + 58373: 691, // ShowDatabaseNameOpt (7x) + 58439: 692, // TablespaceSizeValue (7x) + 58452: 693, // UpdateStmt (7x) + 57567: 694, // varying (7x) + 58006: 695, // AuthString (6x) + 57379: 696, // column (6x) + 58029: 697, // ColumnDef (6x) + 57382: 698, // create (6x) + 58071: 699, // DatabaseOption (6x) + 58070: 700, // DBName (6x) + 58107: 701, // EscapedTableRef (6x) + 58131: 702, // FieldsOrColumns (6x) + 58129: 703, // FieldTerminator (6x) + 58139: 704, // ForceOpt (6x) + 57427: 705, // grant (6x) + 58181: 706, // IndexName (6x) + 58184: 707, // IndexOption (6x) + 58185: 708, // IndexOptionList (6x) + 58241: 709, // NumLiteral (6x) + 58299: 710, // Priority (6x) + 58335: 711, // RolenameList (6x) + 58338: 712, // RowFormat (6x) + 58354: 713, // SelectStmtLimitOpt (6x) + 58362: 714, // SetExpr (6x) + 58423: 715, // TableOptimizerHints (6x) + 58425: 716, // TableOption (6x) + 58427: 717, // TableOrTables (6x) + 58462: 718, // UsernameList (6x) + 57977: 719, // AlgorithmClause (5x) + 58017: 720, // BuiltinFunction (5x) + 58018: 721, // ByItem (5x) + 58022: 722, // Char (5x) + 58028: 723, // CollationName (5x) + 58031: 724, // ColumnKeywordOpt (5x) + 58112: 725, // ExplainableStmt (5x) + 58127: 726, // FieldOpt (5x) + 58128: 727, // FieldOpts (5x) + 58171: 728, // IgnoreOptional (5x) + 57439: 729, // infile (5x) + 58211: 730, // LimitOption (5x) + 57467: 731, // load (5x) + 58221: 732, // LockClause (5x) + 58252: 733, // OptCharsetWithOptBinary (5x) + 58262: 734, // OptNullTreatment (5x) + 58345: 735, // SelectLockOpt (5x) + 58352: 736, // SelectStmtIntoOption (5x) + 57529: 737, // show (5x) + 58411: 738, // TableAsName (5x) + 58429: 739, // TableRefs (5x) + 58508: 740, // XAXid (5x) + 58001: 741, // Assignment (4x) + 58019: 742, // ByList (4x) + 58053: 743, // Constraint (4x) + 58069: 744, // CurdateSym (4x) + 58134: 745, // FloatOpt (4x) + 58165: 746, // IdentList (4x) + 58168: 747, // IfExists (4x) + 58190: 748, // IndexTypeName (4x) + 58237: 749, // NowSym (4x) + 58238: 750, // NowSymFunc (4x) + 58239: 751, // NowSymOptionFraction (4x) + 57494: 752, // optimizerCosts (4x) + 57495: 753, // option (4x) + 57496: 754, // optionally (4x) + 58267: 755, // OptWild (4x) + 57499: 756, // outer (4x) + 58287: 757, // PartitionNameListOpt (4x) + 58294: 758, // Precision (4x) + 58300: 759, // PriorityOpt (4x) + 58306: 760, // ReferDef (4x) + 58325: 761, // RestrictOrCascadeOpt (4x) + 58340: 762, // RowStmt (4x) + 58341: 763, // RowValue (4x) + 58412: 764, // TableAsNameOpt (4x) + 58424: 765, // TableOptimizerHintsOpt (4x) + 58445: 766, // TransactionChar (4x) + 58455: 767, // UserSpec (4x) + 58494: 768, // WindowName (4x) + 57994: 769, // AnalyzeOption (3x) + 58002: 770, // AssignmentList (3x) + 58021: 771, // CastType (3x) + 58040: 772, // ColumnOption (3x) + 58043: 773, // ColumnPosition (3x) + 58047: 774, // CommonTableExpr (3x) + 58072: 775, // DatabaseOptionList (3x) + 58075: 776, // DatabaseSym (3x) + 58081: 777, // DefaultTrueDistinctOpt (3x) + 58102: 778, // EnforcedOrNot (3x) + 58118: 779, // ExtendedPriv (3x) + 58155: 780, // GeneratedAlways (3x) + 58161: 781, // GroupByClause (3x) + 58173: 782, // IndexHint (3x) + 58177: 783, // IndexHintType (3x) + 58182: 784, // IndexNameAndTypeOpt (3x) + 58193: 785, // InsertRowAliasOpt (3x) + 58204: 786, // KeyOrIndexOpt (3x) + 57455: 787, // keys (3x) + 57476: 788, // maxValue (3x) + 58240: 789, // NowSymOptionFractionParentheses (3x) + 58263: 790, // OptOrder (3x) + 58281: 791, // PartitionDefinition (3x) + 58291: 792, // PasswordOrLockOption (3x) + 58298: 793, // PrimaryOpt (3x) + 58301: 794, // PrivElem (3x) + 58303: 795, // PrivType (3x) + 58318: 796, // RequireClause (3x) + 58319: 797, // RequireClauseOpt (3x) + 58321: 798, // RequireListElement (3x) + 58336: 799, // RolenameWithoutIdent (3x) + 58329: 800, // RoleOrPrivElem (3x) + 58351: 801, // SelectStmtGroup (3x) + 58366: 802, // SetOprOpt (3x) + 58384: 803, // SignedLiteral (3x) + 57540: 804, // system (3x) + 58413: 805, // TableElement (3x) + 58422: 806, // TableNameOptWild (3x) + 58426: 807, // TableOptionList (3x) + 58446: 808, // TransactionChars (3x) + 57549: 809, // trigger (3x) + 57551: 810, // undo (3x) + 57554: 811, // unlock (3x) + 57557: 812, // usage (3x) + 58456: 813, // UserSpecList (3x) + 58468: 814, // ValuesStmtList (3x) + 58464: 815, // ValueSym (3x) + 58491: 816, // WindowFrameStart (3x) + 58506: 817, // WorkOpt (3x) + 57979: 818, // AlterDatabaseStmt (2x) + 57980: 819, // AlterInstanceStmt (2x) + 57981: 820, // AlterLogfileGroupStmt (2x) + 57982: 821, // AlterOrderItem (2x) + 57989: 822, // AlterTablespaceStmt (2x) + 57984: 823, // AlterTableSpec (2x) + 57990: 824, // AlterUserSpec (2x) + 57992: 825, // AlterUserStmt (2x) + 57993: 826, // AlterViewStmt (2x) + 57997: 827, // AnalyzeTableStmt (2x) + 58003: 828, // AuthOption (2x) + 58005: 829, // AuthPlugin (2x) + 58008: 830, // BeginTransactionStmt (2x) + 58010: 831, // BinlogStmt (2x) + 57371: 832, // call (2x) + 58020: 833, // CallStmt (2x) + 58027: 834, // CheckConstraintKeyword (2x) + 58035: 835, // ColumnNameListOpt (2x) + 58038: 836, // ColumnNameOrUserVariable (2x) + 58041: 837, // ColumnOptionList (2x) + 58042: 838, // ColumnOptionListOpt (2x) + 58045: 839, // CommentOrAttributeOption (2x) + 58046: 840, // CommitStmt (2x) + 58049: 841, // CompletionTypeWithinTransaction (2x) + 58050: 842, // ConnectionOption (2x) + 58052: 843, // ConnectionOptions (2x) + 58056: 844, // CreateDatabaseStmt (2x) + 58057: 845, // CreateIndexStmt (2x) + 58058: 846, // CreateLogfileGroupStmt (2x) + 58059: 847, // CreateRoleStmt (2x) + 58060: 848, // CreateSpatialRefSysStmt (2x) + 58064: 849, // CreateTablespaceStmt (2x) + 58063: 850, // CreateTableStmt (2x) + 58065: 851, // CreateUserStmt (2x) + 58066: 852, // CreateViewSelectOpt (2x) + 58067: 853, // CreateViewStmt (2x) + 57391: 854, // databases (2x) + 58077: 855, // DeallocateStmt (2x) + 58078: 856, // DeallocateSym (2x) + 57402: 857, // describe (2x) + 58088: 858, // DoStmt (2x) + 58089: 859, // DropDatabaseStmt (2x) + 58090: 860, // DropIndexStmt (2x) + 58091: 861, // DropLogfileGroupStmt (2x) + 58092: 862, // DropRoleStmt (2x) + 58093: 863, // DropSpatialRefSysStmt (2x) + 58095: 864, // DropTablespaceStmt (2x) + 58094: 865, // DropTableStmt (2x) + 58096: 866, // DropUserStmt (2x) + 58097: 867, // DropViewStmt (2x) + 58098: 868, // DuplicateOpt (2x) + 58100: 869, // EmptyStmt (2x) + 58101: 870, // EncryptionOpt (2x) + 58103: 871, // EnforcedOrNotOpt (2x) + 58108: 872, // ExecuteStmt (2x) + 57414: 873, // explain (2x) + 58109: 874, // ExplainFormatType (2x) + 58110: 875, // ExplainStmt (2x) + 58111: 876, // ExplainSym (2x) + 58120: 877, // Field (2x) + 58123: 878, // FieldItem (2x) + 58130: 879, // Fields (2x) + 58138: 880, // FlushStmt (2x) + 58144: 881, // FuncDatetimePrecList (2x) + 58145: 882, // FuncDatetimePrecListOpt (2x) + 58158: 883, // GrantProxyStmt (2x) + 58159: 884, // GrantRoleStmt (2x) + 58160: 885, // GrantStmt (2x) + 58162: 886, // HashString (2x) + 58163: 887, // HavingClause (2x) + 58166: 888, // IdentListWithParenOpt (2x) + 58174: 889, // IndexHintList (2x) + 58175: 890, // IndexHintListOpt (2x) + 58180: 891, // IndexLockAndAlgorithmOpt (2x) + 58194: 892, // InsertValues (2x) + 58198: 893, // IntoOpt (2x) + 57456: 894, // kill (2x) + 58205: 895, // KillStmt (2x) + 58210: 896, // LimitClause (2x) + 57465: 897, // linear (2x) + 58212: 898, // LinearOpt (2x) + 58213: 899, // Lines (2x) + 58216: 900, // LoadDataSetItem (2x) + 58219: 901, // LoadDataStmt (2x) + 58222: 902, // LockTablesStmt (2x) + 58228: 903, // MaxValueOrExpression (2x) + 58243: 904, // ObjectType (2x) + 57491: 905, // of (2x) + 58244: 906, // OfTablesOpt (2x) + 58245: 907, // OnDelete (2x) + 58248: 908, // OnUpdate (2x) + 58253: 909, // OptCollate (2x) + 58257: 910, // OptFull (2x) + 58271: 911, // OptimizeTableStmt (2x) + 58259: 912, // OptInteger (2x) + 58272: 913, // OptionalBraces (2x) + 58261: 914, // OptLeadLagInfo (2x) + 58260: 915, // OptLLDefault (2x) + 58266: 916, // OptTemporary (2x) + 58277: 917, // OuterOpt (2x) + 58279: 918, // PartDefOptionList (2x) + 58282: 919, // PartitionDefinitionList (2x) + 58283: 920, // PartitionDefinitionListOpt (2x) + 58289: 921, // PartitionOpt (2x) + 58290: 922, // PasswordOpt (2x) + 58292: 923, // PasswordOrLockOptionList (2x) + 58293: 924, // PasswordOrLockOptions (2x) + 58297: 925, // PreparedStmt (2x) + 58302: 926, // PrivLevel (2x) + 57506: 927, // procedure (2x) + 58307: 928, // ReferOpt (2x) + 58309: 929, // RegexpSym (2x) + 58310: 930, // ReleaseSavepointStmt (2x) + 58311: 931, // RenameTableStmt (2x) + 58312: 932, // RenameUserStmt (2x) + 58314: 933, // RepairTableStmt (2x) + 58323: 934, // ResourceGroupNameOption (2x) + 58324: 935, // RestartStmt (2x) + 57520: 936, // revoke (2x) + 58326: 937, // RevokeRoleStmt (2x) + 58327: 938, // RevokeStmt (2x) + 58330: 939, // RoleOrPrivElemList (2x) + 58331: 940, // RoleSpec (2x) + 58337: 941, // RollbackStmt (2x) + 58344: 942, // SavepointStmt (2x) + 58355: 943, // SelectStmtOpt (2x) + 58358: 944, // SelectStmtSQLCache (2x) + 58360: 945, // SetDefaultRoleOpt (2x) + 58361: 946, // SetDefaultRoleStmt (2x) + 58371: 947, // SetRoleStmt (2x) + 58372: 948, // SetStmt (2x) + 58377: 949, // ShowProfileType (2x) + 58380: 950, // ShowStmt (2x) + 58381: 951, // ShowTableAliasOpt (2x) + 58383: 952, // ShutdownStmt (2x) + 58342: 953, // SRSAttribute (2x) + 58343: 954, // SRSAttributeListOpt (2x) + 58389: 955, // StartTransactionOpt (2x) + 58392: 956, // Statement (2x) + 58394: 957, // StatsPersistentVal (2x) + 58399: 958, // SubPartDefinition (2x) + 58402: 959, // SubPartitionMethod (2x) + 58407: 960, // Symbol (2x) + 58410: 961, // TableAliasRefList (2x) + 58414: 962, // TableElementList (2x) + 58417: 963, // TableLock (2x) + 58421: 964, // TableNameListOpt (2x) + 58434: 965, // TablespaceDataFileOpt (2x) + 58433: 966, // TablesTerminalSym (2x) + 58431: 967, // TableToTable (2x) + 58441: 968, // TextStringList (2x) + 58448: 969, // TruncateTableStmt (2x) + 58451: 970, // UnlockTablesStmt (2x) + 58457: 971, // UserToUser (2x) + 58454: 972, // UseStmt (2x) + 58466: 973, // ValuesList (2x) + 58469: 974, // Varchar (2x) + 58471: 975, // VariableAssignment (2x) + 58474: 976, // ViewAlgorithm (2x) + 58475: 977, // ViewCheckOption (2x) + 58476: 978, // ViewDefiner (2x) + 58477: 979, // ViewFieldList (2x) + 58478: 980, // ViewName (2x) + 58479: 981, // ViewSQLSecurity (2x) + 58481: 982, // WhenClause (2x) + 58486: 983, // WindowDefinition (2x) + 58489: 984, // WindowFrameBound (2x) + 58496: 985, // WindowSpec (2x) + 58500: 986, // WithGrantOptionOpt (2x) + 58501: 987, // WithList (2x) + 58507: 988, // XAStmt (2x) + 57983: 989, // AlterOrderList (1x) + 57985: 990, // AlterTableSpecList (1x) + 57986: 991, // AlterTableSpecListOpt (1x) + 57987: 992, // AlterTableSpecSingleOpt (1x) + 57991: 993, // AlterUserSpecList (1x) + 57995: 994, // AnalyzeOptionList (1x) + 57996: 995, // AnalyzeOptionListOpt (1x) + 57998: 996, // AnyOrAll (1x) + 57999: 997, // ArrayKwdOpt (1x) + 58000: 998, // AsOpt (1x) + 58004: 999, // AuthOptionWithPassword (1x) + 58007: 1000, // BeginOrStartSym (1x) + 58009: 1001, // BetweenOrNotOp (1x) + 58012: 1002, // BitValueType (1x) + 58013: 1003, // BlobType (1x) + 58015: 1004, // BooleanType (1x) + 57369: 1005, // both (1x) + 58025: 1006, // CharsetNameOrDefault (1x) + 58026: 1007, // CharsetOpt (1x) + 58030: 1008, // ColumnFormat (1x) + 58032: 1009, // ColumnList (1x) + 58039: 1010, // ColumnNameOrUserVariableList (1x) + 58036: 1011, // ColumnNameOrUserVarListOpt (1x) + 58037: 1012, // ColumnNameOrUserVarListOptWithBrackets (1x) + 58044: 1013, // ColumnSetValueList (1x) + 58048: 1014, // CompareOp (1x) + 58051: 1015, // ConnectionOptionList (1x) + 58054: 1016, // ConstraintElem (1x) + 58061: 1017, // CreateTableOptionListOpt (1x) + 58062: 1018, // CreateTableSelectOpt (1x) + 58073: 1019, // DatabaseOptionListOpt (1x) + 58074: 1020, // DatabaseOptionReadOnlyValue (1x) + 58076: 1021, // DateAndTimeType (1x) + 58082: 1022, // DefaultValueExpr (1x) + 57408: 1023, // dual (1x) + 58099: 1024, // ElseOpt (1x) + 58104: 1025, // EnforcedOrNotOrNotNullOpt (1x) + 58117: 1026, // ExpressionOpt (1x) + 58119: 1027, // FetchFirstOpt (1x) + 58121: 1028, // FieldAsName (1x) + 58122: 1029, // FieldAsNameOpt (1x) + 58124: 1030, // FieldItemList (1x) + 58126: 1031, // FieldList (1x) + 58132: 1032, // FirstOrNext (1x) + 58133: 1033, // FixedPointType (1x) + 58135: 1034, // FloatingPointType (1x) + 58136: 1035, // FlushOption (1x) + 58137: 1036, // FlushRelayChannelOpt (1x) + 58140: 1037, // FromDual (1x) + 58142: 1038, // FulltextSearchModifierOpt (1x) + 58143: 1039, // FuncDatetimePrec (1x) + 58156: 1040, // GetFormatSelector (1x) + 58157: 1041, // GlobalScope (1x) + 58164: 1042, // HistogramUpdateOpt (1x) + 58170: 1043, // IgnoreLines (1x) + 58176: 1044, // IndexHintScope (1x) + 58179: 1045, // IndexKeyTypeOpt (1x) + 58183: 1046, // IndexNameList (1x) + 58188: 1047, // IndexPartSpecificationListOpt (1x) + 58191: 1048, // IndexTypeOpt (1x) + 58172: 1049, // InOrNotOp (1x) + 58195: 1050, // InstanceOption (1x) + 58197: 1051, // IntegerType (1x) + 58200: 1052, // IsolationLevel (1x) + 58199: 1053, // IsOrNotOp (1x) + 57461: 1054, // leading (1x) + 58207: 1055, // LikeEscapeOpt (1x) + 58208: 1056, // LikeOrNotOp (1x) + 58209: 1057, // LikeTableWithOrWithoutParen (1x) + 58214: 1058, // LinesTerminated (1x) + 58217: 1059, // LoadDataSetList (1x) + 58218: 1060, // LoadDataSetSpecOpt (1x) + 58220: 1061, // LocalOpt (1x) + 58223: 1062, // LockType (1x) + 58224: 1063, // LogTypeOpt (1x) + 58225: 1064, // LowPriorityOpt (1x) + 58226: 1065, // Match (1x) + 58227: 1066, // MatchOpt (1x) + 58229: 1067, // MaxValueOrExpressionList (1x) + 58230: 1068, // NChar (1x) + 58233: 1069, // NoRollbackOnErrorOpt (1x) + 58242: 1070, // NumericType (1x) + 58232: 1071, // NVarchar (1x) + 58246: 1072, // OnDeleteUpdateOpt (1x) + 58247: 1073, // OnDuplicateKeyUpdate (1x) + 58249: 1074, // OptBinMod (1x) + 58251: 1075, // OptCharset (1x) + 58254: 1076, // OptExistingWindowName (1x) + 58256: 1077, // OptFromFirstLast (1x) + 58258: 1078, // OptGConcatSeparator (1x) + 58264: 1079, // OptPartitionClause (1x) + 58265: 1080, // OptTable (1x) + 58268: 1081, // OptWindowFrameClause (1x) + 58269: 1082, // OptWindowOrderByClause (1x) + 58274: 1083, // Order (1x) + 58273: 1084, // OrReplace (1x) + 57500: 1085, // outfile (1x) + 58280: 1086, // PartDefValuesOpt (1x) + 58284: 1087, // PartitionKeyAlgorithmOpt (1x) + 58285: 1088, // PartitionMethod (1x) + 58288: 1089, // PartitionNumOpt (1x) + 57504: 1090, // precisionType (1x) + 58296: 1091, // PrepareSQL (1x) + 58304: 1092, // ProcedureCall (1x) + 58305: 1093, // QuickOptional (1x) + 57511: 1094, // recursive (1x) + 58308: 1095, // RegexpOrNotOp (1x) + 58313: 1096, // ReorganizePartitionRuleOpt (1x) + 58315: 1097, // RepairTypeListOpt (1x) + 58317: 1098, // Replica (1x) + 58320: 1099, // RequireList (1x) + 58322: 1100, // ResourceGroupName (1x) + 58332: 1101, // RoleSpecList (1x) + 58339: 1102, // RowOrRows (1x) + 58348: 1103, // SelectStmtFieldList (1x) + 58356: 1104, // SelectStmtOpts (1x) + 58357: 1105, // SelectStmtOptsList (1x) + 58363: 1106, // SetOpr (1x) + 58370: 1107, // SetRoleOpt (1x) + 58374: 1108, // ShowIndexKwd (1x) + 58375: 1109, // ShowLikeOrWhereOpt (1x) + 58376: 1110, // ShowProfileArgsOpt (1x) + 58378: 1111, // ShowProfileTypes (1x) + 58379: 1112, // ShowProfileTypesOpt (1x) + 58382: 1113, // ShowTargetFilterable (1x) + 57536: 1114, // ssl (1x) + 58388: 1115, // Start (1x) + 58391: 1116, // Starting (1x) + 57537: 1117, // starting (1x) + 58390: 1118, // StartTransactionOptList (1x) + 58393: 1119, // StatementList (1x) + 58395: 1120, // StorageMedia (1x) + 57538: 1121, // stored (1x) + 58398: 1122, // StringType (1x) + 58400: 1123, // SubPartDefinitionList (1x) + 58401: 1124, // SubPartDefinitionListOpt (1x) + 58403: 1125, // SubPartitionNumOpt (1x) + 58404: 1126, // SubPartitionOpt (1x) + 58415: 1127, // TableElementListOpt (1x) + 58418: 1128, // TableLockList (1x) + 58430: 1129, // TableRefsClause (1x) + 58435: 1130, // TablespaceLogfileGroupOpt (1x) + 58432: 1131, // TableToTableList (1x) + 58442: 1132, // TextType (1x) + 58409: 1133, // TLSChannelOpt (1x) + 57548: 1134, // trailing (1x) + 58447: 1135, // TrimDirection (1x) + 58449: 1136, // Type (1x) + 58458: 1137, // UserToUserList (1x) + 58460: 1138, // UserVariableList (1x) + 58463: 1139, // UsingRoles (1x) + 58465: 1140, // Values (1x) + 58467: 1141, // ValuesOpt (1x) + 58472: 1142, // VariableAssignmentList (1x) + 57568: 1143, // virtual (1x) + 58480: 1144, // VirtualOrStored (1x) + 58482: 1145, // WhenClauseList (1x) + 58485: 1146, // WindowClauseOptional (1x) + 58487: 1147, // WindowDefinitionList (1x) + 58488: 1148, // WindowFrameBetween (1x) + 58490: 1149, // WindowFrameExtent (1x) + 58492: 1150, // WindowFrameUnits (1x) + 58495: 1151, // WindowNameOrSpec (1x) + 58497: 1152, // WindowSpecDetails (1x) + 58502: 1153, // WithReadLockOpt (1x) + 58503: 1154, // WithRollupClause (1x) + 58504: 1155, // WithValidation (1x) + 58505: 1156, // WithValidationOpt (1x) + 58509: 1157, // Year (1x) + 57976: 1158, // $default (0x) + 57960: 1159, // createTableSelect (0x) + 57950: 1160, // empty (0x) + 57345: 1161, // error (0x) + 57975: 1162, // higherThanComma (0x) + 57969: 1163, // higherThanParenthese (0x) + 57958: 1164, // insertValues (0x) + 57353: 1165, // invalid (0x) + 57961: 1166, // lowerThanCharsetKwd (0x) + 57974: 1167, // lowerThanComma (0x) + 57959: 1168, // lowerThanCreateTableSelect (0x) + 57971: 1169, // lowerThanEq (0x) + 57966: 1170, // lowerThanFunction (0x) + 57957: 1171, // lowerThanInsertValues (0x) + 57962: 1172, // lowerThanKey (0x) + 57963: 1173, // lowerThanLocal (0x) + 57973: 1174, // lowerThanNot (0x) + 57970: 1175, // lowerThanOn (0x) + 57968: 1176, // lowerThanParenthese (0x) + 57964: 1177, // lowerThanRemove (0x) + 57951: 1178, // lowerThanSelectOpt (0x) + 57956: 1179, // lowerThanSelectStmt (0x) + 57955: 1180, // lowerThanSetKeyword (0x) + 57954: 1181, // lowerThanStringLitToken (0x) + 57952: 1182, // lowerThanValueKeyword (0x) + 57953: 1183, // lowerThanWith (0x) + 57965: 1184, // lowerThenOrder (0x) + 57972: 1185, // neg (0x) + 58385: 1186, // SignedNum (0x) + 57967: 1187, // tableRefPriority (0x) + } + + yySymNames = []string{ + "$end", + "';'", + "comment", + "remove", + "reorganize", + "secondaryEngineAttribute", + "storage", + "autoIncrement", + "','", + "first", + "after", + "serial", + "columnFormat", + "srid", + "password", + "encryption", + "charsetKwd", + "engine", + "')'", + "engine_attribute", + "nodegroup", + "autoextendSize", + "keyBlockSize", + "tablespace", + "resource", + "attribute", + "account", + "failedLoginAttempts", + "passwordLockTime", + "data", + "insertMethod", + "maxRows", + "minRows", + "connection", + "avgRowLength", + "checksum", + "compression", + "delayKeyWrite", + "packKeys", + "rowFormat", + "secondaryEngine", + "statsAutoRecalc", + "statsPersistent", + "statsSamplePages", + "signed", + "wait", + "extentSize", + "fileBlockSize", + "initialSize", + "maxSize", + "noWaitTablespace", + "redoBufferSize", + "undoBufferSize", + "tp", + "algorithm", + "invisible", + "visible", + "view", + "ascii", + "tables", + "day", + "defined", + "yearType", + "byteType", + "unicodeSym", + "hour", + "microsecond", + "minute", + "month", + "quarter", + "second", + "subpartition", + "week", + "columns", + "fields", + "no", + "local", + "separator", + "status", + "cipher", + "current", + "issuer", + "maxConnectionsPerHour", + "maxQueriesPerHour", + "maxUpdatesPerHour", + "maxUserConnections", + "preceding", + "san", + "sqlTsiYear", + "subject", + "tokenIssuer", + "definer", + "definition", + "description", + "discard", + "identified", + "nameKwd", + "organization", + "partitions", + "sqlTsiDay", + "sqlTsiHour", + "sqlTsiMinute", + "sqlTsiMonth", + "sqlTsiQuarter", + "sqlTsiSecond", + "sqlTsiWeek", + "user", + "auto", + "dateType", + "identifier", + "logs", + "manual", + "one", + "resume", + "retain", + "suspend", + "timeType", + "extended", + "hash", + "respect", + "truncate", + "end", + "enforced", + "following", + "nowait", + "quick", + "skip", + "unbounded", + "useFrm", + "coalesce", + "jsonType", + "only", + "prepare", + "timestampType", + "value", + "collation", + "datetimeType", + "format", + "geometryCollection", + "lineString", + "log", + "multiLineString", + "multiPoint", + "multiPolygon", + "offset", + "point", + "polygon", + "role", + "unknown", + "btree", + "fixed", + "isolation", + "logfile", + "memory", + "privileges", + "query", + "repair", + "reverse", + "rollback", + "rowCount", + "rtree", + "validation", + "variables", + "begin", + "commit", + "datafile", + "disable", + "dynamic", + "enable", + "errorKwd", + "full", + "mode", + "processlist", + "reference", + "savepoint", + "start", + "subpartitions", + "temporary", + "without", + "work", + "active", + "binlog", + "block", + "booleanType", + "buckets", + "chain", + "channel", + "compact", + "compressed", + "context", + "copyKwd", + "cpu", + "deallocate", + "directory", + "disk", + "do", + "exchange", + "execute", + "expansion", + "flush", + "general", + "histogram", + "hosts", + "identSQLErrors", + "importKwd", + "inactive", + "inplace", + "instant", + "ipc", + "locked", + "master", + "modify", + "nulls", + "old", + "pageSym", + "rebuild", + "redundant", + "relay", + "restart", + "routine", + "s3", + "secondaryLoad", + "secondaryUnload", + "share", + "shutdown", + "slave", + "slow", + "source", + "swaps", + "traditional", + "undofile", + "userResources", + "warnings", + "xa", + "action", + "against", + "always", + "bitType", + "boolType", + "cascaded", + "client", + "committed", + "consistent", + "duplicate", + "engines", + "enum", + "events", + "expire", + "export", + "faultsSym", + "geometry", + "global", + "grants", + "history", + "indexes", + "instance", + "invoker", + "io", + "keyring", + "language", + "last", + "less", + "level", + "list", + "merge", + "migrate", + "national", + "ncharType", + "never", + "next", + "none", + "nvarcharType", + "open", + "parser", + "partial", + "partitioning", + "phase", + "plugins", + "profile", + "profiles", + "recover", + "reload", + "repeatable", + "replica", + "reuse", + "rollup", + "rotate", + "security", + "serializable", + "session", + "simple", + "snapshot", + "switchesSym", + "temptable", + "textType", + "than", + "tls", + "transaction", + "triggers", + "uncommitted", + "undefined", + "x509", + "xid", + "addDate", + "any", + "avg", + "compress", + "config", + "escape", + "event", + "explore", + "file", + "found", + "function", + "getFormat", + "jsonArrayagg", + "jsonObjectAgg", + "jsonSumCrc32", + "member", + "names", + "process", + "proxy", + "replication", + "some", + "sqlBufferResult", + "sqlCache", + "sqlNoCache", + "subDate", + "super", + "timestampAdd", + "timestampDiff", + "weightString", + "'('", + "on", + "not2", + "stringLit", + "not", + "with", + "as", + "defaultKwd", + "left", + "right", + "union", + "collate", + "'+'", + "'-'", + "mod", + "except", + "intersect", + "null", + "forKwd", + "into", + "limit", + "lock", + "partition", + "fetch", + "from", + "order", + "and", + "'*'", + "where", + "using", + "or", + "andand", + "pipesAsOr", + "xor", + "eq", + "set", + "group", + "having", + "charType", + "values", + "straightJoin", + "join", + "window", + "intLit", + "natural", + "cross", + "inner", + "'}'", + "replace", + "like", + "rows", + "rangeKwd", + "groups", + "desc", + "asc", + "dayHour", + "dayMicrosecond", + "dayMinute", + "daySecond", + "hourMicrosecond", + "hourMinute", + "hourSecond", + "minuteMicrosecond", + "minuteSecond", + "secondMicrosecond", + "yearMonth", + "in", + "when", + "binaryType", + "elseKwd", + "then", + "'<'", + "'>'", + "ge", + "is", + "le", + "neq", + "neqSynonym", + "nulleq", + "'%'", + "'&'", + "'/'", + "'^'", + "'|'", + "between", + "div", + "lsh", + "rsh", + "regexpKwd", + "rlike", + "memberof", + "key", + "singleAtIdentifier", + "currentUser", + "hexLit", + "bitLit", + "ifKwd", + "check", + "insert", + "interval", + "paramMarker", + "primary", + "row", + "'{'", + "decLit", + "floatLit", + "unique", + "constraint", + "database", + "falseKwd", + "pipes", + "trueKwd", + "exists", + "references", + "convert", + "repeat", + "builtinCurDate", + "builtinNow", + "currentDate", + "currentTs", + "localTime", + "localTs", + "generated", + "underscoreCS", + "doubleAtIdentifier", + "builtinCount", + "'!'", + "'~'", + "builtinApproxCountDistinct", + "builtinApproxPercentile", + "builtinBitAnd", + "builtinBitOr", + "builtinBitXor", + "builtinCast", + "builtinCurTime", + "builtinDateAdd", + "builtinDateSub", + "builtinExtract", + "builtinGroupConcat", + "builtinMax", + "builtinMin", + "builtinPosition", + "builtinStddevPop", + "builtinStddevSamp", + "builtinSubstring", + "builtinSum", + "builtinSysDate", + "builtinTranslate", + "builtinTrim", + "builtinUser", + "builtinVarPop", + "builtinVarSamp", + "caseKwd", + "cumeDist", + "currentRole", + "currentTime", + "denseRank", + "firstValue", + "lag", + "lastValue", + "lead", + "nthValue", + "ntile", + "percentRank", + "rank", + "rowNumber", + "utcDate", + "utcTime", + "utcTimestamp", + "match", + "tableKwd", + "ignore", + "selectKwd", + "character", + "Identifier", + "NotKeywordToken", + "UnReservedKeyword", + "index", + "to", + "force", + "'.'", + "jss", + "juss", + "array", + "assignmentEq", + "update", + "read", + "requireKwd", + "lines", + "lateral", + "by", + "use", + "'@'", + "alter", + "sql", + "drop", + "cascade", + "restrict", + "spatial", + "add", + "analyze", + "foreign", + "fulltext", + "rename", + "decimalType", + "doubleType", + "floatType", + "optimize", + "realType", + "varcharacter", + "varcharType", + "integerType", + "intType", + "write", + "change", + "varbinaryType", + "bigIntType", + "blobType", + "float4Type", + "float8Type", + "int1Type", + "int2Type", + "int3Type", + "int4Type", + "int8Type", + "long", + "longblobType", + "longtextType", + "mediumblobType", + "mediumIntType", + "mediumtextType", + "middleIntType", + "numericType", + "smallIntType", + "tinyblobType", + "tinyIntType", + "tinytextType", + "SubSelect", + "FunctionNameConflictNonNow", + "UserVariable", + "SimpleIdent", + "Literal", + "StringLiteral", + "FunctionCallGeneric", + "FunctionCallKeyword", + "FunctionCallNonKeyword", + "FunctionNameConflict", + "FunctionNameDateArith", + "FunctionNameDateArithMultiForms", + "FunctionNameDatetimePrecision", + "FunctionNameOptionalBraces", + "SimpleExpr", + "SumExpr", + "SystemVariable", + "Variable", + "WindowFuncCall", + "BitExpr", + "PredicateExpr", + "BoolPri", + "Expression", + "logAnd", + "logOr", + "all", + "NUM", + "StringName", + "EqOpt", + "TableName", + "unsigned", + "zerofill", + "over", + "ColumnName", + "distinct", + "distinctRow", + "WindowingClause", + "lowPriority", + "delayed", + "highPriority", + "deleteKwd", + "hintComment", + "FieldLen", + "OptWindowingClause", + "LengthNum", + "sqlBigResult", + "sqlCalcFoundRows", + "sqlSmallResult", + "SelectStmt", + "SelectStmtBasic", + "SelectStmtFromDualTable", + "SelectStmtFromTable", + "ExpressionList", + "SetOprClause", + "terminated", + "Username", + "SetOprClauseList", + "SetOprStmtWithLimitOrderBy", + "SetOprStmtWoutLimitOrderBy", + "CharsetKw", + "enclosed", + "OrderBy", + "SelectStmtLimit", + "escaped", + "optionallyEnclosedBy", + "SelectStmtWithClause", + "SetOprStmt", + "WithClause", + "TablespaceOption", + "DistinctKwd", + "DistinctOpt", + "OptFieldLen", + "TablespaceOptionList", + "TablespaceOptionListOpt", + "DefaultKwdOpt", + "EqOrAssignmentEq", + "ExprOrDefault", + "JoinTable", + "OptBinary", + "RolenameComposed", + "TableFactor", + "TableRef", + "FromOrIn", + "PartitionNameList", + "release", + "CharsetName", + "ExpressionListOpt", + "noWriteToBinLog", + "NoWriteToBinLogAliasOpt", + "TextString", + "TimestampUnit", + "BuggyDefaultFalseDistinctOpt", + "ColumnNameList", + "DefaultFalseDistinctOpt", + "IndexPartSpecification", + "JoinType", + "KeyOrIndex", + "NotSym", + "Rolename", + "RoleNameString", + "TableNameList", + "CrossOpt", + "DeleteWithoutUsingStmt", + "DeleteWithUsingStmt", + "IndexPartSpecificationList", + "Int64Num", + "OrderByOptional", + "PartDefOption", + "TimeUnit", + "UpdateStmtNoWith", + "VariableName", + "WhereClause", + "WhereClauseOptional", + "AllOrPartitionNameList", + "AlterTableStmt", + "ConstraintKeywordOpt", + "DeleteFromStmt", + "IfNotExists", + "IndexInvisible", + "IndexType", + "InsertIntoStmt", + "ReplaceIntoStmt", + "ShowDatabaseNameOpt", + "TablespaceSizeValue", + "UpdateStmt", + "varying", + "AuthString", + "column", + "ColumnDef", + "create", + "DatabaseOption", + "DBName", + "EscapedTableRef", + "FieldsOrColumns", + "FieldTerminator", + "ForceOpt", + "grant", + "IndexName", + "IndexOption", + "IndexOptionList", + "NumLiteral", + "Priority", + "RolenameList", + "RowFormat", + "SelectStmtLimitOpt", + "SetExpr", + "TableOptimizerHints", + "TableOption", + "TableOrTables", + "UsernameList", + "AlgorithmClause", + "BuiltinFunction", + "ByItem", + "Char", + "CollationName", + "ColumnKeywordOpt", + "ExplainableStmt", + "FieldOpt", + "FieldOpts", + "IgnoreOptional", + "infile", + "LimitOption", + "load", + "LockClause", + "OptCharsetWithOptBinary", + "OptNullTreatment", + "SelectLockOpt", + "SelectStmtIntoOption", + "show", + "TableAsName", + "TableRefs", + "XAXid", + "Assignment", + "ByList", + "Constraint", + "CurdateSym", + "FloatOpt", + "IdentList", + "IfExists", + "IndexTypeName", + "NowSym", + "NowSymFunc", + "NowSymOptionFraction", + "optimizerCosts", + "option", + "optionally", + "OptWild", + "outer", + "PartitionNameListOpt", + "Precision", + "PriorityOpt", + "ReferDef", + "RestrictOrCascadeOpt", + "RowStmt", + "RowValue", + "TableAsNameOpt", + "TableOptimizerHintsOpt", + "TransactionChar", + "UserSpec", + "WindowName", + "AnalyzeOption", + "AssignmentList", + "CastType", + "ColumnOption", + "ColumnPosition", + "CommonTableExpr", + "DatabaseOptionList", + "DatabaseSym", + "DefaultTrueDistinctOpt", + "EnforcedOrNot", + "ExtendedPriv", + "GeneratedAlways", + "GroupByClause", + "IndexHint", + "IndexHintType", + "IndexNameAndTypeOpt", + "InsertRowAliasOpt", + "KeyOrIndexOpt", + "keys", + "maxValue", + "NowSymOptionFractionParentheses", + "OptOrder", + "PartitionDefinition", + "PasswordOrLockOption", + "PrimaryOpt", + "PrivElem", + "PrivType", + "RequireClause", + "RequireClauseOpt", + "RequireListElement", + "RolenameWithoutIdent", + "RoleOrPrivElem", + "SelectStmtGroup", + "SetOprOpt", + "SignedLiteral", + "system", + "TableElement", + "TableNameOptWild", + "TableOptionList", + "TransactionChars", + "trigger", + "undo", + "unlock", + "usage", + "UserSpecList", + "ValuesStmtList", + "ValueSym", + "WindowFrameStart", + "WorkOpt", + "AlterDatabaseStmt", + "AlterInstanceStmt", + "AlterLogfileGroupStmt", + "AlterOrderItem", + "AlterTablespaceStmt", + "AlterTableSpec", + "AlterUserSpec", + "AlterUserStmt", + "AlterViewStmt", + "AnalyzeTableStmt", + "AuthOption", + "AuthPlugin", + "BeginTransactionStmt", + "BinlogStmt", + "call", + "CallStmt", + "CheckConstraintKeyword", + "ColumnNameListOpt", + "ColumnNameOrUserVariable", + "ColumnOptionList", + "ColumnOptionListOpt", + "CommentOrAttributeOption", + "CommitStmt", + "CompletionTypeWithinTransaction", + "ConnectionOption", + "ConnectionOptions", + "CreateDatabaseStmt", + "CreateIndexStmt", + "CreateLogfileGroupStmt", + "CreateRoleStmt", + "CreateSpatialRefSysStmt", + "CreateTablespaceStmt", + "CreateTableStmt", + "CreateUserStmt", + "CreateViewSelectOpt", + "CreateViewStmt", + "databases", + "DeallocateStmt", + "DeallocateSym", + "describe", + "DoStmt", + "DropDatabaseStmt", + "DropIndexStmt", + "DropLogfileGroupStmt", + "DropRoleStmt", + "DropSpatialRefSysStmt", + "DropTablespaceStmt", + "DropTableStmt", + "DropUserStmt", + "DropViewStmt", + "DuplicateOpt", + "EmptyStmt", + "EncryptionOpt", + "EnforcedOrNotOpt", + "ExecuteStmt", + "explain", + "ExplainFormatType", + "ExplainStmt", + "ExplainSym", + "Field", + "FieldItem", + "Fields", + "FlushStmt", + "FuncDatetimePrecList", + "FuncDatetimePrecListOpt", + "GrantProxyStmt", + "GrantRoleStmt", + "GrantStmt", + "HashString", + "HavingClause", + "IdentListWithParenOpt", + "IndexHintList", + "IndexHintListOpt", + "IndexLockAndAlgorithmOpt", + "InsertValues", + "IntoOpt", + "kill", + "KillStmt", + "LimitClause", + "linear", + "LinearOpt", + "Lines", + "LoadDataSetItem", + "LoadDataStmt", + "LockTablesStmt", + "MaxValueOrExpression", + "ObjectType", + "of", + "OfTablesOpt", + "OnDelete", + "OnUpdate", + "OptCollate", + "OptFull", + "OptimizeTableStmt", + "OptInteger", + "OptionalBraces", + "OptLeadLagInfo", + "OptLLDefault", + "OptTemporary", + "OuterOpt", + "PartDefOptionList", + "PartitionDefinitionList", + "PartitionDefinitionListOpt", + "PartitionOpt", + "PasswordOpt", + "PasswordOrLockOptionList", + "PasswordOrLockOptions", + "PreparedStmt", + "PrivLevel", + "procedure", + "ReferOpt", + "RegexpSym", + "ReleaseSavepointStmt", + "RenameTableStmt", + "RenameUserStmt", + "RepairTableStmt", + "ResourceGroupNameOption", + "RestartStmt", + "revoke", + "RevokeRoleStmt", + "RevokeStmt", + "RoleOrPrivElemList", + "RoleSpec", + "RollbackStmt", + "SavepointStmt", + "SelectStmtOpt", + "SelectStmtSQLCache", + "SetDefaultRoleOpt", + "SetDefaultRoleStmt", + "SetRoleStmt", + "SetStmt", + "ShowProfileType", + "ShowStmt", + "ShowTableAliasOpt", + "ShutdownStmt", + "SRSAttribute", + "SRSAttributeListOpt", + "StartTransactionOpt", + "Statement", + "StatsPersistentVal", + "SubPartDefinition", + "SubPartitionMethod", + "Symbol", + "TableAliasRefList", + "TableElementList", + "TableLock", + "TableNameListOpt", + "TablespaceDataFileOpt", + "TablesTerminalSym", + "TableToTable", + "TextStringList", + "TruncateTableStmt", + "UnlockTablesStmt", + "UserToUser", + "UseStmt", + "ValuesList", + "Varchar", + "VariableAssignment", + "ViewAlgorithm", + "ViewCheckOption", + "ViewDefiner", + "ViewFieldList", + "ViewName", + "ViewSQLSecurity", + "WhenClause", + "WindowDefinition", + "WindowFrameBound", + "WindowSpec", + "WithGrantOptionOpt", + "WithList", + "XAStmt", + "AlterOrderList", + "AlterTableSpecList", + "AlterTableSpecListOpt", + "AlterTableSpecSingleOpt", + "AlterUserSpecList", + "AnalyzeOptionList", + "AnalyzeOptionListOpt", + "AnyOrAll", + "ArrayKwdOpt", + "AsOpt", + "AuthOptionWithPassword", + "BeginOrStartSym", + "BetweenOrNotOp", + "BitValueType", + "BlobType", + "BooleanType", + "both", + "CharsetNameOrDefault", + "CharsetOpt", + "ColumnFormat", + "ColumnList", + "ColumnNameOrUserVariableList", + "ColumnNameOrUserVarListOpt", + "ColumnNameOrUserVarListOptWithBrackets", + "ColumnSetValueList", + "CompareOp", + "ConnectionOptionList", + "ConstraintElem", + "CreateTableOptionListOpt", + "CreateTableSelectOpt", + "DatabaseOptionListOpt", + "DatabaseOptionReadOnlyValue", + "DateAndTimeType", + "DefaultValueExpr", + "dual", + "ElseOpt", + "EnforcedOrNotOrNotNullOpt", + "ExpressionOpt", + "FetchFirstOpt", + "FieldAsName", + "FieldAsNameOpt", + "FieldItemList", + "FieldList", + "FirstOrNext", + "FixedPointType", + "FloatingPointType", + "FlushOption", + "FlushRelayChannelOpt", + "FromDual", + "FulltextSearchModifierOpt", + "FuncDatetimePrec", + "GetFormatSelector", + "GlobalScope", + "HistogramUpdateOpt", + "IgnoreLines", + "IndexHintScope", + "IndexKeyTypeOpt", + "IndexNameList", + "IndexPartSpecificationListOpt", + "IndexTypeOpt", + "InOrNotOp", + "InstanceOption", + "IntegerType", + "IsolationLevel", + "IsOrNotOp", + "leading", + "LikeEscapeOpt", + "LikeOrNotOp", + "LikeTableWithOrWithoutParen", + "LinesTerminated", + "LoadDataSetList", + "LoadDataSetSpecOpt", + "LocalOpt", + "LockType", + "LogTypeOpt", + "LowPriorityOpt", + "Match", + "MatchOpt", + "MaxValueOrExpressionList", + "NChar", + "NoRollbackOnErrorOpt", + "NumericType", + "NVarchar", + "OnDeleteUpdateOpt", + "OnDuplicateKeyUpdate", + "OptBinMod", + "OptCharset", + "OptExistingWindowName", + "OptFromFirstLast", + "OptGConcatSeparator", + "OptPartitionClause", + "OptTable", + "OptWindowFrameClause", + "OptWindowOrderByClause", + "Order", + "OrReplace", + "outfile", + "PartDefValuesOpt", + "PartitionKeyAlgorithmOpt", + "PartitionMethod", + "PartitionNumOpt", + "precisionType", + "PrepareSQL", + "ProcedureCall", + "QuickOptional", + "recursive", + "RegexpOrNotOp", + "ReorganizePartitionRuleOpt", + "RepairTypeListOpt", + "Replica", + "RequireList", + "ResourceGroupName", + "RoleSpecList", + "RowOrRows", + "SelectStmtFieldList", + "SelectStmtOpts", + "SelectStmtOptsList", + "SetOpr", + "SetRoleOpt", + "ShowIndexKwd", + "ShowLikeOrWhereOpt", + "ShowProfileArgsOpt", + "ShowProfileTypes", + "ShowProfileTypesOpt", + "ShowTargetFilterable", + "ssl", + "Start", + "Starting", + "starting", + "StartTransactionOptList", + "StatementList", + "StorageMedia", + "stored", + "StringType", + "SubPartDefinitionList", + "SubPartDefinitionListOpt", + "SubPartitionNumOpt", + "SubPartitionOpt", + "TableElementListOpt", + "TableLockList", + "TableRefsClause", + "TablespaceLogfileGroupOpt", + "TableToTableList", + "TextType", + "TLSChannelOpt", + "trailing", + "TrimDirection", + "Type", + "UserToUserList", + "UserVariableList", + "UsingRoles", + "Values", + "ValuesOpt", + "VariableAssignmentList", + "virtual", + "VirtualOrStored", + "WhenClauseList", + "WindowClauseOptional", + "WindowDefinitionList", + "WindowFrameBetween", + "WindowFrameExtent", + "WindowFrameUnits", + "WindowNameOrSpec", + "WindowSpecDetails", + "WithReadLockOpt", + "WithRollupClause", + "WithValidation", + "WithValidationOpt", + "Year", + "$default", + "createTableSelect", + "empty", + "error", + "higherThanComma", + "higherThanParenthese", + "insertValues", + "invalid", + "lowerThanCharsetKwd", + "lowerThanComma", + "lowerThanCreateTableSelect", + "lowerThanEq", + "lowerThanFunction", + "lowerThanInsertValues", + "lowerThanKey", + "lowerThanLocal", + "lowerThanNot", + "lowerThanOn", + "lowerThanParenthese", + "lowerThanRemove", + "lowerThanSelectOpt", + "lowerThanSelectStmt", + "lowerThanSetKeyword", + "lowerThanStringLitToken", + "lowerThanValueKeyword", + "lowerThanWith", + "lowerThenOrder", + "neg", + "SignedNum", + "tableRefPriority", + } + + yyReductions = []struct{ xsym, components int }{ + {0, 1}, + {1115, 1}, + {683, 6}, + {683, 7}, + {992, 1}, + {992, 2}, + {992, 4}, + {823, 1}, + {823, 5}, + {823, 5}, + {823, 4}, + {823, 5}, + {823, 2}, + {823, 4}, + {823, 5}, + {823, 3}, + {823, 4}, + {823, 4}, + {823, 3}, + {823, 3}, + {823, 7}, + {823, 3}, + {823, 4}, + {823, 4}, + {823, 4}, + {823, 4}, + {823, 2}, + {823, 2}, + {823, 4}, + {823, 3}, + {823, 4}, + {823, 3}, + {823, 2}, + {823, 2}, + {823, 4}, + {823, 5}, + {823, 6}, + {823, 8}, + {823, 5}, + {823, 5}, + {823, 3}, + {823, 3}, + {823, 3}, + {823, 5}, + {823, 1}, + {823, 1}, + {823, 1}, + {823, 2}, + {823, 2}, + {823, 1}, + {823, 1}, + {823, 4}, + {823, 3}, + {823, 4}, + {1096, 0}, + {1096, 5}, + {682, 1}, + {682, 1}, + {1156, 0}, + {1156, 1}, + {1155, 2}, + {1155, 2}, + {719, 3}, + {719, 3}, + {719, 3}, + {719, 3}, + {719, 3}, + {732, 3}, + {732, 3}, + {665, 1}, + {665, 1}, + {786, 0}, + {786, 1}, + {724, 0}, + {724, 1}, + {773, 0}, + {773, 1}, + {773, 2}, + {991, 0}, + {991, 1}, + {990, 1}, + {990, 3}, + {652, 1}, + {652, 3}, + {684, 0}, + {684, 1}, + {684, 2}, + {960, 1}, + {931, 3}, + {1131, 1}, + {1131, 3}, + {967, 3}, + {932, 3}, + {1137, 1}, + {1137, 3}, + {971, 3}, + {827, 4}, + {827, 10}, + {827, 11}, + {827, 8}, + {1042, 0}, + {1042, 2}, + {1042, 2}, + {995, 0}, + {995, 2}, + {994, 1}, + {994, 3}, + {994, 2}, + {769, 2}, + {741, 3}, + {770, 1}, + {770, 3}, + {830, 2}, + {830, 2}, + {830, 3}, + {1118, 1}, + {1118, 3}, + {955, 2}, + {955, 2}, + {955, 3}, + {817, 0}, + {817, 1}, + {831, 2}, + {697, 3}, + {697, 3}, + {602, 1}, + {602, 3}, + {602, 5}, + {661, 1}, + {661, 3}, + {835, 0}, + {835, 1}, + {888, 0}, + {888, 3}, + {746, 1}, + {746, 3}, + {1011, 0}, + {1011, 1}, + {1010, 1}, + {1010, 3}, + {836, 1}, + {836, 1}, + {1012, 0}, + {1012, 3}, + {840, 2}, + {840, 3}, + {793, 0}, + {793, 1}, + {666, 1}, + {666, 1}, + {778, 1}, + {778, 2}, + {871, 0}, + {871, 1}, + {1025, 2}, + {1025, 1}, + {772, 2}, + {772, 1}, + {772, 1}, + {772, 2}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 3}, + {772, 3}, + {772, 2}, + {772, 6}, + {772, 6}, + {772, 1}, + {772, 2}, + {772, 2}, + {772, 2}, + {772, 3}, + {772, 2}, + {1120, 1}, + {1120, 1}, + {1120, 1}, + {1008, 1}, + {1008, 1}, + {1008, 1}, + {780, 0}, + {780, 2}, + {1144, 0}, + {1144, 1}, + {1144, 1}, + {837, 1}, + {837, 2}, + {838, 0}, + {838, 1}, + {1016, 7}, + {1016, 7}, + {1016, 7}, + {1016, 6}, + {1016, 7}, + {1016, 7}, + {1016, 5}, + {1065, 2}, + {1065, 2}, + {1065, 2}, + {1066, 0}, + {1066, 1}, + {760, 5}, + {907, 3}, + {908, 3}, + {1072, 0}, + {1072, 1}, + {1072, 1}, + {1072, 2}, + {1072, 2}, + {928, 1}, + {928, 1}, + {928, 2}, + {928, 2}, + {928, 2}, + {1022, 1}, + {1022, 1}, + {1022, 1}, + {1022, 3}, + {1022, 3}, + {720, 3}, + {720, 3}, + {720, 4}, + {720, 4}, + {789, 3}, + {789, 1}, + {751, 1}, + {751, 3}, + {751, 4}, + {751, 3}, + {751, 1}, + {750, 1}, + {750, 1}, + {750, 1}, + {750, 1}, + {749, 1}, + {749, 1}, + {749, 1}, + {744, 1}, + {744, 1}, + {803, 1}, + {803, 2}, + {803, 2}, + {709, 1}, + {709, 1}, + {709, 1}, + {845, 12}, + {1047, 0}, + {1047, 3}, + {673, 1}, + {673, 3}, + {663, 3}, + {663, 4}, + {891, 0}, + {891, 1}, + {891, 1}, + {891, 2}, + {891, 2}, + {1045, 0}, + {1045, 1}, + {1045, 1}, + {1045, 1}, + {818, 4}, + {818, 3}, + {844, 5}, + {700, 1}, + {1100, 1}, + {1100, 1}, + {699, 4}, + {699, 4}, + {699, 4}, + {699, 4}, + {1020, 1}, + {1020, 1}, + {1019, 0}, + {1019, 1}, + {775, 1}, + {775, 2}, + {850, 11}, + {850, 6}, + {643, 0}, + {643, 1}, + {921, 0}, + {921, 6}, + {959, 6}, + {959, 5}, + {1087, 0}, + {1087, 3}, + {1088, 1}, + {1088, 4}, + {1088, 5}, + {1088, 4}, + {1088, 5}, + {898, 0}, + {898, 1}, + {1126, 0}, + {1126, 4}, + {1125, 0}, + {1125, 2}, + {1089, 0}, + {1089, 2}, + {920, 0}, + {920, 3}, + {919, 1}, + {919, 3}, + {791, 5}, + {1124, 0}, + {1124, 3}, + {1123, 1}, + {1123, 3}, + {958, 3}, + {918, 0}, + {918, 2}, + {676, 3}, + {676, 3}, + {676, 4}, + {676, 3}, + {676, 3}, + {676, 3}, + {676, 4}, + {676, 4}, + {676, 3}, + {676, 3}, + {676, 3}, + {676, 3}, + {1086, 0}, + {1086, 4}, + {1086, 6}, + {1086, 5}, + {868, 0}, + {868, 1}, + {868, 1}, + {998, 0}, + {998, 1}, + {1018, 0}, + {1018, 1}, + {1018, 1}, + {1018, 1}, + {1018, 1}, + {852, 1}, + {852, 1}, + {852, 1}, + {852, 1}, + {1057, 2}, + {1057, 4}, + {853, 11}, + {826, 10}, + {1084, 0}, + {1084, 2}, + {976, 0}, + {976, 3}, + {976, 3}, + {976, 3}, + {978, 0}, + {978, 3}, + {981, 0}, + {981, 3}, + {981, 3}, + {980, 1}, + {979, 0}, + {979, 3}, + {1009, 1}, + {1009, 3}, + {977, 0}, + {977, 4}, + {977, 4}, + {858, 2}, + {671, 13}, + {671, 9}, + {672, 10}, + {685, 1}, + {685, 1}, + {685, 2}, + {685, 2}, + {776, 1}, + {859, 4}, + {860, 6}, + {865, 6}, + {916, 0}, + {916, 1}, + {867, 4}, + {867, 6}, + {866, 3}, + {866, 5}, + {862, 3}, + {862, 5}, + {761, 0}, + {761, 1}, + {761, 1}, + {717, 1}, + {717, 1}, + {597, 0}, + {597, 1}, + {869, 0}, + {876, 1}, + {876, 1}, + {876, 1}, + {875, 3}, + {875, 2}, + {875, 3}, + {875, 2}, + {875, 4}, + {875, 5}, + {875, 7}, + {875, 5}, + {875, 3}, + {875, 6}, + {874, 1}, + {874, 1}, + {942, 2}, + {930, 3}, + {613, 1}, + {674, 1}, + {595, 1}, + {591, 3}, + {591, 3}, + {591, 3}, + {591, 3}, + {591, 2}, + {591, 9}, + {591, 3}, + {591, 3}, + {591, 3}, + {591, 1}, + {903, 1}, + {903, 1}, + {1038, 0}, + {1038, 4}, + {1038, 7}, + {1038, 3}, + {1038, 3}, + {593, 1}, + {593, 1}, + {592, 1}, + {592, 1}, + {621, 1}, + {621, 3}, + {1067, 1}, + {1067, 3}, + {655, 0}, + {655, 1}, + {882, 0}, + {882, 1}, + {881, 1}, + {590, 3}, + {590, 3}, + {590, 4}, + {590, 5}, + {590, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1014, 1}, + {1001, 1}, + {1001, 2}, + {1053, 1}, + {1053, 2}, + {1049, 1}, + {1049, 2}, + {1056, 1}, + {1056, 2}, + {1095, 1}, + {1095, 2}, + {996, 1}, + {996, 1}, + {996, 1}, + {589, 5}, + {589, 3}, + {589, 5}, + {589, 4}, + {589, 3}, + {589, 5}, + {589, 1}, + {929, 1}, + {929, 1}, + {1055, 0}, + {1055, 2}, + {877, 1}, + {877, 3}, + {877, 5}, + {877, 2}, + {1029, 0}, + {1029, 1}, + {1028, 1}, + {1028, 2}, + {1028, 1}, + {1028, 2}, + {1031, 1}, + {1031, 3}, + {1154, 0}, + {1154, 2}, + {781, 4}, + {887, 0}, + {887, 2}, + {747, 0}, + {747, 2}, + {686, 0}, + {686, 3}, + {728, 0}, + {728, 1}, + {706, 0}, + {706, 1}, + {708, 0}, + {708, 2}, + {707, 3}, + {707, 1}, + {707, 3}, + {707, 2}, + {707, 1}, + {707, 3}, + {784, 1}, + {784, 3}, + {784, 3}, + {1048, 0}, + {1048, 1}, + {688, 2}, + {688, 2}, + {748, 1}, + {748, 1}, + {748, 1}, + {687, 1}, + {687, 1}, + {506, 1}, + {506, 1}, + {506, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {508, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {507, 1}, + {833, 2}, + {1092, 1}, + {1092, 3}, + {1092, 4}, + {1092, 6}, + {689, 9}, + {893, 0}, + {893, 1}, + {892, 6}, + {892, 4}, + {892, 4}, + {892, 4}, + {892, 4}, + {892, 3}, + {892, 1}, + {892, 1}, + {892, 1}, + {892, 1}, + {892, 3}, + {815, 1}, + {815, 1}, + {973, 1}, + {973, 3}, + {763, 3}, + {1141, 0}, + {1141, 1}, + {1140, 3}, + {1140, 1}, + {645, 1}, + {645, 1}, + {1013, 3}, + {1013, 5}, + {785, 0}, + {785, 2}, + {785, 5}, + {1073, 0}, + {1073, 5}, + {690, 7}, + {573, 1}, + {573, 1}, + {573, 1}, + {573, 1}, + {573, 1}, + {573, 1}, + {573, 1}, + {573, 2}, + {573, 1}, + {573, 1}, + {573, 2}, + {573, 2}, + {574, 1}, + {574, 2}, + {989, 1}, + {989, 3}, + {821, 2}, + {630, 3}, + {742, 1}, + {742, 3}, + {721, 1}, + {721, 2}, + {1083, 1}, + {1083, 1}, + {790, 0}, + {790, 1}, + {790, 1}, + {675, 0}, + {675, 1}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 5}, + {588, 5}, + {588, 5}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 3}, + {588, 1}, + {572, 1}, + {572, 3}, + {572, 5}, + {583, 1}, + {583, 1}, + {583, 1}, + {583, 1}, + {583, 3}, + {583, 1}, + {583, 1}, + {583, 1}, + {583, 1}, + {583, 1}, + {583, 2}, + {583, 2}, + {583, 2}, + {583, 2}, + {583, 3}, + {583, 2}, + {583, 1}, + {583, 3}, + {583, 5}, + {583, 6}, + {583, 2}, + {583, 4}, + {583, 2}, + {583, 7}, + {583, 7}, + {583, 5}, + {583, 6}, + {583, 6}, + {583, 4}, + {583, 4}, + {583, 3}, + {583, 3}, + {997, 0}, + {997, 1}, + {638, 1}, + {638, 1}, + {639, 1}, + {639, 1}, + {662, 0}, + {662, 1}, + {777, 0}, + {777, 1}, + {660, 1}, + {660, 2}, + {578, 1}, + {578, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {570, 1}, + {913, 0}, + {913, 2}, + {582, 1}, + {582, 1}, + {582, 1}, + {582, 1}, + {581, 1}, + {581, 1}, + {581, 1}, + {581, 1}, + {581, 1}, + {581, 1}, + {576, 4}, + {576, 4}, + {576, 2}, + {576, 3}, + {576, 2}, + {576, 4}, + {576, 6}, + {576, 2}, + {576, 2}, + {576, 2}, + {576, 4}, + {576, 6}, + {576, 4}, + {577, 4}, + {577, 4}, + {577, 6}, + {577, 8}, + {577, 8}, + {577, 6}, + {577, 6}, + {577, 6}, + {577, 6}, + {577, 6}, + {577, 8}, + {577, 8}, + {577, 8}, + {577, 8}, + {577, 4}, + {577, 6}, + {577, 6}, + {577, 7}, + {577, 4}, + {577, 7}, + {577, 7}, + {577, 8}, + {577, 4}, + {1040, 1}, + {1040, 1}, + {1040, 1}, + {1040, 1}, + {579, 1}, + {579, 1}, + {580, 1}, + {580, 1}, + {1135, 1}, + {1135, 1}, + {1135, 1}, + {584, 6}, + {584, 4}, + {584, 4}, + {584, 5}, + {584, 6}, + {584, 5}, + {584, 6}, + {584, 5}, + {584, 6}, + {584, 5}, + {584, 6}, + {584, 5}, + {584, 5}, + {584, 8}, + {584, 6}, + {584, 6}, + {584, 6}, + {584, 6}, + {584, 6}, + {584, 6}, + {584, 6}, + {584, 5}, + {584, 6}, + {584, 7}, + {584, 8}, + {584, 8}, + {584, 9}, + {1078, 0}, + {1078, 2}, + {575, 4}, + {575, 6}, + {1039, 0}, + {1039, 2}, + {1039, 3}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {677, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {659, 1}, + {1026, 0}, + {1026, 1}, + {1145, 1}, + {1145, 2}, + {982, 4}, + {1024, 0}, + {1024, 2}, + {771, 2}, + {771, 3}, + {771, 1}, + {771, 1}, + {771, 2}, + {771, 2}, + {771, 2}, + {771, 2}, + {771, 2}, + {771, 1}, + {771, 1}, + {771, 2}, + {771, 1}, + {710, 1}, + {710, 1}, + {710, 1}, + {759, 0}, + {759, 1}, + {598, 1}, + {598, 3}, + {598, 3}, + {669, 1}, + {669, 3}, + {806, 2}, + {806, 4}, + {961, 1}, + {961, 3}, + {755, 0}, + {755, 2}, + {1093, 0}, + {1093, 1}, + {925, 4}, + {1091, 1}, + {1091, 1}, + {872, 2}, + {872, 4}, + {1138, 1}, + {1138, 3}, + {855, 3}, + {856, 1}, + {856, 1}, + {941, 2}, + {941, 3}, + {941, 4}, + {941, 5}, + {841, 4}, + {841, 4}, + {841, 5}, + {841, 2}, + {841, 3}, + {841, 1}, + {841, 2}, + {952, 1}, + {935, 1}, + {618, 4}, + {619, 3}, + {620, 7}, + {617, 7}, + {617, 6}, + {617, 5}, + {617, 6}, + {617, 6}, + {634, 2}, + {634, 2}, + {636, 2}, + {636, 3}, + {987, 3}, + {987, 1}, + {774, 4}, + {1037, 2}, + {1146, 0}, + {1146, 2}, + {1147, 1}, + {1147, 3}, + {983, 3}, + {768, 1}, + {985, 3}, + {1152, 4}, + {1076, 0}, + {1076, 1}, + {1079, 0}, + {1079, 3}, + {1082, 0}, + {1082, 3}, + {1081, 0}, + {1081, 2}, + {1150, 1}, + {1150, 1}, + {1150, 1}, + {1149, 1}, + {1149, 1}, + {816, 2}, + {816, 2}, + {816, 2}, + {816, 4}, + {816, 2}, + {1148, 4}, + {984, 1}, + {984, 2}, + {984, 2}, + {984, 2}, + {984, 4}, + {612, 0}, + {612, 1}, + {605, 2}, + {1151, 1}, + {1151, 1}, + {587, 4}, + {587, 4}, + {587, 4}, + {587, 4}, + {587, 4}, + {587, 5}, + {587, 7}, + {587, 7}, + {587, 6}, + {587, 6}, + {587, 9}, + {914, 0}, + {914, 3}, + {914, 3}, + {915, 0}, + {915, 2}, + {734, 0}, + {734, 2}, + {734, 2}, + {1077, 0}, + {1077, 2}, + {1077, 2}, + {1129, 1}, + {739, 1}, + {739, 3}, + {701, 1}, + {701, 4}, + {650, 1}, + {650, 1}, + {649, 4}, + {649, 2}, + {649, 4}, + {649, 3}, + {757, 0}, + {757, 4}, + {764, 0}, + {764, 1}, + {738, 1}, + {738, 2}, + {783, 2}, + {783, 2}, + {783, 2}, + {1044, 0}, + {1044, 2}, + {1044, 3}, + {1044, 3}, + {782, 5}, + {1046, 0}, + {1046, 1}, + {1046, 3}, + {1046, 1}, + {1046, 3}, + {889, 1}, + {889, 2}, + {890, 0}, + {890, 1}, + {646, 3}, + {646, 5}, + {646, 7}, + {646, 7}, + {646, 9}, + {646, 4}, + {646, 6}, + {646, 3}, + {646, 5}, + {646, 7}, + {664, 1}, + {664, 1}, + {917, 0}, + {917, 1}, + {670, 1}, + {670, 2}, + {670, 2}, + {896, 0}, + {896, 2}, + {730, 1}, + {730, 1}, + {1102, 1}, + {1102, 1}, + {1032, 1}, + {1032, 1}, + {1027, 0}, + {1027, 1}, + {631, 2}, + {631, 4}, + {631, 4}, + {631, 5}, + {713, 0}, + {713, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {943, 1}, + {1104, 0}, + {1104, 1}, + {1105, 2}, + {1105, 1}, + {715, 1}, + {765, 0}, + {765, 1}, + {944, 1}, + {944, 1}, + {1103, 1}, + {801, 0}, + {801, 1}, + {736, 0}, + {736, 5}, + {569, 3}, + {569, 3}, + {569, 3}, + {569, 3}, + {735, 0}, + {735, 3}, + {735, 3}, + {735, 4}, + {735, 5}, + {735, 4}, + {735, 5}, + {735, 5}, + {735, 4}, + {906, 0}, + {906, 2}, + {635, 1}, + {635, 1}, + {635, 2}, + {635, 2}, + {627, 3}, + {627, 3}, + {626, 4}, + {626, 4}, + {626, 5}, + {626, 2}, + {626, 2}, + {626, 3}, + {625, 1}, + {625, 3}, + {622, 1}, + {622, 1}, + {1106, 2}, + {1106, 2}, + {1106, 2}, + {802, 1}, + {948, 2}, + {948, 4}, + {948, 7}, + {948, 6}, + {948, 9}, + {948, 4}, + {948, 4}, + {948, 3}, + {947, 3}, + {946, 6}, + {945, 1}, + {945, 1}, + {945, 1}, + {1107, 3}, + {1107, 1}, + {1107, 1}, + {808, 1}, + {808, 3}, + {766, 3}, + {766, 2}, + {766, 2}, + {1052, 2}, + {1052, 2}, + {1052, 2}, + {1052, 1}, + {714, 1}, + {714, 1}, + {714, 1}, + {644, 1}, + {644, 1}, + {679, 1}, + {679, 3}, + {975, 3}, + {975, 4}, + {975, 4}, + {975, 4}, + {975, 4}, + {975, 3}, + {975, 3}, + {975, 2}, + {975, 4}, + {975, 4}, + {975, 2}, + {975, 2}, + {1006, 1}, + {1006, 1}, + {654, 1}, + {654, 1}, + {723, 1}, + {723, 1}, + {1142, 1}, + {1142, 3}, + {586, 1}, + {586, 1}, + {585, 1}, + {571, 1}, + {624, 1}, + {624, 3}, + {624, 2}, + {624, 2}, + {718, 1}, + {718, 3}, + {922, 1}, + {922, 4}, + {695, 1}, + {668, 1}, + {668, 1}, + {648, 3}, + {648, 2}, + {799, 1}, + {799, 1}, + {667, 1}, + {667, 1}, + {711, 1}, + {711, 3}, + {950, 3}, + {950, 4}, + {950, 4}, + {950, 5}, + {950, 4}, + {950, 2}, + {950, 5}, + {950, 3}, + {950, 4}, + {950, 3}, + {950, 3}, + {950, 2}, + {950, 5}, + {950, 2}, + {1112, 0}, + {1112, 1}, + {1111, 1}, + {1111, 3}, + {949, 1}, + {949, 1}, + {949, 2}, + {949, 2}, + {949, 2}, + {949, 1}, + {949, 1}, + {949, 1}, + {949, 1}, + {1110, 0}, + {1110, 3}, + {1139, 0}, + {1139, 2}, + {1108, 1}, + {1108, 1}, + {1108, 1}, + {651, 1}, + {651, 1}, + {1113, 1}, + {1113, 1}, + {1113, 1}, + {1113, 3}, + {1113, 3}, + {1113, 3}, + {1113, 3}, + {1113, 5}, + {1113, 4}, + {1113, 5}, + {1113, 5}, + {1113, 1}, + {1113, 5}, + {1113, 1}, + {1113, 2}, + {1113, 2}, + {1113, 1}, + {1113, 2}, + {1113, 2}, + {1113, 1}, + {1109, 0}, + {1109, 2}, + {1109, 2}, + {1041, 0}, + {1041, 1}, + {1041, 1}, + {910, 0}, + {910, 1}, + {691, 0}, + {691, 2}, + {951, 2}, + {1098, 1}, + {1098, 1}, + {880, 3}, + {1035, 1}, + {1035, 1}, + {1035, 1}, + {1035, 1}, + {1035, 1}, + {1035, 2}, + {1035, 3}, + {1035, 3}, + {1036, 0}, + {1036, 3}, + {1063, 0}, + {1063, 1}, + {1063, 1}, + {1063, 1}, + {1063, 1}, + {1063, 1}, + {657, 0}, + {657, 1}, + {657, 1}, + {964, 0}, + {964, 1}, + {1153, 0}, + {1153, 3}, + {1153, 2}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {956, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {725, 1}, + {1119, 1}, + {1119, 3}, + {743, 2}, + {834, 1}, + {834, 1}, + {805, 1}, + {805, 1}, + {962, 1}, + {962, 3}, + {1127, 0}, + {1127, 3}, + {716, 1}, + {716, 4}, + {716, 4}, + {716, 4}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 1}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 3}, + {716, 2}, + {716, 2}, + {716, 3}, + {716, 3}, + {716, 5}, + {716, 3}, + {716, 3}, + {704, 0}, + {704, 1}, + {957, 1}, + {957, 1}, + {1017, 0}, + {1017, 1}, + {807, 1}, + {807, 2}, + {807, 3}, + {1080, 0}, + {1080, 1}, + {969, 3}, + {712, 3}, + {712, 3}, + {712, 3}, + {712, 3}, + {712, 3}, + {712, 3}, + {1136, 1}, + {1136, 1}, + {1136, 1}, + {1070, 3}, + {1070, 2}, + {1070, 3}, + {1070, 3}, + {1070, 2}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1051, 1}, + {1004, 1}, + {1004, 1}, + {912, 0}, + {912, 1}, + {912, 1}, + {1033, 1}, + {1033, 1}, + {1033, 1}, + {1034, 1}, + {1034, 1}, + {1034, 1}, + {1034, 2}, + {1034, 1}, + {1034, 1}, + {1002, 1}, + {1122, 3}, + {1122, 2}, + {1122, 3}, + {1122, 2}, + {1122, 3}, + {1122, 3}, + {1122, 2}, + {1122, 2}, + {1122, 1}, + {1122, 2}, + {1122, 5}, + {1122, 5}, + {1122, 1}, + {1122, 3}, + {1122, 2}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {1122, 1}, + {722, 1}, + {722, 1}, + {1068, 1}, + {1068, 2}, + {1068, 2}, + {974, 2}, + {974, 2}, + {974, 1}, + {974, 1}, + {1071, 2}, + {1071, 2}, + {1071, 1}, + {1071, 2}, + {1071, 2}, + {1071, 3}, + {1071, 3}, + {1071, 2}, + {1157, 1}, + {1157, 1}, + {1003, 1}, + {1003, 2}, + {1003, 1}, + {1003, 1}, + {1003, 2}, + {1132, 1}, + {1132, 2}, + {1132, 1}, + {1132, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {733, 1}, + {1021, 1}, + {1021, 2}, + {1021, 2}, + {1021, 2}, + {1021, 3}, + {611, 3}, + {640, 0}, + {640, 1}, + {726, 1}, + {726, 1}, + {726, 1}, + {727, 0}, + {727, 2}, + {745, 0}, + {745, 1}, + {745, 1}, + {758, 5}, + {1074, 0}, + {1074, 1}, + {647, 0}, + {647, 2}, + {647, 3}, + {1075, 0}, + {1075, 2}, + {628, 2}, + {628, 1}, + {628, 2}, + {909, 0}, + {909, 2}, + {658, 1}, + {658, 1}, + {658, 1}, + {968, 1}, + {968, 3}, + {988, 3}, + {988, 4}, + {988, 4}, + {988, 3}, + {988, 4}, + {988, 6}, + {988, 3}, + {988, 3}, + {988, 5}, + {988, 3}, + {988, 2}, + {988, 4}, + {1000, 1}, + {1000, 1}, + {740, 1}, + {740, 3}, + {740, 5}, + {740, 5}, + {848, 7}, + {848, 9}, + {863, 6}, + {954, 0}, + {954, 2}, + {953, 2}, + {953, 2}, + {953, 5}, + {953, 2}, + {849, 6}, + {849, 6}, + {965, 0}, + {965, 3}, + {1130, 0}, + {1130, 4}, + {822, 7}, + {822, 7}, + {822, 6}, + {822, 4}, + {822, 6}, + {822, 6}, + {822, 7}, + {822, 7}, + {864, 4}, + {864, 5}, + {846, 8}, + {820, 8}, + {861, 5}, + {642, 0}, + {642, 1}, + {641, 1}, + {641, 2}, + {641, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 1}, + {637, 1}, + {637, 3}, + {637, 3}, + {637, 3}, + {637, 3}, + {692, 1}, + {692, 1}, + {596, 1}, + {596, 1}, + {693, 1}, + {693, 2}, + {678, 10}, + {678, 8}, + {972, 2}, + {680, 2}, + {681, 0}, + {681, 1}, + {851, 9}, + {847, 4}, + {825, 9}, + {825, 9}, + {825, 12}, + {825, 9}, + {819, 3}, + {1050, 4}, + {1050, 2}, + {1050, 4}, + {1050, 3}, + {1050, 3}, + {1133, 0}, + {1133, 3}, + {1069, 0}, + {1069, 4}, + {767, 2}, + {813, 1}, + {813, 3}, + {824, 2}, + {824, 5}, + {824, 4}, + {993, 1}, + {993, 3}, + {999, 3}, + {999, 5}, + {843, 0}, + {843, 2}, + {1015, 1}, + {1015, 2}, + {842, 2}, + {842, 2}, + {842, 2}, + {842, 2}, + {797, 0}, + {797, 1}, + {796, 2}, + {796, 2}, + {796, 2}, + {796, 2}, + {1099, 1}, + {1099, 3}, + {1099, 2}, + {798, 2}, + {798, 2}, + {798, 2}, + {798, 2}, + {798, 2}, + {839, 0}, + {839, 2}, + {839, 2}, + {934, 0}, + {934, 3}, + {924, 0}, + {924, 1}, + {923, 1}, + {923, 2}, + {792, 2}, + {792, 2}, + {792, 3}, + {792, 3}, + {792, 4}, + {792, 5}, + {792, 2}, + {792, 5}, + {792, 3}, + {792, 3}, + {792, 2}, + {792, 2}, + {792, 2}, + {792, 4}, + {828, 0}, + {828, 3}, + {828, 3}, + {828, 5}, + {828, 5}, + {828, 4}, + {829, 1}, + {886, 1}, + {886, 1}, + {940, 1}, + {1101, 1}, + {1101, 3}, + {885, 9}, + {883, 7}, + {884, 4}, + {986, 0}, + {986, 3}, + {986, 3}, + {986, 3}, + {986, 3}, + {986, 3}, + {779, 1}, + {779, 2}, + {800, 1}, + {800, 1}, + {800, 1}, + {800, 3}, + {800, 3}, + {939, 1}, + {939, 3}, + {794, 1}, + {794, 4}, + {795, 1}, + {795, 2}, + {795, 1}, + {795, 1}, + {795, 2}, + {795, 2}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 2}, + {795, 1}, + {795, 2}, + {795, 1}, + {795, 2}, + {795, 2}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 3}, + {795, 2}, + {795, 2}, + {795, 2}, + {795, 2}, + {795, 2}, + {795, 2}, + {795, 2}, + {795, 1}, + {795, 1}, + {904, 0}, + {904, 1}, + {904, 1}, + {904, 1}, + {926, 1}, + {926, 3}, + {926, 3}, + {926, 3}, + {926, 1}, + {938, 7}, + {937, 4}, + {901, 16}, + {1064, 0}, + {1064, 1}, + {1043, 0}, + {1043, 3}, + {1007, 0}, + {1007, 3}, + {1061, 0}, + {1061, 1}, + {879, 0}, + {879, 2}, + {702, 1}, + {702, 1}, + {1030, 2}, + {1030, 1}, + {878, 3}, + {878, 2}, + {878, 3}, + {878, 3}, + {878, 4}, + {878, 6}, + {703, 1}, + {703, 1}, + {703, 1}, + {899, 0}, + {899, 3}, + {1116, 0}, + {1116, 3}, + {1058, 0}, + {1058, 3}, + {1060, 0}, + {1060, 2}, + {1059, 3}, + {1059, 1}, + {900, 3}, + {970, 2}, + {902, 3}, + {966, 1}, + {966, 1}, + {963, 2}, + {1062, 1}, + {1062, 2}, + {1062, 1}, + {1062, 2}, + {1128, 1}, + {1128, 3}, + {933, 5}, + {1097, 0}, + {1097, 2}, + {1097, 2}, + {1097, 2}, + {911, 4}, + {895, 2}, + {895, 3}, + {895, 3}, + {895, 2}, + {1186, 1}, + {1186, 2}, + {1186, 2}, + {870, 1}, + {814, 1}, + {814, 3}, + {762, 2}, + } + + yyXErrors = map[yyXError]string{} + + yyParseTab = [3698][]uint16{ + // 0 + {1729, 1729, 120: 2240, 132: 2147, 156: 2250, 158: 2151, 163: 2127, 2130, 174: 2142, 2128, 181: 2129, 192: 2150, 195: 2132, 197: 2148, 199: 2170, 218: 2153, 224: 2152, 233: 2241, 332: 2161, 337: 2160, 353: 2249, 367: 2168, 371: 2159, 380: 2146, 385: 2140, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 523: 2244, 525: 2124, 527: 2137, 532: 2126, 535: 2125, 539: 2251, 569: 2165, 609: 2133, 617: 2167, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 2226, 2225, 2136, 653: 2143, 671: 2134, 2135, 678: 2242, 683: 2173, 685: 2181, 689: 2202, 2220, 693: 2232, 698: 2131, 705: 2245, 731: 2247, 737: 2169, 811: 2248, 818: 2172, 2175, 2217, 822: 2214, 825: 2174, 2209, 2176, 830: 2177, 2178, 2144, 2201, 840: 2179, 844: 2184, 2185, 2216, 2189, 2211, 2213, 2186, 2188, 853: 2187, 855: 2180, 2149, 2139, 2190, 2191, 2192, 2218, 2196, 2212, 2215, 2193, 2195, 2194, 869: 2171, 872: 2182, 2138, 875: 2183, 2141, 880: 2197, 883: 2199, 2200, 2198, 894: 2252, 2203, 901: 2204, 2235, 911: 2238, 925: 2205, 930: 2221, 2207, 2219, 2208, 935: 2237, 2246, 2223, 2222, 941: 2206, 2224, 946: 2229, 2228, 2227, 950: 2230, 952: 2236, 956: 2239, 969: 2231, 2234, 972: 2233, 988: 2210, 1115: 2122, 1119: 2123}, + {2121}, + {2120, 5817}, + {23: 5709, 54: 5548, 57: 1773, 91: 1773, 106: 5712, 152: 5711, 255: 5713, 440: 5294, 502: 1620, 3860, 526: 1773, 728: 4528, 776: 5707, 810: 5710, 976: 5708}, + {59: 3627, 106: 5692, 502: 3626, 717: 5691}, + // 5 + {59: 554, 76: 3624, 502: 554, 656: 3623, 5663}, + {2001, 2001, 179: 4389, 817: 5662}, + {297: 5651}, + {335: 5650}, + {2001, 2001, 75: 2001, 179: 4389, 358: 2001, 653: 2001, 817: 5648}, + // 10 + {23: 5439, 54: 1775, 57: 1775, 91: 1775, 106: 5442, 147: 5443, 152: 5441, 177: 5298, 362: 5438, 438: 5432, 440: 5294, 502: 1744, 509: 1864, 526: 1775, 530: 5433, 534: 5434, 776: 5435, 810: 5440, 916: 5436, 1045: 5431, 1084: 5437}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 5430}, + {2: 759, 759, 759, 759, 759, 759, 9: 759, 759, 759, 759, 759, 759, 759, 759, 759, 19: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 356: 759, 503: 759, 606: 759, 759, 759, 610: 3852, 715: 3853, 765: 5396}, + {1752, 1752}, + {1751, 1751}, + // 15 + {332: 2161, 371: 2159, 502: 2158, 504: 2154, 517: 2243, 569: 3303, 609: 2133, 617: 3302, 2155, 2156, 2157, 622: 2166, 625: 2164, 3304, 3305, 671: 5393, 5394, 678: 5395}, + {23: 5303, 57: 5299, 59: 1744, 106: 5300, 132: 929, 147: 5301, 152: 5305, 177: 5298, 440: 5294, 502: 1744, 509: 5296, 530: 5302, 776: 5295, 810: 5304, 916: 5297}, + {2: 1728, 1728, 1728, 1728, 1728, 1728, 9: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 19: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 337: 1728, 350: 1728, 359: 1728, 371: 1728, 380: 1728, 430: 1728, 502: 1728, 504: 1728, 517: 1728, 525: 1728, 532: 1728, 609: 1728}, + {2: 1727, 1727, 1727, 1727, 1727, 1727, 9: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 19: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 337: 1727, 350: 1727, 359: 1727, 371: 1727, 380: 1727, 430: 1727, 502: 1727, 504: 1727, 517: 1727, 525: 1727, 532: 1727, 609: 1727}, + {2: 1726, 1726, 1726, 1726, 1726, 1726, 9: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 19: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 337: 1726, 350: 1726, 359: 1726, 371: 1726, 380: 1726, 430: 1726, 502: 1726, 504: 1726, 517: 1726, 525: 1726, 532: 1726, 609: 1726}, + // 20 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 4498, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 4494, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 2161, 337: 2160, 350: 4497, 359: 3356, 371: 2159, 380: 2146, 430: 2145, 502: 2158, 504: 2154, 506: 3355, 2311, 2310, 517: 2243, 525: 4493, 532: 4499, 569: 4500, 598: 4495, 609: 2133, 617: 4501, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4507, 4506, 2136, 671: 2134, 2135, 678: 2242, 683: 4508, 685: 4502, 689: 4504, 4505, 693: 4503, 725: 4496}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4492, 2311, 2310}, + {174: 4490}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4479, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4481, 2311, 2310, 1092: 4480}, + {2: 759, 759, 759, 759, 759, 759, 9: 759, 759, 759, 759, 759, 759, 759, 759, 759, 19: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 351: 759, 359: 759, 503: 759, 606: 759, 759, 759, 610: 3852, 715: 3853, 765: 4466}, + // 25 + {2: 759, 759, 759, 759, 759, 759, 9: 759, 759, 759, 759, 759, 759, 759, 759, 759, 19: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 351: 759, 359: 759, 606: 759, 759, 759, 610: 3852, 715: 3853, 765: 4421}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4416, 2311, 2310}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4410, 2311, 2310}, + {132: 4408}, + {132: 930}, + // 30 + {2001, 2001, 75: 2001, 179: 4389, 358: 2001, 510: 2001, 653: 2001, 817: 4390}, + {917, 917}, + {916, 916}, + {2: 764, 764, 764, 764, 764, 764, 9: 764, 764, 764, 764, 764, 764, 764, 764, 764, 19: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 4359, 4365, 4366, 764, 764, 764, 764, 764, 764, 334: 764, 764, 764, 339: 764, 764, 764, 344: 764, 764, 764, 349: 764, 359: 764, 370: 764, 764, 4362, 375: 764, 380: 764, 400: 764, 424: 764, 764, 764, 764, 764, 430: 764, 764, 764, 434: 764, 764, 764, 764, 440: 764, 764, 443: 764, 764, 446: 764, 764, 764, 764, 764, 764, 764, 764, 455: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 594: 2956, 603: 2954, 2955, 606: 3855, 3857, 3856, 610: 3852, 614: 4358, 4361, 4357, 638: 4283, 4355, 710: 4356, 715: 4354, 943: 4364, 4360, 1104: 4353, 4363}, + {214, 214, 18: 214, 333: 214, 337: 214, 342: 214, 347: 214, 214, 350: 214, 214, 214, 214, 355: 214, 4328, 214, 360: 3979, 368: 214, 680: 3980, 4329, 1037: 4327}, + // 35 + {754, 754, 18: 754, 333: 754, 337: 754, 342: 754, 347: 754, 754, 350: 754, 754, 754, 754, 355: 754, 357: 754, 368: 4315, 781: 4317, 801: 4316}, + {1201, 1201, 18: 1201, 333: 1201, 337: 1201, 342: 1201, 347: 1201, 1201, 350: 1201, 1201, 1201, 1201, 355: 1201, 357: 3000, 630: 3001, 675: 4311}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4306}, + {434: 3329, 762: 3328, 814: 3327}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4299, 2311, 2310, 774: 4298, 987: 4296, 1094: 4297}, + // 40 + {332: 2161, 337: 2160, 371: 2159, 502: 2158, 504: 2154, 569: 4295, 617: 3296, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 3298, 3297, 3295}, + {735, 735, 18: 735, 333: 735, 337: 735}, + {734, 734, 18: 734, 333: 734, 337: 734}, + {342: 4280, 347: 4281, 4282, 1106: 4279}, + {489, 489, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + // 45 + {342: 723, 347: 723, 723}, + {491, 491, 342: 721, 347: 721, 721}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 4181, 2344, 4177, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 4179, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 4182, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 4178, 2435, 2527, 2450, 4185, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 4183, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 4184, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 4180, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 339: 4187, 370: 3250, 424: 4191, 456: 4190, 505: 3248, 4188, 2311, 2310, 628: 4192, 679: 4189, 975: 4193, 1142: 4186}, + {16: 3249, 59: 578, 73: 578, 578, 78: 581, 117: 4073, 135: 4078, 154: 4063, 162: 581, 170: 4084, 172: 578, 203: 4076, 210: 4057, 225: 4086, 232: 4075, 244: 4067, 246: 4080, 251: 4082, 4056, 254: 4065, 272: 4070, 277: 4081, 4062, 4061, 283: 4085, 289: 4083, 298: 4079, 370: 3250, 400: 4058, 457: 4074, 502: 4071, 505: 3248, 509: 4064, 628: 4069, 698: 4055, 787: 4066, 854: 4068, 910: 4060, 1041: 4077, 1098: 4059, 1108: 4072, 1113: 4054}, + {17: 554, 59: 554, 76: 3624, 78: 554, 110: 554, 154: 554, 169: 554, 200: 554, 202: 554, 217: 554, 226: 554, 231: 554, 400: 554, 502: 554, 656: 3623, 4025, 752: 554}, + // 50 + {546, 546}, + {545, 545}, + {544, 544}, + {543, 543}, + {542, 542}, + // 55 + {541, 541}, + {540, 540}, + {539, 539}, + {538, 538}, + {537, 537}, + // 60 + {536, 536}, + {535, 535}, + {534, 534}, + {533, 533}, + {532, 532}, + // 65 + {531, 531}, + {530, 530}, + {529, 529}, + {528, 528}, + {527, 527}, + // 70 + {526, 526}, + {525, 525}, + {524, 524}, + {523, 523}, + {522, 522}, + // 75 + {521, 521}, + {520, 520}, + {519, 519}, + {518, 518}, + {517, 517}, + // 80 + {516, 516}, + {515, 515}, + {514, 514}, + {513, 513}, + {512, 512}, + // 85 + {511, 511}, + {510, 510}, + {509, 509}, + {508, 508}, + {507, 507}, + // 90 + {506, 506}, + {505, 505}, + {504, 504}, + {503, 503}, + {502, 502}, + // 95 + {501, 501}, + {500, 500}, + {499, 499}, + {498, 498}, + {497, 497}, + // 100 + {496, 496}, + {495, 495}, + {494, 494}, + {493, 493}, + {492, 492}, + // 105 + {490, 490}, + {488, 488}, + {487, 487}, + {486, 486}, + {485, 485}, + // 110 + {484, 484}, + {483, 483}, + {482, 482}, + {481, 481}, + {480, 480}, + // 115 + {479, 479}, + {478, 478}, + {477, 477}, + {467, 467}, + {2: 422, 422, 422, 422, 422, 422, 9: 422, 422, 422, 422, 422, 422, 422, 422, 422, 19: 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 359: 422, 502: 4022, 1080: 4023}, + // 120 + {121: 3995, 132: 3996, 158: 3998, 163: 4000, 3997, 175: 4001, 280: 3999, 1000: 3994}, + {220, 220}, + {2: 759, 759, 759, 759, 759, 759, 9: 759, 759, 759, 759, 759, 759, 759, 759, 759, 19: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 359: 759, 435: 759, 503: 759, 521: 759, 606: 759, 759, 759, 610: 3852, 715: 3853, 765: 3854}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3850, 2311, 2310, 700: 3851}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 3693, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 3695, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 3697, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 3701, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 3694, 2354, 3702, 2356, 3696, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 3699, 3803, 3700, 2418, 2524, 2449, 2452, 2799, 3698, 2800, 2801, 2778, 335: 3704, 353: 3727, 430: 3721, 445: 3725, 504: 3710, 506: 2901, 2311, 2310, 3720, 517: 3723, 525: 3715, 527: 3719, 594: 3714, 596: 3703, 609: 3718, 648: 3705, 698: 3716, 705: 3724, 731: 3709, 737: 3722, 779: 3706, 794: 3707, 3713, 799: 3708, 3711, 809: 3717, 812: 3726, 939: 3804}, + // 125 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 3693, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 3695, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 3697, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 3701, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 3694, 2354, 3702, 2356, 3696, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 3699, 2381, 3700, 2418, 2524, 2449, 2452, 2799, 3698, 2800, 2801, 2778, 335: 3704, 353: 3727, 430: 3721, 445: 3725, 504: 3710, 506: 2901, 2311, 2310, 3720, 517: 3723, 525: 3715, 527: 3719, 594: 3714, 596: 3703, 609: 3718, 648: 3705, 698: 3716, 705: 3724, 731: 3709, 737: 3722, 779: 3706, 794: 3707, 3713, 799: 3708, 3711, 809: 3717, 812: 3726, 939: 3712}, + {29: 3651}, + {59: 3638, 502: 3639, 966: 3650}, + {59: 3638, 502: 3639, 966: 3637}, + {59: 554, 76: 3624, 502: 554, 656: 3623, 3630}, + // 130 + {59: 554, 76: 3624, 502: 554, 656: 3623, 3625}, + {16: 2258, 33: 2294, 58: 2257, 60: 2263, 62: 2292, 65: 2265, 2272, 2273, 2274, 2280, 2286, 72: 2291, 106: 2290, 108: 2261, 2254, 116: 2287, 120: 2289, 129: 2259, 133: 2288, 135: 2260, 137: 2270, 2264, 2268, 2269, 2275, 2276, 2277, 145: 2278, 2279, 155: 2295, 157: 2283, 159: 2285, 332: 2253, 340: 2271, 2284, 375: 2256, 380: 2282, 428: 2266, 431: 2267, 440: 2262, 447: 2281, 570: 2255, 595: 2293, 720: 2296}, + {16: 2258, 58: 2257, 60: 2263, 62: 2292, 65: 2265, 2272, 2273, 2274, 2280, 2286, 72: 2291, 106: 2290, 108: 2261, 2254, 116: 2287, 120: 2289, 129: 2259, 133: 2288, 135: 2260, 137: 2270, 2264, 2268, 2269, 2275, 2276, 2277, 145: 2278, 2279, 157: 2283, 159: 2285, 332: 2253, 340: 2271, 2284, 380: 2282, 428: 2266, 431: 2267, 440: 2262, 447: 2281, 570: 2255, 720: 3621}, + {332: 3617}, + {332: 2299}, + // 135 + {1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 45: 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 60: 1709, 71: 1709, 82: 1709, 1709, 1709, 1709, 92: 1709, 1709, 96: 1709, 1709, 112: 1709, 1709, 115: 1709, 144: 1709, 184: 1709, 332: 1709, 1709, 1709, 336: 1709, 1709, 1709, 1709, 342: 1709, 1709, 347: 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 361: 1709, 370: 1709, 1709, 373: 1709, 380: 1709, 382: 1709, 423: 1709, 429: 1709, 433: 1709, 1709, 438: 1709, 1709, 445: 1709, 454: 1709, 502: 1709, 1709, 1709, 1709, 509: 1709, 511: 1709, 518: 1709, 520: 1709}, + {332: 1134}, + {332: 1133}, + {332: 1132}, + {332: 1131}, + // 140 + {332: 1130}, + {332: 1129}, + {332: 1128}, + {332: 1127}, + {332: 1126}, + // 145 + {332: 1125}, + {332: 1124}, + {332: 1123}, + {332: 1122}, + {332: 1121}, + // 150 + {332: 1120}, + {332: 1119}, + {332: 1118}, + {332: 1117}, + {332: 1116}, + // 155 + {332: 1115}, + {332: 1114}, + {332: 1113}, + {332: 1112}, + {332: 1111}, + // 160 + {332: 1110}, + {332: 1109}, + {332: 1108}, + {332: 1107}, + {332: 1106}, + // 165 + {332: 1105}, + {332: 1104}, + {332: 1103}, + {332: 1102}, + {332: 1101}, + // 170 + {332: 1100}, + {332: 1099}, + {11, 11}, + {375: 2256, 595: 2298}, + {375: 2256, 595: 2297}, + // 175 + {8, 8}, + {9, 9}, + {10, 10}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 2300}, + {18: 3616}, + // 180 + {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 333: 660, 660, 660, 660, 660, 660, 340: 660, 660, 660, 660, 660, 660, 660, 660, 660, 350: 660, 660, 660, 660, 355: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 372: 660, 660, 660, 376: 660, 660, 660, 660, 381: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 401: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 442: 660, 516: 3614}, + {1687, 1687, 8: 1687, 18: 1687, 77: 1687, 357: 1687, 2745, 361: 1687, 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3613}, + {332: 3585}, + {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 333: 1699, 335: 1699, 337: 1699, 1699, 340: 1699, 1699, 1699, 347: 1699, 1699, 350: 1699, 1699, 1699, 1699, 355: 1699, 1699, 1699, 1699, 360: 1699, 1699, 1699, 1699, 1699, 1699, 3568, 1699, 1699, 1699, 372: 1699, 1699, 1699, 376: 1699, 1699, 1699, 1699, 382: 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 399: 1699, 401: 1699, 1699, 3565, 3563, 3562, 3570, 3564, 3566, 3567, 3569, 1014: 3561, 1053: 3560}, + // 185 + {8: 2999, 18: 1682}, + {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 333: 1674, 335: 1674, 337: 1674, 1674, 340: 1674, 1674, 1674, 347: 1674, 1674, 350: 1674, 1674, 1674, 1674, 355: 1674, 1674, 1674, 1674, 360: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 372: 1674, 1674, 1674, 376: 1674, 1674, 1674, 1674, 382: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 399: 1674, 401: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, + {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 333: 1646, 3528, 1646, 3527, 1646, 1646, 340: 1646, 1646, 1646, 344: 3099, 3100, 3105, 1646, 1646, 350: 1646, 1646, 1646, 1646, 355: 1646, 1646, 1646, 1646, 3101, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 372: 1646, 1646, 1646, 376: 1646, 1646, 1646, 1646, 381: 3532, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 3531, 1646, 401: 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 3103, 3096, 3102, 3106, 3095, 3529, 3104, 3097, 3098, 3539, 3540, 3538, 666: 3530, 929: 3533, 1001: 3535, 1049: 3534, 1056: 3536, 1095: 3537}, + {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 3524, 1596, 1596, 1596, 1596, 1596, 1596, 340: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 350: 1596, 1596, 1596, 1596, 355: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 372: 1596, 1596, 1596, 376: 1596, 1596, 1596, 1596, 381: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 401: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 442: 1596, 512: 1596, 1596, 1596}, + {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 509: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, + // 190 + {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 509: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594}, + {1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 509: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593}, + {1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1134, 1592, 1592, 1592, 1592, 1592, 1592, 340: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 350: 1592, 1592, 1592, 1592, 355: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 372: 1592, 1592, 1592, 376: 1592, 1592, 1592, 1592, 381: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 401: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 442: 1592, 512: 1592, 1592, 1592}, + {1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 509: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, + {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 509: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, + // 195 + {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 509: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589}, + {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 509: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588}, + {1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 3519, 1587, 1587, 1587, 1587, 1587, 1587, 340: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 350: 1587, 1587, 1587, 1587, 355: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 372: 1587, 1587, 1587, 376: 1587, 1587, 1587, 1587, 381: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 401: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 442: 1587, 512: 1587, 1587, 1587}, + {1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 509: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586}, + {1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 509: 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, + // 200 + {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 509: 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584}, + {1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 509: 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583}, + {1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 509: 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582}, + {1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 509: 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581}, + {1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 509: 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, + // 205 + {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 509: 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, + {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1133, 1578, 1578, 1578, 1578, 1578, 1578, 340: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 350: 1578, 1578, 1578, 1578, 355: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 372: 1578, 1578, 1578, 376: 1578, 1578, 1578, 1578, 381: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 401: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 442: 1578, 512: 1578, 1578, 1578}, + {1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 509: 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577}, + {1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 509: 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576}, + {1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 509: 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, + // 210 + {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 509: 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574}, + {1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 509: 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573}, + {1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 509: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572}, + {1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 509: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571}, + {1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 509: 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, + // 215 + {1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 509: 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569}, + {1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1130, 1568, 1568, 3518, 1568, 1568, 1568, 340: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 350: 1568, 1568, 1568, 1568, 355: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 372: 1568, 1568, 1568, 376: 1568, 1568, 1568, 1568, 381: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 401: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 442: 1568, 512: 1568, 1568, 1568}, + {1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 509: 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567}, + {1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1128, 1566, 1566, 1566, 1566, 1566, 1566, 340: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 350: 1566, 1566, 1566, 1566, 355: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 372: 1566, 1566, 1566, 376: 1566, 1566, 1566, 1566, 381: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 401: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 442: 1566, 512: 1566, 1566, 1566}, + {1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 509: 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565}, + // 220 + {1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 509: 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564}, + {1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 509: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563}, + {1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 509: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562}, + {1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 509: 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561}, + {1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 509: 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560}, + // 225 + {1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 509: 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559}, + {1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 509: 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558}, + {1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 509: 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557}, + {1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 509: 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556}, + {1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 509: 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555}, + // 230 + {1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 509: 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554}, + {1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 509: 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553}, + {1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 509: 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552}, + {1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 509: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551}, + {1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 509: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550}, + // 235 + {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 509: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549}, + {1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 509: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548}, + {1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 509: 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547}, + {1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 509: 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546}, + {1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 509: 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545}, + // 240 + {1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 509: 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544}, + {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 509: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543}, + {1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 509: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542}, + {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1121, 1541, 1541, 1541, 1541, 1541, 1541, 340: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 350: 1541, 1541, 1541, 1541, 355: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 372: 1541, 1541, 1541, 376: 1541, 1541, 1541, 1541, 381: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 401: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 442: 1541, 512: 1541, 1541, 1541}, + {1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 509: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, + // 245 + {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 509: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, + {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 509: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538}, + {1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 509: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537}, + {1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1126, 1536, 1536, 1536, 1536, 1536, 1536, 340: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 350: 1536, 1536, 1536, 1536, 355: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 372: 1536, 1536, 1536, 376: 1536, 1536, 1536, 1536, 381: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 401: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 442: 1536, 512: 1536, 1536, 1536}, + {1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 509: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, + // 250 + {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 509: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, + {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 509: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533}, + {1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 509: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532}, + {1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 509: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531}, + {1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 509: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, + // 255 + {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 509: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, + {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 509: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528}, + {1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 509: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527}, + {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 3515, 1526, 1526, 1526, 1526, 1526, 1526, 340: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 350: 1526, 1526, 1526, 1526, 355: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 372: 1526, 1526, 1526, 376: 1526, 1526, 1526, 1526, 381: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 401: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 442: 1526, 512: 1526, 1526, 1526}, + {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 509: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, + // 260 + {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 509: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, + {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 509: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523}, + {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 509: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522}, + {1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 509: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521}, + {1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 509: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, + // 265 + {1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 509: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519}, + {1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 509: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518}, + {1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 509: 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517}, + {1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 509: 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516}, + {1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 509: 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515}, + // 270 + {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 509: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514}, + {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 509: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513}, + {1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 509: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512}, + {1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 509: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511}, + {1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 509: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510}, + // 275 + {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 509: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509}, + {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 509: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508}, + {1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1113, 1507, 1507, 1507, 1507, 1507, 1507, 340: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 350: 1507, 1507, 1507, 1507, 355: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 372: 1507, 1507, 1507, 376: 1507, 1507, 1507, 1507, 381: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 401: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 442: 1507, 512: 1507, 1507, 1507}, + {1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 509: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506}, + {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 509: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505}, + // 280 + {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 509: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504}, + {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 509: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503}, + {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 509: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502}, + {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 509: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501}, + {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1104, 1500, 1500, 3514, 1500, 1500, 1500, 340: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 350: 1500, 1500, 1500, 1500, 355: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 372: 1500, 1500, 1500, 376: 1500, 1500, 1500, 1500, 381: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 401: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 442: 1500, 512: 1500, 1500, 1500}, + // 285 + {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1103, 1499, 1499, 3513, 1499, 1499, 1499, 340: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 350: 1499, 1499, 1499, 1499, 355: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 372: 1499, 1499, 1499, 376: 1499, 1499, 1499, 1499, 381: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 401: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 442: 1499, 512: 1499, 1499, 1499}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 509: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1102, 1497, 1497, 1497, 1497, 1497, 1497, 340: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 350: 1497, 1497, 1497, 1497, 355: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 372: 1497, 1497, 1497, 376: 1497, 1497, 1497, 1497, 381: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 401: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 442: 1497, 512: 1497, 1497, 1497}, + {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 509: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496}, + {1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 509: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495}, + // 290 + {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 509: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494}, + {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 509: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493}, + {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1099, 1492, 1492, 1492, 1492, 1492, 1492, 340: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 350: 1492, 1492, 1492, 1492, 355: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 372: 1492, 1492, 1492, 376: 1492, 1492, 1492, 1492, 381: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 401: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 442: 1492, 512: 1492, 1492, 1492}, + {1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 509: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491}, + {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1100, 1490, 1490, 1490, 1490, 1490, 1490, 340: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 350: 1490, 1490, 1490, 1490, 355: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 372: 1490, 1490, 1490, 376: 1490, 1490, 1490, 1490, 381: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 401: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 442: 1490, 512: 1490, 1490, 1490}, + // 295 + {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 3503, 1489, 1489, 1489, 1489, 1489, 1489, 340: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 350: 1489, 1489, 1489, 1489, 355: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 372: 1489, 1489, 1489, 376: 1489, 1489, 1489, 1489, 381: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 401: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 442: 1489, 512: 1489, 1489, 1489}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 509: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488}, + {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 509: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487}, + {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1101, 1486, 1486, 1486, 1486, 1486, 1486, 340: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 350: 1486, 1486, 1486, 1486, 355: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 372: 1486, 1486, 1486, 376: 1486, 1486, 1486, 1486, 381: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 401: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 442: 1486, 512: 1486, 1486, 1486}, + {1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 509: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, + // 300 + {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1131, 1484, 1484, 1484, 1484, 1484, 1484, 340: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 350: 1484, 1484, 1484, 1484, 355: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 372: 1484, 1484, 1484, 376: 1484, 1484, 1484, 1484, 381: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 401: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 442: 1484, 512: 1484, 1484, 1484}, + {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 509: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483}, + {1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 509: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482}, + {1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 509: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481}, + {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 509: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, + // 305 + {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 509: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, + {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 509: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478}, + {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 509: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477}, + {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 509: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476}, + {1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 509: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475}, + // 310 + {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 509: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474}, + {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 509: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473}, + {1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 509: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472}, + {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1111, 1471, 1471, 1471, 1471, 1471, 1471, 340: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 350: 1471, 1471, 1471, 1471, 355: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 372: 1471, 1471, 1471, 376: 1471, 1471, 1471, 1471, 381: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 401: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 442: 1471, 512: 1471, 1471, 1471}, + {1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 509: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470}, + // 315 + {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 509: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469}, + {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 509: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468}, + {1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 509: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467}, + {1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 509: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466}, + {1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 509: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465}, + // 320 + {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 509: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464}, + {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 509: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463}, + {1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 509: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462}, + {1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 509: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461}, + {1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 509: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, + // 325 + {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 509: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, + {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 509: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458}, + {1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 509: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457}, + {1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 509: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456}, + {1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 509: 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455}, + // 330 + {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 509: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, + {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 509: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453}, + {1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 509: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452}, + {1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 509: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451}, + {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1108, 1450, 1450, 1450, 1450, 1450, 1450, 340: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 350: 1450, 1450, 1450, 1450, 355: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 372: 1450, 1450, 1450, 376: 1450, 1450, 1450, 1450, 381: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 401: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 442: 1450, 512: 1450, 1450, 1450}, + // 335 + {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 509: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, + {1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 509: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448}, + {1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 509: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447}, + {1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 509: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446}, + {1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 509: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, + // 340 + {1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 509: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444}, + {1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 509: 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443}, + {1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 509: 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442}, + {1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 509: 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441}, + {1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 509: 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}, + // 345 + {1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 509: 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439}, + {1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 509: 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438}, + {1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 509: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437}, + {1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1106, 1436, 1436, 1436, 1436, 1436, 1436, 340: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 350: 1436, 1436, 1436, 1436, 355: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 372: 1436, 1436, 1436, 376: 1436, 1436, 1436, 1436, 381: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 401: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 442: 1436, 512: 1436, 1436, 1436}, + {1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1132, 1435, 1435, 1435, 1435, 1435, 1435, 340: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 350: 1435, 1435, 1435, 1435, 355: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 372: 1435, 1435, 1435, 376: 1435, 1435, 1435, 1435, 381: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 401: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 442: 1435, 512: 1435, 1435, 1435}, + // 350 + {1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1117, 1434, 1434, 1434, 1434, 1434, 1434, 340: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 350: 1434, 1434, 1434, 1434, 355: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 372: 1434, 1434, 1434, 376: 1434, 1434, 1434, 1434, 381: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 401: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 442: 1434, 512: 1434, 1434, 1434}, + {1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 509: 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433}, + {1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 509: 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432}, + {1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 509: 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431}, + {1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1119, 1430, 1430, 1430, 1430, 1430, 1430, 340: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 350: 1430, 1430, 1430, 1430, 355: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 372: 1430, 1430, 1430, 376: 1430, 1430, 1430, 1430, 381: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 401: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 442: 1430, 512: 1430, 1430, 1430}, + // 355 + {1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1118, 1429, 1429, 1429, 1429, 1429, 1429, 340: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 350: 1429, 1429, 1429, 1429, 355: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 372: 1429, 1429, 1429, 376: 1429, 1429, 1429, 1429, 381: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 401: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 442: 1429, 512: 1429, 1429, 1429}, + {1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 509: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428}, + {1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 509: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427}, + {1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 509: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426}, + {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 509: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, + // 360 + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1105, 1424, 1424, 1424, 1424, 1424, 1424, 340: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 350: 1424, 1424, 1424, 1424, 355: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 372: 1424, 1424, 1424, 376: 1424, 1424, 1424, 1424, 381: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 401: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 442: 1424, 512: 1424, 1424, 1424}, + {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 509: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423}, + {1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 509: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422}, + {1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 509: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421}, + {1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 509: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, + // 365 + {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 509: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419}, + {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 509: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418}, + {1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 509: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417}, + {1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 509: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416}, + {1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 509: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415}, + // 370 + {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 509: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414}, + {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 509: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413}, + {1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 509: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412}, + {1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 509: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411}, + {1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 509: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410}, + // 375 + {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 509: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409}, + {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 509: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408}, + {1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 509: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407}, + {1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 509: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406}, + {1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 509: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}, + // 380 + {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 509: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404}, + {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 509: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403}, + {1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 509: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 509: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401}, + {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 509: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400}, + // 385 + {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 509: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399}, + {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 509: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398}, + {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 509: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 509: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396}, + {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 509: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, + // 390 + {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 509: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394}, + {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 509: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 509: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 509: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391}, + {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 509: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, + // 395 + {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 509: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, + {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 509: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388}, + {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 509: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387}, + {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 509: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386}, + {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 509: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385}, + // 400 + {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 509: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384}, + {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 509: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383}, + {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 509: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382}, + {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 509: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381}, + {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 509: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380}, + // 405 + {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 509: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379}, + {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 509: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378}, + {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 509: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 509: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376}, + {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 509: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375}, + // 410 + {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 509: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374}, + {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 509: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373}, + {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 509: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372}, + {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 509: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371}, + {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 509: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370}, + // 415 + {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 509: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369}, + {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 509: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, + {1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 509: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367}, + {1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 509: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366}, + {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 509: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365}, + // 420 + {1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 509: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364}, + {1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 509: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363}, + {1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 509: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 509: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361}, + {1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 509: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360}, + // 425 + {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 509: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359}, + {1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 509: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358}, + {1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 509: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357}, + {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 509: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356}, + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 509: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355}, + // 430 + {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 509: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354}, + {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 509: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353}, + {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 509: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 509: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351}, + {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 509: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350}, + // 435 + {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 509: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349}, + {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 509: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348}, + {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 509: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347}, + {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 509: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346}, + {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 509: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345}, + // 440 + {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 509: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344}, + {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 509: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343}, + {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 509: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342}, + {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 509: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341}, + {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 509: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340}, + // 445 + {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 509: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339}, + {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 509: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338}, + {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 509: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337}, + {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 509: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336}, + {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 509: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335}, + // 450 + {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 509: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334}, + {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 509: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333}, + {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 509: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332}, + {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 509: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331}, + {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 509: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330}, + // 455 + {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 509: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329}, + {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 509: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328}, + {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 509: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327}, + {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 509: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326}, + {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 509: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325}, + // 460 + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1127, 1324, 1324, 1324, 1324, 1324, 1324, 340: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 350: 1324, 1324, 1324, 1324, 355: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 372: 1324, 1324, 1324, 376: 1324, 1324, 1324, 1324, 381: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 401: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 442: 1324, 512: 1324, 1324, 1324}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1123, 1323, 1323, 1323, 1323, 1323, 1323, 340: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 350: 1323, 1323, 1323, 1323, 355: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 372: 1323, 1323, 1323, 376: 1323, 1323, 1323, 1323, 381: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 401: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 442: 1323, 512: 1323, 1323, 1323}, + {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1116, 1322, 1322, 1322, 1322, 1322, 1322, 340: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 350: 1322, 1322, 1322, 1322, 355: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 372: 1322, 1322, 1322, 376: 1322, 1322, 1322, 1322, 381: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 401: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 442: 1322, 512: 1322, 1322, 1322}, + {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1115, 1321, 1321, 1321, 1321, 1321, 1321, 340: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 350: 1321, 1321, 1321, 1321, 355: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 372: 1321, 1321, 1321, 376: 1321, 1321, 1321, 1321, 381: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 401: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 442: 1321, 512: 1321, 1321, 1321}, + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1114, 1320, 1320, 1320, 1320, 1320, 1320, 340: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 350: 1320, 1320, 1320, 1320, 355: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 372: 1320, 1320, 1320, 376: 1320, 1320, 1320, 1320, 381: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 401: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 442: 1320, 512: 1320, 1320, 1320}, + // 465 + {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1112, 1319, 1319, 1319, 1319, 1319, 1319, 340: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 350: 1319, 1319, 1319, 1319, 355: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 372: 1319, 1319, 1319, 376: 1319, 1319, 1319, 1319, 381: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 401: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 442: 1319, 512: 1319, 1319, 1319}, + {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 509: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318}, + {1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 509: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317}, + {1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 509: 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316, 1316}, + {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 509: 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315}, + // 470 + {1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 509: 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314, 1314}, + {1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 509: 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313}, + {1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 509: 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312, 1312}, + {1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 509: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311}, + {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 509: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310}, + // 475 + {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 509: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 509: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308}, + {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 509: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307}, + {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 509: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306}, + {1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 509: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305}, + // 480 + {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 509: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304}, + {1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 509: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303}, + {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 509: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302}, + {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 509: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301}, + {1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 509: 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300}, + // 485 + {1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 509: 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299}, + {1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 509: 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298}, + {1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 509: 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297}, + {1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 509: 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296}, + {1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 509: 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295, 1295}, + // 490 + {1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 509: 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294, 1294}, + {1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 509: 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293, 1293}, + {1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 509: 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292}, + {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 509: 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291}, + {1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 509: 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290}, + // 495 + {1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 509: 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289, 1289}, + {1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 509: 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288, 1288}, + {1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 509: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287}, + {1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 509: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286}, + {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 509: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285}, + // 500 + {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 509: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284}, + {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 509: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283}, + {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1044, 1282, 1282, 1282, 1282, 1282, 1282, 340: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 350: 1282, 1282, 1282, 1282, 355: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 372: 1282, 1282, 1282, 376: 1282, 1282, 1282, 1282, 381: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 401: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 442: 1282, 512: 1282, 1282, 1282}, + {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 3500, 1281, 1281, 1281, 1281, 1281, 1281, 340: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 350: 1281, 1281, 1281, 1281, 355: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 372: 1281, 1281, 1281, 376: 1281, 1281, 1281, 1281, 381: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 401: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 442: 1281, 512: 1281, 1281, 1281}, + {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 509: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280}, + // 505 + {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 509: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279}, + {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 3491, 1278, 1278, 1278, 1278, 1278, 1278, 340: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 350: 1278, 1278, 1278, 1278, 355: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 372: 1278, 1278, 1278, 376: 1278, 1278, 1278, 1278, 381: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 401: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 442: 1278, 512: 1278, 1278, 1278}, + {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 509: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 509: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276}, + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1122, 1275, 1275, 1275, 1275, 1275, 1275, 340: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 350: 1275, 1275, 1275, 1275, 355: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 372: 1275, 1275, 1275, 376: 1275, 1275, 1275, 1275, 381: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 401: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 442: 1275, 512: 1275, 1275, 1275}, + // 510 + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 509: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274}, + {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1043, 1273, 1273, 1273, 1273, 1273, 1273, 340: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 350: 1273, 1273, 1273, 1273, 355: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 372: 1273, 1273, 1273, 376: 1273, 1273, 1273, 1273, 381: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 401: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 442: 1273, 512: 1273, 1273, 1273}, + {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 3484, 1272, 1272, 1272, 1272, 1272, 1272, 340: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 350: 1272, 1272, 1272, 1272, 355: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 372: 1272, 1272, 1272, 376: 1272, 1272, 1272, 1272, 381: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 401: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 442: 1272, 512: 1272, 1272, 1272}, + {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 3477, 1271, 1271, 1271, 1271, 1271, 1271, 340: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 350: 1271, 1271, 1271, 1271, 355: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 372: 1271, 1271, 1271, 376: 1271, 1271, 1271, 1271, 381: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 401: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 442: 1271, 512: 1271, 1271, 1271}, + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 3457, 1270, 1270, 1270, 1270, 1270, 1270, 340: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 350: 1270, 1270, 1270, 1270, 355: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 372: 1270, 1270, 1270, 376: 1270, 1270, 1270, 1270, 381: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 401: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 442: 1270, 512: 1270, 1270, 1270}, + // 515 + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 3449, 1269, 1269, 1269, 1269, 1269, 1269, 340: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 350: 1269, 1269, 1269, 1269, 355: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 372: 1269, 1269, 1269, 376: 1269, 1269, 1269, 1269, 381: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 401: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 442: 1269, 512: 1269, 1269, 1269}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 3443, 1268, 1268, 1268, 1268, 1268, 1268, 340: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 350: 1268, 1268, 1268, 1268, 355: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 372: 1268, 1268, 1268, 376: 1268, 1268, 1268, 1268, 381: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 401: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 442: 1268, 512: 1268, 1268, 1268}, + {1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 509: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 333: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 372: 1228, 1228, 1228, 376: 1228, 1228, 1228, 1228, 381: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 401: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 429: 1228, 433: 1228, 438: 1228, 1228, 442: 1228, 445: 1228, 454: 1228}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 333: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 372: 1227, 1227, 1227, 376: 1227, 1227, 1227, 1227, 381: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 401: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 429: 1227, 433: 1227, 438: 1227, 1227, 442: 1227, 445: 1227, 454: 1227}, + // 520 + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 333: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 372: 1226, 1226, 1226, 376: 1226, 1226, 1226, 1226, 381: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 401: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 429: 1226, 433: 1226, 438: 1226, 1226, 442: 1226, 445: 1226, 454: 1226}, + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 333: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 372: 1225, 1225, 1225, 376: 1225, 1225, 1225, 1225, 381: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 401: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 429: 1225, 433: 1225, 438: 1225, 1225, 442: 1225, 445: 1225, 454: 1225}, + {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 333: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 372: 1224, 1224, 1224, 376: 1224, 1224, 1224, 1224, 381: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 401: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 429: 1224, 433: 1224, 438: 1224, 1224, 442: 1224, 445: 1224, 454: 1224}, + {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 333: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 372: 1223, 1223, 1223, 376: 1223, 1223, 1223, 1223, 381: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 401: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 429: 1223, 433: 1223, 438: 1223, 1223, 442: 1223, 445: 1223, 454: 1223}, + {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 333: 1222, 1222, 3442, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 372: 1222, 1222, 1222, 376: 1222, 1222, 1222, 1222, 381: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 401: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 429: 1222, 433: 1222, 438: 1222, 1222, 442: 1222, 445: 1222, 454: 1222}, + // 525 + {335: 3439, 426: 3440, 3441}, + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 333: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 372: 1220, 1220, 1220, 376: 1220, 1220, 1220, 1220, 381: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 401: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 429: 1220, 433: 1220, 438: 1220, 1220, 442: 1220, 445: 1220, 454: 1220}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 333: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 372: 1219, 1219, 1219, 376: 1219, 1219, 1219, 1219, 381: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 401: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 429: 1219, 433: 1219, 438: 1219, 1219, 442: 1219, 445: 1219, 454: 1219}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 333: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 372: 1216, 1216, 1216, 376: 1216, 1216, 1216, 1216, 381: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 401: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 429: 1216, 433: 1216, 438: 1216, 1216, 442: 1216, 445: 1216, 454: 1216}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 1124, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3437}, + // 530 + {1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 333: 1184, 1184, 1184, 1184, 1184, 1184, 340: 1184, 1184, 1184, 2749, 1184, 1184, 1184, 1184, 1184, 350: 1184, 1184, 1184, 1184, 355: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 372: 1184, 1184, 1184, 376: 1184, 1184, 1184, 1184, 381: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 401: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 442: 2750}, + {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 333: 1183, 1183, 1183, 1183, 1183, 1183, 340: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 350: 1183, 1183, 1183, 1183, 355: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 372: 1183, 1183, 1183, 376: 1183, 1183, 1183, 1183, 381: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 401: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 442: 1183, 512: 3432, 1183, 1183}, + {1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 333: 1180, 1180, 1180, 1180, 1180, 1180, 340: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 350: 1180, 1180, 1180, 1180, 355: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 372: 1180, 1180, 1180, 376: 1180, 1180, 1180, 1180, 381: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 401: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 442: 1180, 513: 3428, 3429}, + {1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 333: 1179, 1179, 1179, 1179, 1179, 1179, 340: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 350: 1179, 1179, 1179, 1179, 355: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 372: 1179, 1179, 1179, 376: 1179, 1179, 1179, 1179, 381: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 401: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 442: 1179}, + {1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 333: 1178, 1178, 1178, 1178, 1178, 1178, 340: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 350: 1178, 1178, 1178, 1178, 355: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 372: 1178, 1178, 1178, 376: 1178, 1178, 1178, 1178, 381: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 401: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 442: 1178}, + // 535 + {1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 333: 1177, 1177, 1177, 1177, 1177, 1177, 340: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 350: 1177, 1177, 1177, 1177, 355: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 372: 1177, 1177, 1177, 376: 1177, 1177, 1177, 1177, 381: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 401: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 442: 1177}, + {1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 333: 1175, 1175, 1175, 1175, 1175, 1175, 340: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 350: 1175, 1175, 1175, 1175, 355: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 372: 1175, 1175, 1175, 376: 1175, 1175, 1175, 1175, 381: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 401: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 442: 1175}, + {1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 333: 1174, 1174, 1174, 1174, 1174, 1174, 340: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 350: 1174, 1174, 1174, 1174, 355: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 372: 1174, 1174, 1174, 376: 1174, 1174, 1174, 1174, 381: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 401: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 442: 1174}, + {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 333: 1173, 1173, 1173, 1173, 1173, 1173, 340: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 350: 1173, 1173, 1173, 1173, 355: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 372: 1173, 1173, 1173, 376: 1173, 1173, 1173, 1173, 381: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 401: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 442: 1173}, + {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 333: 1172, 1172, 1172, 1172, 1172, 1172, 340: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 350: 1172, 1172, 1172, 1172, 355: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 372: 1172, 1172, 1172, 376: 1172, 1172, 1172, 1172, 381: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 401: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 442: 1172}, + // 540 + {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 333: 1171, 1171, 1171, 1171, 1171, 1171, 340: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 350: 1171, 1171, 1171, 1171, 355: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 372: 1171, 1171, 1171, 376: 1171, 1171, 1171, 1171, 381: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 401: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 442: 1171}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3427, 2661, 2734, 2660, 2657}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3426, 2661, 2734, 2660, 2657}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3425, 2661, 2734, 2660, 2657}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3424, 2661, 2734, 2660, 2657}, + // 545 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3423, 2661, 2734, 2660, 2657}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 333: 1164, 1164, 1164, 1164, 1164, 1164, 340: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 350: 1164, 1164, 1164, 1164, 355: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 372: 1164, 1164, 1164, 376: 1164, 1164, 1164, 1164, 381: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 401: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 442: 1164}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 2160, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 3294, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 2158, 504: 2154, 506: 2652, 2311, 2310, 569: 3293, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3291, 617: 3296, 2155, 2156, 2157, 3292, 2166, 625: 2164, 2163, 2162, 634: 3298, 3297, 3295}, + {332: 3286}, + {332: 2161, 569: 3285}, + // 550 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3282, 2311, 2310}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3281, 2661, 2734, 2660, 2657}, + {332: 3274}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 399: 976, 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3261, 1026: 3262}, + {332: 3202}, + // 555 + {332: 3199}, + {332: 3191}, + {332: 1136}, + {332: 1135}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 340: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 350: 1096, 1096, 1096, 1096, 355: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 372: 1096, 1096, 1096, 376: 1096, 1096, 1096, 1096, 381: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 401: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 442: 1096}, + // 560 + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 340: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 350: 1095, 1095, 1095, 1095, 355: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 372: 1095, 1095, 1095, 376: 1095, 1095, 1095, 1095, 381: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 401: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 442: 1095}, + {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 340: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 350: 1094, 1094, 1094, 1094, 355: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 372: 1094, 1094, 1094, 376: 1094, 1094, 1094, 1094, 381: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 401: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 442: 1094}, + {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 340: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 350: 1093, 1093, 1093, 1093, 355: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 372: 1093, 1093, 1093, 376: 1093, 1093, 1093, 1093, 381: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 401: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 442: 1093}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 340: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 350: 1092, 1092, 1092, 1092, 355: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 372: 1092, 1092, 1092, 376: 1092, 1092, 1092, 1092, 381: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 401: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 442: 1092}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 340: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 350: 1091, 1091, 1091, 1091, 355: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 372: 1091, 1091, 1091, 376: 1091, 1091, 1091, 1091, 381: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 401: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 442: 1091}, + // 565 + {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 340: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 350: 1090, 1090, 1090, 1090, 355: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 372: 1090, 1090, 1090, 376: 1090, 1090, 1090, 1090, 381: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 401: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 442: 1090}, + {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 340: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 350: 1089, 1089, 1089, 1089, 355: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 372: 1089, 1089, 1089, 376: 1089, 1089, 1089, 1089, 381: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 401: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 442: 1089}, + {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 340: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 350: 1088, 1088, 1088, 1088, 355: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 372: 1088, 1088, 1088, 376: 1088, 1088, 1088, 1088, 381: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 401: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 442: 1088}, + {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 340: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 350: 1087, 1087, 1087, 1087, 355: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 372: 1087, 1087, 1087, 376: 1087, 1087, 1087, 1087, 381: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 401: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 442: 1087}, + {332: 3188}, + // 570 + {332: 3185}, + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 3182, 1098, 1098, 1098, 1098, 1098, 1098, 340: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 350: 1098, 1098, 1098, 1098, 355: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 372: 1098, 1098, 1098, 376: 1098, 1098, 1098, 1098, 381: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 401: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 442: 1098, 913: 3183}, + {332: 3180}, + {1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 3176, 1008, 1008, 1008, 1008, 1008, 1008, 340: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 350: 1008, 1008, 1008, 1008, 355: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 372: 1008, 1008, 1008, 376: 1008, 1008, 1008, 1008, 381: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 401: 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 1008, 442: 1008, 1039: 3175}, + {332: 3167}, + // 575 + {332: 3164}, + {332: 3159}, + {332: 3156}, + {332: 3151}, + {332: 3142}, + // 580 + {332: 3135}, + {332: 3130}, + {332: 3093}, + {332: 3079}, + {332: 3062}, + // 585 + {332: 3055}, + {332: 1046}, + {332: 1045}, + {332: 3052}, + {332: 3049}, + // 590 + {332: 3041}, + {332: 3033}, + {332: 3025}, + {332: 3011}, + {332: 2996}, + // 595 + {332: 2991}, + {332: 2986}, + {332: 2981}, + {332: 2976}, + {332: 2971}, + // 600 + {332: 2966}, + {332: 2953}, + {332: 2950}, + {332: 2947}, + {332: 2944}, + // 605 + {332: 2941}, + {332: 2938}, + {332: 2934}, + {332: 2928}, + {332: 2915}, + // 610 + {332: 2910}, + {332: 2905}, + {332: 2737}, + {663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 333: 663, 663, 663, 663, 663, 663, 340: 663, 663, 663, 663, 663, 663, 663, 663, 663, 350: 663, 663, 663, 663, 355: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 372: 663, 663, 663, 376: 663, 663, 663, 663, 381: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 401: 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 442: 663}, + {662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 333: 662, 662, 662, 662, 662, 662, 340: 662, 662, 662, 662, 662, 662, 662, 662, 662, 350: 662, 662, 662, 662, 355: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 372: 662, 662, 662, 376: 662, 662, 662, 662, 381: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 401: 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 442: 662}, + // 615 + {661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 333: 661, 661, 661, 661, 661, 661, 340: 661, 661, 661, 661, 661, 661, 661, 661, 661, 350: 661, 661, 661, 661, 355: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 372: 661, 661, 661, 376: 661, 661, 661, 661, 381: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 401: 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 442: 661}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2738}, + {8: 2746, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2904}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2903}, + // 620 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2902}, + {2: 1691, 1691, 1691, 1691, 1691, 1691, 9: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 19: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 334: 1691, 1691, 1691, 339: 1691, 1691, 1691, 344: 1691, 1691, 1691, 349: 1691, 370: 1691, 1691, 375: 1691, 380: 1691, 400: 1691, 424: 1691, 1691, 1691, 1691, 1691, 430: 1691, 1691, 1691, 434: 1691, 1691, 1691, 1691, 440: 1691, 1691, 443: 1691, 1691, 446: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 455: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, + {2: 1690, 1690, 1690, 1690, 1690, 1690, 9: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 19: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 334: 1690, 1690, 1690, 339: 1690, 1690, 1690, 344: 1690, 1690, 1690, 349: 1690, 370: 1690, 1690, 375: 1690, 380: 1690, 400: 1690, 424: 1690, 1690, 1690, 1690, 1690, 430: 1690, 1690, 1690, 434: 1690, 1690, 1690, 1690, 440: 1690, 1690, 443: 1690, 1690, 446: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 455: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, + {2: 1689, 1689, 1689, 1689, 1689, 1689, 9: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 19: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 334: 1689, 1689, 1689, 339: 1689, 1689, 1689, 344: 1689, 1689, 1689, 349: 1689, 370: 1689, 1689, 375: 1689, 380: 1689, 400: 1689, 424: 1689, 1689, 1689, 1689, 1689, 430: 1689, 1689, 1689, 434: 1689, 1689, 1689, 1689, 440: 1689, 1689, 443: 1689, 1689, 446: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 455: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, + {2: 1688, 1688, 1688, 1688, 1688, 1688, 9: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 19: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 334: 1688, 1688, 1688, 339: 1688, 1688, 1688, 344: 1688, 1688, 1688, 349: 1688, 370: 1688, 1688, 375: 1688, 380: 1688, 400: 1688, 424: 1688, 1688, 1688, 1688, 1688, 430: 1688, 1688, 1688, 434: 1688, 1688, 1688, 1688, 440: 1688, 1688, 443: 1688, 1688, 446: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 455: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, + // 625 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2747, 2661, 2734, 2660, 2657}, + {18: 2751, 343: 2749, 442: 2750}, + {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 333: 660, 660, 660, 660, 660, 660, 340: 660, 660, 660, 660, 660, 660, 660, 660, 660, 350: 660, 660, 660, 660, 355: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 372: 660, 660, 660, 376: 660, 660, 660, 660, 381: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 401: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 442: 660}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 2899, 506: 2901, 2311, 2310, 596: 2898, 723: 2897}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2896, 2661, 2734, 2660, 2657}, + // 630 + {119: 843, 356: 2753, 503: 843, 601: 843, 1077: 2752}, + {119: 2757, 503: 2758, 601: 846, 734: 2756}, + {9: 2754, 260: 2755}, + {119: 842, 503: 842, 601: 842}, + {119: 841, 503: 841, 601: 841}, + // 635 + {601: 2761, 605: 2762}, + {212: 2760}, + {212: 2759}, + {601: 844}, + {601: 845}, + // 640 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 2806, 506: 2805, 2311, 2310, 768: 2808, 985: 2809, 1151: 2807}, + {852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 333: 852, 852, 852, 852, 852, 852, 340: 852, 852, 852, 852, 852, 852, 852, 852, 852, 350: 852, 852, 852, 852, 355: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 372: 852, 852, 852, 376: 852, 852, 852, 852, 381: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 401: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 442: 852}, + {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 509: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, + {1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 509: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592}, + {1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 509: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587}, + // 645 + {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 509: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578}, + {1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 509: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568}, + {1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 509: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566}, + {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 509: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541}, + {1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 509: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536}, + // 650 + {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 509: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526}, + {1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 509: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507}, + {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 509: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}, + {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 509: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 509: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497}, + // 655 + {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 509: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492}, + {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 509: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490}, + {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 509: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489}, + {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 509: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486}, + {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 509: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484}, + // 660 + {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 509: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471}, + {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 509: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, + {1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 509: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436}, + {1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 509: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435}, + {1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 509: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434}, + // 665 + {1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 509: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430}, + {1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 509: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429}, + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 509: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, + {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 509: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324}, + {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 509: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323}, + // 670 + {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 509: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322}, + {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 509: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321}, + {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 509: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320}, + {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 509: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319}, + {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 509: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282}, + // 675 + {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 509: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281}, + {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 509: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278}, + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 509: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275}, + {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 509: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273}, + {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 509: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272}, + // 680 + {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 509: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271}, + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 509: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 509: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 509: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268}, + {894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 333: 894, 894, 894, 894, 894, 894, 340: 894, 894, 894, 894, 894, 894, 894, 894, 894, 350: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 372: 894, 894, 894, 376: 894, 894, 894, 894, 381: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 401: 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 894, 442: 894}, + // 685 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 891, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 354: 891, 357: 891, 382: 891, 891, 891, 506: 2805, 2311, 2310, 768: 2812, 1076: 2811, 1152: 2810}, + {865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 333: 865, 865, 865, 865, 865, 865, 340: 865, 865, 865, 865, 865, 865, 865, 865, 865, 350: 865, 865, 865, 865, 355: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 372: 865, 865, 865, 376: 865, 865, 865, 865, 381: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 401: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 442: 865}, + {864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 333: 864, 864, 864, 864, 864, 864, 340: 864, 864, 864, 864, 864, 864, 864, 864, 864, 350: 864, 864, 864, 864, 355: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 372: 864, 864, 864, 376: 864, 864, 864, 864, 381: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 401: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 442: 864}, + {863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 333: 863, 863, 863, 863, 863, 863, 340: 863, 863, 863, 863, 863, 863, 863, 863, 863, 350: 863, 863, 863, 863, 355: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 372: 863, 863, 863, 376: 863, 863, 863, 863, 381: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 401: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 442: 863}, + {18: 2895}, + // 690 + {18: 889, 354: 2814, 357: 889, 382: 889, 889, 889, 1079: 2813}, + {18: 890, 354: 890, 357: 890, 382: 890, 890, 890}, + {18: 887, 357: 2825, 382: 887, 887, 887, 1082: 2824}, + {522: 2815}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2816, 721: 2817, 742: 2818}, + // 695 + {1208, 1208, 8: 1208, 18: 1208, 77: 1208, 333: 1208, 337: 1208, 342: 1208, 347: 1208, 1208, 350: 1208, 1208, 1208, 1208, 355: 1208, 357: 1208, 2745, 362: 2743, 2744, 2742, 2740, 369: 1208, 374: 1208, 382: 1208, 1208, 1208, 2823, 2822, 592: 2741, 2739, 1083: 2821}, + {1210, 1210, 8: 1210, 18: 1210, 77: 1210, 333: 1210, 337: 1210, 342: 1210, 347: 1210, 1210, 350: 1210, 1210, 1210, 1210, 355: 1210, 357: 1210, 369: 1210, 374: 1210, 382: 1210, 1210, 1210}, + {8: 2819, 18: 888, 357: 888, 382: 888, 888, 888}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2816, 721: 2820}, + {1209, 1209, 8: 1209, 18: 1209, 77: 1209, 333: 1209, 337: 1209, 342: 1209, 347: 1209, 1209, 350: 1209, 1209, 1209, 1209, 355: 1209, 357: 1209, 369: 1209, 374: 1209, 382: 1209, 1209, 1209}, + // 700 + {1207, 1207, 8: 1207, 18: 1207, 77: 1207, 333: 1207, 337: 1207, 342: 1207, 347: 1207, 1207, 350: 1207, 1207, 1207, 1207, 355: 1207, 357: 1207, 369: 1207, 374: 1207, 382: 1207, 1207, 1207}, + {1206, 1206, 8: 1206, 18: 1206, 77: 1206, 333: 1206, 337: 1206, 342: 1206, 347: 1206, 1206, 350: 1206, 1206, 1206, 1206, 355: 1206, 357: 1206, 369: 1206, 374: 1206, 382: 1206, 1206, 1206}, + {1205, 1205, 8: 1205, 18: 1205, 77: 1205, 333: 1205, 337: 1205, 342: 1205, 347: 1205, 1205, 350: 1205, 1205, 1205, 1205, 355: 1205, 357: 1205, 369: 1205, 374: 1205, 382: 1205, 1205, 1205}, + {18: 885, 382: 2830, 2831, 2832, 1081: 2828, 1150: 2829}, + {522: 2826}, + // 705 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2816, 721: 2817, 742: 2827}, + {8: 2819, 18: 886, 382: 886, 886, 886}, + {18: 892}, + {80: 2843, 127: 2839, 375: 2833, 416: 2844, 431: 2842, 2841, 436: 2835, 2834, 709: 2840, 816: 2837, 1148: 2838, 2836}, + {80: 883, 127: 883, 375: 883, 416: 883, 431: 883, 883, 436: 883, 883}, + // 710 + {80: 882, 127: 882, 375: 882, 416: 882, 431: 882, 882, 436: 882, 882}, + {80: 881, 127: 881, 375: 881, 416: 881, 431: 881, 881, 436: 881, 881}, + {1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 18: 1879, 86: 1879, 123: 1879, 333: 1879, 1879, 336: 1879, 338: 1879, 1879, 343: 1879, 349: 1879, 354: 1879, 423: 1879, 429: 1879, 433: 1879, 438: 1879, 1879, 445: 1879, 454: 1879}, + {1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 18: 1878, 86: 1878, 123: 1878, 333: 1878, 1878, 336: 1878, 338: 1878, 1878, 343: 1878, 349: 1878, 354: 1878, 423: 1878, 429: 1878, 433: 1878, 438: 1878, 1878, 445: 1878, 454: 1878}, + {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 18: 1877, 86: 1877, 123: 1877, 333: 1877, 1877, 336: 1877, 338: 1877, 1877, 343: 1877, 349: 1877, 354: 1877, 423: 1877, 429: 1877, 433: 1877, 438: 1877, 1877, 445: 1877, 454: 1877}, + // 715 + {18: 884}, + {18: 880}, + {18: 879}, + {86: 2890}, + {86: 2888}, + // 720 + {86: 2886}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2893}, + {434: 2892}, + {80: 2843, 127: 2845, 375: 2833, 431: 2848, 2847, 436: 2835, 2834, 709: 2846, 816: 2850, 984: 2849}, + {86: 2890, 123: 2891}, + // 725 + {86: 2888, 123: 2889}, + {86: 2886, 123: 2887}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2853}, + {358: 2851}, + {18: 872, 358: 872}, + // 730 + {80: 2843, 127: 2845, 375: 2833, 431: 2848, 2847, 436: 2835, 2834, 709: 2846, 816: 2850, 984: 2852}, + {18: 873}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 2883}, + {1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 333: 1005, 1005, 1005, 1005, 1005, 1005, 340: 1005, 1005, 1005, 344: 1005, 1005, 1005, 1005, 1005, 350: 1005, 1005, 1005, 1005, 355: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 372: 1005, 1005, 1005, 376: 1005, 1005, 1005, 1005, 381: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 401: 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005}, + {1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 333: 1004, 1004, 1004, 1004, 1004, 1004, 340: 1004, 1004, 1004, 344: 1004, 1004, 1004, 1004, 1004, 350: 1004, 1004, 1004, 1004, 355: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 372: 1004, 1004, 1004, 376: 1004, 1004, 1004, 1004, 381: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 401: 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004}, + // 735 + {1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 333: 1003, 1003, 1003, 1003, 1003, 1003, 340: 1003, 1003, 1003, 344: 1003, 1003, 1003, 1003, 1003, 350: 1003, 1003, 1003, 1003, 355: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 372: 1003, 1003, 1003, 376: 1003, 1003, 1003, 1003, 381: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 401: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003}, + {1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 333: 1002, 1002, 1002, 1002, 1002, 1002, 340: 1002, 1002, 1002, 344: 1002, 1002, 1002, 1002, 1002, 350: 1002, 1002, 1002, 1002, 355: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 372: 1002, 1002, 1002, 376: 1002, 1002, 1002, 1002, 381: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 401: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002}, + {1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 333: 1001, 1001, 1001, 1001, 1001, 1001, 340: 1001, 1001, 1001, 344: 1001, 1001, 1001, 1001, 1001, 350: 1001, 1001, 1001, 1001, 355: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 372: 1001, 1001, 1001, 376: 1001, 1001, 1001, 1001, 381: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 401: 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001}, + {1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 333: 1000, 1000, 1000, 1000, 1000, 1000, 340: 1000, 1000, 1000, 344: 1000, 1000, 1000, 1000, 1000, 350: 1000, 1000, 1000, 1000, 355: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 372: 1000, 1000, 1000, 376: 1000, 1000, 1000, 1000, 381: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 401: 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}, + {999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 333: 999, 999, 999, 999, 999, 999, 340: 999, 999, 999, 344: 999, 999, 999, 999, 999, 350: 999, 999, 999, 999, 355: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 372: 999, 999, 999, 376: 999, 999, 999, 999, 381: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 401: 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999}, + // 740 + {998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 333: 998, 998, 998, 998, 998, 998, 340: 998, 998, 998, 344: 998, 998, 998, 998, 998, 350: 998, 998, 998, 998, 355: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 372: 998, 998, 998, 376: 998, 998, 998, 998, 381: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 401: 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998, 998}, + {997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 333: 997, 997, 997, 997, 997, 997, 340: 997, 997, 997, 344: 997, 997, 997, 997, 997, 350: 997, 997, 997, 997, 355: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 372: 997, 997, 997, 376: 997, 997, 997, 997, 381: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 401: 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, 997}, + {996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 333: 996, 996, 996, 996, 996, 996, 340: 996, 996, 996, 344: 996, 996, 996, 996, 996, 350: 996, 996, 996, 996, 355: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 372: 996, 996, 996, 376: 996, 996, 996, 996, 381: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 401: 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996, 996}, + {995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 333: 995, 995, 995, 995, 995, 995, 340: 995, 995, 995, 344: 995, 995, 995, 995, 995, 350: 995, 995, 995, 995, 355: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 372: 995, 995, 995, 376: 995, 995, 995, 995, 381: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 401: 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995, 995}, + {994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 333: 994, 994, 994, 994, 994, 994, 340: 994, 994, 994, 344: 994, 994, 994, 994, 994, 350: 994, 994, 994, 994, 355: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 372: 994, 994, 994, 376: 994, 994, 994, 994, 381: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 401: 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994, 994}, + // 745 + {993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 333: 993, 993, 993, 993, 993, 993, 340: 993, 993, 993, 344: 993, 993, 993, 993, 993, 350: 993, 993, 993, 993, 355: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 372: 993, 993, 993, 376: 993, 993, 993, 993, 381: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 401: 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993, 993}, + {992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 333: 992, 992, 992, 992, 992, 992, 340: 992, 992, 992, 344: 992, 992, 992, 992, 992, 350: 992, 992, 992, 992, 355: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 372: 992, 992, 992, 376: 992, 992, 992, 992, 381: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 401: 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992, 992}, + {991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 333: 991, 991, 991, 991, 991, 991, 340: 991, 991, 991, 344: 991, 991, 991, 991, 991, 350: 991, 991, 991, 991, 355: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 372: 991, 991, 991, 376: 991, 991, 991, 991, 381: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 401: 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991, 991}, + {990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 333: 990, 990, 990, 990, 990, 990, 340: 990, 990, 990, 344: 990, 990, 990, 990, 990, 350: 990, 990, 990, 990, 355: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 372: 990, 990, 990, 376: 990, 990, 990, 990, 381: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 401: 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, 990}, + {989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 333: 989, 989, 989, 989, 989, 989, 340: 989, 989, 989, 344: 989, 989, 989, 989, 989, 350: 989, 989, 989, 989, 355: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 372: 989, 989, 989, 376: 989, 989, 989, 989, 381: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 401: 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989}, + // 750 + {988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 333: 988, 988, 988, 988, 988, 988, 340: 988, 988, 988, 344: 988, 988, 988, 988, 988, 350: 988, 988, 988, 988, 355: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 372: 988, 988, 988, 376: 988, 988, 988, 988, 381: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 401: 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, 988}, + {987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 333: 987, 987, 987, 987, 987, 987, 340: 987, 987, 987, 344: 987, 987, 987, 987, 987, 350: 987, 987, 987, 987, 355: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 372: 987, 987, 987, 376: 987, 987, 987, 987, 381: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 401: 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987, 987}, + {986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 333: 986, 986, 986, 986, 986, 986, 340: 986, 986, 986, 344: 986, 986, 986, 986, 986, 350: 986, 986, 986, 986, 355: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 372: 986, 986, 986, 376: 986, 986, 986, 986, 381: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 401: 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, 986}, + {985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 333: 985, 985, 985, 985, 985, 985, 340: 985, 985, 985, 344: 985, 985, 985, 985, 985, 350: 985, 985, 985, 985, 355: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 372: 985, 985, 985, 376: 985, 985, 985, 985, 381: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 401: 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985}, + {984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 333: 984, 984, 984, 984, 984, 984, 340: 984, 984, 984, 344: 984, 984, 984, 984, 984, 350: 984, 984, 984, 984, 355: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 372: 984, 984, 984, 376: 984, 984, 984, 984, 381: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 401: 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984, 984}, + // 755 + {983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 333: 983, 983, 983, 983, 983, 983, 340: 983, 983, 983, 344: 983, 983, 983, 983, 983, 350: 983, 983, 983, 983, 355: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 372: 983, 983, 983, 376: 983, 983, 983, 983, 381: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 401: 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983, 983}, + {982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 333: 982, 982, 982, 982, 982, 982, 340: 982, 982, 982, 344: 982, 982, 982, 982, 982, 350: 982, 982, 982, 982, 355: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 372: 982, 982, 982, 376: 982, 982, 982, 982, 381: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 401: 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, 982}, + {981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 333: 981, 981, 981, 981, 981, 981, 340: 981, 981, 981, 344: 981, 981, 981, 981, 981, 350: 981, 981, 981, 981, 355: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 372: 981, 981, 981, 376: 981, 981, 981, 981, 381: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 401: 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981, 981}, + {980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 333: 980, 980, 980, 980, 980, 980, 340: 980, 980, 980, 344: 980, 980, 980, 980, 980, 350: 980, 980, 980, 980, 355: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 372: 980, 980, 980, 376: 980, 980, 980, 980, 381: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 401: 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980}, + {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 333: 979, 979, 979, 979, 979, 979, 340: 979, 979, 979, 344: 979, 979, 979, 979, 979, 350: 979, 979, 979, 979, 355: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 372: 979, 979, 979, 376: 979, 979, 979, 979, 381: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 401: 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979}, + // 760 + {978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 333: 978, 978, 978, 978, 978, 978, 340: 978, 978, 978, 344: 978, 978, 978, 978, 978, 350: 978, 978, 978, 978, 355: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 372: 978, 978, 978, 376: 978, 978, 978, 978, 381: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 401: 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, 978}, + {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 333: 977, 977, 977, 977, 977, 977, 340: 977, 977, 977, 344: 977, 977, 977, 977, 977, 350: 977, 977, 977, 977, 355: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 372: 977, 977, 977, 376: 977, 977, 977, 977, 381: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 401: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977}, + {86: 2884, 123: 2885}, + {18: 875, 358: 875}, + {18: 868, 358: 868}, + // 765 + {18: 876, 358: 876}, + {18: 869, 358: 869}, + {18: 877, 358: 877}, + {18: 870, 358: 870}, + {18: 878, 358: 878}, + // 770 + {18: 871, 358: 871}, + {18: 874, 358: 874}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 2894}, + {86: 2884}, + {893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 333: 893, 893, 893, 893, 893, 893, 340: 893, 893, 893, 893, 893, 893, 893, 893, 893, 350: 893, 893, 893, 893, 355: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 372: 893, 893, 893, 376: 893, 893, 893, 893, 381: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 401: 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 442: 893}, + // 775 + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 333: 1166, 1166, 1166, 1166, 1166, 1166, 340: 1166, 1166, 1166, 2749, 1166, 1166, 1166, 1166, 1166, 350: 1166, 1166, 1166, 1166, 355: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 372: 1166, 1166, 1166, 376: 1166, 1166, 1166, 1166, 381: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 401: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 442: 1166}, + {1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 333: 1176, 1176, 1176, 1176, 1176, 1176, 340: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 350: 1176, 1176, 1176, 1176, 355: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 372: 1176, 1176, 1176, 376: 1176, 1176, 1176, 1176, 381: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 401: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 442: 1176}, + {667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 376: 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 401: 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 429: 667, 433: 667, 438: 667, 667, 442: 667, 445: 667, 454: 667, 502: 667, 667, 667, 667, 509: 667, 511: 667, 518: 667}, + {666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 376: 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 401: 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 429: 666, 433: 666, 438: 666, 666, 442: 666, 445: 666, 454: 666, 502: 666, 666, 666, 666, 509: 666, 511: 666, 518: 666}, + {222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 376: 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 429: 222, 433: 222, 438: 222, 222, 442: 222, 445: 222, 454: 222, 502: 222, 222, 222, 222, 509: 222, 222, 222, 515: 222, 222, 518: 222, 222, 222, 522: 222, 524: 222, 526: 222}, + // 780 + {221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 376: 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 429: 221, 433: 221, 438: 221, 221, 442: 221, 445: 221, 454: 221, 502: 221, 221, 221, 221, 509: 221, 221, 221, 515: 221, 221, 518: 221, 221, 221, 522: 221, 524: 221, 526: 221}, + {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 333: 1705, 335: 1705, 337: 1705, 1705, 340: 1705, 1705, 1705, 347: 1705, 1705, 350: 1705, 1705, 1705, 1705, 355: 1705, 1705, 1705, 1705, 360: 1705, 1705, 1705, 1705, 1705, 1705, 367: 1705, 1705, 1705, 372: 1705, 1705, 1705, 376: 1705, 1705, 1705, 1705, 382: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 399: 1705, 401: 1705, 1705, 592: 2741, 2739}, + {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 333: 1706, 335: 1706, 337: 1706, 1706, 340: 1706, 1706, 1706, 347: 1706, 1706, 350: 1706, 1706, 1706, 1706, 355: 1706, 1706, 1706, 2745, 360: 1706, 1706, 1706, 2744, 1706, 1706, 367: 1706, 1706, 1706, 372: 1706, 1706, 1706, 376: 1706, 1706, 1706, 1706, 382: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 399: 1706, 401: 1706, 1706, 592: 2741, 2739}, + {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 333: 1707, 335: 1707, 337: 1707, 1707, 340: 1707, 1707, 1707, 347: 1707, 1707, 350: 1707, 1707, 1707, 1707, 355: 1707, 1707, 1707, 2745, 360: 1707, 1707, 1707, 2744, 1707, 2740, 367: 1707, 1707, 1707, 372: 1707, 1707, 1707, 376: 1707, 1707, 1707, 1707, 382: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 399: 1707, 401: 1707, 1707, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2906}, + // 785 + {18: 2907, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {119: 2757, 503: 2758, 601: 846, 734: 2908}, + {601: 2761, 605: 2909}, + {853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 333: 853, 853, 853, 853, 853, 853, 340: 853, 853, 853, 853, 853, 853, 853, 853, 853, 350: 853, 853, 853, 853, 355: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 372: 853, 853, 853, 376: 853, 853, 853, 853, 381: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 401: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 442: 853}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2911}, + // 790 + {18: 2912, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {119: 2757, 503: 2758, 601: 846, 734: 2913}, + {601: 2761, 605: 2914}, + {854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 333: 854, 854, 854, 854, 854, 854, 340: 854, 854, 854, 854, 854, 854, 854, 854, 854, 350: 854, 854, 854, 854, 355: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 372: 854, 854, 854, 376: 854, 854, 854, 854, 381: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 401: 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, 442: 854}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2916}, + // 795 + {8: 2918, 18: 851, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739, 914: 2917}, + {18: 2925}, + {375: 2833, 432: 2920, 436: 2835, 2834, 709: 2919}, + {8: 2922, 18: 848, 915: 2924}, + {8: 2922, 18: 848, 915: 2921}, + // 800 + {18: 849}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2923}, + {18: 847, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {18: 850}, + {119: 2757, 503: 2758, 601: 846, 734: 2926}, + // 805 + {601: 2761, 605: 2927}, + {855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 333: 855, 855, 855, 855, 855, 855, 340: 855, 855, 855, 855, 855, 855, 855, 855, 855, 350: 855, 855, 855, 855, 355: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 372: 855, 855, 855, 376: 855, 855, 855, 855, 381: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 401: 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, 442: 855}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2929}, + {8: 2918, 18: 851, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739, 914: 2930}, + {18: 2931}, + // 810 + {119: 2757, 503: 2758, 601: 846, 734: 2932}, + {601: 2761, 605: 2933}, + {856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 333: 856, 856, 856, 856, 856, 856, 340: 856, 856, 856, 856, 856, 856, 856, 856, 856, 350: 856, 856, 856, 856, 355: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 372: 856, 856, 856, 376: 856, 856, 856, 856, 381: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 401: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 442: 856}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2935, 2661, 2734, 2660, 2657}, + {18: 2936, 343: 2749, 442: 2750}, + // 815 + {601: 2761, 605: 2937}, + {857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 333: 857, 857, 857, 857, 857, 857, 340: 857, 857, 857, 857, 857, 857, 857, 857, 857, 350: 857, 857, 857, 857, 355: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 372: 857, 857, 857, 376: 857, 857, 857, 857, 381: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 401: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 442: 857}, + {18: 2939}, + {601: 2761, 605: 2940}, + {858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 333: 858, 858, 858, 858, 858, 858, 340: 858, 858, 858, 858, 858, 858, 858, 858, 858, 350: 858, 858, 858, 858, 355: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 372: 858, 858, 858, 376: 858, 858, 858, 858, 381: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 401: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 442: 858}, + // 820 + {18: 2942}, + {601: 2761, 605: 2943}, + {859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 333: 859, 859, 859, 859, 859, 859, 340: 859, 859, 859, 859, 859, 859, 859, 859, 859, 350: 859, 859, 859, 859, 355: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 372: 859, 859, 859, 376: 859, 859, 859, 859, 381: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 401: 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 859, 442: 859}, + {18: 2945}, + {601: 2761, 605: 2946}, + // 825 + {860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 333: 860, 860, 860, 860, 860, 860, 340: 860, 860, 860, 860, 860, 860, 860, 860, 860, 350: 860, 860, 860, 860, 355: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 372: 860, 860, 860, 376: 860, 860, 860, 860, 381: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 401: 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 860, 442: 860}, + {18: 2948}, + {601: 2761, 605: 2949}, + {861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 333: 861, 861, 861, 861, 861, 861, 340: 861, 861, 861, 861, 861, 861, 861, 861, 861, 350: 861, 861, 861, 861, 355: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 372: 861, 861, 861, 376: 861, 861, 861, 861, 381: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 401: 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 442: 861}, + {18: 2951}, + // 830 + {601: 2761, 605: 2952}, + {862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 333: 862, 862, 862, 862, 862, 862, 340: 862, 862, 862, 862, 862, 862, 862, 862, 862, 350: 862, 862, 862, 862, 355: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 372: 862, 862, 862, 376: 862, 862, 862, 862, 381: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 401: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 442: 862}, + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2960, 662: 2959}, + {2: 1146, 1146, 1146, 1146, 1146, 1146, 9: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 19: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 334: 1146, 1146, 1146, 339: 1146, 1146, 1146, 344: 1146, 1146, 1146, 349: 1146, 359: 1146, 370: 1146, 1146, 1146, 375: 1146, 380: 1146, 400: 1146, 424: 1146, 1146, 1146, 1146, 1146, 430: 1146, 1146, 1146, 434: 1146, 1146, 1146, 1146, 440: 1146, 1146, 443: 1146, 1146, 446: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 455: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 504: 1146, 594: 1146, 603: 1146, 1146, 606: 1146, 1146, 1146, 610: 1146, 614: 1146, 1146, 1146}, + {2: 1145, 1145, 1145, 1145, 1145, 1145, 9: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 19: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 334: 1145, 1145, 1145, 339: 1145, 1145, 1145, 344: 1145, 1145, 1145, 349: 1145, 359: 1145, 370: 1145, 1145, 1145, 375: 1145, 380: 1145, 400: 1145, 424: 1145, 1145, 1145, 1145, 1145, 430: 1145, 1145, 1145, 434: 1145, 1145, 1145, 1145, 440: 1145, 1145, 443: 1145, 1145, 446: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 455: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 504: 1145, 594: 1145, 603: 1145, 1145, 606: 1145, 1145, 1145, 610: 1145, 614: 1145, 1145, 1145}, + // 835 + {2: 1144, 1144, 1144, 1144, 1144, 1144, 9: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 19: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 334: 1144, 1144, 1144, 339: 1144, 1144, 1144, 344: 1144, 1144, 1144, 349: 1144, 359: 1144, 370: 1144, 1144, 1144, 375: 1144, 380: 1144, 400: 1144, 424: 1144, 1144, 1144, 1144, 1144, 430: 1144, 1144, 1144, 434: 1144, 1144, 1144, 1144, 440: 1144, 1144, 443: 1144, 1144, 446: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 455: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 504: 1144, 594: 1144, 603: 1144, 1144, 606: 1144, 1144, 1144, 610: 1144, 614: 1144, 1144, 1144}, + {2: 1143, 1143, 1143, 1143, 1143, 1143, 9: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 19: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 334: 1143, 1143, 1143, 339: 1143, 1143, 1143, 344: 1143, 1143, 1143, 349: 1143, 370: 1143, 1143, 375: 1143, 380: 1143, 400: 1143, 424: 1143, 1143, 1143, 1143, 1143, 430: 1143, 1143, 1143, 434: 1143, 1143, 1143, 1143, 440: 1143, 1143, 443: 1143, 1143, 446: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 455: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 594: 2965}, + {2: 1141, 1141, 1141, 1141, 1141, 1141, 9: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 19: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 334: 1141, 1141, 1141, 339: 1141, 1141, 1141, 344: 1141, 1141, 1141, 349: 1141, 370: 1141, 1141, 375: 1141, 380: 1141, 400: 1141, 424: 1141, 1141, 1141, 1141, 1141, 430: 1141, 1141, 1141, 434: 1141, 1141, 1141, 1141, 440: 1141, 1141, 443: 1141, 1141, 446: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 455: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141}, + {2: 1138, 1138, 1138, 1138, 1138, 1138, 9: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 19: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 334: 1138, 1138, 1138, 339: 1138, 1138, 1138, 344: 1138, 1138, 1138, 349: 1138, 370: 1138, 1138, 375: 1138, 380: 1138, 400: 1138, 424: 1138, 1138, 1138, 1138, 1138, 430: 1138, 1138, 1138, 434: 1138, 1138, 1138, 1138, 440: 1138, 1138, 443: 1138, 1138, 446: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 455: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2961}, + // 840 + {18: 2962, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2963}, + {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 333: 1019, 1019, 1019, 1019, 1019, 1019, 340: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 350: 1019, 1019, 1019, 1019, 355: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 372: 1019, 1019, 1019, 376: 1019, 1019, 1019, 1019, 381: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 401: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 442: 1019}, + {866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 333: 866, 866, 866, 866, 866, 866, 340: 866, 866, 866, 866, 866, 866, 866, 866, 866, 350: 866, 866, 866, 866, 355: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 372: 866, 866, 866, 376: 866, 866, 866, 866, 381: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 401: 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 866, 442: 866}, + {2: 1137, 1137, 1137, 1137, 1137, 1137, 9: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 19: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 334: 1137, 1137, 1137, 339: 1137, 1137, 1137, 344: 1137, 1137, 1137, 349: 1137, 370: 1137, 1137, 375: 1137, 380: 1137, 400: 1137, 424: 1137, 1137, 1137, 1137, 1137, 430: 1137, 1137, 1137, 434: 1137, 1137, 1137, 1137, 440: 1137, 1137, 443: 1137, 1137, 446: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 455: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137}, + // 845 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2967, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2968}, + {18: 2969, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2970}, + {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 333: 1020, 1020, 1020, 1020, 1020, 1020, 340: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 350: 1020, 1020, 1020, 1020, 355: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 372: 1020, 1020, 1020, 376: 1020, 1020, 1020, 1020, 381: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 401: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 442: 1020}, + // 850 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2972, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2973}, + {18: 2974, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2975}, + {1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 333: 1021, 1021, 1021, 1021, 1021, 1021, 340: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 350: 1021, 1021, 1021, 1021, 355: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 372: 1021, 1021, 1021, 376: 1021, 1021, 1021, 1021, 381: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 401: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 442: 1021}, + // 855 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2977, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2978}, + {18: 2979, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2980}, + {1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 333: 1022, 1022, 1022, 1022, 1022, 1022, 340: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 350: 1022, 1022, 1022, 1022, 355: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 372: 1022, 1022, 1022, 376: 1022, 1022, 1022, 1022, 381: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 401: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 442: 1022}, + // 860 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2982, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2983}, + {18: 2984, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2985}, + {1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 333: 1023, 1023, 1023, 1023, 1023, 1023, 340: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 350: 1023, 1023, 1023, 1023, 355: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 372: 1023, 1023, 1023, 376: 1023, 1023, 1023, 1023, 381: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 401: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 442: 1023}, + // 865 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2987, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2988}, + {18: 2989, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2990}, + {1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 333: 1024, 1024, 1024, 1024, 1024, 1024, 340: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 350: 1024, 1024, 1024, 1024, 355: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 372: 1024, 1024, 1024, 376: 1024, 1024, 1024, 1024, 381: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 401: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 442: 1024}, + // 870 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2992, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2993}, + {18: 2994, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 2995}, + {1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 333: 1025, 1025, 1025, 1025, 1025, 1025, 340: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 350: 1025, 1025, 1025, 1025, 355: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 372: 1025, 1025, 1025, 376: 1025, 1025, 1025, 1025, 381: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 401: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 442: 1025}, + // 875 + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 2997, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2998}, + {8: 2999, 18: 1201, 77: 1201, 357: 3000, 630: 3001, 675: 3002}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3010}, + {522: 3008}, + // 880 + {1200, 1200, 18: 1200, 77: 1200, 333: 1200, 337: 1200, 342: 1200, 347: 1200, 1200, 350: 1200, 1200, 1200, 1200, 355: 1200}, + {18: 1012, 77: 3004, 1078: 3003}, + {18: 3006}, + {335: 3005}, + {18: 1011}, + // 885 + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3007}, + {1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 333: 1026, 1026, 1026, 1026, 1026, 1026, 340: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 350: 1026, 1026, 1026, 1026, 355: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 372: 1026, 1026, 1026, 376: 1026, 1026, 1026, 1026, 381: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 401: 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 442: 1026}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2816, 721: 2817, 742: 3009}, + {1211, 1211, 8: 2819, 18: 1211, 77: 1211, 333: 1211, 337: 1211, 342: 1211, 347: 1211, 1211, 350: 1211, 1211, 1211, 1211, 355: 1211}, + {1686, 1686, 8: 1686, 18: 1686, 77: 1686, 357: 1686, 2745, 361: 1686, 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 890 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 359: 3015, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3012, 594: 3014, 603: 2954, 2955, 638: 3013}, + {18: 3023, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3021}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3018}, + {18: 3016}, + // 895 + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3017}, + {1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 333: 1027, 1027, 1027, 1027, 1027, 1027, 340: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 350: 1027, 1027, 1027, 1027, 355: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 372: 1027, 1027, 1027, 376: 1027, 1027, 1027, 1027, 381: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 401: 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027, 442: 1027}, + {18: 3019, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3020}, + {1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 333: 1029, 1029, 1029, 1029, 1029, 1029, 340: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 350: 1029, 1029, 1029, 1029, 355: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 372: 1029, 1029, 1029, 376: 1029, 1029, 1029, 1029, 381: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 401: 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 442: 1029}, + // 900 + {8: 2999, 18: 3022}, + {1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 333: 1030, 1030, 1030, 1030, 1030, 1030, 340: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 350: 1030, 1030, 1030, 1030, 355: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 372: 1030, 1030, 1030, 376: 1030, 1030, 1030, 1030, 381: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 401: 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 1030, 442: 1030}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3024}, + {1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 333: 1028, 1028, 1028, 1028, 1028, 1028, 340: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 350: 1028, 1028, 1028, 1028, 355: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 372: 1028, 1028, 1028, 376: 1028, 1028, 1028, 1028, 381: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 401: 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 442: 1028}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3026, 594: 3027}, + // 905 + {18: 3031, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3028}, + {18: 3029, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3030}, + {1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 333: 1031, 1031, 1031, 1031, 1031, 1031, 340: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 350: 1031, 1031, 1031, 1031, 355: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 372: 1031, 1031, 1031, 376: 1031, 1031, 1031, 1031, 381: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 401: 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 442: 1031}, + // 910 + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3032}, + {1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 333: 1032, 1032, 1032, 1032, 1032, 1032, 340: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 350: 1032, 1032, 1032, 1032, 355: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 372: 1032, 1032, 1032, 376: 1032, 1032, 1032, 1032, 381: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 401: 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 442: 1032}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3034, 594: 3035}, + {18: 3039, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3036}, + // 915 + {18: 3037, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3038}, + {1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 333: 1033, 1033, 1033, 1033, 1033, 1033, 340: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 350: 1033, 1033, 1033, 1033, 355: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 372: 1033, 1033, 1033, 376: 1033, 1033, 1033, 1033, 381: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 401: 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 442: 1033}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3040}, + {1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 333: 1034, 1034, 1034, 1034, 1034, 1034, 340: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 350: 1034, 1034, 1034, 1034, 355: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 372: 1034, 1034, 1034, 376: 1034, 1034, 1034, 1034, 381: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 401: 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 442: 1034}, + // 920 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3042, 594: 3043}, + {18: 3047, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3044}, + {18: 3045, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3046}, + // 925 + {1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 333: 1035, 1035, 1035, 1035, 1035, 1035, 340: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 350: 1035, 1035, 1035, 1035, 355: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 372: 1035, 1035, 1035, 376: 1035, 1035, 1035, 1035, 381: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 401: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 442: 1035}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3048}, + {1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 333: 1036, 1036, 1036, 1036, 1036, 1036, 340: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 350: 1036, 1036, 1036, 1036, 355: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 372: 1036, 1036, 1036, 376: 1036, 1036, 1036, 1036, 381: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 401: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 442: 1036}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3050}, + {8: 2999, 18: 3051}, + // 930 + {1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 333: 1037, 1037, 1037, 1037, 1037, 1037, 340: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 350: 1037, 1037, 1037, 1037, 355: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 372: 1037, 1037, 1037, 376: 1037, 1037, 1037, 1037, 381: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 401: 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 1037, 442: 1037}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3053}, + {8: 2999, 18: 3054}, + {1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 333: 1038, 1038, 1038, 1038, 1038, 1038, 340: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 350: 1038, 1038, 1038, 1038, 355: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 372: 1038, 1038, 1038, 376: 1038, 1038, 1038, 1038, 381: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 401: 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 442: 1038}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3056}, + // 935 + {8: 3057, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3058}, + {8: 3059, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3060}, + {18: 3061, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 940 + {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 333: 1052, 1052, 1052, 1052, 1052, 1052, 340: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 350: 1052, 1052, 1052, 1052, 355: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 372: 1052, 1052, 1052, 376: 1052, 1052, 1052, 1052, 381: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 401: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 442: 1052}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3063, 1005: 3065, 1054: 3066, 1134: 3067, 3064}, + {18: 3075, 356: 3076, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 356: 3069, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3068}, + {2: 1042, 1042, 1042, 1042, 1042, 1042, 9: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 19: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 334: 1042, 1042, 1042, 339: 1042, 1042, 1042, 344: 1042, 1042, 1042, 349: 1042, 356: 1042, 370: 1042, 1042, 375: 1042, 380: 1042, 400: 1042, 424: 1042, 1042, 1042, 1042, 1042, 430: 1042, 1042, 1042, 434: 1042, 1042, 1042, 1042, 440: 1042, 1042, 443: 1042, 1042, 446: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 455: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042}, + // 945 + {2: 1041, 1041, 1041, 1041, 1041, 1041, 9: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 19: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 334: 1041, 1041, 1041, 339: 1041, 1041, 1041, 344: 1041, 1041, 1041, 349: 1041, 356: 1041, 370: 1041, 1041, 375: 1041, 380: 1041, 400: 1041, 424: 1041, 1041, 1041, 1041, 1041, 430: 1041, 1041, 1041, 434: 1041, 1041, 1041, 1041, 440: 1041, 1041, 443: 1041, 1041, 446: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 455: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041}, + {2: 1040, 1040, 1040, 1040, 1040, 1040, 9: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 19: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 334: 1040, 1040, 1040, 339: 1040, 1040, 1040, 344: 1040, 1040, 1040, 349: 1040, 356: 1040, 370: 1040, 1040, 375: 1040, 380: 1040, 400: 1040, 424: 1040, 1040, 1040, 1040, 1040, 430: 1040, 1040, 1040, 434: 1040, 1040, 1040, 1040, 440: 1040, 1040, 443: 1040, 1040, 446: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 455: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040}, + {356: 3072, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3070}, + {18: 3071, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 950 + {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 333: 1057, 1057, 1057, 1057, 1057, 1057, 340: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 350: 1057, 1057, 1057, 1057, 355: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 372: 1057, 1057, 1057, 376: 1057, 1057, 1057, 1057, 381: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 401: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 442: 1057}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3073}, + {18: 3074, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 333: 1056, 1056, 1056, 1056, 1056, 1056, 340: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 350: 1056, 1056, 1056, 1056, 355: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 372: 1056, 1056, 1056, 376: 1056, 1056, 1056, 1056, 381: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 401: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 442: 1056}, + {1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 333: 1059, 1059, 1059, 1059, 1059, 1059, 340: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 350: 1059, 1059, 1059, 1059, 355: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 372: 1059, 1059, 1059, 376: 1059, 1059, 1059, 1059, 381: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 401: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 442: 1059}, + // 955 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3077}, + {18: 3078, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 333: 1058, 1058, 1058, 1058, 1058, 1058, 340: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 350: 1058, 1058, 1058, 1058, 355: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 372: 1058, 1058, 1058, 376: 1058, 1058, 1058, 1058, 381: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 401: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 442: 1058}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3080}, + {8: 3081, 356: 3082, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 960 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3088}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3083}, + {18: 3084, 350: 3085, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 333: 1064, 1064, 1064, 1064, 1064, 1064, 340: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 350: 1064, 1064, 1064, 1064, 355: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 372: 1064, 1064, 1064, 376: 1064, 1064, 1064, 1064, 381: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 401: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 442: 1064}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3086}, + // 965 + {18: 3087, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 333: 1062, 1062, 1062, 1062, 1062, 1062, 340: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 350: 1062, 1062, 1062, 1062, 355: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 372: 1062, 1062, 1062, 376: 1062, 1062, 1062, 1062, 381: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 401: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 442: 1062}, + {8: 3090, 18: 3089, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 333: 1065, 1065, 1065, 1065, 1065, 1065, 340: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 350: 1065, 1065, 1065, 1065, 355: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 372: 1065, 1065, 1065, 376: 1065, 1065, 1065, 1065, 381: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 401: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 442: 1065}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3091}, + // 970 + {18: 3092, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 333: 1063, 1063, 1063, 1063, 1063, 1063, 340: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 350: 1063, 1063, 1063, 1063, 355: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 372: 1063, 1063, 1063, 376: 1063, 1063, 1063, 1063, 381: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 401: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 442: 1063}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3094}, + {344: 3099, 3100, 3105, 359: 3101, 398: 3107, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3129}, + // 975 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3128}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3127}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3126}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 3123, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3122}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 3117, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3116}, + // 980 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3115}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3114}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3113}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3112}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3111}, + // 985 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3110}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3108}, + {18: 3109, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 333: 1066, 1066, 1066, 1066, 1066, 1066, 340: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 350: 1066, 1066, 1066, 1066, 355: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 372: 1066, 1066, 1066, 376: 1066, 1066, 1066, 1066, 381: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 401: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 442: 1066}, + {1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 333: 1185, 1185, 1185, 1185, 1185, 1185, 340: 1185, 1185, 1185, 344: 1185, 1185, 1185, 1185, 1185, 350: 1185, 1185, 1185, 1185, 355: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 372: 1185, 1185, 1185, 376: 1185, 1185, 1185, 1185, 381: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 401: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185}, + // 990 + {1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 333: 1186, 1186, 1186, 1186, 1186, 1186, 340: 1186, 1186, 1186, 344: 1186, 1186, 1186, 1186, 1186, 350: 1186, 1186, 1186, 1186, 355: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 372: 1186, 1186, 1186, 376: 1186, 1186, 1186, 1186, 381: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 401: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 3106, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186}, + {1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 333: 1187, 1187, 1187, 1187, 1187, 1187, 340: 1187, 1187, 1187, 344: 1187, 1187, 1187, 1187, 1187, 350: 1187, 1187, 1187, 1187, 355: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 372: 1187, 1187, 1187, 376: 1187, 1187, 1187, 1187, 381: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 401: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 3106, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187}, + {1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 333: 1188, 1188, 1188, 1188, 1188, 1188, 340: 1188, 1188, 1188, 344: 1188, 1188, 1188, 1188, 1188, 350: 1188, 1188, 1188, 1188, 355: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 372: 1188, 1188, 1188, 376: 1188, 1188, 1188, 1188, 381: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 401: 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 3106, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188}, + {1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 333: 1189, 1189, 1189, 1189, 1189, 1189, 340: 1189, 1189, 1189, 344: 1189, 1189, 1189, 1189, 1189, 350: 1189, 1189, 1189, 1189, 355: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 372: 1189, 1189, 1189, 376: 1189, 1189, 1189, 1189, 381: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 401: 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 3106, 1189, 1189, 1189, 1189, 1189, 1189, 1189, 1189}, + {1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 333: 1190, 1190, 1190, 1190, 1190, 1190, 340: 1190, 1190, 1190, 344: 1190, 1190, 1190, 1190, 1190, 350: 1190, 1190, 1190, 1190, 355: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 372: 1190, 1190, 1190, 376: 1190, 1190, 1190, 1190, 381: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 401: 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 3106, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190}, + // 995 + {1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 333: 1194, 1194, 1194, 1194, 1194, 1194, 340: 1194, 1194, 1194, 344: 1194, 1194, 3105, 1194, 1194, 350: 1194, 1194, 1194, 1194, 355: 1194, 1194, 1194, 1194, 3101, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 372: 1194, 1194, 1194, 376: 1194, 1194, 1194, 1194, 381: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 401: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 3103, 1194, 3102, 3106, 1194, 1194, 3104, 1194, 1194, 1194, 1194, 1194}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 1124, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3118}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 3119}, + {1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 333: 1192, 1192, 1192, 1192, 1192, 1192, 340: 1192, 1192, 1192, 344: 1192, 1192, 1192, 1192, 1192, 350: 1192, 1192, 1192, 1192, 355: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 372: 1192, 1192, 1192, 376: 1192, 1192, 1192, 1192, 381: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 401: 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3121}, + // 1000 + {1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 333: 1191, 1191, 1191, 1191, 1191, 1191, 340: 1191, 1191, 1191, 344: 1191, 1191, 3105, 1191, 1191, 350: 1191, 1191, 1191, 1191, 355: 1191, 1191, 1191, 1191, 3101, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 372: 1191, 1191, 1191, 376: 1191, 1191, 1191, 1191, 381: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 401: 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 3103, 1191, 3102, 3106, 1191, 1191, 3104, 1191, 1191, 1191, 1191, 1191}, + {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 333: 1195, 1195, 1195, 1195, 1195, 1195, 340: 1195, 1195, 1195, 344: 1195, 1195, 3105, 1195, 1195, 350: 1195, 1195, 1195, 1195, 355: 1195, 1195, 1195, 1195, 3101, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 372: 1195, 1195, 1195, 376: 1195, 1195, 1195, 1195, 381: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 401: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 3103, 1195, 3102, 3106, 1195, 1195, 3104, 1195, 1195, 1195, 1195, 1195}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 1124, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3124}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 3125}, + {1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 333: 1193, 1193, 1193, 1193, 1193, 1193, 340: 1193, 1193, 1193, 344: 1193, 1193, 1193, 1193, 1193, 350: 1193, 1193, 1193, 1193, 355: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 372: 1193, 1193, 1193, 376: 1193, 1193, 1193, 1193, 381: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 401: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193}, + // 1005 + {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 333: 1196, 1196, 1196, 1196, 1196, 1196, 340: 1196, 1196, 1196, 344: 3099, 3100, 3105, 1196, 1196, 350: 1196, 1196, 1196, 1196, 355: 1196, 1196, 1196, 1196, 3101, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 372: 1196, 1196, 1196, 376: 1196, 1196, 1196, 1196, 381: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 401: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 3103, 1196, 3102, 3106, 1196, 1196, 3104, 1196, 1196, 1196, 1196, 1196}, + {1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 333: 1197, 1197, 1197, 1197, 1197, 1197, 340: 1197, 1197, 1197, 344: 3099, 3100, 3105, 1197, 1197, 350: 1197, 1197, 1197, 1197, 355: 1197, 1197, 1197, 1197, 3101, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 372: 1197, 1197, 1197, 376: 1197, 1197, 1197, 1197, 381: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 401: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 3103, 1197, 3102, 3106, 1197, 1197, 3104, 1197, 1197, 1197, 1197, 1197}, + {1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 333: 1198, 1198, 1198, 1198, 1198, 1198, 340: 1198, 1198, 1198, 344: 3099, 3100, 3105, 1198, 1198, 350: 1198, 1198, 1198, 1198, 355: 1198, 1198, 1198, 1198, 3101, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 372: 1198, 1198, 1198, 376: 1198, 1198, 1198, 1198, 381: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 401: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 3103, 1198, 3102, 3106, 1198, 1198, 3104, 3097, 3098, 1198, 1198, 1198}, + {1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 333: 1199, 1199, 1199, 1199, 1199, 1199, 340: 1199, 1199, 1199, 344: 3099, 3100, 3105, 1199, 1199, 350: 1199, 1199, 1199, 1199, 355: 1199, 1199, 1199, 1199, 3101, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 372: 1199, 1199, 1199, 376: 1199, 1199, 1199, 1199, 381: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 401: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 3103, 3096, 3102, 3106, 1199, 1199, 3104, 3097, 3098, 1199, 1199, 1199}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 659: 2854, 677: 3131}, + // 1010 + {356: 3132}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3133}, + {18: 3134, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 333: 1068, 1068, 1068, 1068, 1068, 1068, 340: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 350: 1068, 1068, 1068, 1068, 355: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 372: 1068, 1068, 1068, 376: 1068, 1068, 1068, 1068, 381: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 401: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 442: 1068}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3136}, + // 1015 + {8: 3137, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {431: 3138}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3139}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 3140}, + {18: 3141}, + // 1020 + {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 333: 1069, 1069, 1069, 1069, 1069, 1069, 340: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 350: 1069, 1069, 1069, 1069, 355: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 372: 1069, 1069, 1069, 376: 1069, 1069, 1069, 1069, 381: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 401: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 442: 1069}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3143}, + {8: 3144, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 3146, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3145}, + {18: 3150, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1025 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 1124, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3147}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 3148}, + {18: 3149, 344: 3120}, + {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 333: 1070, 1070, 1070, 1070, 1070, 1070, 340: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 350: 1070, 1070, 1070, 1070, 355: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 372: 1070, 1070, 1070, 376: 1070, 1070, 1070, 1070, 381: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 401: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 442: 1070}, + {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 333: 1071, 1071, 1071, 1071, 1071, 1071, 340: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 350: 1071, 1071, 1071, 1071, 355: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 372: 1071, 1071, 1071, 376: 1071, 1071, 1071, 1071, 381: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 401: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 442: 1071}, + // 1030 + {18: 1681, 375: 3153, 881: 3152, 3154}, + {18: 1680}, + {18: 1679}, + {18: 3155}, + {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 333: 1072, 1072, 1072, 1072, 1072, 1072, 340: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 350: 1072, 1072, 1072, 1072, 355: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 372: 1072, 1072, 1072, 376: 1072, 1072, 1072, 1072, 381: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 401: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 442: 1072}, + // 1035 + {18: 1681, 375: 3153, 881: 3152, 3157}, + {18: 3158}, + {1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 333: 1073, 1073, 1073, 1073, 1073, 1073, 340: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 350: 1073, 1073, 1073, 1073, 355: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 372: 1073, 1073, 1073, 376: 1073, 1073, 1073, 1073, 381: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 401: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 442: 1073}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3160}, + {8: 3161, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1040 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3162}, + {18: 3163, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 333: 1075, 1075, 1075, 1075, 1075, 1075, 340: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 350: 1075, 1075, 1075, 1075, 355: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 372: 1075, 1075, 1075, 376: 1075, 1075, 1075, 1075, 381: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 401: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 442: 1075}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3165}, + {18: 3166}, + // 1045 + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 333: 1076, 1076, 1076, 1076, 1076, 1076, 340: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 350: 1076, 1076, 1076, 1076, 355: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 372: 1076, 1076, 1076, 376: 1076, 1076, 1076, 1076, 381: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 401: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 442: 1076}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3168}, + {8: 2999, 18: 3169, 361: 3170}, + {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 333: 1081, 1081, 1081, 1081, 1081, 1081, 340: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 350: 1081, 1081, 1081, 1081, 355: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 372: 1081, 1081, 1081, 376: 1081, 1081, 1081, 1081, 381: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 401: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 442: 1081}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 3171}, + // 1050 + {18: 3174}, + {669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 29: 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 73: 669, 669, 332: 669, 669, 669, 336: 669, 669, 669, 669, 342: 669, 669, 349: 669, 354: 669, 367: 669, 370: 669, 669, 380: 669, 400: 669, 423: 669, 429: 669, 433: 669, 438: 669, 669, 445: 669, 454: 669, 502: 669, 669, 669, 669, 509: 669, 511: 669, 515: 669, 518: 669, 520: 669}, + {668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 29: 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 73: 668, 668, 332: 668, 668, 668, 336: 668, 668, 668, 668, 342: 668, 668, 349: 668, 354: 668, 367: 668, 370: 668, 668, 380: 668, 400: 668, 423: 668, 429: 668, 433: 668, 438: 668, 668, 445: 668, 454: 668, 502: 668, 668, 668, 668, 509: 668, 511: 668, 515: 668, 518: 668, 520: 668}, + {1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 333: 1080, 1080, 1080, 1080, 1080, 1080, 340: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 350: 1080, 1080, 1080, 1080, 355: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 372: 1080, 1080, 1080, 376: 1080, 1080, 1080, 1080, 381: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 401: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 442: 1080}, + {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 333: 1082, 1082, 1082, 1082, 1082, 1082, 340: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 350: 1082, 1082, 1082, 1082, 355: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 372: 1082, 1082, 1082, 376: 1082, 1082, 1082, 1082, 381: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 401: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 442: 1082}, + // 1055 + {18: 3177, 375: 3178}, + {1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 333: 1007, 1007, 1007, 1007, 1007, 1007, 340: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 350: 1007, 1007, 1007, 1007, 355: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 372: 1007, 1007, 1007, 376: 1007, 1007, 1007, 1007, 381: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 401: 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007, 442: 1007}, + {18: 3179}, + {1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 333: 1006, 1006, 1006, 1006, 1006, 1006, 340: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 350: 1006, 1006, 1006, 1006, 355: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 372: 1006, 1006, 1006, 376: 1006, 1006, 1006, 1006, 381: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 401: 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006, 442: 1006}, + {18: 3181}, + // 1060 + {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 333: 1083, 1083, 1083, 1083, 1083, 1083, 340: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 350: 1083, 1083, 1083, 1083, 355: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 372: 1083, 1083, 1083, 376: 1083, 1083, 1083, 1083, 381: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 401: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 442: 1083}, + {18: 3184}, + {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 333: 1084, 1084, 1084, 1084, 1084, 1084, 340: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 350: 1084, 1084, 1084, 1084, 355: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 372: 1084, 1084, 1084, 376: 1084, 1084, 1084, 1084, 381: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 401: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 442: 1084}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 333: 1097, 1097, 1097, 1097, 1097, 1097, 340: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 350: 1097, 1097, 1097, 1097, 355: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 372: 1097, 1097, 1097, 376: 1097, 1097, 1097, 1097, 381: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 401: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 442: 1097, 510: 1097, 516: 1097, 519: 1097, 526: 1097}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3186}, + // 1065 + {18: 3187}, + {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 333: 1085, 1085, 1085, 1085, 1085, 1085, 340: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 350: 1085, 1085, 1085, 1085, 355: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 372: 1085, 1085, 1085, 376: 1085, 1085, 1085, 1085, 381: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 401: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 442: 1085}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3189}, + {18: 3190}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 333: 1086, 1086, 1086, 1086, 1086, 1086, 340: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 350: 1086, 1086, 1086, 1086, 355: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 372: 1086, 1086, 1086, 376: 1086, 1086, 1086, 1086, 381: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 401: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 442: 1086}, + // 1070 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3192, 2311, 2310, 572: 3193}, + {18: 1183, 366: 1183, 512: 3195}, + {18: 3194}, + {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 333: 1151, 1151, 1151, 1151, 1151, 1151, 340: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 350: 1151, 1151, 1151, 1151, 355: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 372: 1151, 1151, 1151, 376: 1151, 1151, 1151, 1151, 381: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 401: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 442: 1151}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3196, 2311, 2310}, + // 1075 + {18: 1182, 366: 1182, 512: 3197}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3198, 2311, 2310}, + {1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 333: 1181, 1181, 1181, 1181, 1181, 1181, 340: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 350: 1181, 1181, 1181, 1181, 355: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 372: 1181, 1181, 1181, 376: 1181, 1181, 1181, 1181, 381: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 401: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 442: 1181, 513: 1181, 1181}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3192, 2311, 2310, 572: 3200}, + {18: 3201}, + // 1080 + {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 333: 1152, 1152, 1152, 1152, 1152, 1152, 340: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 350: 1152, 1152, 1152, 1152, 355: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 372: 1152, 1152, 1152, 376: 1152, 1152, 1152, 1152, 381: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 401: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 442: 1152}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3203}, + {8: 3204, 358: 2745, 361: 3205, 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {44: 3216, 62: 3212, 108: 3211, 116: 3215, 130: 3218, 136: 3213, 370: 3223, 400: 3209, 505: 3222, 536: 3214, 3219, 3220, 540: 3221, 599: 3217, 722: 3210, 771: 3208}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 3206}, + // 1085 + {18: 3207}, + {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 333: 1153, 1153, 1153, 1153, 1153, 1153, 340: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 350: 1153, 1153, 1153, 1153, 355: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 372: 1153, 1153, 1153, 376: 1153, 1153, 1153, 1153, 381: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 401: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 442: 1153}, + {18: 3260}, + {18: 317, 332: 3239, 515: 317, 611: 3240, 640: 3259}, + {16: 317, 18: 317, 332: 3239, 370: 317, 400: 317, 505: 317, 515: 317, 611: 3240, 640: 3244}, + // 1090 + {18: 967, 515: 967}, + {18: 966, 515: 966}, + {18: 317, 332: 3239, 515: 317, 611: 3240, 640: 3243}, + {18: 310, 332: 3225, 515: 310, 611: 3226, 745: 3242, 758: 3227}, + {18: 317, 332: 3239, 515: 317, 611: 3240, 640: 3238}, + // 1095 + {18: 391, 515: 391, 543: 3235, 3236, 912: 3237}, + {18: 391, 515: 391, 543: 3235, 3236, 912: 3234}, + {18: 960, 515: 960}, + {18: 959, 515: 959}, + {18: 310, 332: 3225, 515: 310, 611: 3226, 745: 3224, 758: 3227}, + // 1100 + {18: 957, 515: 957}, + {16: 355, 18: 355, 332: 355, 370: 355, 400: 355, 505: 355, 515: 355}, + {16: 354, 18: 354, 332: 354, 370: 354, 400: 354, 505: 354, 515: 354}, + {18: 958, 515: 958}, + {375: 2256, 595: 3228, 613: 3229}, + // 1105 + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 18: 309, 44: 309, 333: 309, 309, 336: 309, 338: 309, 309, 343: 309, 349: 309, 354: 309, 423: 309, 429: 309, 433: 309, 438: 309, 309, 445: 309, 454: 309, 515: 309, 599: 309, 309}, + {308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 18: 308, 44: 308, 333: 308, 308, 336: 308, 338: 308, 308, 343: 308, 349: 308, 354: 308, 423: 308, 429: 308, 433: 308, 438: 308, 308, 445: 308, 454: 308, 515: 308, 599: 308, 308}, + {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 14: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 29: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 53: 1711, 1711, 1711, 1711, 71: 1711, 144: 1711, 332: 1711, 1711, 337: 1711, 1711, 1711, 342: 1711, 1711, 347: 1711, 1711, 350: 1711, 1711, 353: 1711, 1711, 361: 1711, 370: 1711, 1711, 380: 1711, 382: 1711, 434: 1711, 502: 1711, 1711, 1711, 1711, 509: 1711, 511: 1711}, + {8: 3231, 18: 3230}, + {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 16: 318, 18: 318, 44: 318, 58: 318, 63: 318, 318, 333: 318, 318, 336: 318, 338: 318, 318, 343: 318, 349: 318, 354: 318, 370: 318, 385: 318, 318, 400: 318, 423: 318, 429: 318, 433: 318, 438: 318, 318, 445: 318, 454: 318, 505: 318, 515: 318, 599: 318, 318}, + // 1110 + {375: 2256, 595: 3228, 613: 3232}, + {18: 3233}, + {307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 18: 307, 44: 307, 333: 307, 307, 336: 307, 338: 307, 307, 343: 307, 349: 307, 354: 307, 423: 307, 429: 307, 433: 307, 438: 307, 307, 445: 307, 454: 307, 515: 307, 599: 307, 307}, + {18: 961, 515: 961}, + {18: 390, 515: 390}, + // 1115 + {18: 389, 515: 389}, + {18: 962, 515: 962}, + {18: 963, 515: 963}, + {375: 2256, 595: 3228, 613: 3241}, + {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 16: 316, 18: 316, 44: 316, 58: 316, 63: 316, 316, 333: 316, 316, 336: 316, 338: 316, 316, 343: 316, 349: 316, 354: 316, 370: 316, 385: 316, 316, 400: 316, 423: 316, 429: 316, 433: 316, 438: 316, 316, 445: 316, 454: 316, 505: 316, 515: 316, 599: 316, 316}, + // 1120 + {18: 3230}, + {18: 964, 515: 964}, + {18: 965, 515: 965}, + {16: 3249, 18: 304, 370: 3250, 400: 3246, 505: 3248, 515: 304, 628: 3247, 647: 3245}, + {18: 968, 515: 968}, + // 1125 + {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 16: 3249, 18: 301, 333: 301, 301, 336: 301, 338: 301, 301, 343: 301, 349: 301, 354: 301, 370: 3250, 423: 301, 429: 301, 433: 301, 438: 301, 301, 445: 301, 454: 301, 505: 3248, 515: 301, 628: 3257, 1075: 3256}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 3253}, + {367: 3252}, + {298, 298, 298, 298, 298, 298, 298, 298, 9: 298, 298, 298, 298, 298, 298, 298, 298, 298, 19: 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 335: 298, 339: 298, 360: 298, 366: 298, 381: 298, 400: 298}, + {367: 3251}, + // 1130 + {297, 297, 297, 297, 297, 297, 297, 297, 9: 297, 297, 297, 297, 297, 297, 297, 297, 297, 19: 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 335: 297, 339: 297, 360: 297, 366: 297, 381: 297, 400: 297}, + {299, 299, 299, 299, 299, 299, 299, 299, 9: 299, 299, 299, 299, 299, 299, 299, 299, 299, 19: 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 335: 299, 339: 299, 360: 299, 366: 299, 381: 299, 400: 299}, + {306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 18: 306, 333: 306, 306, 336: 306, 338: 306, 306, 343: 306, 349: 306, 354: 306, 400: 3254, 423: 306, 429: 306, 433: 306, 438: 306, 306, 445: 306, 454: 306, 515: 306, 1074: 3255}, + {305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 18: 305, 333: 305, 305, 336: 305, 338: 305, 305, 343: 305, 349: 305, 354: 305, 423: 305, 429: 305, 433: 305, 438: 305, 305, 445: 305, 454: 305, 515: 305}, + {302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 18: 302, 333: 302, 302, 336: 302, 338: 302, 302, 343: 302, 349: 302, 354: 302, 423: 302, 429: 302, 433: 302, 438: 302, 302, 445: 302, 454: 302, 515: 302}, + // 1135 + {303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 18: 303, 333: 303, 303, 336: 303, 338: 303, 303, 343: 303, 349: 303, 354: 303, 423: 303, 429: 303, 433: 303, 438: 303, 303, 445: 303, 454: 303, 515: 303}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 3258}, + {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 18: 300, 333: 300, 300, 336: 300, 338: 300, 300, 343: 300, 349: 300, 354: 300, 423: 300, 429: 300, 433: 300, 438: 300, 300, 445: 300, 454: 300, 515: 300}, + {18: 969, 515: 969}, + {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 333: 1154, 1154, 1154, 1154, 1154, 1154, 340: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 350: 1154, 1154, 1154, 1154, 355: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 372: 1154, 1154, 1154, 376: 1154, 1154, 1154, 1154, 381: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 401: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 442: 1154}, + // 1140 + {358: 2745, 362: 2743, 2744, 2742, 2740, 399: 975, 592: 2741, 2739}, + {399: 3265, 982: 3264, 1145: 3263}, + {121: 971, 399: 3265, 401: 3271, 982: 3270, 1024: 3269}, + {121: 974, 399: 974, 401: 974}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3266}, + // 1145 + {358: 2745, 362: 2743, 2744, 2742, 2740, 402: 3267, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3268}, + {121: 972, 358: 2745, 362: 2743, 2744, 2742, 2740, 399: 972, 401: 972, 592: 2741, 2739}, + {121: 3273}, + {121: 973, 399: 973, 401: 973}, + // 1150 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3272}, + {121: 970, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 333: 1155, 1155, 1155, 1155, 1155, 1155, 340: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 350: 1155, 1155, 1155, 1155, 355: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 372: 1155, 1155, 1155, 376: 1155, 1155, 1155, 1155, 381: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 401: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 442: 1155}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3275}, + {338: 3276, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1155 + {44: 3216, 62: 3212, 108: 3211, 116: 3215, 130: 3218, 136: 3213, 370: 3223, 400: 3209, 505: 3222, 536: 3214, 3219, 3220, 540: 3221, 599: 3217, 722: 3210, 771: 3277}, + {18: 1148, 515: 3279, 997: 3278}, + {18: 3280}, + {18: 1147}, + {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 333: 1157, 1157, 1157, 1157, 1157, 1157, 340: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 350: 1157, 1157, 1157, 1157, 355: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 372: 1157, 1157, 1157, 376: 1157, 1157, 1157, 1157, 381: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 401: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 442: 1157}, + // 1160 + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 333: 1158, 1158, 1158, 1158, 1158, 1158, 340: 1158, 1158, 1158, 2749, 1158, 1158, 1158, 1158, 1158, 350: 1158, 1158, 1158, 1158, 355: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 372: 1158, 1158, 1158, 376: 1158, 1158, 1158, 1158, 381: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 401: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 442: 1158}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3283}, + {358: 2745, 362: 2743, 2744, 2742, 2740, 379: 3284, 592: 2741, 2739}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 333: 1159, 1159, 1159, 1159, 1159, 1159, 340: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 350: 1159, 1159, 1159, 1159, 355: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 372: 1159, 1159, 1159, 376: 1159, 1159, 1159, 1159, 381: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 401: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 442: 1159}, + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 333: 1160, 1160, 1160, 1160, 1160, 1160, 340: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 350: 1160, 1160, 1160, 1160, 355: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 372: 1160, 1160, 1160, 376: 1160, 1160, 1160, 1160, 381: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 401: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 442: 1160}, + // 1165 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3287}, + {8: 3288}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3289}, + {8: 1686, 18: 3290, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 333: 1161, 1161, 1161, 1161, 1161, 1161, 340: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 350: 1161, 1161, 1161, 1161, 355: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 372: 1161, 1161, 1161, 376: 1161, 1161, 1161, 1161, 381: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 401: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 442: 1161}, + // 1170 + {8: 1687, 18: 3422, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {8: 3419}, + {8: 1164, 18: 1164, 334: 1164, 336: 1164, 342: 720, 1164, 1164, 1164, 1164, 720, 720, 352: 3306, 355: 3307, 357: 3000, 1164, 1164, 362: 1164, 1164, 1164, 1164, 1164, 381: 1164, 398: 1164, 403: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 442: 1164, 630: 3308, 3309}, + {332: 3191, 434: 3329, 762: 3328, 814: 3327}, + {332: 2161, 371: 2159, 502: 2158, 504: 2154, 569: 3303, 617: 3302, 2155, 2156, 2157, 622: 2166, 625: 2164, 3304, 3305}, + // 1175 + {18: 3301, 342: 721, 347: 721, 721}, + {18: 3300}, + {18: 3299}, + {748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 340: 748, 748, 748, 748, 748, 748, 748, 748, 748, 350: 748, 748, 748, 748, 355: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 371: 748, 748, 748, 748, 376: 748, 748, 748, 748, 381: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 401: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 442: 748, 502: 748, 504: 748, 517: 748, 609: 748}, + {749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 340: 749, 749, 749, 749, 749, 749, 749, 749, 749, 350: 749, 749, 749, 749, 355: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 371: 749, 749, 749, 749, 376: 749, 749, 749, 749, 381: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 401: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 442: 749, 502: 749, 504: 749, 517: 749, 609: 749}, + // 1180 + {750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 340: 750, 750, 750, 750, 750, 750, 750, 750, 750, 350: 750, 750, 750, 750, 355: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 371: 750, 750, 750, 750, 376: 750, 750, 750, 750, 381: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 401: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 442: 750, 502: 750, 504: 750, 517: 750, 609: 750}, + {907, 907, 18: 907, 333: 907, 337: 907, 342: 721, 347: 721, 721}, + {906, 906, 18: 906, 333: 906, 337: 906, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + {733, 733, 18: 733, 333: 733, 337: 733}, + {732, 732, 18: 732, 333: 732, 337: 732}, + // 1185 + {375: 2256, 432: 3315, 595: 3228, 613: 3314, 730: 3322}, + {9: 3311, 269: 3312, 1032: 3313}, + {726, 726, 18: 726, 333: 726, 337: 726, 352: 3306, 355: 3307, 631: 3310}, + {725, 725, 18: 725, 333: 725, 337: 725}, + {724, 724, 18: 724, 333: 724, 337: 724}, + // 1190 + {375: 783, 382: 783, 432: 783, 434: 783}, + {375: 782, 382: 782, 432: 782, 434: 782}, + {375: 2256, 382: 781, 432: 3315, 434: 781, 595: 3228, 613: 3314, 730: 3316, 1027: 3317}, + {787, 787, 8: 787, 18: 787, 144: 787, 333: 787, 337: 787, 342: 787, 347: 787, 787, 350: 787, 787, 353: 787, 382: 787, 434: 787}, + {786, 786, 8: 786, 18: 786, 144: 786, 333: 786, 337: 786, 342: 786, 347: 786, 786, 350: 786, 786, 353: 786, 382: 786, 434: 786}, + // 1195 + {382: 780, 434: 780}, + {382: 3319, 434: 3318, 1102: 3320}, + {131: 785}, + {131: 784}, + {131: 3321}, + // 1200 + {776, 776, 18: 776, 333: 776, 337: 776, 342: 776, 347: 776, 776, 350: 776, 776, 353: 776}, + {779, 779, 8: 3323, 18: 779, 144: 3324, 333: 779, 337: 779, 342: 779, 347: 779, 779, 350: 779, 779, 353: 779}, + {375: 2256, 432: 3315, 595: 3228, 613: 3314, 730: 3326}, + {375: 2256, 432: 3315, 595: 3228, 613: 3314, 730: 3325}, + {777, 777, 18: 777, 333: 777, 337: 777, 342: 777, 347: 777, 777, 350: 777, 777, 353: 777}, + // 1205 + {778, 778, 18: 778, 333: 778, 337: 778, 342: 778, 347: 778, 778, 350: 778, 778, 353: 778}, + {1201, 1201, 8: 3341, 18: 1201, 333: 1201, 337: 1201, 342: 1201, 347: 1201, 1201, 350: 1201, 1201, 1201, 1201, 355: 1201, 357: 3000, 630: 3001, 675: 3340}, + {3, 3, 8: 3, 18: 3, 333: 3, 337: 3, 342: 3, 347: 3, 3, 350: 3, 3, 3, 3, 355: 3, 357: 3}, + {332: 3330, 763: 3331}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1242, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 3335, 1140: 3334, 3333}, + // 1210 + {1, 1, 8: 1, 18: 1, 333: 1, 337: 1, 342: 1, 347: 1, 1, 350: 1, 1, 1, 1, 355: 1, 357: 1}, + {1238, 1238, 8: 1238, 18: 1238, 333: 1238, 338: 1238, 352: 1238, 357: 1238, 2745, 360: 1238, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {18: 3339}, + {8: 3337, 18: 1241}, + {8: 1239, 18: 1239}, + // 1215 + {1237, 1237, 8: 1237, 18: 1237, 332: 3199, 1237, 338: 1237, 352: 1237, 357: 1237, 360: 1237}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 3338}, + {8: 1240, 18: 1240}, + {1243, 1243, 8: 1243, 18: 1243, 333: 1243, 337: 1243, 1243, 342: 1243, 347: 1243, 1243, 350: 1243, 1243, 1243, 1243, 355: 1243, 357: 1243}, + {775, 775, 18: 775, 333: 775, 337: 775, 342: 775, 347: 775, 775, 350: 775, 775, 3306, 775, 355: 3307, 631: 3344, 713: 3343}, + // 1220 + {434: 3329, 762: 3342}, + {2, 2, 8: 2, 18: 2, 333: 2, 337: 2, 342: 2, 347: 2, 2, 350: 2, 2, 2, 2, 355: 2, 357: 2}, + {746, 746, 18: 746, 333: 746, 337: 746, 342: 746, 347: 746, 746, 350: 3346, 746, 353: 3347, 735: 3345}, + {774, 774, 18: 774, 333: 774, 337: 774, 342: 774, 347: 774, 774, 350: 774, 774, 353: 774}, + {752, 752, 18: 752, 333: 752, 337: 752, 342: 752, 347: 752, 752, 351: 3375, 736: 3374}, + // 1225 + {223: 3352, 517: 3351}, + {398: 3348}, + {223: 3349}, + {171: 3350}, + {738, 738, 18: 738, 333: 738, 337: 738, 342: 738, 347: 738, 738, 351: 738}, + // 1230 + {737, 737, 18: 737, 45: 737, 124: 737, 126: 737, 333: 737, 337: 737, 342: 737, 347: 737, 737, 351: 737, 905: 3354, 3368}, + {737, 737, 18: 737, 124: 737, 126: 737, 333: 737, 337: 737, 342: 737, 347: 737, 737, 351: 737, 905: 3354, 3353}, + {744, 744, 18: 744, 124: 3365, 126: 3366, 333: 744, 337: 744, 342: 744, 347: 744, 744, 351: 744}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 3358}, + {951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 336: 951, 951, 951, 951, 951, 951, 951, 951, 347: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 360: 951, 951, 367: 951, 951, 951, 951, 951, 951, 951, 951, 376: 951, 951, 951, 951, 951, 951, 398: 951, 423: 951, 429: 951, 433: 951, 438: 951, 951, 445: 951, 951, 454: 951, 501: 951, 951, 951, 951, 951, 509: 951, 951, 951, 3363, 517: 951, 951, 520: 951, 523: 951, 525: 951, 527: 951, 951, 951, 531: 951, 951, 535: 951, 539: 951, 545: 951, 951}, + // 1235 + {512: 3361}, + {948, 948, 8: 948, 18: 948, 45: 948, 117: 948, 124: 948, 948, 948, 128: 948, 333: 948, 337: 948, 342: 948, 347: 948, 948, 350: 948, 948, 517: 948, 527: 948, 948, 948}, + {736, 736, 8: 3359, 18: 736, 45: 736, 124: 736, 126: 736, 333: 736, 337: 736, 342: 736, 347: 736, 736, 351: 736}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3360}, + {947, 947, 8: 947, 18: 947, 45: 947, 117: 947, 124: 947, 947, 947, 128: 947, 333: 947, 337: 947, 342: 947, 347: 947, 947, 350: 947, 947, 517: 947, 527: 947, 947, 947}, + // 1240 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3362, 2311, 2310}, + {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 336: 949, 949, 949, 949, 949, 949, 949, 949, 347: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 360: 949, 949, 367: 949, 949, 949, 949, 949, 949, 949, 949, 376: 949, 949, 949, 949, 949, 949, 398: 949, 423: 949, 429: 949, 433: 949, 438: 949, 949, 445: 949, 949, 454: 949, 501: 949, 949, 949, 949, 949, 509: 949, 949, 949, 517: 949, 949, 520: 949, 523: 949, 525: 949, 527: 949, 949, 949, 531: 949, 949, 535: 949, 539: 949, 545: 949, 949}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3364, 2311, 2310}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 336: 950, 950, 950, 950, 950, 950, 950, 950, 347: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 360: 950, 950, 367: 950, 950, 950, 950, 950, 950, 950, 950, 376: 950, 950, 950, 950, 950, 950, 398: 950, 423: 950, 429: 950, 433: 950, 438: 950, 950, 445: 950, 950, 454: 950, 501: 950, 950, 950, 950, 950, 509: 950, 950, 950, 517: 950, 950, 520: 950, 523: 950, 525: 950, 527: 950, 950, 950, 531: 950, 950, 535: 950, 539: 950, 545: 950, 950}, + {741, 741, 18: 741, 333: 741, 337: 741, 342: 741, 347: 741, 741, 351: 741}, + // 1245 + {209: 3367}, + {739, 739, 18: 739, 333: 739, 337: 739, 342: 739, 347: 739, 739, 351: 739}, + {745, 745, 18: 745, 45: 3370, 124: 3369, 126: 3371, 333: 745, 337: 745, 342: 745, 347: 745, 745, 351: 745}, + {743, 743, 18: 743, 333: 743, 337: 743, 342: 743, 347: 743, 743, 351: 743}, + {375: 2256, 595: 3373}, + // 1250 + {209: 3372}, + {740, 740, 18: 740, 333: 740, 337: 740, 342: 740, 347: 740, 740, 351: 740}, + {742, 742, 18: 742, 333: 742, 337: 742, 342: 742, 347: 742, 742, 351: 742}, + {908, 908, 18: 908, 333: 908, 337: 908, 342: 908, 347: 908, 908}, + {1085: 3376}, + // 1255 + {335: 3377}, + {54, 54, 18: 54, 73: 3381, 3380, 333: 54, 337: 54, 342: 54, 347: 54, 54, 520: 54, 702: 3379, 879: 3378}, + {39, 39, 18: 39, 333: 39, 337: 39, 342: 39, 347: 39, 39, 520: 3409, 899: 3408}, + {61: 3388, 623: 3384, 629: 3386, 632: 3387, 3385, 878: 3383, 1030: 3382}, + {61: 52, 332: 52, 356: 52, 398: 52, 623: 52, 629: 52, 632: 52, 52}, + // 1260 + {61: 51, 332: 51, 356: 51, 398: 51, 623: 51, 629: 51, 632: 51, 51}, + {53, 53, 18: 53, 61: 3388, 332: 53, 53, 337: 53, 342: 53, 347: 53, 53, 367: 53, 503: 53, 520: 53, 623: 3384, 629: 3386, 632: 3387, 3385, 878: 3407}, + {49, 49, 18: 49, 61: 49, 332: 49, 49, 337: 49, 342: 49, 347: 49, 49, 367: 49, 503: 49, 520: 49, 623: 49, 629: 49, 632: 49, 49}, + {522: 3405}, + {335: 3399, 426: 3400, 3401, 703: 3404}, + // 1265 + {522: 3402}, + {522: 3397}, + {349: 3389}, + {522: 3390}, + {335: 3391, 426: 3392, 3393, 658: 3394}, + // 1270 + {294, 294, 8: 294, 18: 294, 61: 294, 112: 294, 294, 115: 294, 332: 294, 294, 337: 294, 342: 294, 347: 294, 294, 367: 294, 373: 294, 503: 294, 520: 294, 623: 294, 629: 294, 632: 294, 294, 754: 294}, + {293, 293, 8: 293, 18: 293, 61: 293, 112: 293, 293, 115: 293, 332: 293, 293, 337: 293, 342: 293, 347: 293, 293, 367: 293, 373: 293, 503: 293, 520: 293, 623: 293, 629: 293, 632: 293, 293, 754: 293}, + {292, 292, 8: 292, 18: 292, 61: 292, 112: 292, 292, 115: 292, 332: 292, 292, 337: 292, 342: 292, 347: 292, 292, 367: 292, 373: 292, 503: 292, 520: 292, 623: 292, 629: 292, 632: 292, 292, 754: 292}, + {44, 44, 18: 44, 61: 44, 332: 44, 44, 337: 44, 342: 44, 347: 44, 44, 367: 44, 503: 44, 520: 44, 623: 44, 629: 44, 632: 44, 44, 754: 3395}, + {629: 3396}, + // 1275 + {43, 43, 18: 43, 61: 43, 332: 43, 43, 337: 43, 342: 43, 347: 43, 43, 367: 43, 503: 43, 520: 43, 623: 43, 629: 43, 632: 43, 43}, + {335: 3399, 426: 3400, 3401, 703: 3398}, + {45, 45, 18: 45, 61: 45, 332: 45, 45, 337: 45, 342: 45, 347: 45, 45, 367: 45, 503: 45, 520: 45, 623: 45, 629: 45, 632: 45, 45}, + {42, 42, 18: 42, 61: 42, 332: 42, 42, 337: 42, 342: 42, 347: 42, 42, 367: 42, 503: 42, 520: 42, 623: 42, 629: 42, 632: 42, 42}, + {41, 41, 18: 41, 61: 41, 332: 41, 41, 337: 41, 342: 41, 347: 41, 41, 367: 41, 503: 41, 520: 41, 623: 41, 629: 41, 632: 41, 41}, + // 1280 + {40, 40, 18: 40, 61: 40, 332: 40, 40, 337: 40, 342: 40, 347: 40, 40, 367: 40, 503: 40, 520: 40, 623: 40, 629: 40, 632: 40, 40}, + {335: 3399, 426: 3400, 3401, 703: 3403}, + {46, 46, 18: 46, 61: 46, 332: 46, 46, 337: 46, 342: 46, 347: 46, 46, 367: 46, 503: 46, 520: 46, 623: 46, 629: 46, 632: 46, 46}, + {47, 47, 18: 47, 61: 47, 332: 47, 47, 337: 47, 342: 47, 347: 47, 47, 367: 47, 503: 47, 520: 47, 623: 47, 629: 47, 632: 47, 47}, + {335: 3399, 426: 3400, 3401, 703: 3406}, + // 1285 + {48, 48, 18: 48, 61: 48, 332: 48, 48, 337: 48, 342: 48, 347: 48, 48, 367: 48, 503: 48, 520: 48, 623: 48, 629: 48, 632: 48, 48}, + {50, 50, 18: 50, 61: 50, 332: 50, 50, 337: 50, 342: 50, 347: 50, 50, 367: 50, 503: 50, 520: 50, 623: 50, 629: 50, 632: 50, 50}, + {751, 751, 18: 751, 333: 751, 337: 751, 342: 751, 347: 751, 751}, + {37, 37, 18: 37, 332: 37, 37, 337: 37, 342: 37, 347: 37, 37, 367: 37, 503: 37, 623: 37, 1116: 3410, 3411}, + {35, 35, 18: 35, 332: 35, 35, 337: 35, 342: 35, 347: 35, 35, 367: 35, 503: 35, 623: 3415, 1058: 3414}, + // 1290 + {522: 3412}, + {335: 3399, 426: 3400, 3401, 703: 3413}, + {36, 36, 18: 36, 332: 36, 36, 337: 36, 342: 36, 347: 36, 36, 367: 36, 503: 36, 623: 36}, + {38, 38, 18: 38, 332: 38, 38, 337: 38, 342: 38, 347: 38, 38, 367: 38, 503: 38}, + {522: 3416}, + // 1295 + {335: 3399, 426: 3400, 3401, 703: 3417}, + {34, 34, 18: 34, 332: 34, 34, 337: 34, 342: 34, 347: 34, 34, 367: 34, 503: 34}, + {747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 340: 747, 747, 747, 747, 747, 747, 747, 747, 747, 350: 747, 747, 747, 747, 355: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 371: 747, 747, 747, 747, 376: 747, 747, 747, 747, 381: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 401: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 442: 747, 502: 747, 504: 747, 517: 747, 609: 747}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3420}, + {8: 1686, 18: 3421, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1300 + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 333: 1162, 1162, 1162, 1162, 1162, 1162, 340: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 350: 1162, 1162, 1162, 1162, 355: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 372: 1162, 1162, 1162, 376: 1162, 1162, 1162, 1162, 381: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 401: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 442: 1162}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 333: 1163, 1163, 1163, 1163, 1163, 1163, 340: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 350: 1163, 1163, 1163, 1163, 355: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 372: 1163, 1163, 1163, 376: 1163, 1163, 1163, 1163, 381: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 401: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 442: 1163}, + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 333: 1165, 1165, 1165, 1165, 1165, 1165, 340: 1165, 1165, 1165, 2749, 1165, 1165, 1165, 1165, 1165, 350: 1165, 1165, 1165, 1165, 355: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 372: 1165, 1165, 1165, 376: 1165, 1165, 1165, 1165, 381: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 401: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 442: 1165}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 333: 1167, 1167, 1167, 1167, 1167, 1167, 340: 1167, 1167, 1167, 2749, 1167, 1167, 1167, 1167, 1167, 350: 1167, 1167, 1167, 1167, 355: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 372: 1167, 1167, 1167, 376: 1167, 1167, 1167, 1167, 381: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 401: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 442: 1167}, + {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 333: 1168, 1168, 1168, 1168, 1168, 1168, 340: 1168, 1168, 1168, 2749, 1168, 1168, 1168, 1168, 1168, 350: 1168, 1168, 1168, 1168, 355: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 372: 1168, 1168, 1168, 376: 1168, 1168, 1168, 1168, 381: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 401: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 442: 1168}, + // 1305 + {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 333: 1169, 1169, 1169, 1169, 1169, 1169, 340: 1169, 1169, 1169, 2749, 1169, 1169, 1169, 1169, 1169, 350: 1169, 1169, 1169, 1169, 355: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 372: 1169, 1169, 1169, 376: 1169, 1169, 1169, 1169, 381: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 401: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 442: 1169}, + {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 333: 1170, 1170, 1170, 1170, 1170, 1170, 340: 1170, 1170, 1170, 2749, 1170, 1170, 1170, 1170, 1170, 350: 1170, 1170, 1170, 1170, 355: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 372: 1170, 1170, 1170, 376: 1170, 1170, 1170, 1170, 381: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 401: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 442: 1170}, + {335: 3431}, + {335: 3430}, + {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 333: 1149, 1149, 1149, 1149, 1149, 1149, 340: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 350: 1149, 1149, 1149, 1149, 355: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 372: 1149, 1149, 1149, 376: 1149, 1149, 1149, 1149, 381: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 401: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 442: 1149}, + // 1310 + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 333: 1150, 1150, 1150, 1150, 1150, 1150, 340: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 350: 1150, 1150, 1150, 1150, 355: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 372: 1150, 1150, 1150, 376: 1150, 1150, 1150, 1150, 381: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 401: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 442: 1150}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3433, 2311, 2310}, + {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 3434, 1182, 1182, 1182, 1182, 1182, 1182, 340: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 350: 1182, 1182, 1182, 1182, 355: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 372: 1182, 1182, 1182, 376: 1182, 1182, 1182, 1182, 381: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 401: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 442: 1182, 512: 3197, 1182, 1182}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3435}, + {18: 3436}, + // 1315 + {1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 333: 1009, 1009, 1009, 1009, 1009, 1009, 340: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 350: 1009, 1009, 1009, 1009, 355: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 372: 1009, 1009, 1009, 376: 1009, 1009, 1009, 1009, 381: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 401: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 442: 1009}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 358: 2745, 362: 2743, 2744, 2742, 2740, 387: 2864, 2861, 2863, 2862, 2858, 2860, 2859, 2856, 2857, 2855, 2865, 592: 2741, 2739, 659: 2854, 677: 3438}, + {344: 3120}, + {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 333: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 372: 1221, 1221, 1221, 376: 1221, 1221, 1221, 1221, 381: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 401: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 429: 1221, 433: 1221, 438: 1221, 1221, 442: 1221, 445: 1221, 454: 1221}, + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 333: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 372: 1218, 1218, 1218, 376: 1218, 1218, 1218, 1218, 381: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 401: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 429: 1218, 433: 1218, 438: 1218, 1218, 442: 1218, 445: 1218, 454: 1218}, + // 1320 + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 333: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 372: 1217, 1217, 1217, 376: 1217, 1217, 1217, 1217, 381: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 401: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 429: 1217, 433: 1217, 438: 1217, 1217, 442: 1217, 445: 1217, 454: 1217}, + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 333: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 372: 1215, 1215, 1215, 376: 1215, 1215, 1215, 1215, 381: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 401: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 429: 1215, 433: 1215, 438: 1215, 1215, 442: 1215, 445: 1215, 454: 1215}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3444}, + {338: 3445, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {44: 3216, 62: 3212, 108: 3211, 116: 3215, 130: 3218, 136: 3213, 370: 3223, 400: 3209, 505: 3222, 536: 3214, 3219, 3220, 540: 3221, 599: 3217, 722: 3210, 771: 3446}, + // 1325 + {515: 3447}, + {18: 3448}, + {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 333: 1156, 1156, 1156, 1156, 1156, 1156, 340: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 350: 1156, 1156, 1156, 1156, 355: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 372: 1156, 1156, 1156, 376: 1156, 1156, 1156, 1156, 381: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 401: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 442: 1156}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3450, 594: 3451}, + {18: 3455, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1330 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3452}, + {18: 3453, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3454}, + {1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 333: 1017, 1017, 1017, 1017, 1017, 1017, 340: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 350: 1017, 1017, 1017, 1017, 355: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 372: 1017, 1017, 1017, 376: 1017, 1017, 1017, 1017, 381: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 401: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 442: 1017}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3456}, + // 1335 + {1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 333: 1018, 1018, 1018, 1018, 1018, 1018, 340: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 350: 1018, 1018, 1018, 1018, 355: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 372: 1018, 1018, 1018, 376: 1018, 1018, 1018, 1018, 381: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 401: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 442: 1018}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3458, 594: 3459}, + {8: 3469, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3460}, + {8: 3461, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1340 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3462, 594: 3463}, + {18: 3467, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3464}, + {18: 3465, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3466}, + // 1345 + {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 333: 1013, 1013, 1013, 1013, 1013, 1013, 340: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 350: 1013, 1013, 1013, 1013, 355: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 372: 1013, 1013, 1013, 376: 1013, 1013, 1013, 1013, 381: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 401: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 442: 1013}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3468}, + {1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 333: 1015, 1015, 1015, 1015, 1015, 1015, 340: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 350: 1015, 1015, 1015, 1015, 355: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 372: 1015, 1015, 1015, 376: 1015, 1015, 1015, 1015, 381: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 401: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 442: 1015}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3470, 594: 3471}, + {18: 3475, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1350 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3472}, + {18: 3473, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3474}, + {1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 333: 1014, 1014, 1014, 1014, 1014, 1014, 340: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 350: 1014, 1014, 1014, 1014, 355: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 372: 1014, 1014, 1014, 376: 1014, 1014, 1014, 1014, 381: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 401: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 442: 1014}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3476}, + // 1355 + {1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 333: 1016, 1016, 1016, 1016, 1016, 1016, 340: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 350: 1016, 1016, 1016, 1016, 355: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 372: 1016, 1016, 1016, 376: 1016, 1016, 1016, 1016, 381: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 401: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 442: 1016}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 659: 3478}, + {8: 3479}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3480}, + {8: 3481, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 1360 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3482}, + {18: 3483, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 333: 1060, 1060, 1060, 1060, 1060, 1060, 340: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 350: 1060, 1060, 1060, 1060, 355: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 372: 1060, 1060, 1060, 376: 1060, 1060, 1060, 1060, 381: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 401: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 442: 1060}, + {60: 2870, 62: 2874, 65: 2869, 2866, 2868, 2872, 2873, 2867, 72: 2871, 88: 2882, 99: 2878, 2877, 2876, 2880, 2881, 2875, 2879, 659: 3485}, + {8: 3486}, + // 1365 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3487}, + {8: 3488, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3489}, + {18: 3490, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 333: 1061, 1061, 1061, 1061, 1061, 1061, 340: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 350: 1061, 1061, 1061, 1061, 355: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 372: 1061, 1061, 1061, 376: 1061, 1061, 1061, 1061, 381: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 401: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 442: 1061}, + // 1370 + {108: 3493, 116: 3495, 133: 3496, 136: 3494, 1040: 3492}, + {8: 3497}, + {8: 1050}, + {8: 1049}, + {8: 1048}, + // 1375 + {8: 1047}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3498}, + {18: 3499, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 333: 1067, 1067, 1067, 1067, 1067, 1067, 340: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 350: 1067, 1067, 1067, 1067, 355: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 372: 1067, 1067, 1067, 376: 1067, 1067, 1067, 1067, 381: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 401: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 442: 1067}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3501}, + // 1380 + {18: 3502}, + {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 333: 1051, 1051, 1051, 1051, 1051, 1051, 340: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 350: 1051, 1051, 1051, 1051, 355: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 372: 1051, 1051, 1051, 376: 1051, 1051, 1051, 1051, 381: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 401: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 442: 1051}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3504}, + {18: 3505, 338: 3506, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 333: 1055, 1055, 1055, 1055, 1055, 1055, 340: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 350: 1055, 1055, 1055, 1055, 355: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 372: 1055, 1055, 1055, 376: 1055, 1055, 1055, 1055, 381: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 401: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 442: 1055}, + // 1385 + {370: 3223, 400: 3508, 505: 3222, 722: 3507}, + {332: 3239, 611: 3511}, + {332: 3239, 611: 3509}, + {18: 3510}, + {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 333: 1053, 1053, 1053, 1053, 1053, 1053, 340: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 350: 1053, 1053, 1053, 1053, 355: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 372: 1053, 1053, 1053, 376: 1053, 1053, 1053, 1053, 381: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 401: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 442: 1053}, + // 1390 + {18: 3512}, + {1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 333: 1054, 1054, 1054, 1054, 1054, 1054, 340: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 350: 1054, 1054, 1054, 1054, 355: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 372: 1054, 1054, 1054, 376: 1054, 1054, 1054, 1054, 381: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 401: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 442: 1054}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 333: 1077, 1077, 1077, 1077, 1077, 1077, 340: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 350: 1077, 1077, 1077, 1077, 355: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 372: 1077, 1077, 1077, 376: 1077, 1077, 1077, 1077, 381: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 401: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 442: 1077}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 333: 1078, 1078, 1078, 1078, 1078, 1078, 340: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 350: 1078, 1078, 1078, 1078, 355: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 372: 1078, 1078, 1078, 376: 1078, 1078, 1078, 1078, 381: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 401: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 442: 1078}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3516}, + // 1395 + {18: 3517}, + {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 333: 1074, 1074, 1074, 1074, 1074, 1074, 340: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 350: 1074, 1074, 1074, 1074, 355: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 372: 1074, 1074, 1074, 376: 1074, 1074, 1074, 1074, 381: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 401: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 442: 1074}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 333: 1079, 1079, 1079, 1079, 1079, 1079, 340: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 350: 1079, 1079, 1079, 1079, 355: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 372: 1079, 1079, 1079, 376: 1079, 1079, 1079, 1079, 381: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 401: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 442: 1079}, + {2: 1142, 1142, 1142, 1142, 1142, 1142, 9: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 19: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 334: 1142, 1142, 1142, 339: 1142, 1142, 1142, 344: 1142, 1142, 1142, 349: 1142, 370: 1142, 1142, 375: 1142, 380: 1142, 400: 1142, 424: 1142, 1142, 1142, 1142, 1142, 430: 1142, 1142, 1142, 434: 1142, 1142, 1142, 1142, 440: 1142, 1142, 443: 1142, 1142, 446: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 594: 2956, 603: 2954, 2955, 638: 2957, 2958, 660: 3520, 662: 2959}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3521}, + // 1400 + {18: 3522, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 333: 867, 867, 867, 867, 867, 867, 340: 867, 867, 867, 867, 867, 867, 867, 867, 867, 350: 867, 867, 867, 867, 355: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 372: 867, 867, 867, 376: 867, 867, 867, 867, 381: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 401: 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 867, 442: 867, 601: 2761, 605: 2964, 612: 3523}, + {1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 333: 1039, 1039, 1039, 1039, 1039, 1039, 340: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 350: 1039, 1039, 1039, 1039, 355: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 372: 1039, 1039, 1039, 376: 1039, 1039, 1039, 1039, 381: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 401: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 442: 1039}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 3525}, + {18: 3526}, + // 1405 + {1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 333: 1010, 1010, 1010, 1010, 1010, 1010, 340: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 350: 1010, 1010, 1010, 1010, 355: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 372: 1010, 1010, 1010, 376: 1010, 1010, 1010, 1010, 381: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 401: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 442: 1010}, + {122: 1973, 148: 1973, 349: 1973, 381: 1973, 398: 1973, 416: 1973, 420: 1973, 1973, 441: 1973, 443: 1973, 1973}, + {122: 1972, 148: 1972, 349: 1972, 381: 1972, 398: 1972, 416: 1972, 420: 1972, 1972, 441: 1972, 443: 1972, 1972}, + {2: 1665, 1665, 1665, 1665, 1665, 1665, 9: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 19: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 334: 1665, 1665, 339: 1665, 1665, 1665, 344: 1665, 1665, 1665, 349: 1665, 370: 1665, 1665, 375: 1665, 380: 1665, 400: 1665, 424: 1665, 1665, 1665, 1665, 1665, 430: 1665, 1665, 1665, 434: 1665, 1665, 1665, 1665, 440: 1665, 1665, 443: 1665, 1665, 446: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 455: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, + {381: 3558, 398: 3557, 416: 3556, 420: 3539, 3540, 929: 3559}, + // 1410 + {332: 1661}, + {2: 1659, 1659, 1659, 1659, 1659, 1659, 9: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 19: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 334: 1659, 1659, 339: 1659, 1659, 1659, 344: 1659, 1659, 1659, 349: 1659, 370: 1659, 1659, 375: 1659, 380: 1659, 400: 1659, 424: 1659, 1659, 1659, 1659, 1659, 430: 1659, 1659, 1659, 434: 1659, 1659, 1659, 1659, 440: 1659, 1659, 443: 1659, 1659, 446: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 455: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, + {2: 1657, 1657, 1657, 1657, 1657, 1657, 9: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 19: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 334: 1657, 1657, 339: 1657, 1657, 1657, 344: 1657, 1657, 1657, 349: 1657, 370: 1657, 1657, 375: 1657, 380: 1657, 400: 1657, 424: 1657, 1657, 1657, 1657, 1657, 430: 1657, 1657, 1657, 434: 1657, 1657, 1657, 1657, 440: 1657, 1657, 443: 1657, 1657, 446: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 455: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, + {332: 3552, 569: 3553}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3549}, + // 1415 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3545, 2661, 2734, 2660, 2657}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3544, 2661, 2734, 2660, 2657}, + {332: 3541}, + {2: 1645, 1645, 1645, 1645, 1645, 1645, 9: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 19: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 334: 1645, 1645, 339: 1645, 1645, 1645, 344: 1645, 1645, 1645, 349: 1645, 370: 1645, 1645, 375: 1645, 380: 1645, 400: 1645, 424: 1645, 1645, 1645, 1645, 1645, 430: 1645, 1645, 1645, 434: 1645, 1645, 1645, 1645, 440: 1645, 1645, 443: 1645, 1645, 446: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 455: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, + {2: 1644, 1644, 1644, 1644, 1644, 1644, 9: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 19: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 334: 1644, 1644, 339: 1644, 1644, 1644, 344: 1644, 1644, 1644, 349: 1644, 370: 1644, 1644, 375: 1644, 380: 1644, 400: 1644, 424: 1644, 1644, 1644, 1644, 1644, 430: 1644, 1644, 1644, 434: 1644, 1644, 1644, 1644, 440: 1644, 1644, 443: 1644, 1644, 446: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 455: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, + // 1420 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3542, 2661, 2734, 2660, 2657}, + {18: 3543, 343: 2749, 442: 2750}, + {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 333: 1647, 335: 1647, 337: 1647, 1647, 340: 1647, 1647, 1647, 347: 1647, 1647, 350: 1647, 1647, 1647, 1647, 355: 1647, 1647, 1647, 1647, 360: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 372: 1647, 1647, 1647, 376: 1647, 1647, 1647, 1647, 382: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 399: 1647, 401: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, + {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 333: 1648, 335: 1648, 337: 1648, 1648, 340: 1648, 1648, 1648, 2749, 347: 1648, 1648, 350: 1648, 1648, 1648, 1648, 355: 1648, 1648, 1648, 1648, 360: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 372: 1648, 1648, 1648, 376: 1648, 1648, 1648, 1648, 382: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 399: 1648, 401: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 442: 2750}, + {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 3547, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 333: 1643, 335: 1643, 337: 1643, 1643, 340: 1643, 1643, 1643, 2749, 347: 1643, 1643, 350: 1643, 1643, 1643, 1643, 355: 1643, 1643, 1643, 1643, 360: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 372: 1643, 1643, 1643, 376: 1643, 1643, 1643, 1643, 382: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 399: 1643, 401: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 442: 2750, 1055: 3546}, + // 1425 + {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 333: 1649, 335: 1649, 337: 1649, 1649, 340: 1649, 1649, 1649, 347: 1649, 1649, 350: 1649, 1649, 1649, 1649, 355: 1649, 1649, 1649, 1649, 360: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 372: 1649, 1649, 1649, 376: 1649, 1649, 1649, 1649, 382: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 399: 1649, 401: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, + {335: 3548}, + {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 333: 1642, 335: 1642, 337: 1642, 1642, 340: 1642, 1642, 1642, 347: 1642, 1642, 350: 1642, 1642, 1642, 1642, 355: 1642, 1642, 1642, 1642, 360: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 372: 1642, 1642, 1642, 376: 1642, 1642, 1642, 1642, 382: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 399: 1642, 401: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, + {344: 3099, 3100, 3105, 358: 3550, 3101, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 3551}, + // 1430 + {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 333: 1650, 335: 1650, 337: 1650, 1650, 340: 1650, 1650, 1650, 347: 1650, 1650, 350: 1650, 1650, 1650, 1650, 355: 1650, 1650, 1650, 1650, 360: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 372: 1650, 1650, 1650, 376: 1650, 1650, 1650, 1650, 382: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 399: 1650, 401: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 2160, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 3294, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 2158, 504: 2154, 506: 2652, 2311, 2310, 569: 3293, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 617: 3296, 2155, 2156, 2157, 3554, 2166, 625: 2164, 2163, 2162, 634: 3298, 3297, 3295}, + {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 333: 1651, 335: 1651, 337: 1651, 1651, 340: 1651, 1651, 1651, 347: 1651, 1651, 350: 1651, 1651, 1651, 1651, 355: 1651, 1651, 1651, 1651, 360: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 372: 1651, 1651, 1651, 376: 1651, 1651, 1651, 1651, 382: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 399: 1651, 401: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, + {8: 2999, 18: 3555}, + {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 333: 1652, 335: 1652, 337: 1652, 1652, 340: 1652, 1652, 1652, 347: 1652, 1652, 350: 1652, 1652, 1652, 1652, 355: 1652, 1652, 1652, 1652, 360: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 372: 1652, 1652, 1652, 376: 1652, 1652, 1652, 1652, 382: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 399: 1652, 401: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, + // 1435 + {2: 1664, 1664, 1664, 1664, 1664, 1664, 9: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 19: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 334: 1664, 1664, 339: 1664, 1664, 1664, 344: 1664, 1664, 1664, 349: 1664, 370: 1664, 1664, 375: 1664, 380: 1664, 400: 1664, 424: 1664, 1664, 1664, 1664, 1664, 430: 1664, 1664, 1664, 434: 1664, 1664, 1664, 1664, 440: 1664, 1664, 443: 1664, 1664, 446: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 455: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, + {332: 1660}, + {2: 1658, 1658, 1658, 1658, 1658, 1658, 9: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 19: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 334: 1658, 1658, 339: 1658, 1658, 1658, 344: 1658, 1658, 1658, 349: 1658, 370: 1658, 1658, 375: 1658, 380: 1658, 400: 1658, 424: 1658, 1658, 1658, 1658, 1658, 430: 1658, 1658, 1658, 434: 1658, 1658, 1658, 1658, 440: 1658, 1658, 443: 1658, 1658, 446: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 455: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, + {2: 1656, 1656, 1656, 1656, 1656, 1656, 9: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 19: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 334: 1656, 1656, 339: 1656, 1656, 1656, 344: 1656, 1656, 1656, 349: 1656, 370: 1656, 1656, 375: 1656, 380: 1656, 400: 1656, 424: 1656, 1656, 1656, 1656, 1656, 430: 1656, 1656, 1656, 434: 1656, 1656, 1656, 1656, 440: 1656, 1656, 443: 1656, 1656, 446: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 455: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, + {148: 3583, 349: 3584, 441: 3582, 443: 3581}, + // 1440 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 3575, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 3576, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 3574, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 3572, 594: 3577, 996: 3573}, + {2: 1673, 1673, 1673, 1673, 1673, 1673, 9: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 19: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 334: 1673, 1673, 339: 1673, 1673, 1673, 344: 1673, 1673, 1673, 349: 1673, 370: 1673, 1673, 375: 1673, 380: 1673, 400: 1673, 424: 1673, 1673, 1673, 1673, 1673, 430: 1673, 1673, 1673, 434: 1673, 1673, 1673, 1673, 440: 1673, 1673, 443: 1673, 1673, 446: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 455: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 594: 1673}, + {2: 1672, 1672, 1672, 1672, 1672, 1672, 9: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 19: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 334: 1672, 1672, 339: 1672, 1672, 1672, 344: 1672, 1672, 1672, 349: 1672, 370: 1672, 1672, 375: 1672, 380: 1672, 400: 1672, 424: 1672, 1672, 1672, 1672, 1672, 430: 1672, 1672, 1672, 434: 1672, 1672, 1672, 1672, 440: 1672, 1672, 443: 1672, 1672, 446: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 455: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 594: 1672}, + {2: 1671, 1671, 1671, 1671, 1671, 1671, 9: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 19: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 334: 1671, 1671, 339: 1671, 1671, 1671, 344: 1671, 1671, 1671, 349: 1671, 370: 1671, 1671, 375: 1671, 380: 1671, 400: 1671, 424: 1671, 1671, 1671, 1671, 1671, 430: 1671, 1671, 1671, 434: 1671, 1671, 1671, 1671, 440: 1671, 1671, 443: 1671, 1671, 446: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 455: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 594: 1671}, + {2: 1670, 1670, 1670, 1670, 1670, 1670, 9: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 19: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 334: 1670, 1670, 339: 1670, 1670, 1670, 344: 1670, 1670, 1670, 349: 1670, 370: 1670, 1670, 375: 1670, 380: 1670, 400: 1670, 424: 1670, 1670, 1670, 1670, 1670, 430: 1670, 1670, 1670, 434: 1670, 1670, 1670, 1670, 440: 1670, 1670, 443: 1670, 1670, 446: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 455: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 594: 1670}, + // 1445 + {2: 1669, 1669, 1669, 1669, 1669, 1669, 9: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 19: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 334: 1669, 1669, 339: 1669, 1669, 1669, 344: 1669, 1669, 1669, 349: 1669, 370: 1669, 1669, 375: 1669, 380: 1669, 400: 1669, 424: 1669, 1669, 1669, 1669, 1669, 430: 1669, 1669, 1669, 434: 1669, 1669, 1669, 1669, 440: 1669, 1669, 443: 1669, 1669, 446: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 455: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 594: 1669}, + {2: 1668, 1668, 1668, 1668, 1668, 1668, 9: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 19: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 334: 1668, 1668, 339: 1668, 1668, 1668, 344: 1668, 1668, 1668, 349: 1668, 370: 1668, 1668, 375: 1668, 380: 1668, 400: 1668, 424: 1668, 1668, 1668, 1668, 1668, 430: 1668, 1668, 1668, 434: 1668, 1668, 1668, 1668, 440: 1668, 1668, 443: 1668, 1668, 446: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 455: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 594: 1668}, + {2: 1667, 1667, 1667, 1667, 1667, 1667, 9: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 19: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 334: 1667, 1667, 339: 1667, 1667, 1667, 344: 1667, 1667, 1667, 349: 1667, 370: 1667, 1667, 375: 1667, 380: 1667, 400: 1667, 424: 1667, 1667, 1667, 1667, 1667, 430: 1667, 1667, 1667, 434: 1667, 1667, 1667, 1667, 440: 1667, 1667, 443: 1667, 1667, 446: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 455: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 594: 1667}, + {2: 1666, 1666, 1666, 1666, 1666, 1666, 9: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 19: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 334: 1666, 1666, 339: 1666, 1666, 1666, 344: 1666, 1666, 1666, 349: 1666, 370: 1666, 1666, 375: 1666, 380: 1666, 400: 1666, 424: 1666, 1666, 1666, 1666, 1666, 430: 1666, 1666, 1666, 434: 1666, 1666, 1666, 1666, 440: 1666, 1666, 443: 1666, 1666, 446: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 455: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 594: 1666}, + {148: 1663, 334: 3528, 336: 3527, 349: 1663, 441: 1663, 443: 1663, 666: 3571}, + // 1450 + {148: 1662, 349: 1662, 441: 1662, 443: 1662}, + {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 333: 1677, 335: 1677, 337: 1677, 1677, 340: 1677, 1677, 1677, 347: 1677, 1677, 350: 1677, 1677, 1677, 1677, 355: 1677, 1677, 1677, 1677, 360: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 372: 1677, 1677, 1677, 376: 1677, 1677, 1677, 1677, 382: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 399: 1677, 401: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, + {332: 2161, 569: 3580}, + {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 333: 660, 660, 660, 660, 660, 660, 340: 660, 660, 660, 660, 660, 660, 660, 660, 660, 350: 660, 660, 660, 660, 355: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 372: 660, 660, 660, 376: 660, 660, 660, 660, 381: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 401: 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 442: 660, 516: 3578}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1655, 1488, 1488, 1488, 1488, 1488, 1488, 340: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 350: 1488, 1488, 1488, 1488, 355: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 372: 1488, 1488, 1488, 376: 1488, 1488, 1488, 1488, 381: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 401: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 442: 1488, 512: 1488, 1488, 1488}, + // 1455 + {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1654, 1487, 1487, 1487, 1487, 1487, 1487, 340: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 350: 1487, 1487, 1487, 1487, 355: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 372: 1487, 1487, 1487, 376: 1487, 1487, 1487, 1487, 381: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 401: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 442: 1487, 512: 1487, 1487, 1487}, + {332: 1653}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 3579}, + {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 333: 1675, 335: 1675, 337: 1675, 1675, 340: 1675, 1675, 1675, 347: 1675, 1675, 350: 1675, 1675, 1675, 1675, 355: 1675, 1675, 1675, 1675, 360: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 372: 1675, 1675, 1675, 376: 1675, 1675, 1675, 1675, 382: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 399: 1675, 401: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 333: 1676, 335: 1676, 337: 1676, 1676, 340: 1676, 1676, 1676, 347: 1676, 1676, 350: 1676, 1676, 1676, 1676, 355: 1676, 1676, 1676, 1676, 360: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 372: 1676, 1676, 1676, 376: 1676, 1676, 1676, 1676, 382: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 399: 1676, 401: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, + // 1460 + {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 333: 1702, 335: 1702, 337: 1702, 1702, 340: 1702, 1702, 1702, 347: 1702, 1702, 350: 1702, 1702, 1702, 1702, 355: 1702, 1702, 1702, 1702, 360: 1702, 1702, 1702, 1702, 1702, 1702, 367: 1702, 1702, 1702, 372: 1702, 1702, 1702, 376: 1702, 1702, 1702, 1702, 382: 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 399: 1702, 401: 1702, 1702}, + {1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 333: 1701, 335: 1701, 337: 1701, 1701, 340: 1701, 1701, 1701, 347: 1701, 1701, 350: 1701, 1701, 1701, 1701, 355: 1701, 1701, 1701, 1701, 360: 1701, 1701, 1701, 1701, 1701, 1701, 367: 1701, 1701, 1701, 372: 1701, 1701, 1701, 376: 1701, 1701, 1701, 1701, 382: 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 399: 1701, 401: 1701, 1701}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 333: 1700, 335: 1700, 337: 1700, 1700, 340: 1700, 1700, 1700, 347: 1700, 1700, 350: 1700, 1700, 1700, 1700, 355: 1700, 1700, 1700, 1700, 360: 1700, 1700, 1700, 1700, 1700, 1700, 367: 1700, 1700, 1700, 372: 1700, 1700, 1700, 376: 1700, 1700, 1700, 1700, 382: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 399: 1700, 401: 1700, 1700}, + {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 333: 1678, 335: 1678, 337: 1678, 1678, 340: 1678, 1678, 1678, 347: 1678, 1678, 350: 1678, 1678, 1678, 1678, 355: 1678, 1678, 1678, 1678, 360: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 372: 1678, 1678, 1678, 376: 1678, 1678, 1678, 1678, 382: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 399: 1678, 401: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 3588}, + // 1465 + {1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 354: 1996, 366: 1996, 1996, 370: 1996, 385: 1996, 1996, 400: 1996, 505: 1996, 512: 3609, 516: 1996, 527: 1996, 1996, 1996, 536: 1996, 1996, 1996, 540: 1996, 1996, 1996, 1996, 1996, 547: 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996, 1996}, + {8: 1993, 18: 1993}, + {8: 3589, 18: 3590}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3608}, + {235: 3591}, + // 1470 + {332: 3592}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 3593}, + {18: 1696, 337: 3596, 344: 3099, 3100, 3105, 359: 3101, 398: 3595, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098, 1038: 3594}, + {18: 3607}, + {183: 3600, 376: 3599}, + // 1475 + {155: 3597}, + {198: 3598}, + {18: 1692}, + {259: 3602}, + {171: 3601}, + // 1480 + {18: 1693}, + {171: 3603}, + {18: 1695, 337: 3604}, + {155: 3605}, + {198: 3606}, + // 1485 + {18: 1694}, + {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 333: 1703, 335: 1703, 337: 1703, 1703, 340: 1703, 1703, 1703, 347: 1703, 1703, 350: 1703, 1703, 1703, 1703, 355: 1703, 1703, 1703, 1703, 360: 1703, 1703, 1703, 1703, 1703, 1703, 367: 1703, 1703, 1703, 372: 1703, 1703, 1703, 376: 1703, 1703, 1703, 1703, 382: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 399: 1703, 401: 1703, 1703}, + {8: 1992, 18: 1992}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3610, 2311, 2310}, + {1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 354: 1995, 366: 1995, 1995, 370: 1995, 385: 1995, 1995, 400: 1995, 505: 1995, 512: 3611, 516: 1995, 527: 1995, 1995, 1995, 536: 1995, 1995, 1995, 540: 1995, 1995, 1995, 1995, 1995, 547: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995}, + // 1490 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3612, 2311, 2310}, + {1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 354: 1994, 366: 1994, 1994, 370: 1994, 385: 1994, 1994, 400: 1994, 505: 1994, 516: 1994, 527: 1994, 1994, 1994, 536: 1994, 1994, 1994, 540: 1994, 1994, 1994, 1994, 1994, 547: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994}, + {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 333: 1704, 335: 1704, 337: 1704, 1704, 340: 1704, 1704, 1704, 347: 1704, 1704, 350: 1704, 1704, 1704, 1704, 355: 1704, 1704, 1704, 1704, 360: 1704, 1704, 1704, 1704, 1704, 1704, 367: 1704, 1704, 1704, 372: 1704, 1704, 1704, 376: 1704, 1704, 1704, 1704, 382: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 399: 1704, 401: 1704, 1704, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3615}, + {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 333: 1708, 335: 1708, 337: 1708, 1708, 340: 1708, 1708, 1708, 347: 1708, 1708, 350: 1708, 1708, 1708, 1708, 355: 1708, 1708, 1708, 2745, 360: 1708, 1708, 2743, 2744, 2742, 2740, 367: 1708, 1708, 1708, 372: 1708, 1708, 1708, 376: 1708, 1708, 1708, 1708, 382: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 399: 1708, 401: 1708, 1708, 592: 2741, 2739}, + // 1495 + {1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 18: 1899, 333: 1899, 1899, 336: 1899, 338: 1899, 1899, 343: 1899, 349: 1899, 354: 1899, 423: 1899, 429: 1899, 433: 1899, 438: 1899, 1899, 445: 1899, 454: 1899}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 3618, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 3619}, + {1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 18: 1901, 333: 1901, 1901, 336: 1901, 338: 1901, 1901, 343: 1901, 349: 1901, 354: 1901, 423: 1901, 429: 1901, 433: 1901, 438: 1901, 1901, 445: 1901, 454: 1901}, + {8: 2999, 18: 3620}, + {1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 18: 1900, 333: 1900, 1900, 336: 1900, 338: 1900, 1900, 343: 1900, 349: 1900, 354: 1900, 423: 1900, 429: 1900, 433: 1900, 438: 1900, 1900, 445: 1900, 454: 1900}, + // 1500 + {18: 3622}, + {1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 18: 1902, 333: 1902, 1902, 336: 1902, 338: 1902, 1902, 343: 1902, 349: 1902, 354: 1902, 423: 1902, 429: 1902, 433: 1902, 438: 1902, 1902, 445: 1902, 454: 1902}, + {553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 19: 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 354: 553, 375: 553, 400: 553, 502: 553, 594: 553, 752: 553}, + {552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 19: 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 552, 354: 552, 375: 552, 400: 552, 502: 552, 594: 552, 752: 552}, + {59: 3627, 502: 3626, 717: 3628}, + // 1505 + {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 9: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 19: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 337: 1733, 350: 1733, 359: 1733, 428: 1733}, + {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 9: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 19: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 337: 1732, 350: 1732, 359: 1732, 428: 1732}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 3629}, + {12, 12, 8: 3359}, + {59: 3627, 502: 3626, 717: 3631}, + // 1510 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 3632}, + {16, 16, 8: 3359, 117: 16, 125: 16, 128: 16, 1097: 3633}, + {17, 17, 117: 3635, 125: 3634, 128: 3636}, + {15, 15, 117: 15, 125: 15, 128: 15}, + {14, 14, 117: 14, 125: 14, 128: 14}, + // 1515 + {13, 13, 117: 13, 125: 13, 128: 13}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3641, 963: 3642, 1128: 3640}, + {26, 26, 26, 26, 26, 26, 26, 26, 9: 26, 26, 26, 26, 26, 26, 26, 26, 26, 19: 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 359: 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 9: 25, 25, 25, 25, 25, 25, 25, 25, 25, 19: 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 359: 25}, + {27, 27, 8: 3648}, + // 1520 + {518: 3644, 545: 3645, 1062: 3643}, + {19, 19, 8: 19}, + {24, 24, 8: 24}, + {23, 23, 8: 23, 76: 3647}, + {21, 21, 8: 21, 76: 3646}, + // 1525 + {20, 20, 8: 20}, + {22, 22, 8: 22}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3641, 963: 3649}, + {18, 18, 8: 18}, + {28, 28}, + // 1530 + {76: 62, 606: 3653, 729: 62, 1064: 3652}, + {76: 3655, 729: 56, 1061: 3654}, + {76: 61, 729: 61}, + {729: 3656}, + {729: 55}, + // 1535 + {335: 3657}, + {351: 1793, 380: 3659, 503: 3658, 868: 3660}, + {1792, 1792, 332: 1792, 337: 1792, 1792, 351: 1792, 371: 1792, 502: 1792, 504: 1792}, + {1791, 1791, 332: 1791, 337: 1791, 1791, 351: 1791, 371: 1791, 502: 1791, 504: 1791}, + {351: 3661}, + // 1540 + {502: 3662}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3663}, + {58, 58, 73: 58, 58, 332: 58, 367: 58, 503: 58, 505: 3665, 520: 58, 1007: 3664}, + {54, 54, 73: 3381, 3380, 332: 54, 367: 54, 503: 54, 520: 54, 702: 3379, 879: 3668}, + {367: 3666}, + // 1545 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 3667}, + {57, 57, 73: 57, 57, 332: 57, 367: 57, 503: 57, 520: 57}, + {39, 39, 332: 39, 367: 39, 503: 39, 520: 3409, 899: 3669}, + {60, 60, 332: 60, 367: 60, 503: 3671, 1043: 3670}, + {1979, 1979, 332: 3674, 367: 1979, 1012: 3675}, + // 1550 + {375: 2256, 595: 3672}, + {520: 3673}, + {59, 59, 332: 59, 367: 59}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 1985, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 424: 2748, 506: 3586, 2311, 2310, 571: 3688, 602: 3687, 836: 3686, 1010: 3685, 3689}, + {33, 33, 367: 3677, 1060: 3676}, + // 1555 + {63, 63}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3192, 2311, 2310, 572: 3680, 900: 3679, 1059: 3678}, + {32, 32, 8: 3683}, + {30, 30, 8: 30}, + {366: 3681}, + // 1560 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 3682}, + {29, 29, 8: 29}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3192, 2311, 2310, 572: 3680, 900: 3684}, + {31, 31, 8: 31}, + {8: 3691, 18: 1984}, + // 1565 + {8: 1983, 18: 1983}, + {8: 1981, 18: 1981}, + {8: 1980, 18: 1980}, + {18: 3690}, + {1978, 1978, 367: 1978}, + // 1570 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 424: 2748, 506: 3586, 2311, 2310, 571: 3688, 602: 3687, 836: 3692}, + {8: 1982, 18: 1982}, + {8: 120, 109: 120, 333: 120, 356: 120, 424: 1596, 510: 120, 524: 1596}, + {8: 85, 332: 85, 85, 356: 85, 424: 1576, 510: 85, 524: 1576}, + {8: 99, 332: 99, 99, 356: 99, 424: 1550, 510: 99, 524: 1550}, + // 1575 + {8: 86, 332: 86, 86, 356: 86, 424: 1546, 510: 86, 524: 1546}, + {8: 75, 332: 75, 75, 356: 75, 424: 1512, 510: 75, 524: 1512}, + {8: 95, 332: 95, 95, 356: 95, 424: 1439, 510: 95, 524: 1439}, + {8: 100, 332: 100, 100, 356: 100, 424: 1433, 510: 100, 524: 1433}, + {225: 3801, 240: 3802, 424: 1416, 524: 1416}, + // 1580 + {8: 87, 332: 87, 87, 356: 87, 424: 1413, 510: 87, 524: 1413}, + {8: 76, 332: 76, 76, 356: 76, 424: 1410, 510: 76, 524: 1410}, + {424: 3799, 524: 3798}, + {8: 646, 333: 646, 356: 646, 424: 222, 510: 646, 524: 222}, + {8: 645, 333: 645, 356: 645, 510: 645}, + // 1585 + {8: 116, 109: 3797, 333: 116, 356: 116, 510: 116}, + {8: 118, 333: 118, 356: 118, 510: 118}, + {8: 117, 333: 117, 356: 117, 510: 117}, + {356: 3795}, + {8: 96, 332: 96, 96, 351: 3793, 356: 96, 510: 96}, + // 1590 + {8: 113, 333: 113, 356: 113, 510: 113}, + {8: 3745, 333: 3746, 356: 3747}, + {8: 111, 332: 3742, 111, 356: 111, 510: 111}, + {8: 109, 154: 3741, 332: 109, 109, 356: 109, 510: 109}, + {8: 107, 219: 3740, 332: 107, 107, 356: 107, 510: 107}, + // 1595 + {8: 106, 23: 3734, 57: 3736, 106: 3733, 147: 3737, 177: 3735, 219: 3738, 332: 106, 106, 356: 106, 510: 106}, + {8: 103, 332: 103, 103, 356: 103, 510: 103}, + {8: 102, 332: 102, 102, 356: 102, 510: 102}, + {8: 101, 147: 3732, 332: 101, 101, 356: 101, 510: 101}, + {8: 98, 332: 98, 98, 356: 98, 510: 98}, + // 1600 + {8: 97, 332: 97, 97, 356: 97, 510: 97}, + {57: 3731, 854: 3730}, + {8: 93, 332: 93, 93, 356: 93, 510: 93}, + {753: 3729}, + {8: 91, 332: 91, 91, 356: 91, 510: 91}, + // 1605 + {8: 88, 332: 88, 88, 356: 88, 510: 88}, + {59: 3728}, + {8: 83, 332: 83, 83, 356: 83, 510: 83}, + {8: 92, 332: 92, 92, 356: 92, 510: 92}, + {8: 94, 332: 94, 94, 356: 94, 510: 94}, + // 1610 + {8: 81, 332: 81, 81, 356: 81, 510: 81}, + {8: 79, 332: 79, 79, 356: 79, 510: 79}, + {8: 105, 332: 105, 105, 356: 105, 510: 105}, + {8: 104, 332: 104, 104, 356: 104, 510: 104}, + {59: 3739}, + // 1615 + {8: 82, 332: 82, 82, 356: 82, 510: 82}, + {8: 80, 332: 80, 80, 356: 80, 510: 80}, + {8: 78, 332: 78, 78, 356: 78, 510: 78}, + {8: 84, 332: 84, 84, 356: 84, 510: 84}, + {8: 77, 332: 77, 77, 356: 77, 510: 77}, + // 1620 + {8: 108, 332: 108, 108, 356: 108, 510: 108}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 3743}, + {8: 3589, 18: 3744}, + {8: 110, 333: 110, 356: 110, 510: 110}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 3693, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 3695, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 3697, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 3701, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 3694, 2354, 3702, 2356, 3696, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 3699, 2381, 3700, 2418, 2524, 2449, 2452, 2799, 3698, 2800, 2801, 2778, 335: 3704, 353: 3727, 430: 3721, 445: 3725, 504: 3710, 506: 2901, 2311, 2310, 3720, 517: 3723, 525: 3715, 527: 3719, 594: 3714, 596: 3703, 609: 3718, 648: 3705, 698: 3716, 705: 3724, 731: 3709, 737: 3722, 779: 3706, 794: 3707, 3713, 799: 3708, 3792, 809: 3717, 812: 3726}, + // 1625 + {2: 74, 74, 74, 74, 74, 74, 9: 74, 74, 74, 74, 74, 74, 74, 74, 74, 19: 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 3759, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 359: 74, 502: 3758, 904: 3761, 927: 3760}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 3751}, + {659, 659, 659, 8: 659, 14: 659, 24: 659, 659, 659, 659, 659, 57: 659, 94: 659, 659, 337: 659, 361: 659, 366: 659, 424: 3756, 510: 659, 516: 659, 519: 659, 524: 3755, 526: 659}, + {1098, 1098, 1098, 8: 1098, 14: 1098, 24: 1098, 1098, 1098, 1098, 1098, 57: 1098, 94: 1098, 1098, 332: 3182, 337: 1098, 361: 1098, 366: 1098, 510: 1098, 516: 1098, 519: 1098, 526: 1098, 913: 3754}, + {655, 655, 8: 655, 337: 655}, + // 1630 + {64, 64, 8: 3752}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3753}, + {654, 654, 8: 654, 337: 654}, + {656, 656, 656, 8: 656, 14: 656, 24: 656, 656, 656, 656, 656, 57: 656, 94: 656, 656, 337: 656, 361: 656, 366: 656, 510: 656, 516: 656, 519: 656, 526: 656}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 3757}, + // 1635 + {657, 657, 657, 8: 657, 14: 657, 24: 657, 657, 657, 657, 657, 57: 657, 94: 657, 657, 337: 657, 361: 657, 366: 657, 510: 657, 516: 657, 519: 657, 526: 657}, + {658, 658, 658, 8: 658, 14: 658, 24: 658, 658, 658, 658, 658, 57: 658, 94: 658, 658, 337: 658, 361: 658, 366: 658, 510: 658, 516: 658, 519: 658, 526: 658}, + {2: 73, 73, 73, 73, 73, 73, 9: 73, 73, 73, 73, 73, 73, 73, 73, 73, 19: 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 359: 73}, + {2: 72, 72, 72, 72, 72, 72, 9: 72, 72, 72, 72, 72, 72, 72, 72, 72, 19: 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 359: 72}, + {2: 71, 71, 71, 71, 71, 71, 9: 71, 71, 71, 71, 71, 71, 71, 71, 71, 19: 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 359: 71}, + // 1640 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3762, 506: 3763, 2311, 2310, 926: 3764}, + {356: 70, 510: 70, 512: 3790}, + {356: 66, 510: 66, 512: 3787}, + {356: 3765}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3766, 767: 3767, 813: 3768}, + // 1645 + {141, 141, 141, 8: 141, 14: 141, 24: 141, 141, 141, 141, 141, 95: 3772, 337: 141, 519: 141, 828: 3771}, + {195, 195, 195, 8: 195, 14: 195, 24: 195, 195, 195, 195, 195, 337: 195, 519: 195}, + {65, 65, 8: 3769}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3766, 767: 3770}, + {194, 194, 194, 8: 194, 14: 194, 24: 194, 194, 194, 194, 194, 337: 194, 519: 194}, + // 1650 + {196, 196, 196, 8: 196, 14: 196, 24: 196, 196, 196, 196, 196, 337: 196, 519: 196}, + {337: 3774, 522: 3773}, + {14: 3785, 335: 3782, 695: 3784}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 3776, 829: 3775}, + {139, 139, 139, 8: 139, 14: 139, 24: 139, 139, 139, 139, 139, 337: 139, 3778, 519: 139, 522: 3777}, + // 1655 + {135, 135, 135, 8: 135, 14: 135, 24: 135, 135, 135, 135, 135, 337: 135, 135, 519: 135, 522: 135}, + {335: 3782, 695: 3783}, + {335: 3780, 426: 3781, 886: 3779}, + {137, 137, 137, 8: 137, 14: 137, 24: 137, 137, 137, 137, 137, 337: 137, 519: 137}, + {134, 134, 134, 8: 134, 14: 134, 24: 134, 134, 134, 134, 134, 337: 134, 519: 134}, + // 1660 + {133, 133, 133, 8: 133, 14: 133, 24: 133, 133, 133, 133, 133, 337: 133, 519: 133}, + {651, 651, 651, 8: 651, 14: 651, 18: 651, 24: 651, 651, 651, 651, 651, 114: 651, 337: 651, 519: 651}, + {138, 138, 138, 8: 138, 14: 138, 24: 138, 138, 138, 138, 138, 337: 138, 519: 138}, + {140, 140, 140, 8: 140, 14: 140, 24: 140, 140, 140, 140, 140, 337: 140, 519: 140}, + {335: 3780, 426: 3781, 886: 3786}, + // 1665 + {136, 136, 136, 8: 136, 14: 136, 24: 136, 136, 136, 136, 136, 337: 136, 519: 136}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3788, 506: 3789, 2311, 2310}, + {356: 68, 510: 68}, + {356: 67, 510: 67}, + {359: 3791}, + // 1670 + {356: 69, 510: 69}, + {8: 112, 333: 112, 356: 112, 510: 112}, + {220: 3794}, + {8: 114, 333: 114, 356: 114, 510: 114}, + {220: 3796}, + // 1675 + {8: 115, 333: 115, 356: 115, 510: 115}, + {8: 119, 109: 119, 333: 119, 356: 119, 510: 119}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 3800}, + {647, 647, 8: 647, 333: 647, 356: 647, 510: 647}, + {648, 648, 8: 648, 333: 648, 356: 648, 510: 648}, + // 1680 + {8: 90, 332: 90, 90, 356: 90, 510: 90}, + {8: 89, 332: 89, 89, 356: 89, 510: 89}, + {333: 3845, 424: 1524, 524: 1524}, + {8: 3745, 333: 3805, 510: 3806}, + {2: 74, 74, 74, 74, 74, 74, 9: 74, 74, 74, 74, 74, 74, 74, 74, 74, 19: 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 3759, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 359: 74, 502: 3758, 904: 3808, 927: 3760}, + // 1685 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 3807}, + {127, 127, 8: 3752}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3762, 506: 3763, 2311, 2310, 926: 3809}, + {510: 3810}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3766, 767: 3767, 813: 3811}, + // 1690 + {178, 178, 8: 3769, 337: 178, 519: 3813, 796: 3812, 3814}, + {177, 177, 177, 14: 177, 24: 177, 177, 177, 177, 177, 337: 177}, + {79: 3834, 81: 3832, 87: 3835, 89: 3833, 3836, 270: 3827, 301: 3829, 798: 3831, 1099: 3830, 1114: 3828}, + {126, 126, 337: 3816, 986: 3815}, + {129, 129}, + // 1695 + {82: 3820, 3818, 3819, 3821, 705: 3817}, + {753: 3826}, + {375: 2256, 595: 3825}, + {375: 2256, 595: 3824}, + {375: 2256, 595: 3823}, + // 1700 + {375: 2256, 595: 3822}, + {121, 121}, + {122, 122}, + {123, 123}, + {124, 124}, + // 1705 + {125, 125}, + {176, 176, 176, 14: 176, 24: 176, 176, 176, 176, 176, 337: 176}, + {175, 175, 175, 14: 175, 24: 175, 175, 175, 175, 175, 337: 175}, + {174, 174, 174, 14: 174, 24: 174, 174, 174, 174, 174, 337: 174}, + {173, 173, 173, 14: 173, 24: 173, 173, 173, 173, 173, 79: 3834, 81: 3832, 87: 3835, 89: 3833, 3836, 337: 173, 358: 3842, 798: 3843}, + // 1710 + {172, 172, 172, 14: 172, 24: 172, 172, 172, 172, 172, 79: 172, 81: 172, 87: 172, 89: 172, 172, 337: 172, 358: 172}, + {335: 3841}, + {335: 3840}, + {335: 3839}, + {335: 3838}, + // 1715 + {335: 3837}, + {165, 165, 165, 14: 165, 24: 165, 165, 165, 165, 165, 79: 165, 81: 165, 87: 165, 89: 165, 165, 337: 165, 358: 165}, + {166, 166, 166, 14: 166, 24: 166, 166, 166, 166, 166, 79: 166, 81: 166, 87: 166, 89: 166, 166, 337: 166, 358: 166}, + {167, 167, 167, 14: 167, 24: 167, 167, 167, 167, 167, 79: 167, 81: 167, 87: 167, 89: 167, 167, 337: 167, 358: 167}, + {168, 168, 168, 14: 168, 24: 168, 168, 168, 168, 168, 79: 168, 81: 168, 87: 168, 89: 168, 168, 337: 168, 358: 168}, + // 1720 + {169, 169, 169, 14: 169, 24: 169, 169, 169, 169, 169, 79: 169, 81: 169, 87: 169, 89: 169, 169, 337: 169, 358: 169}, + {79: 3834, 81: 3832, 87: 3835, 89: 3833, 3836, 798: 3844}, + {170, 170, 170, 14: 170, 24: 170, 170, 170, 170, 170, 79: 170, 81: 170, 87: 170, 89: 170, 170, 337: 170, 358: 170}, + {171, 171, 171, 14: 171, 24: 171, 171, 171, 171, 171, 79: 171, 81: 171, 87: 171, 89: 171, 171, 337: 171, 358: 171}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3846}, + // 1725 + {510: 3847}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 3848}, + {126, 126, 8: 3752, 337: 3816, 986: 3849}, + {128, 128}, + {1857, 1857, 15: 1857, 1857, 339: 1857, 343: 1857, 360: 1857, 370: 1857, 381: 1857, 505: 1857, 518: 1857}, + // 1730 + {216, 216}, + {2: 760, 760, 760, 760, 760, 760, 9: 760, 760, 760, 760, 760, 760, 760, 760, 760, 19: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 334: 760, 760, 760, 339: 760, 760, 760, 344: 760, 760, 760, 349: 760, 351: 760, 356: 760, 359: 760, 370: 760, 760, 760, 375: 760, 380: 760, 400: 760, 424: 760, 760, 760, 760, 760, 430: 760, 760, 760, 434: 760, 760, 760, 760, 440: 760, 760, 443: 760, 760, 446: 760, 760, 760, 760, 760, 760, 760, 760, 455: 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 503: 760, 521: 760, 594: 760, 603: 760, 760, 606: 760, 760, 760, 610: 760, 614: 760, 760, 760}, + {2: 758, 758, 758, 758, 758, 758, 9: 758, 758, 758, 758, 758, 758, 758, 758, 758, 19: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 351: 758, 356: 758, 359: 758, 435: 758, 503: 758, 521: 758, 606: 758, 758, 758}, + {2: 953, 953, 953, 953, 953, 953, 9: 953, 953, 953, 953, 953, 953, 953, 953, 953, 19: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 359: 953, 435: 953, 503: 953, 521: 953, 606: 3855, 3857, 3856, 710: 3858, 759: 3859}, + {2: 956, 956, 956, 956, 956, 956, 9: 956, 956, 956, 956, 956, 956, 956, 956, 956, 19: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 334: 956, 956, 956, 339: 956, 956, 956, 344: 956, 956, 956, 349: 956, 351: 956, 356: 956, 359: 956, 370: 956, 956, 956, 375: 956, 380: 956, 400: 956, 424: 956, 956, 956, 956, 956, 430: 956, 956, 956, 434: 956, 956, 956, 956, 440: 956, 956, 443: 956, 956, 446: 956, 956, 956, 956, 956, 956, 956, 956, 455: 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 503: 956, 521: 956, 594: 956, 603: 956, 956, 606: 956, 956, 956, 610: 956, 614: 956, 956, 956}, + // 1735 + {2: 955, 955, 955, 955, 955, 955, 9: 955, 955, 955, 955, 955, 955, 955, 955, 955, 19: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 334: 955, 955, 955, 339: 955, 955, 955, 344: 955, 955, 955, 349: 955, 351: 955, 356: 955, 359: 955, 370: 955, 955, 955, 375: 955, 380: 955, 400: 955, 424: 955, 955, 955, 955, 955, 430: 955, 955, 955, 434: 955, 955, 955, 955, 440: 955, 955, 443: 955, 955, 446: 955, 955, 955, 955, 955, 955, 955, 955, 455: 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 955, 503: 955, 521: 955, 594: 955, 603: 955, 955, 606: 955, 955, 955, 610: 955, 614: 955, 955, 955}, + {2: 954, 954, 954, 954, 954, 954, 9: 954, 954, 954, 954, 954, 954, 954, 954, 954, 19: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 334: 954, 954, 954, 339: 954, 954, 954, 344: 954, 954, 954, 349: 954, 351: 954, 356: 954, 359: 954, 370: 954, 954, 954, 375: 954, 380: 954, 400: 954, 424: 954, 954, 954, 954, 954, 430: 954, 954, 954, 434: 954, 954, 954, 954, 440: 954, 954, 443: 954, 954, 446: 954, 954, 954, 954, 954, 954, 954, 954, 455: 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 954, 503: 954, 521: 954, 594: 954, 603: 954, 954, 606: 954, 954, 954, 610: 954, 614: 954, 954, 954}, + {2: 952, 952, 952, 952, 952, 952, 9: 952, 952, 952, 952, 952, 952, 952, 952, 952, 19: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 351: 952, 356: 952, 359: 952, 435: 952, 503: 952, 521: 952}, + {2: 1620, 1620, 1620, 1620, 1620, 1620, 9: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 19: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 359: 1620, 435: 1620, 503: 3860, 521: 1620, 728: 3861}, + {2: 1619, 1619, 1619, 1619, 1619, 1619, 9: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 19: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 351: 1619, 356: 1619, 359: 1619, 435: 1619, 502: 1619, 521: 1619}, + // 1740 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 435: 3865, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3864, 701: 3862, 739: 3863}, + {839, 839, 8: 839, 18: 839, 333: 839, 337: 839, 342: 839, 347: 839, 839, 350: 839, 839, 839, 839, 355: 839, 357: 839, 360: 839, 367: 839, 839, 839, 374: 839}, + {8: 3921, 367: 3991}, + {8: 837, 340: 3884, 3885, 367: 3973, 372: 3883, 3886, 376: 3882, 3887, 3888, 664: 3881, 670: 3880}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3970, 2311, 2310}, + // 1745 + {835, 835, 8: 835, 18: 835, 333: 835, 337: 835, 340: 835, 835, 835, 347: 835, 835, 350: 835, 835, 835, 835, 355: 835, 357: 835, 360: 835, 835, 367: 835, 835, 835, 372: 835, 835, 835, 376: 835, 835, 835, 835}, + {834, 834, 8: 834, 18: 834, 333: 834, 337: 834, 340: 834, 834, 834, 347: 834, 834, 350: 834, 834, 834, 834, 355: 834, 357: 834, 360: 834, 834, 367: 834, 834, 834, 372: 834, 834, 834, 376: 834, 834, 834, 834}, + {829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 333: 829, 337: 829, 829, 340: 829, 829, 829, 347: 829, 829, 350: 829, 829, 829, 829, 3934, 829, 357: 829, 360: 829, 829, 367: 829, 829, 829, 372: 829, 829, 829, 376: 829, 829, 829, 829, 503: 829, 511: 829, 523: 829, 757: 3933}, + {827, 827, 2422, 2532, 2385, 2350, 2534, 2315, 827, 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 827, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 333: 827, 337: 827, 3878, 340: 827, 827, 827, 347: 827, 827, 350: 827, 827, 827, 827, 355: 827, 357: 827, 360: 827, 827, 367: 827, 827, 827, 372: 827, 827, 827, 376: 827, 827, 827, 827, 506: 3877, 2311, 2310, 738: 3876, 764: 3875}, + {332: 2161, 569: 3924}, + // 1750 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 337: 2160, 359: 3356, 371: 2159, 435: 3865, 502: 2158, 504: 2154, 506: 3355, 2311, 2310, 521: 3870, 569: 3874, 598: 3868, 617: 3296, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 3298, 3297, 3295, 646: 3867, 649: 3866, 3873, 701: 3862, 739: 3872}, + {8: 3921, 18: 3922}, + {837, 837, 8: 837, 18: 837, 333: 837, 337: 837, 340: 3884, 3885, 837, 347: 837, 837, 350: 837, 837, 837, 837, 355: 837, 357: 837, 360: 837, 367: 837, 837, 837, 372: 3883, 3886, 837, 376: 3882, 3887, 3888, 664: 3881, 670: 3880}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 827, 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 3418, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 338: 3878, 340: 827, 827, 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 372: 827, 827, 376: 827, 827, 827, 506: 3877, 2311, 2310, 630: 3308, 3309, 738: 3876, 764: 3875}, + {832, 832, 8: 832, 18: 832, 333: 832, 337: 832, 340: 832, 832, 832, 347: 832, 832, 350: 832, 832, 832, 832, 355: 832, 357: 832, 360: 832, 832, 367: 832, 832, 832, 372: 832, 832, 832, 376: 832, 832, 832, 832}, + // 1755 + {826, 826, 8: 826, 18: 826, 333: 826, 337: 826, 340: 826, 826, 826, 347: 826, 826, 350: 826, 826, 826, 826, 355: 826, 357: 826, 360: 826, 826, 367: 826, 826, 826, 372: 826, 826, 826, 376: 826, 826, 826, 826, 503: 826, 511: 826, 523: 826}, + {825, 825, 8: 825, 18: 825, 332: 825, 825, 337: 825, 340: 825, 825, 825, 347: 825, 825, 350: 825, 825, 825, 825, 355: 825, 357: 825, 360: 825, 825, 367: 825, 825, 825, 372: 825, 825, 825, 376: 825, 825, 825, 825, 503: 825, 511: 825, 523: 825}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3879, 2311, 2310}, + {824, 824, 8: 824, 18: 824, 332: 824, 824, 337: 824, 340: 824, 824, 824, 347: 824, 824, 350: 824, 824, 824, 824, 355: 824, 357: 824, 360: 824, 824, 367: 824, 824, 824, 372: 824, 824, 824, 376: 824, 824, 824, 824, 503: 824, 511: 824, 523: 824}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3914}, + // 1760 + {373: 794, 756: 3901, 917: 3905}, + {340: 3884, 3885, 373: 3898, 664: 3899}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3891}, + {373: 796, 756: 796}, + {373: 795, 756: 795}, + // 1765 + {2: 792, 792, 792, 792, 792, 792, 9: 792, 792, 792, 792, 792, 792, 792, 792, 792, 19: 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 359: 792, 521: 792}, + {373: 3890}, + {373: 3889}, + {2: 790, 790, 790, 790, 790, 790, 9: 790, 790, 790, 790, 790, 790, 790, 790, 790, 19: 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 359: 790, 521: 790}, + {2: 791, 791, 791, 791, 791, 791, 9: 791, 791, 791, 791, 791, 791, 791, 791, 791, 19: 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 791, 359: 791, 521: 791}, + // 1770 + {799, 799, 8: 799, 18: 799, 333: 3892, 337: 799, 340: 799, 799, 799, 347: 799, 799, 350: 799, 799, 799, 799, 355: 799, 357: 799, 360: 799, 3893, 367: 799, 799, 799, 372: 799, 799, 799, 376: 799, 799, 799, 799, 664: 3881, 670: 3880}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3897}, + {332: 3894}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 3895}, + {8: 3589, 18: 3896}, + // 1775 + {797, 797, 8: 797, 18: 797, 333: 797, 337: 797, 340: 797, 797, 797, 347: 797, 797, 350: 797, 797, 797, 797, 355: 797, 357: 797, 360: 797, 797, 367: 797, 797, 797, 372: 797, 797, 797, 376: 797, 797, 797, 797}, + {798, 798, 8: 798, 18: 798, 333: 798, 337: 798, 340: 798, 798, 798, 347: 798, 798, 350: 798, 798, 798, 798, 355: 798, 357: 798, 2745, 360: 798, 798, 2743, 2744, 2742, 2740, 367: 798, 798, 798, 372: 798, 798, 798, 376: 798, 798, 798, 798, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3904}, + {373: 794, 756: 3901, 917: 3900}, + {373: 3902}, + // 1780 + {373: 793}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3903}, + {800, 800, 8: 800, 18: 800, 333: 800, 337: 800, 340: 800, 800, 800, 347: 800, 800, 350: 800, 800, 800, 800, 355: 800, 357: 800, 360: 800, 800, 367: 800, 800, 800, 372: 800, 800, 800, 376: 800, 800, 800, 800, 664: 3881, 670: 3880}, + {801, 801, 8: 801, 18: 801, 333: 801, 337: 801, 340: 801, 801, 801, 347: 801, 801, 350: 801, 801, 801, 801, 355: 801, 357: 801, 360: 801, 801, 367: 801, 801, 801, 372: 801, 801, 801, 376: 801, 801, 801, 801, 664: 3881, 670: 3880}, + {373: 3906}, + // 1785 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3907}, + {333: 3908, 340: 3884, 3885, 361: 3909, 372: 3883, 3886, 376: 3882, 3887, 3888, 664: 3881, 670: 3880}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3913}, + {332: 3910}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 3911}, + // 1790 + {8: 3589, 18: 3912}, + {802, 802, 8: 802, 18: 802, 333: 802, 337: 802, 340: 802, 802, 802, 347: 802, 802, 350: 802, 802, 802, 802, 355: 802, 357: 802, 360: 802, 802, 367: 802, 802, 802, 372: 802, 802, 802, 376: 802, 802, 802, 802}, + {803, 803, 8: 803, 18: 803, 333: 803, 337: 803, 340: 803, 803, 803, 347: 803, 803, 350: 803, 803, 803, 803, 355: 803, 357: 803, 2745, 360: 803, 803, 2743, 2744, 2742, 2740, 367: 803, 803, 803, 372: 803, 803, 803, 376: 803, 803, 803, 803, 592: 2741, 2739}, + {806, 806, 8: 806, 18: 806, 333: 3915, 337: 806, 340: 3884, 3885, 806, 347: 806, 806, 350: 806, 806, 806, 806, 355: 806, 357: 806, 360: 806, 3916, 367: 806, 806, 806, 372: 3883, 3886, 806, 376: 3882, 3887, 3888, 806, 664: 3881, 670: 3880}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3920}, + // 1795 + {332: 3917}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 3918}, + {8: 3589, 18: 3919}, + {804, 804, 8: 804, 18: 804, 333: 804, 337: 804, 340: 804, 804, 804, 347: 804, 804, 350: 804, 804, 804, 804, 355: 804, 357: 804, 360: 804, 804, 367: 804, 804, 804, 372: 804, 804, 804, 376: 804, 804, 804, 804}, + {805, 805, 8: 805, 18: 805, 333: 805, 337: 805, 340: 805, 805, 805, 347: 805, 805, 350: 805, 805, 805, 805, 355: 805, 357: 805, 2745, 360: 805, 805, 2743, 2744, 2742, 2740, 367: 805, 805, 805, 372: 805, 805, 805, 376: 805, 805, 805, 805, 592: 2741, 2739}, + // 1800 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 435: 3865, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3873, 701: 3923}, + {830, 830, 8: 830, 18: 830, 333: 830, 337: 830, 340: 830, 830, 830, 347: 830, 830, 350: 830, 830, 830, 830, 355: 830, 357: 830, 360: 830, 830, 367: 830, 830, 830, 372: 830, 830, 830, 376: 830, 830, 830, 830}, + {838, 838, 8: 838, 18: 838, 333: 838, 337: 838, 342: 838, 347: 838, 838, 350: 838, 838, 838, 838, 355: 838, 357: 838, 360: 838, 367: 838, 838, 838, 374: 838}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 338: 3878, 506: 3877, 2311, 2310, 738: 3925}, + {1989, 1989, 8: 1989, 18: 1989, 332: 3926, 1989, 337: 1989, 340: 1989, 1989, 1989, 347: 1989, 1989, 350: 1989, 1989, 1989, 1989, 355: 1989, 357: 1989, 360: 1989, 1989, 367: 1989, 1989, 1989, 372: 1989, 1989, 1989, 376: 1989, 1989, 1989, 1989, 888: 3927}, + // 1805 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3929, 2311, 2310, 746: 3928}, + {831, 831, 8: 831, 18: 831, 333: 831, 337: 831, 340: 831, 831, 831, 347: 831, 831, 350: 831, 831, 831, 831, 355: 831, 357: 831, 360: 831, 831, 367: 831, 831, 831, 372: 831, 831, 831, 376: 831, 831, 831, 831}, + {8: 3931, 18: 3930}, + {1987, 1987, 8: 1987, 18: 1987, 107: 1987, 111: 1987, 337: 1987, 361: 1987}, + {1988, 1988, 8: 1988, 18: 1988, 333: 1988, 337: 1988, 1988, 340: 1988, 1988, 1988, 347: 1988, 1988, 350: 1988, 1988, 1988, 1988, 355: 1988, 357: 1988, 360: 1988, 1988, 367: 1988, 1988, 1988, 372: 1988, 1988, 1988, 376: 1988, 1988, 1988, 1988}, + // 1810 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3932, 2311, 2310}, + {1986, 1986, 8: 1986, 18: 1986, 107: 1986, 111: 1986, 337: 1986, 361: 1986}, + {827, 827, 2422, 2532, 2385, 2350, 2534, 2315, 827, 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 827, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 333: 827, 337: 827, 3878, 340: 827, 827, 827, 347: 827, 827, 350: 827, 827, 827, 827, 355: 827, 357: 827, 360: 827, 827, 367: 827, 827, 827, 372: 827, 827, 827, 376: 827, 827, 827, 827, 503: 827, 506: 3877, 2311, 2310, 511: 827, 523: 827, 738: 3876, 764: 3941}, + {332: 3935}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 652: 3937}, + // 1815 + {2039, 2039, 3: 2039, 2039, 8: 2039, 18: 2039, 23: 2039, 351: 2039, 354: 2039}, + {8: 3938, 18: 3939}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3940, 2311, 2310}, + {828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 337: 828, 828, 340: 828, 828, 828, 347: 828, 828, 350: 828, 828, 828, 828, 355: 828, 357: 828, 360: 828, 828, 367: 828, 828, 828, 371: 828, 828, 828, 828, 376: 828, 828, 828, 828, 502: 828, 828, 828, 511: 828, 523: 828}, + {2038, 2038, 3: 2038, 2038, 8: 2038, 18: 2038, 23: 2038, 351: 2038, 354: 2038}, + // 1820 + {808, 808, 8: 808, 18: 808, 333: 808, 337: 808, 340: 808, 808, 808, 347: 808, 808, 350: 808, 808, 808, 808, 355: 808, 357: 808, 360: 808, 808, 367: 808, 808, 808, 372: 808, 808, 808, 376: 808, 808, 808, 808, 503: 3944, 511: 3945, 523: 3943, 782: 3947, 3946, 889: 3948, 3942}, + {833, 833, 8: 833, 18: 833, 333: 833, 337: 833, 340: 833, 833, 833, 347: 833, 833, 350: 833, 833, 833, 833, 355: 833, 357: 833, 360: 833, 833, 367: 833, 833, 833, 372: 833, 833, 833, 376: 833, 833, 833, 833}, + {423: 3965, 509: 3966, 665: 3969}, + {423: 3965, 509: 3966, 665: 3968}, + {423: 3965, 509: 3966, 665: 3967}, + // 1825 + {332: 820, 350: 3950, 1044: 3951}, + {810, 810, 8: 810, 18: 810, 333: 810, 337: 810, 340: 810, 810, 810, 347: 810, 810, 350: 810, 810, 810, 810, 355: 810, 357: 810, 360: 810, 810, 367: 810, 810, 810, 372: 810, 810, 810, 376: 810, 810, 810, 810, 503: 810, 511: 810, 523: 810}, + {807, 807, 8: 807, 18: 807, 333: 807, 337: 807, 340: 807, 807, 807, 347: 807, 807, 350: 807, 807, 807, 807, 355: 807, 357: 807, 360: 807, 807, 367: 807, 807, 807, 372: 807, 807, 807, 376: 807, 807, 807, 807, 503: 3944, 511: 3945, 523: 3943, 782: 3949, 3946}, + {809, 809, 8: 809, 18: 809, 333: 809, 337: 809, 340: 809, 809, 809, 347: 809, 809, 350: 809, 809, 809, 809, 355: 809, 357: 809, 360: 809, 809, 367: 809, 809, 809, 372: 809, 809, 809, 376: 809, 809, 809, 809, 503: 809, 511: 809, 523: 809}, + {357: 3961, 368: 3962, 373: 3960}, + // 1830 + {332: 3952}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 815, 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 815, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 433: 3955, 506: 3954, 2311, 2310, 1046: 3953}, + {8: 3957, 18: 3956}, + {8: 814, 18: 814}, + {8: 812, 18: 812}, + // 1835 + {816, 816, 8: 816, 18: 816, 333: 816, 337: 816, 340: 816, 816, 816, 347: 816, 816, 350: 816, 816, 816, 816, 355: 816, 357: 816, 360: 816, 816, 367: 816, 816, 816, 372: 816, 816, 816, 376: 816, 816, 816, 816, 503: 816, 511: 816, 523: 816}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 433: 3959, 506: 3958, 2311, 2310}, + {8: 813, 18: 813}, + {8: 811, 18: 811}, + {332: 819}, + // 1840 + {522: 3964}, + {522: 3963}, + {332: 817}, + {332: 818}, + {2: 2052, 2052, 2052, 2052, 2052, 2052, 9: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 19: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 350: 2052, 361: 2052}, + // 1845 + {2: 2051, 2051, 2051, 2051, 2051, 2051, 9: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 19: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 350: 2051, 361: 2051}, + {332: 821, 350: 821}, + {332: 822, 350: 822}, + {332: 823, 350: 823}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3971}, + // 1850 + {340: 3884, 3885, 372: 3883, 3886, 376: 3882, 3887, 3888, 3972, 664: 3881, 670: 3880}, + {836, 836, 8: 836, 18: 836, 333: 836, 337: 836, 342: 836, 347: 836, 836, 350: 836, 836, 836, 836, 355: 836, 357: 836, 360: 836, 367: 836, 836, 836, 374: 836}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3974, 741: 3975, 770: 3976}, + {366: 3988, 516: 3989, 644: 3987}, + {2011, 2011, 8: 2011, 352: 2011, 357: 2011, 360: 2011}, + // 1855 + {214, 214, 8: 3977, 352: 214, 357: 214, 360: 3979, 680: 3980, 3978}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3974, 741: 3986}, + {1201, 1201, 352: 1201, 357: 3000, 630: 3001, 675: 3982}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3981}, + {213, 213, 18: 213, 333: 213, 337: 213, 342: 213, 347: 213, 213, 350: 213, 213, 213, 213, 355: 213, 357: 213, 368: 213, 213, 374: 213}, + // 1860 + {215, 215, 18: 215, 333: 215, 337: 215, 342: 215, 347: 215, 215, 350: 215, 215, 215, 215, 355: 215, 357: 215, 2745, 362: 2743, 2744, 2742, 2740, 368: 215, 215, 374: 215, 592: 2741, 2739}, + {789, 789, 352: 3983, 896: 3984}, + {375: 2256, 432: 3315, 595: 3228, 613: 3314, 730: 3985}, + {218, 218}, + {788, 788}, + // 1865 + {2010, 2010, 8: 2010, 352: 2010, 357: 2010, 360: 2010}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 3990}, + {2: 687, 687, 687, 687, 687, 687, 9: 687, 687, 687, 687, 687, 687, 687, 687, 687, 19: 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 339: 687, 687, 687, 344: 687, 687, 687, 349: 687, 370: 687, 687, 375: 687, 380: 687, 400: 687, 424: 687, 687, 687, 687, 687, 430: 687, 687, 687, 434: 687, 687, 687, 687, 440: 687, 687, 443: 687, 687, 446: 687, 687, 687, 687, 687, 687, 687, 687, 455: 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, 687}, + {2: 686, 686, 686, 686, 686, 686, 9: 686, 686, 686, 686, 686, 686, 686, 686, 686, 19: 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 339: 686, 686, 686, 344: 686, 686, 686, 349: 686, 370: 686, 686, 375: 686, 380: 686, 400: 686, 424: 686, 686, 686, 686, 686, 430: 686, 686, 686, 434: 686, 686, 686, 686, 440: 686, 686, 443: 686, 686, 446: 686, 686, 686, 686, 686, 686, 686, 686, 455: 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686}, + {2012, 2012, 8: 2012, 352: 2012, 357: 2012, 360: 2012}, + // 1870 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3974, 741: 3975, 770: 3992}, + {214, 214, 8: 3977, 360: 3979, 680: 3980, 3993}, + {217, 217}, + {335: 3391, 426: 3392, 3393, 658: 4005, 740: 4019}, + {335: 3391, 426: 3392, 3393, 658: 4005, 740: 4015}, + // 1875 + {335: 3391, 426: 3392, 3393, 658: 4005, 740: 4014}, + {335: 3391, 426: 3392, 3393, 658: 4005, 740: 4011}, + {335: 3391, 426: 3392, 3393, 658: 4005, 740: 4004}, + {279, 279, 446: 4002}, + {335: 277, 426: 277, 277}, + // 1880 + {335: 276, 426: 276, 276}, + {302: 4003}, + {278, 278}, + {280, 280}, + {275, 275, 8: 4006, 112: 275, 275, 115: 275, 373: 275}, + // 1885 + {335: 3391, 426: 3392, 3393, 658: 4007}, + {274, 274, 8: 4008, 112: 274, 274, 115: 274, 373: 274}, + {375: 2256, 426: 4010, 595: 4009}, + {273, 273, 112: 273, 273, 115: 273, 373: 273}, + {272, 272, 112: 272, 272, 115: 272, 373: 272}, + // 1890 + {282, 282, 112: 4012}, + {276: 4013}, + {281, 281}, + {283, 283}, + {286, 286, 115: 4016}, + // 1895 + {285, 285, 350: 4017}, + {265: 4018}, + {284, 284}, + {289, 289, 113: 4021, 373: 4020}, + {288, 288}, + // 1900 + {287, 287}, + {2: 421, 421, 421, 421, 421, 421, 9: 421, 421, 421, 421, 421, 421, 421, 421, 421, 19: 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 359: 421}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4024}, + {420, 420}, + {17: 4036, 59: 3627, 78: 4028, 110: 560, 154: 4027, 169: 4037, 200: 4038, 202: 4029, 217: 4033, 226: 4039, 231: 4030, 400: 4035, 502: 3626, 717: 4034, 752: 4031, 1035: 4026, 1063: 4032}, + // 1905 + {571, 571}, + {570, 570}, + {569, 569}, + {568, 568}, + {567, 567}, + // 1910 + {566, 566}, + {110: 4053}, + {110: 4048}, + {551, 551, 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 337: 551, 350: 551, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 4040, 964: 4041}, + {110: 559}, + // 1915 + {110: 558}, + {110: 557}, + {110: 556}, + {110: 555}, + {550, 550, 8: 3359, 18: 550, 337: 550, 350: 550}, + // 1920 + {549, 549, 337: 4043, 350: 4044, 1153: 4042}, + {563, 563}, + {518: 4046}, + {248: 4045}, + {547, 547}, + // 1925 + {353: 4047}, + {548, 548}, + {562, 562, 350: 4050, 1036: 4049}, + {564, 564}, + {186: 4051}, + // 1930 + {335: 4052}, + {561, 561}, + {565, 565}, + {584, 584, 360: 4174, 381: 4173, 1109: 4172}, + {57: 4161, 106: 4163, 440: 4162, 502: 4160}, + // 1935 + {635, 635, 350: 4148}, + {78: 4147}, + {140: 4145}, + {78: 4144}, + {59: 4139, 73: 3381, 3380, 172: 4138, 702: 4140}, + // 1940 + {629, 629}, + {626, 626, 153: 4119, 182: 4120, 189: 4121, 191: 4118, 208: 4123, 214: 4122, 227: 4125, 4124, 350: 626, 352: 626, 355: 626, 594: 4126, 949: 4117, 1111: 4116, 4115}, + {627, 627}, + {356: 609, 398: 609}, + {356: 608, 398: 608}, + // 1945 + {356: 607, 398: 607}, + {604, 604, 360: 604, 381: 604}, + {603, 603, 360: 603, 381: 603}, + {602, 602, 360: 602, 381: 602}, + {59: 4113}, + // 1950 + {78: 4111}, + {356: 4087, 398: 4088, 651: 4106}, + {73: 578, 578, 170: 4084, 910: 4100}, + {332: 4095}, + {593, 593, 360: 593, 381: 593}, + // 1955 + {591, 591, 360: 591, 381: 591}, + {78: 4094, 162: 4093}, + {588, 588, 360: 588, 381: 588}, + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4092}, + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4089}, + // 1960 + {585, 585, 360: 585, 381: 585}, + {78: 580, 162: 580}, + {78: 579, 162: 579}, + {59: 577, 73: 577, 577, 172: 577}, + {78: 573}, + // 1965 + {78: 572}, + {2: 606, 606, 606, 606, 606, 606, 9: 606, 606, 606, 606, 606, 606, 606, 606, 606, 19: 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 359: 606}, + {2: 605, 605, 605, 605, 605, 605, 9: 605, 605, 605, 605, 605, 605, 605, 605, 605, 19: 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 359: 605}, + {586, 586, 360: 586, 381: 586}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3850, 2311, 2310, 700: 4091}, + // 1970 + {575, 575, 360: 575, 381: 575}, + {587, 587, 360: 587, 381: 587}, + {590, 590, 360: 590, 381: 590}, + {589, 589, 360: 589, 381: 589}, + {359: 4096}, + // 1975 + {18: 4097}, + {203: 4099, 232: 4098}, + {594, 594, 360: 594, 381: 594}, + {592, 592, 360: 592, 381: 592}, + {73: 3381, 3380, 702: 4101}, + // 1980 + {356: 4087, 398: 4088, 651: 4103, 951: 4102}, + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4105}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4104}, + {574, 574, 356: 574, 360: 574, 381: 574, 398: 574}, + {595, 595, 360: 595, 381: 595}, + // 1985 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 4107, 2311, 2310, 598: 4108}, + {951, 951, 356: 4087, 360: 951, 381: 951, 398: 4088, 512: 3363, 651: 4109}, + {598, 598, 360: 598, 381: 598}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4110, 2311, 2310}, + {597, 597, 360: 597, 381: 597}, + // 1990 + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4112}, + {599, 599, 360: 599, 381: 599}, + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4114}, + {600, 600, 360: 600, 381: 600}, + {613, 613, 350: 4133, 352: 613, 355: 613, 1110: 4132}, + // 1995 + {625, 625, 8: 4130, 350: 625, 352: 625, 355: 625}, + {624, 624, 8: 624, 350: 624, 352: 624, 355: 624}, + {622, 622, 8: 622, 350: 622, 352: 622, 355: 622}, + {621, 621, 8: 621, 350: 621, 352: 621, 355: 621}, + {257: 4129}, + // 2000 + {292: 4128}, + {249: 4127}, + {617, 617, 8: 617, 350: 617, 352: 617, 355: 617}, + {616, 616, 8: 616, 350: 616, 352: 616, 355: 616}, + {615, 615, 8: 615, 350: 615, 352: 615, 355: 615}, + // 2005 + {614, 614, 8: 614, 350: 614, 352: 614, 355: 614}, + {618, 618, 8: 618, 350: 618, 352: 618, 355: 618}, + {619, 619, 8: 619, 350: 619, 352: 619, 355: 619}, + {620, 620, 8: 620, 350: 620, 352: 620, 355: 620}, + {153: 4119, 182: 4120, 189: 4121, 191: 4118, 208: 4123, 214: 4122, 227: 4125, 4124, 594: 4126, 949: 4131}, + // 2010 + {623, 623, 8: 623, 350: 623, 352: 623, 355: 623}, + {775, 775, 352: 3306, 355: 3307, 631: 3344, 713: 4137}, + {155: 4134}, + {375: 2256, 595: 4135, 674: 4136}, + {1710, 1710, 1710, 14: 1710, 24: 1710, 1710, 1710, 1710, 1710, 60: 1710, 82: 1710, 1710, 1710, 1710, 352: 1710, 355: 1710}, + // 2015 + {612, 612, 352: 612, 355: 612}, + {628, 628}, + {630, 630}, + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4143}, + {356: 4087, 398: 4088, 651: 4103, 951: 4141}, + // 2020 + {576, 576, 356: 4087, 360: 576, 381: 576, 398: 4088, 651: 4090, 691: 4142}, + {596, 596, 360: 596, 381: 596}, + {601, 601, 360: 601, 381: 601}, + {631, 631}, + {78: 4146}, + // 2025 + {632, 632}, + {633, 633}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 4149}, + {611, 611, 361: 4151, 1139: 4150}, + {634, 634}, + // 2030 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 4157}, + {649, 649, 8: 649, 424: 1596, 510: 649, 524: 1596}, + {650, 650, 8: 650, 424: 222, 510: 650, 524: 222}, + {644, 644, 8: 644, 510: 644}, + {643, 643, 8: 643, 510: 643}, + // 2035 + {642, 642, 8: 642, 510: 642}, + {610, 610, 8: 4158}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 4159, 4154}, + {641, 641, 8: 641, 510: 641}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4171}, + // 2040 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4170}, + {2: 1622, 1622, 1622, 1622, 1622, 1622, 9: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 428: 4165, 686: 4166}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 4164}, + {636, 636}, + {334: 3528, 336: 3527, 666: 4168}, + // 2045 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3850, 2311, 2310, 700: 4167}, + {637, 637}, + {444: 4169}, + {2: 1621, 1621, 1621, 1621, 1621, 1621, 9: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 19: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 335: 1621, 359: 1621, 375: 1621, 425: 1621}, + {638, 638}, + // 2050 + {639, 639}, + {640, 640}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 4176, 2661, 2734, 2660, 2657}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4175}, + {582, 582, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + // 2055 + {583, 583, 343: 2749, 442: 2750}, + {2: 298, 298, 298, 298, 298, 298, 9: 298, 298, 298, 298, 298, 298, 298, 298, 298, 19: 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 335: 298, 339: 298, 366: 1578, 400: 298, 512: 1578, 516: 1578}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 4277, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1538, 506: 4188, 2311, 2310, 512: 1538, 516: 1538, 679: 4222}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1533, 506: 4188, 2311, 2310, 512: 1533, 516: 1533, 679: 4274}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 339: 4270, 366: 1531, 400: 3173, 506: 2901, 2311, 2310, 512: 1531, 516: 1531, 596: 3172, 654: 4269}, + // 2060 + {350: 4253, 366: 3988, 512: 1526, 516: 1526, 644: 4252}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 4209, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 339: 4249, 366: 1517, 506: 2901, 2311, 2310, 512: 1517, 516: 1517, 594: 4247, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 4212, 945: 4248, 1107: 4246}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 4244, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1514, 506: 4188, 2311, 2310, 512: 1514, 516: 1514, 679: 4219}, + {151: 4230, 366: 1498, 512: 1498, 516: 1498, 518: 4231, 766: 4229, 808: 4228}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1341, 506: 4188, 2311, 2310, 512: 1341, 516: 1341, 679: 4225}, + // 2065 + {715, 715, 8: 4215}, + {147: 4208}, + {366: 685, 512: 4206, 516: 685}, + {366: 3988, 516: 3989, 644: 4204}, + {366: 3988, 516: 3989, 644: 4199}, + // 2070 + {366: 3988, 516: 3989, 644: 4197}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 339: 4196, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 4195, 1006: 4194}, + {665, 665, 8: 665}, + {672, 672, 8: 672}, + {671, 671, 8: 671}, + // 2075 + {670, 670, 8: 670}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4198}, + {677, 677, 8: 677, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4203}, + {689, 689, 2422, 2532, 2385, 2350, 2534, 2315, 689, 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2267, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 3281, 2661, 2734, 2660, 2657}, + // 2080 + {690, 690, 8: 690}, + {688, 688, 8: 688}, + {678, 678, 8: 678}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4205}, + {683, 683, 8: 683}, + // 2085 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4207, 2311, 2310}, + {366: 684, 516: 684}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 4209, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 594: 4211, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 4212, 945: 4210}, + {705, 705, 424: 1441, 510: 705, 524: 1441}, + {510: 4213}, + // 2090 + {510: 704}, + {703, 703, 8: 4158, 510: 703}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 4214}, + {706, 706, 8: 3752}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 4177, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 4179, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 4216, 2435, 2527, 2450, 4185, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 4217, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 4180, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 370: 3250, 424: 4191, 456: 4190, 505: 3248, 4188, 2311, 2310, 628: 4192, 679: 4189, 975: 4218}, + // 2095 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1538, 506: 4188, 2311, 2310, 512: 1538, 516: 1538, 679: 4222}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 366: 1514, 506: 4188, 2311, 2310, 512: 1514, 516: 1514, 679: 4219}, + {664, 664, 8: 664}, + {366: 3988, 516: 3989, 644: 4220}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4221}, + // 2100 + {680, 680, 8: 680}, + {366: 3988, 516: 3989, 644: 4223}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4224}, + {682, 682, 8: 682}, + {366: 3988, 516: 3989, 644: 4226}, + // 2105 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4227}, + {681, 681, 8: 681}, + {708, 708, 8: 4242}, + {699, 699, 8: 699}, + {262: 4234}, + // 2110 + {131: 4233, 545: 4232}, + {696, 696, 8: 696}, + {695, 695, 8: 695}, + {282: 4236, 288: 4238, 518: 4237, 1052: 4235}, + {697, 697, 8: 697}, + // 2115 + {518: 4241}, + {241: 4239, 299: 4240}, + {691, 691, 8: 691}, + {693, 693, 8: 693}, + {692, 692, 8: 692}, + // 2120 + {694, 694, 8: 694}, + {151: 4230, 518: 4231, 766: 4243}, + {698, 698, 8: 698}, + {151: 4230, 366: 1498, 512: 1498, 516: 1498, 518: 4231, 766: 4229, 808: 4245}, + {709, 709, 8: 4242}, + // 2125 + {707, 707}, + {704, 704, 347: 4250}, + {701, 701}, + {700, 700}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 4251}, + // 2130 + {702, 702, 8: 4158}, + {14: 4258, 335: 4257, 922: 4265}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 4254}, + {366: 3988, 516: 3989, 644: 4255}, + {14: 4258, 335: 4257, 922: 4256}, + // 2135 + {712, 712, 114: 4262}, + {653, 653, 114: 653}, + {332: 4259}, + {335: 3782, 695: 4260}, + {18: 4261}, + // 2140 + {652, 652, 114: 652}, + {80: 4263}, + {14: 4264}, + {711, 711}, + {714, 714, 114: 4266}, + // 2145 + {80: 4267}, + {14: 4268}, + {713, 713}, + {676, 676, 8: 676, 343: 4271}, + {673, 673, 8: 673}, + // 2150 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 339: 4272, 506: 2901, 2311, 2310, 596: 4273}, + {675, 675, 8: 675}, + {674, 674, 8: 674}, + {366: 3988, 516: 3989, 644: 4275}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 4201, 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 4200, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4202, 714: 4276}, + // 2155 + {679, 679, 8: 679}, + {151: 4230, 366: 1498, 512: 1498, 516: 1498, 518: 4231, 766: 4229, 808: 4278}, + {710, 710, 8: 4242}, + {332: 2161, 371: 2159, 502: 2158, 504: 2154, 569: 4290, 617: 4289, 2155, 2156, 2157, 622: 4291}, + {332: 1140, 371: 1140, 502: 1140, 504: 1140, 594: 2956, 603: 2954, 2955, 638: 4283, 4284, 777: 4286, 802: 4288}, + // 2160 + {332: 1140, 371: 1140, 502: 1140, 504: 1140, 594: 2956, 603: 2954, 2955, 638: 4283, 4284, 777: 4286, 802: 4287}, + {332: 1140, 371: 1140, 502: 1140, 504: 1140, 594: 2956, 603: 2954, 2955, 638: 4283, 4284, 777: 4286, 802: 4285}, + {2: 1143, 1143, 1143, 1143, 1143, 1143, 9: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 19: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 334: 1143, 1143, 1143, 339: 1143, 1143, 1143, 344: 1143, 1143, 1143, 349: 1143, 359: 1143, 370: 1143, 1143, 1143, 375: 1143, 380: 1143, 400: 1143, 424: 1143, 1143, 1143, 1143, 1143, 430: 1143, 1143, 1143, 434: 1143, 1143, 1143, 1143, 440: 1143, 1143, 443: 1143, 1143, 446: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 455: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 504: 1143, 594: 1143, 603: 1143, 1143, 606: 1143, 1143, 1143, 610: 1143, 614: 1143, 1143, 1143}, + {332: 1139, 371: 1139, 502: 1139, 504: 1139}, + {332: 717, 371: 717, 502: 717, 504: 717}, + // 2165 + {332: 716, 371: 716, 502: 716, 504: 716}, + {332: 718, 371: 718, 502: 718, 504: 718}, + {332: 719, 371: 719, 502: 719, 504: 719}, + {731, 731, 18: 731, 333: 731, 337: 731, 342: 721, 347: 721, 721}, + {730, 730, 18: 730, 333: 730, 337: 730, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 4292, 4293}, + // 2170 + {342: 722, 347: 722, 722}, + {729, 729, 18: 729, 333: 729, 337: 729, 352: 3306, 355: 3307, 631: 4294}, + {728, 728, 18: 728, 333: 728, 337: 728}, + {727, 727, 18: 727, 333: 727, 337: 727}, + {18: 3418, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + // 2175 + {8: 4304, 332: 905, 371: 905, 502: 905, 504: 905, 517: 905, 609: 905}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4299, 2311, 2310, 774: 4298, 987: 4303}, + {8: 902, 332: 902, 371: 902, 502: 902, 504: 902, 517: 902, 609: 902}, + {332: 3926, 338: 1989, 888: 4300}, + {338: 4301}, + // 2180 + {332: 2161, 569: 4302}, + {8: 901, 332: 901, 371: 901, 502: 901, 504: 901, 517: 901, 609: 901}, + {8: 4304, 332: 904, 371: 904, 502: 904, 504: 904, 517: 904, 609: 904}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4299, 2311, 2310, 774: 4305}, + {8: 903, 332: 903, 371: 903, 502: 903, 504: 903, 517: 903, 609: 903}, + // 2185 + {1201, 1201, 18: 1201, 333: 1201, 337: 1201, 342: 1201, 347: 1201, 1201, 350: 1201, 1201, 1201, 1201, 355: 1201, 357: 3000, 630: 3001, 675: 4307}, + {775, 775, 18: 775, 333: 775, 337: 775, 342: 775, 347: 775, 775, 350: 775, 775, 3306, 775, 355: 3307, 631: 3344, 713: 4308}, + {746, 746, 18: 746, 333: 746, 337: 746, 342: 746, 347: 746, 746, 350: 3346, 746, 353: 3347, 735: 4309}, + {752, 752, 18: 752, 333: 752, 337: 752, 342: 752, 347: 752, 752, 351: 3375, 736: 4310}, + {909, 909, 18: 909, 333: 909, 337: 909, 342: 909, 347: 909, 909}, + // 2190 + {775, 775, 18: 775, 333: 775, 337: 775, 342: 775, 347: 775, 775, 350: 775, 775, 3306, 775, 355: 3307, 631: 3344, 713: 4312}, + {746, 746, 18: 746, 333: 746, 337: 746, 342: 746, 347: 746, 746, 350: 3346, 746, 353: 3347, 735: 4313}, + {752, 752, 18: 752, 333: 752, 337: 752, 342: 752, 347: 752, 752, 351: 3375, 736: 4314}, + {910, 910, 18: 910, 333: 910, 337: 910, 342: 910, 347: 910, 910}, + {522: 4322}, + // 2195 + {1201, 1201, 18: 1201, 333: 1201, 337: 1201, 342: 1201, 347: 1201, 1201, 350: 1201, 1201, 1201, 1201, 355: 1201, 357: 3000, 630: 3001, 675: 4318}, + {753, 753, 18: 753, 333: 753, 337: 753, 342: 753, 347: 753, 753, 350: 753, 753, 753, 753, 355: 753, 357: 753, 369: 753, 374: 753}, + {775, 775, 18: 775, 333: 775, 337: 775, 342: 775, 347: 775, 775, 350: 775, 775, 3306, 775, 355: 3307, 631: 3344, 713: 4319}, + {746, 746, 18: 746, 333: 746, 337: 746, 342: 746, 347: 746, 746, 350: 3346, 746, 353: 3347, 735: 4320}, + {752, 752, 18: 752, 333: 752, 337: 752, 342: 752, 347: 752, 752, 351: 3375, 736: 4321}, + // 2200 + {911, 911, 18: 911, 333: 911, 337: 911, 342: 911, 347: 911, 911}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2816, 721: 2817, 742: 4323}, + {1629, 1629, 8: 2819, 18: 1629, 333: 1629, 337: 4324, 342: 1629, 347: 1629, 1629, 350: 1629, 1629, 1629, 1629, 355: 1629, 357: 1629, 369: 1629, 374: 1629, 1154: 4325}, + {285: 4326}, + {1627, 1627, 18: 1627, 333: 1627, 337: 1627, 342: 1627, 347: 1627, 1627, 350: 1627, 1627, 1627, 1627, 355: 1627, 357: 1627, 369: 1627, 374: 1627}, + // 2205 + {1628, 1628, 18: 1628, 333: 1628, 337: 1628, 342: 1628, 347: 1628, 1628, 350: 1628, 1628, 1628, 1628, 355: 1628, 357: 1628, 369: 1628, 374: 1628}, + {214, 214, 18: 214, 333: 214, 337: 214, 342: 214, 347: 214, 214, 350: 214, 214, 214, 214, 355: 214, 357: 214, 360: 3979, 368: 214, 680: 3980, 4352}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 435: 3865, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3873, 701: 3862, 739: 4337, 1023: 4336, 1129: 4335}, + {754, 754, 18: 754, 333: 754, 337: 754, 342: 754, 347: 754, 754, 350: 754, 754, 754, 754, 355: 754, 357: 754, 368: 4315, 781: 4317, 801: 4330}, + {1201, 1201, 18: 1201, 333: 1201, 337: 1201, 342: 1201, 347: 1201, 1201, 350: 1201, 1201, 1201, 1201, 355: 1201, 357: 3000, 630: 3001, 675: 4331}, + // 2210 + {775, 775, 18: 775, 333: 775, 337: 775, 342: 775, 347: 775, 775, 350: 775, 775, 3306, 775, 355: 3307, 631: 3344, 713: 4332}, + {746, 746, 18: 746, 333: 746, 337: 746, 342: 746, 347: 746, 746, 350: 3346, 746, 353: 3347, 735: 4333}, + {752, 752, 18: 752, 333: 752, 337: 752, 342: 752, 347: 752, 752, 351: 3375, 736: 4334}, + {912, 912, 18: 912, 333: 912, 337: 912, 342: 912, 347: 912, 912}, + {214, 214, 18: 214, 333: 214, 337: 214, 342: 214, 347: 214, 214, 350: 214, 214, 214, 214, 355: 214, 357: 214, 360: 3979, 368: 214, 214, 374: 214, 680: 3980, 4338}, + // 2215 + {900, 900, 18: 900, 333: 900, 337: 900, 342: 900, 347: 900, 900, 350: 900, 900, 900, 900, 355: 900, 357: 900, 360: 900, 368: 900}, + {840, 840, 8: 3921, 18: 840, 333: 840, 337: 840, 342: 840, 347: 840, 840, 350: 840, 840, 840, 840, 355: 840, 357: 840, 360: 840, 368: 840, 840, 374: 840}, + {754, 754, 18: 754, 333: 754, 337: 754, 342: 754, 347: 754, 754, 350: 754, 754, 754, 754, 355: 754, 357: 754, 368: 4315, 754, 374: 754, 781: 4317, 801: 4339}, + {1626, 1626, 18: 1626, 333: 1626, 337: 1626, 342: 1626, 347: 1626, 1626, 350: 1626, 1626, 1626, 1626, 355: 1626, 357: 1626, 369: 4340, 374: 1626, 887: 4341}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4351}, + // 2220 + {899, 899, 18: 899, 333: 899, 337: 899, 342: 899, 347: 899, 899, 350: 899, 899, 899, 899, 355: 899, 357: 899, 374: 4343, 1146: 4342}, + {913, 913, 18: 913, 333: 913, 337: 913, 342: 913, 347: 913, 913, 350: 913, 913, 913, 913, 355: 913, 357: 913}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 2805, 2311, 2310, 768: 4346, 983: 4345, 1147: 4344}, + {898, 898, 8: 4349, 18: 898, 333: 898, 337: 898, 342: 898, 347: 898, 898, 350: 898, 898, 898, 898, 355: 898, 357: 898}, + {897, 897, 8: 897, 18: 897, 333: 897, 337: 897, 342: 897, 347: 897, 897, 350: 897, 897, 897, 897, 355: 897, 357: 897}, + // 2225 + {338: 4347}, + {332: 2806, 985: 4348}, + {895, 895, 8: 895, 18: 895, 333: 895, 337: 895, 342: 895, 347: 895, 895, 350: 895, 895, 895, 895, 355: 895, 357: 895}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 2805, 2311, 2310, 768: 4346, 983: 4350}, + {896, 896, 8: 896, 18: 896, 333: 896, 337: 896, 342: 896, 347: 896, 896, 350: 896, 896, 896, 896, 355: 896, 357: 896}, + // 2230 + {1625, 1625, 18: 1625, 333: 1625, 337: 1625, 342: 1625, 347: 1625, 1625, 350: 1625, 1625, 1625, 1625, 355: 1625, 1625, 1625, 2745, 360: 1625, 362: 2743, 2744, 2742, 2740, 368: 1625, 374: 1625, 592: 2741, 2739}, + {914, 914, 18: 914, 333: 914, 337: 914, 342: 914, 347: 914, 914, 350: 914, 914, 914, 914, 355: 914, 357: 914, 368: 914}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 359: 4369, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 4370, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4368, 877: 4371, 1031: 4372, 1103: 4373}, + {2: 773, 773, 773, 773, 773, 773, 9: 773, 773, 773, 773, 773, 773, 773, 773, 773, 19: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 334: 773, 773, 773, 339: 773, 773, 773, 344: 773, 773, 773, 349: 773, 359: 773, 370: 773, 773, 773, 375: 773, 380: 773, 400: 773, 424: 773, 773, 773, 773, 773, 430: 773, 773, 773, 434: 773, 773, 773, 773, 440: 773, 773, 443: 773, 773, 446: 773, 773, 773, 773, 773, 773, 773, 773, 455: 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 594: 773, 603: 773, 773, 606: 773, 773, 773, 610: 773, 614: 773, 773, 773}, + {2: 772, 772, 772, 772, 772, 772, 9: 772, 772, 772, 772, 772, 772, 772, 772, 772, 19: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 334: 772, 772, 772, 339: 772, 772, 772, 344: 772, 772, 772, 349: 772, 359: 772, 370: 772, 772, 772, 375: 772, 380: 772, 400: 772, 424: 772, 772, 772, 772, 772, 430: 772, 772, 772, 434: 772, 772, 772, 772, 440: 772, 772, 443: 772, 772, 446: 772, 772, 772, 772, 772, 772, 772, 772, 455: 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 772, 594: 772, 603: 772, 772, 606: 772, 772, 772, 610: 772, 614: 772, 772, 772}, + // 2235 + {2: 771, 771, 771, 771, 771, 771, 9: 771, 771, 771, 771, 771, 771, 771, 771, 771, 19: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 334: 771, 771, 771, 339: 771, 771, 771, 344: 771, 771, 771, 349: 771, 359: 771, 370: 771, 771, 771, 375: 771, 380: 771, 400: 771, 424: 771, 771, 771, 771, 771, 430: 771, 771, 771, 434: 771, 771, 771, 771, 440: 771, 771, 443: 771, 771, 446: 771, 771, 771, 771, 771, 771, 771, 771, 455: 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 771, 594: 771, 603: 771, 771, 606: 771, 771, 771, 610: 771, 614: 771, 771, 771}, + {2: 770, 770, 770, 770, 770, 770, 9: 770, 770, 770, 770, 770, 770, 770, 770, 770, 19: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 334: 770, 770, 770, 339: 770, 770, 770, 344: 770, 770, 770, 349: 770, 359: 770, 370: 770, 770, 770, 375: 770, 380: 770, 400: 770, 424: 770, 770, 770, 770, 770, 430: 770, 770, 770, 434: 770, 770, 770, 770, 440: 770, 770, 443: 770, 770, 446: 770, 770, 770, 770, 770, 770, 770, 770, 455: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 594: 770, 603: 770, 770, 606: 770, 770, 770, 610: 770, 614: 770, 770, 770}, + {2: 769, 769, 769, 769, 769, 769, 9: 769, 769, 769, 769, 769, 769, 769, 769, 769, 19: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 334: 769, 769, 769, 339: 769, 769, 769, 344: 769, 769, 769, 349: 769, 359: 769, 370: 769, 769, 769, 375: 769, 380: 769, 400: 769, 424: 769, 769, 769, 769, 769, 430: 769, 769, 769, 434: 769, 769, 769, 769, 440: 769, 769, 443: 769, 769, 446: 769, 769, 769, 769, 769, 769, 769, 769, 455: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 594: 769, 603: 769, 769, 606: 769, 769, 769, 610: 769, 614: 769, 769, 769}, + {2: 768, 768, 768, 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 19: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 334: 768, 768, 768, 339: 768, 768, 768, 344: 768, 768, 768, 349: 768, 359: 768, 370: 768, 768, 768, 375: 768, 380: 768, 400: 768, 424: 768, 768, 768, 768, 768, 430: 768, 768, 768, 434: 768, 768, 768, 768, 440: 768, 768, 443: 768, 768, 446: 768, 768, 768, 768, 768, 768, 768, 768, 455: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 594: 768, 603: 768, 768, 606: 768, 768, 768, 610: 768, 614: 768, 768, 768}, + {2: 767, 767, 767, 767, 767, 767, 9: 767, 767, 767, 767, 767, 767, 767, 767, 767, 19: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 334: 767, 767, 767, 339: 767, 767, 767, 344: 767, 767, 767, 349: 767, 359: 767, 370: 767, 767, 767, 375: 767, 380: 767, 400: 767, 424: 767, 767, 767, 767, 767, 430: 767, 767, 767, 434: 767, 767, 767, 767, 440: 767, 767, 443: 767, 767, 446: 767, 767, 767, 767, 767, 767, 767, 767, 455: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 594: 767, 603: 767, 767, 606: 767, 767, 767, 610: 767, 614: 767, 767, 767}, + // 2240 + {2: 766, 766, 766, 766, 766, 766, 9: 766, 766, 766, 766, 766, 766, 766, 766, 766, 19: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 334: 766, 766, 766, 339: 766, 766, 766, 344: 766, 766, 766, 349: 766, 359: 766, 370: 766, 766, 766, 375: 766, 380: 766, 400: 766, 424: 766, 766, 766, 766, 766, 430: 766, 766, 766, 434: 766, 766, 766, 766, 440: 766, 766, 443: 766, 766, 446: 766, 766, 766, 766, 766, 766, 766, 766, 455: 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 766, 594: 766, 603: 766, 766, 606: 766, 766, 766, 610: 766, 614: 766, 766, 766}, + {2: 765, 765, 765, 765, 765, 765, 9: 765, 765, 765, 765, 765, 765, 765, 765, 765, 19: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 334: 765, 765, 765, 339: 765, 765, 765, 344: 765, 765, 765, 349: 765, 359: 765, 370: 765, 765, 765, 375: 765, 380: 765, 400: 765, 424: 765, 765, 765, 765, 765, 430: 765, 765, 765, 434: 765, 765, 765, 765, 440: 765, 765, 443: 765, 765, 446: 765, 765, 765, 765, 765, 765, 765, 765, 455: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 594: 765, 603: 765, 765, 606: 765, 765, 765, 610: 765, 614: 765, 765, 765}, + {2: 763, 763, 763, 763, 763, 763, 9: 763, 763, 763, 763, 763, 763, 763, 763, 763, 19: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 4359, 4365, 4366, 763, 763, 763, 763, 763, 763, 334: 763, 763, 763, 339: 763, 763, 763, 344: 763, 763, 763, 349: 763, 359: 763, 370: 763, 763, 4362, 375: 763, 380: 763, 400: 763, 424: 763, 763, 763, 763, 763, 430: 763, 763, 763, 434: 763, 763, 763, 763, 440: 763, 763, 443: 763, 763, 446: 763, 763, 763, 763, 763, 763, 763, 763, 455: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 594: 2956, 603: 2954, 2955, 606: 3855, 3857, 3856, 610: 3852, 614: 4358, 4361, 4357, 638: 4283, 4355, 710: 4356, 715: 4354, 943: 4367, 4360}, + {2: 761, 761, 761, 761, 761, 761, 9: 761, 761, 761, 761, 761, 761, 761, 761, 761, 19: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 334: 761, 761, 761, 339: 761, 761, 761, 344: 761, 761, 761, 349: 761, 359: 761, 370: 761, 761, 761, 375: 761, 380: 761, 400: 761, 424: 761, 761, 761, 761, 761, 430: 761, 761, 761, 434: 761, 761, 761, 761, 440: 761, 761, 443: 761, 761, 446: 761, 761, 761, 761, 761, 761, 761, 761, 455: 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 594: 761, 603: 761, 761, 606: 761, 761, 761, 610: 761, 614: 761, 761, 761}, + {2: 757, 757, 757, 757, 757, 757, 9: 757, 757, 757, 757, 757, 757, 757, 757, 757, 19: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 334: 757, 757, 757, 339: 757, 757, 757, 344: 757, 757, 757, 349: 757, 359: 757, 370: 757, 757, 757, 375: 757, 380: 757, 400: 757, 424: 757, 757, 757, 757, 757, 430: 757, 757, 757, 434: 757, 757, 757, 757, 440: 757, 757, 443: 757, 757, 446: 757, 757, 757, 757, 757, 757, 757, 757, 455: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 594: 757, 603: 757, 757, 606: 757, 757, 757, 610: 757, 614: 757, 757, 757}, + // 2245 + {2: 756, 756, 756, 756, 756, 756, 9: 756, 756, 756, 756, 756, 756, 756, 756, 756, 19: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 334: 756, 756, 756, 339: 756, 756, 756, 344: 756, 756, 756, 349: 756, 359: 756, 370: 756, 756, 756, 375: 756, 380: 756, 400: 756, 424: 756, 756, 756, 756, 756, 430: 756, 756, 756, 434: 756, 756, 756, 756, 440: 756, 756, 443: 756, 756, 446: 756, 756, 756, 756, 756, 756, 756, 756, 455: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 594: 756, 603: 756, 756, 606: 756, 756, 756, 610: 756, 614: 756, 756, 756}, + {2: 762, 762, 762, 762, 762, 762, 9: 762, 762, 762, 762, 762, 762, 762, 762, 762, 19: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 334: 762, 762, 762, 339: 762, 762, 762, 344: 762, 762, 762, 349: 762, 359: 762, 370: 762, 762, 762, 375: 762, 380: 762, 400: 762, 424: 762, 762, 762, 762, 762, 430: 762, 762, 762, 434: 762, 762, 762, 762, 440: 762, 762, 443: 762, 762, 446: 762, 762, 762, 762, 762, 762, 762, 762, 455: 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, 594: 762, 603: 762, 762, 606: 762, 762, 762, 610: 762, 614: 762, 762, 762}, + {1637, 1637, 2422, 2532, 2385, 2350, 2534, 2315, 1637, 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 1637, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 333: 1637, 335: 4386, 337: 1637, 4385, 342: 1637, 347: 1637, 1637, 350: 1637, 1637, 1637, 1637, 355: 1637, 1637, 1637, 2745, 360: 1637, 362: 2743, 2744, 2742, 2740, 368: 1637, 1637, 506: 4384, 2311, 2310, 592: 2741, 2739, 1028: 4383, 4382}, + {1641, 1641, 8: 1641, 18: 1641, 333: 1641, 337: 1641, 342: 1641, 347: 1641, 1641, 350: 1641, 1641, 1641, 1641, 355: 1641, 1641, 1641, 360: 1641, 368: 1641, 1641}, + {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 333: 1183, 1183, 1183, 1183, 1183, 1183, 342: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 350: 1183, 1183, 1183, 1183, 355: 1183, 1183, 1183, 1183, 1183, 1183, 362: 1183, 1183, 1183, 1183, 1183, 368: 1183, 1183, 381: 1183, 398: 1183, 403: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 442: 1183, 512: 4377, 1183, 1183}, + // 2250 + {1631, 1631, 8: 1631, 18: 1631, 333: 1631, 337: 1631, 342: 1631, 347: 1631, 1631, 350: 1631, 1631, 1631, 1631, 355: 1631, 1631, 1631, 360: 1631, 368: 1631, 1631}, + {755, 755, 8: 4375, 18: 755, 333: 755, 337: 755, 342: 755, 347: 755, 755, 350: 755, 755, 755, 755, 355: 755, 755, 755, 360: 755, 368: 755, 755}, + {1626, 1626, 18: 1626, 333: 1626, 337: 1626, 342: 1626, 347: 1626, 1626, 350: 1626, 1626, 1626, 1626, 355: 1626, 1626, 1626, 360: 1626, 368: 1626, 4340, 887: 4374}, + {915, 915, 18: 915, 333: 915, 337: 915, 342: 915, 347: 915, 915, 350: 915, 915, 915, 915, 355: 915, 915, 915, 360: 915, 368: 915}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 359: 4369, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 4370, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4368, 877: 4376}, + // 2255 + {1630, 1630, 8: 1630, 18: 1630, 333: 1630, 337: 1630, 342: 1630, 347: 1630, 1630, 350: 1630, 1630, 1630, 1630, 355: 1630, 1630, 1630, 360: 1630, 368: 1630, 1630}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 4378, 506: 4379, 2311, 2310}, + {1640, 1640, 8: 1640, 18: 1640, 333: 1640, 337: 1640, 342: 1640, 347: 1640, 1640, 350: 1640, 1640, 1640, 1640, 355: 1640, 1640, 1640, 360: 1640, 368: 1640, 1640}, + {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 3434, 1182, 1182, 1182, 1182, 1182, 1182, 342: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 350: 1182, 1182, 1182, 1182, 355: 1182, 1182, 1182, 1182, 1182, 1182, 362: 1182, 1182, 1182, 1182, 1182, 368: 1182, 1182, 381: 1182, 398: 1182, 403: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 442: 1182, 512: 4380, 1182, 1182}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 4381, 506: 3198, 2311, 2310}, + // 2260 + {1639, 1639, 8: 1639, 18: 1639, 333: 1639, 337: 1639, 342: 1639, 347: 1639, 1639, 350: 1639, 1639, 1639, 1639, 355: 1639, 1639, 1639, 360: 1639, 368: 1639, 1639}, + {1638, 1638, 8: 1638, 18: 1638, 333: 1638, 337: 1638, 342: 1638, 347: 1638, 1638, 350: 1638, 1638, 1638, 1638, 355: 1638, 1638, 1638, 360: 1638, 368: 1638, 1638}, + {1636, 1636, 8: 1636, 18: 1636, 333: 1636, 337: 1636, 342: 1636, 347: 1636, 1636, 350: 1636, 1636, 1636, 1636, 355: 1636, 1636, 1636, 360: 1636, 368: 1636, 1636}, + {1635, 1635, 8: 1635, 18: 1635, 333: 1635, 337: 1635, 342: 1635, 347: 1635, 1635, 350: 1635, 1635, 1635, 1635, 355: 1635, 1635, 1635, 360: 1635, 368: 1635, 1635}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4388, 506: 4387, 2311, 2310}, + // 2265 + {1633, 1633, 8: 1633, 18: 1633, 333: 1633, 337: 1633, 342: 1633, 347: 1633, 1633, 350: 1633, 1633, 1633, 1633, 355: 1633, 1633, 1633, 360: 1633, 368: 1633, 1633}, + {1634, 1634, 8: 1634, 18: 1634, 333: 1634, 337: 1634, 342: 1634, 347: 1634, 1634, 350: 1634, 1634, 1634, 1634, 355: 1634, 1634, 1634, 360: 1634, 368: 1634, 1634}, + {1632, 1632, 8: 1632, 18: 1632, 333: 1632, 337: 1632, 342: 1632, 347: 1632, 1632, 350: 1632, 1632, 1632, 1632, 355: 1632, 1632, 1632, 360: 1632, 368: 1632, 1632}, + {2000, 2000, 75: 2000, 358: 2000, 510: 2000, 653: 2000}, + {928, 928, 75: 4395, 358: 4393, 510: 4392, 653: 4394, 841: 4391}, + // 2270 + {927, 927}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 4405, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4406, 2311, 2310}, + {75: 4398, 185: 4397}, + {919, 919}, + {653: 4396}, + // 2275 + {918, 918}, + {921, 921, 75: 4403}, + {185: 4399}, + {920, 920, 75: 4401, 653: 4400}, + {923, 923}, + // 2280 + {653: 4402}, + {922, 922}, + {653: 4404}, + {924, 924}, + {1425, 1425, 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4407, 2311, 2310}, + // 2285 + {926, 926}, + {925, 925}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4409, 2311, 2310}, + {931, 931}, + {935, 935, 361: 4411}, + // 2290 + {424: 2748, 571: 4413, 1138: 4412}, + {934, 934, 8: 4414}, + {933, 933, 8: 933}, + {424: 2748, 571: 4415}, + {932, 932, 8: 932}, + // 2295 + {356: 4417}, + {335: 4419, 424: 2748, 571: 4420, 1091: 4418}, + {938, 938}, + {937, 937}, + {936, 936}, + // 2300 + {2: 953, 953, 953, 953, 953, 953, 9: 953, 953, 953, 953, 953, 953, 953, 953, 953, 19: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 351: 953, 359: 953, 606: 3855, 3857, 3856, 710: 3858, 759: 4422}, + {2: 1260, 1260, 1260, 1260, 1260, 1260, 9: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 19: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 351: 4423, 359: 1260, 893: 4424}, + {2: 1259, 1259, 1259, 1259, 1259, 1259, 9: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 19: 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 359: 1259}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4425}, + {134: 829, 332: 829, 337: 829, 354: 3934, 367: 829, 371: 829, 502: 829, 504: 829, 757: 4426}, + // 2305 + {134: 4434, 332: 4427, 337: 2160, 367: 4433, 371: 4435, 502: 2158, 504: 2154, 569: 4432, 617: 4430, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4431, 4429, 3295, 815: 4428, 892: 4436}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 1991, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 2161, 337: 2160, 371: 2159, 502: 2158, 504: 2154, 506: 3586, 2311, 2310, 569: 4295, 602: 3587, 617: 3296, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 3298, 3297, 3295, 661: 4456, 835: 4457}, + {332: 3330, 763: 4452, 973: 4451}, + {1252, 1252, 333: 1252}, + {1251, 1251, 333: 1251, 342: 721, 347: 721, 721}, + // 2310 + {1250, 1250, 333: 1250}, + {1249, 1249, 333: 1249, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4438, 1013: 4437}, + {332: 1247}, + {332: 1246, 434: 3329, 762: 3328, 814: 3327}, + // 2315 + {1229, 1229}, + {1234, 1234, 8: 4442, 333: 1234, 338: 4443, 785: 4441}, + {366: 3988, 516: 3989, 644: 4439}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4440}, + {1236, 1236, 8: 1236, 333: 1236, 338: 1236}, + // 2320 + {1248, 1248, 333: 1248}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4448}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4444, 2311, 2310}, + {1233, 1233, 332: 4445, 1233}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3929, 2311, 2310, 746: 4446}, + // 2325 + {8: 3931, 18: 4447}, + {1232, 1232, 333: 1232}, + {366: 3988, 516: 3989, 644: 4449}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 3336, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 3332, 645: 4450}, + {1235, 1235, 8: 1235, 333: 1235, 338: 1235}, + // 2330 + {1234, 1234, 8: 4454, 333: 1234, 338: 4443, 785: 4453}, + {1245, 1245, 8: 1245, 333: 1245, 338: 1245}, + {1253, 1253, 333: 1253}, + {332: 3330, 763: 4455}, + {1244, 1244, 8: 1244, 333: 1244, 338: 1244}, + // 2335 + {8: 3589, 18: 1990}, + {18: 4458}, + {134: 4434, 332: 2161, 337: 2160, 371: 4435, 502: 2158, 504: 2154, 569: 4463, 617: 4461, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4462, 4460, 3295, 815: 4459}, + {332: 3330, 763: 4452, 973: 4464}, + {1257, 1257, 333: 1257}, + // 2340 + {1256, 1256, 333: 1256, 342: 721, 347: 721, 721}, + {1255, 1255, 333: 1255}, + {1254, 1254, 333: 1254, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + {1234, 1234, 8: 4454, 333: 1234, 338: 4443, 785: 4465}, + {1258, 1258, 333: 1258}, + // 2345 + {2: 953, 953, 953, 953, 953, 953, 9: 953, 953, 953, 953, 953, 953, 953, 953, 953, 19: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 351: 953, 359: 953, 503: 953, 606: 3855, 3857, 3856, 710: 3858, 759: 4467}, + {2: 1620, 1620, 1620, 1620, 1620, 1620, 9: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 19: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 351: 1620, 359: 1620, 503: 3860, 728: 4468}, + {2: 1260, 1260, 1260, 1260, 1260, 1260, 9: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 19: 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 351: 4423, 359: 1260, 893: 4469}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4470}, + {134: 829, 332: 829, 337: 829, 354: 3934, 367: 829, 371: 829, 502: 829, 504: 829, 757: 4471}, + // 2350 + {134: 4434, 332: 4427, 337: 2160, 367: 4433, 371: 4435, 502: 2158, 504: 2154, 569: 4432, 617: 4430, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4431, 4429, 3295, 815: 4428, 892: 4472}, + {1231, 1231, 333: 4474, 1073: 4473}, + {1261, 1261}, + {243: 4475}, + {423: 4476}, + // 2355 + {517: 4477}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3974, 741: 3975, 770: 4478}, + {1230, 1230, 8: 3977}, + {1265, 1265, 332: 4487, 512: 1596}, + {1266, 1266}, + // 2360 + {512: 4482}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4483, 2311, 2310}, + {1264, 1264, 332: 4484}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 4485}, + {18: 4486}, + // 2365 + {1262, 1262}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 1683, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 2306, 655: 4488}, + {18: 4489}, + {1263, 1263}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4491, 2311, 2310}, + // 2370 + {1712, 1712}, + {1713, 1713}, + {502: 1620, 3860, 728: 4528}, + {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 9: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 19: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 371: 2159, 502: 2158, 504: 2154, 512: 1549, 617: 4527, 2155, 2156, 2157}, + {1724, 1724, 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4526}, + // 2375 + {1722, 1722}, + {33: 4524}, + {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 9: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 19: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 366: 4516, 512: 1541}, + {137: 4510, 332: 2161, 337: 2160, 371: 2159, 380: 2146, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 525: 4493, 569: 4500, 609: 2133, 617: 4501, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4507, 4506, 2136, 671: 2134, 2135, 678: 2242, 683: 4508, 685: 4502, 689: 4504, 4505, 693: 4503, 725: 4509}, + {469, 469, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + // 2380 + {471, 471, 342: 721, 347: 721, 721}, + {476, 476}, + {475, 475}, + {474, 474}, + {473, 473}, + // 2385 + {472, 472}, + {470, 470}, + {468, 468}, + {1717, 1717}, + {366: 4511}, + // 2390 + {130: 4514, 229: 4513, 874: 4512}, + {332: 2161, 337: 2160, 371: 2159, 380: 2146, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 525: 4493, 569: 4500, 609: 2133, 617: 4501, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4507, 4506, 2136, 671: 2134, 2135, 678: 2242, 683: 4508, 685: 4502, 689: 4504, 4505, 693: 4503, 725: 4515}, + {332: 1715, 337: 1715, 350: 1715, 371: 1715, 380: 1715, 430: 1715, 502: 1715, 504: 1715, 517: 1715, 525: 1715, 609: 1715}, + {332: 1714, 337: 1714, 350: 1714, 371: 1714, 380: 1714, 430: 1714, 502: 1714, 504: 1714, 517: 1714, 525: 1714, 609: 1714}, + {1716, 1716}, + // 2395 + {130: 4514, 229: 4513, 335: 4517, 874: 4518}, + {332: 2161, 337: 2160, 371: 2159, 380: 2146, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 525: 4493, 569: 4500, 609: 2133, 617: 4501, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4507, 4506, 2136, 671: 2134, 2135, 678: 2242, 683: 4508, 685: 4502, 689: 4504, 4505, 693: 4503, 725: 4523}, + {332: 2161, 337: 2160, 350: 4519, 371: 2159, 380: 2146, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 525: 4493, 569: 4500, 609: 2133, 617: 4501, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 4507, 4506, 2136, 671: 2134, 2135, 678: 2242, 683: 4508, 685: 4502, 689: 4504, 4505, 693: 4503, 725: 4520}, + {33: 4521}, + {1718, 1718}, + // 2400 + {375: 2256, 595: 4522}, + {1719, 1719}, + {1720, 1720}, + {375: 2256, 595: 4525}, + {1721, 1721}, + // 2405 + {1723, 1723}, + {1725, 1725}, + {502: 4529}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4530}, + {2043, 2043, 4565, 2043, 2043, 4569, 4567, 431, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 54: 4560, 94: 4544, 120: 4540, 129: 4537, 156: 4542, 166: 4547, 168: 4548, 178: 4557, 196: 4539, 204: 4543, 211: 4549, 215: 4545, 221: 4558, 4559, 337: 4556, 339: 4564, 342: 4593, 1842, 353: 4561, 2043, 357: 4546, 370: 1842, 429: 4536, 446: 4534, 505: 1842, 509: 4572, 511: 4555, 525: 4551, 527: 4538, 531: 4535, 4532, 535: 4552, 539: 4541, 546: 4550, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 4596, 719: 4554, 732: 4553, 807: 4533, 823: 4563, 990: 4562, 4531}, + // 2410 + {1840, 1840, 3: 5238, 5239, 354: 5240, 921: 5237, 992: 5236}, + {354: 5234}, + {2114, 2114, 4565, 2114, 2114, 4569, 4567, 431, 2114, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 339: 4564, 342: 4593, 1842, 354: 2114, 370: 1842, 505: 1842, 509: 4572, 511: 5230, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 5231}, + {510: 5222}, + {2: 2048, 2048, 2048, 2048, 2048, 2048, 9: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 354: 5092, 423: 2037, 429: 2037, 433: 2037, 438: 2037, 4882, 509: 2037, 530: 2037, 533: 2037, 2037, 684: 5093, 696: 4712, 724: 5090, 743: 5091}, + // 2415 + {354: 5088}, + {354: 5085}, + {2: 2048, 2048, 2048, 2048, 2048, 2048, 9: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 354: 5071, 423: 3965, 429: 4713, 433: 5070, 439: 4714, 509: 3966, 533: 5073, 665: 5072, 696: 4712, 724: 5069, 834: 5074}, + {354: 5058}, + {354: 5056}, + // 2420 + {354: 5053}, + {354: 5050}, + {23: 5047, 354: 5046}, + {23: 5043, 354: 5042}, + {354: 5037}, + // 2425 + {522: 5030}, + {787: 5029}, + {787: 5028}, + {2: 2048, 2048, 2048, 2048, 2048, 2048, 9: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 696: 4712, 724: 5025}, + {2: 2048, 2048, 2048, 2048, 2048, 2048, 9: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 696: 4712, 724: 4738}, + // 2430 + {2: 2048, 2048, 2048, 2048, 2048, 2048, 9: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 19: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 429: 4713, 439: 4714, 509: 4711, 696: 4712, 724: 4709, 834: 4710}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 338: 4698, 359: 1731, 366: 4598, 423: 3965, 509: 3966, 4696, 597: 4697, 665: 4699, 696: 4695}, + {2077, 2077, 3: 2077, 2077, 8: 2077, 354: 2077}, + {2076, 2076, 3: 2076, 2076, 8: 2076, 354: 2076}, + {2075, 2075, 3: 2075, 2075, 7: 430, 2075, 354: 2075}, + // 2435 + {161: 4694}, + {161: 4693}, + {2072, 2072, 3: 2072, 2072, 8: 2072, 354: 2072}, + {2071, 2071, 3: 2071, 2071, 8: 2071, 354: 2071}, + {109: 1731, 190: 1731, 206: 1731, 1731, 339: 1731, 366: 4598, 597: 4687}, + // 2440 + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 339: 1731, 366: 4598, 597: 4684}, + {2042, 2042, 3: 2042, 2042, 8: 4682, 354: 2042}, + {2041, 2041, 3: 2041, 2041, 8: 2041, 354: 2041}, + {15: 1841, 1841, 343: 1841, 370: 1841, 505: 1841}, + {335: 1731, 366: 4598, 597: 4680}, + // 2445 + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 4678}, + {17: 4673, 153: 4674, 194: 4675}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 4671}, + {335: 1731, 366: 4598, 597: 4669}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 4667}, + // 2450 + {193: 4664}, + {193: 4661}, + {366: 4598, 375: 1731, 597: 4659}, + {366: 4598, 375: 1731, 597: 4657}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 597: 4655}, + // 2455 + {366: 4598, 375: 1731, 597: 4653}, + {456, 456, 456, 456, 456, 456, 456, 456, 456, 14: 456, 456, 456, 456, 19: 456, 456, 456, 456, 456, 29: 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 332: 456, 337: 456, 456, 456, 342: 456, 456, 354: 456, 370: 456, 456, 380: 456, 502: 456, 456, 456, 456, 509: 456, 511: 456}, + {16: 3249, 343: 4648, 370: 3250, 505: 3248, 628: 4647}, + {7: 4644}, + {366: 4598, 375: 1731, 597: 4642}, + // 2460 + {335: 1731, 366: 4598, 597: 4640}, + {366: 4598, 375: 1731, 597: 4638}, + {335: 1731, 366: 4598, 597: 4636}, + {335: 1731, 366: 4598, 597: 4634}, + {366: 4598, 375: 1731, 597: 4632}, + // 2465 + {366: 4598, 375: 1731, 597: 4630}, + {445, 445, 445, 445, 445, 445, 445, 445, 445, 14: 445, 445, 445, 445, 19: 445, 445, 445, 445, 445, 29: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 332: 445, 337: 445, 445, 445, 342: 445, 445, 354: 445, 370: 445, 445, 380: 445, 502: 445, 445, 445, 445, 509: 445, 511: 445}, + {339: 1731, 366: 4598, 375: 1731, 597: 4628}, + {339: 1731, 366: 4598, 375: 1731, 597: 4625}, + {339: 1731, 366: 4598, 375: 1731, 597: 4622}, + // 2470 + {339: 1731, 366: 4598, 375: 1731, 597: 4618}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 349: 1731, 366: 4598, 597: 4615}, + {332: 1731, 366: 4598, 597: 4611}, + {335: 1731, 366: 4598, 597: 4608}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 4606}, + // 2475 + {425, 425, 425, 425, 425, 425, 425, 425, 425, 14: 425, 425, 425, 425, 19: 425, 425, 425, 425, 425, 29: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 332: 425, 337: 425, 425, 425, 342: 425, 425, 354: 425, 370: 425, 425, 380: 425, 502: 425, 425, 425, 425, 509: 425, 511: 425}, + {150: 1731, 167: 1731, 187: 1731, 1731, 216: 1731, 339: 1731, 366: 4598, 597: 4599}, + {2: 1730, 1730, 1730, 1730, 1730, 1730, 9: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 19: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 335: 1730, 339: 1730, 349: 1730, 359: 1730, 375: 1730, 400: 1730}, + {150: 4602, 167: 4601, 187: 4605, 4603, 216: 4604, 339: 4600}, + {419, 419, 419, 419, 419, 419, 419, 419, 419, 14: 419, 419, 419, 419, 19: 419, 419, 419, 419, 419, 29: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 332: 419, 337: 419, 419, 419, 342: 419, 419, 354: 419, 370: 419, 419, 380: 419, 502: 419, 419, 419, 419, 509: 419, 511: 419}, + // 2480 + {418, 418, 418, 418, 418, 418, 418, 418, 418, 14: 418, 418, 418, 418, 19: 418, 418, 418, 418, 418, 29: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 332: 418, 337: 418, 418, 418, 342: 418, 418, 354: 418, 370: 418, 418, 380: 418, 502: 418, 418, 418, 418, 509: 418, 511: 418}, + {417, 417, 417, 417, 417, 417, 417, 417, 417, 14: 417, 417, 417, 417, 19: 417, 417, 417, 417, 417, 29: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 332: 417, 337: 417, 417, 417, 342: 417, 417, 354: 417, 370: 417, 417, 380: 417, 502: 417, 417, 417, 417, 509: 417, 511: 417}, + {416, 416, 416, 416, 416, 416, 416, 416, 416, 14: 416, 416, 416, 416, 19: 416, 416, 416, 416, 416, 29: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 332: 416, 337: 416, 416, 416, 342: 416, 416, 354: 416, 370: 416, 416, 380: 416, 502: 416, 416, 416, 416, 509: 416, 511: 416}, + {415, 415, 415, 415, 415, 415, 415, 415, 415, 14: 415, 415, 415, 415, 19: 415, 415, 415, 415, 415, 29: 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 332: 415, 337: 415, 415, 415, 342: 415, 415, 354: 415, 370: 415, 415, 380: 415, 502: 415, 415, 415, 415, 509: 415, 511: 415}, + {414, 414, 414, 414, 414, 414, 414, 414, 414, 14: 414, 414, 414, 414, 19: 414, 414, 414, 414, 414, 29: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 332: 414, 337: 414, 414, 414, 342: 414, 414, 354: 414, 370: 414, 414, 380: 414, 502: 414, 414, 414, 414, 509: 414, 511: 414}, + // 2485 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 4607}, + {432, 432, 432, 432, 432, 432, 432, 432, 432, 14: 432, 432, 432, 432, 19: 432, 432, 432, 432, 432, 29: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 332: 432, 337: 432, 432, 432, 342: 432, 432, 354: 432, 370: 432, 432, 380: 432, 502: 432, 432, 432, 432, 509: 432, 511: 432}, + {335: 4610, 870: 4609}, + {433, 433, 433, 433, 433, 433, 433, 433, 433, 14: 433, 433, 433, 433, 19: 433, 433, 433, 433, 433, 29: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 332: 433, 337: 433, 433, 433, 342: 433, 433, 354: 433, 370: 433, 433, 380: 433, 502: 433, 433, 433, 433, 509: 433, 511: 433}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 14: 4, 4, 4, 4, 19: 4, 4, 4, 4, 4, 29: 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 332: 4, 337: 4, 4, 4, 342: 4, 4, 354: 4, 370: 4, 4, 380: 4, 502: 4, 4, 4, 4, 509: 4, 511: 4, 518: 4}, + // 2490 + {332: 4612}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 551, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 4040, 964: 4613}, + {18: 4614}, + {434, 434, 434, 434, 434, 434, 434, 434, 434, 14: 434, 434, 434, 434, 19: 434, 434, 434, 434, 434, 29: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 332: 434, 337: 434, 434, 434, 342: 434, 434, 354: 434, 370: 434, 434, 380: 434, 502: 434, 434, 434, 434, 509: 434, 511: 434}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 349: 4616, 506: 2901, 2311, 2310, 596: 4617}, + // 2495 + {436, 436, 436, 436, 436, 436, 436, 436, 436, 14: 436, 436, 436, 436, 19: 436, 436, 436, 436, 436, 29: 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 332: 436, 337: 436, 436, 436, 342: 436, 436, 354: 436, 370: 436, 436, 380: 436, 502: 436, 436, 436, 436, 509: 436, 511: 436}, + {435, 435, 435, 435, 435, 435, 435, 435, 435, 14: 435, 435, 435, 435, 19: 435, 435, 435, 435, 435, 29: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 332: 435, 337: 435, 435, 435, 342: 435, 435, 354: 435, 370: 435, 435, 380: 435, 502: 435, 435, 435, 435, 509: 435, 511: 435}, + {339: 4620, 375: 2256, 595: 3228, 613: 4621, 957: 4619}, + {439, 439, 439, 439, 439, 439, 439, 439, 439, 14: 439, 439, 439, 439, 19: 439, 439, 439, 439, 439, 29: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 332: 439, 337: 439, 439, 439, 342: 439, 439, 354: 439, 370: 439, 439, 380: 439, 502: 439, 439, 439, 439, 509: 439, 511: 439}, + {429, 429, 429, 429, 429, 429, 429, 429, 429, 14: 429, 429, 429, 429, 19: 429, 429, 429, 429, 429, 29: 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 332: 429, 337: 429, 429, 429, 342: 429, 429, 354: 429, 370: 429, 429, 380: 429, 502: 429, 429, 429, 429, 509: 429, 511: 429}, + // 2500 + {428, 428, 428, 428, 428, 428, 428, 428, 428, 14: 428, 428, 428, 428, 19: 428, 428, 428, 428, 428, 29: 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 332: 428, 337: 428, 428, 428, 342: 428, 428, 354: 428, 370: 428, 428, 380: 428, 502: 428, 428, 428, 428, 509: 428, 511: 428}, + {339: 4624, 375: 2256, 595: 3228, 613: 4623}, + {441, 441, 441, 441, 441, 441, 441, 441, 441, 14: 441, 441, 441, 441, 19: 441, 441, 441, 441, 441, 29: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 332: 441, 337: 441, 441, 441, 342: 441, 441, 354: 441, 370: 441, 441, 380: 441, 502: 441, 441, 441, 441, 509: 441, 511: 441}, + {440, 440, 440, 440, 440, 440, 440, 440, 440, 14: 440, 440, 440, 440, 19: 440, 440, 440, 440, 440, 29: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 332: 440, 337: 440, 440, 440, 342: 440, 440, 354: 440, 370: 440, 440, 380: 440, 502: 440, 440, 440, 440, 509: 440, 511: 440}, + {339: 4627, 375: 2256, 595: 3228, 613: 4626}, + // 2505 + {443, 443, 443, 443, 443, 443, 443, 443, 443, 14: 443, 443, 443, 443, 19: 443, 443, 443, 443, 443, 29: 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 332: 443, 337: 443, 443, 443, 342: 443, 443, 354: 443, 370: 443, 443, 380: 443, 502: 443, 443, 443, 443, 509: 443, 511: 443}, + {442, 442, 442, 442, 442, 442, 442, 442, 442, 14: 442, 442, 442, 442, 19: 442, 442, 442, 442, 442, 29: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 332: 442, 337: 442, 442, 442, 342: 442, 442, 354: 442, 370: 442, 442, 380: 442, 502: 442, 442, 442, 442, 509: 442, 511: 442}, + {339: 4620, 375: 2256, 595: 3228, 613: 4621, 957: 4629}, + {444, 444, 444, 444, 444, 444, 444, 444, 444, 14: 444, 444, 444, 444, 19: 444, 444, 444, 444, 444, 29: 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 332: 444, 337: 444, 444, 444, 342: 444, 444, 354: 444, 370: 444, 444, 380: 444, 502: 444, 444, 444, 444, 509: 444, 511: 444}, + {375: 2256, 595: 3228, 613: 4631}, + // 2510 + {446, 446, 446, 446, 446, 446, 446, 446, 446, 14: 446, 446, 446, 446, 19: 446, 446, 446, 446, 446, 29: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 332: 446, 337: 446, 446, 446, 342: 446, 446, 354: 446, 370: 446, 446, 380: 446, 502: 446, 446, 446, 446, 509: 446, 511: 446}, + {375: 2256, 595: 3228, 613: 4633}, + {447, 447, 447, 447, 447, 447, 447, 447, 447, 14: 447, 447, 447, 447, 19: 447, 447, 447, 447, 447, 29: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 332: 447, 337: 447, 447, 447, 342: 447, 447, 354: 447, 370: 447, 447, 380: 447, 502: 447, 447, 447, 447, 509: 447, 511: 447}, + {335: 4635}, + {448, 448, 448, 448, 448, 448, 448, 448, 448, 14: 448, 448, 448, 448, 19: 448, 448, 448, 448, 448, 29: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 332: 448, 337: 448, 448, 448, 342: 448, 448, 354: 448, 370: 448, 448, 380: 448, 502: 448, 448, 448, 448, 509: 448, 511: 448}, + // 2515 + {335: 4637}, + {449, 449, 449, 449, 449, 449, 449, 449, 449, 14: 449, 449, 449, 449, 19: 449, 449, 449, 449, 449, 29: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 332: 449, 337: 449, 449, 449, 342: 449, 449, 354: 449, 370: 449, 449, 380: 449, 502: 449, 449, 449, 449, 509: 449, 511: 449}, + {375: 2256, 595: 3228, 613: 4639}, + {450, 450, 450, 450, 450, 450, 450, 450, 450, 14: 450, 450, 450, 450, 19: 450, 450, 450, 450, 450, 29: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 332: 450, 337: 450, 450, 450, 342: 450, 450, 354: 450, 370: 450, 450, 380: 450, 502: 450, 450, 450, 450, 509: 450, 511: 450}, + {335: 4641}, + // 2520 + {451, 451, 451, 451, 451, 451, 451, 451, 451, 14: 451, 451, 451, 451, 19: 451, 451, 451, 451, 451, 29: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 332: 451, 337: 451, 451, 451, 342: 451, 451, 354: 451, 370: 451, 451, 380: 451, 502: 451, 451, 451, 451, 509: 451, 511: 451}, + {375: 2256, 595: 3228, 613: 4643}, + {452, 452, 452, 452, 452, 452, 452, 452, 452, 14: 452, 452, 452, 452, 19: 452, 452, 452, 452, 452, 29: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 332: 452, 337: 452, 452, 452, 342: 452, 452, 354: 452, 370: 452, 452, 380: 452, 502: 452, 452, 452, 452, 509: 452, 511: 452}, + {366: 4598, 375: 1731, 597: 4645}, + {375: 2256, 595: 3228, 613: 4646}, + // 2525 + {453, 453, 453, 453, 453, 453, 453, 453, 453, 14: 453, 453, 453, 453, 19: 453, 453, 453, 453, 453, 29: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 332: 453, 337: 453, 453, 453, 342: 453, 453, 354: 453, 370: 453, 453, 380: 453, 502: 453, 453, 453, 453, 509: 453, 511: 453}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 400: 1731, 597: 4651}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 400: 1731, 597: 4649}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 2899, 506: 2901, 2311, 2310, 596: 2898, 723: 4650}, + {454, 454, 454, 454, 454, 454, 454, 454, 454, 14: 454, 454, 454, 454, 19: 454, 454, 454, 454, 454, 29: 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 332: 454, 337: 454, 454, 454, 342: 454, 454, 354: 454, 370: 454, 454, 380: 454, 502: 454, 454, 454, 454, 509: 454, 511: 454}, + // 2530 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 4652}, + {455, 455, 455, 455, 455, 455, 455, 455, 455, 14: 455, 455, 455, 455, 19: 455, 455, 455, 455, 455, 29: 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 332: 455, 337: 455, 455, 455, 342: 455, 455, 354: 455, 370: 455, 455, 380: 455, 502: 455, 455, 455, 455, 509: 455, 511: 455}, + {375: 2256, 595: 3228, 613: 4654}, + {1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 14: 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 29: 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 332: 1798, 337: 1798, 1798, 1798, 342: 1798, 1798, 354: 1798, 370: 1798, 1798, 380: 1798, 502: 1798, 1798, 1798, 1798, 509: 1798, 511: 1798}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4656, 2311, 2310}, + // 2535 + {1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 14: 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 29: 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 332: 1799, 337: 1799, 1799, 1799, 342: 1799, 1799, 354: 1799, 370: 1799, 1799, 380: 1799, 502: 1799, 1799, 1799, 1799, 509: 1799, 511: 1799}, + {375: 2256, 595: 3228, 613: 4658}, + {1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 14: 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 29: 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 332: 1800, 337: 1800, 1800, 1800, 342: 1800, 1800, 354: 1800, 370: 1800, 1800, 380: 1800, 502: 1800, 1800, 1800, 1800, 509: 1800, 511: 1800}, + {375: 2256, 595: 3228, 613: 4660}, + {1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 14: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 29: 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801, 332: 1801, 337: 1801, 1801, 1801, 342: 1801, 1801, 354: 1801, 370: 1801, 1801, 380: 1801, 502: 1801, 1801, 1801, 1801, 509: 1801, 511: 1801}, + // 2540 + {335: 1731, 366: 4598, 597: 4662}, + {335: 4663}, + {1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 14: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 29: 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 332: 1802, 337: 1802, 1802, 1802, 342: 1802, 1802, 354: 1802, 370: 1802, 1802, 380: 1802, 502: 1802, 1802, 1802, 1802, 509: 1802, 511: 1802}, + {335: 1731, 366: 4598, 597: 4665}, + {335: 4666}, + // 2545 + {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 14: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 29: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 332: 1803, 337: 1803, 1803, 1803, 342: 1803, 1803, 354: 1803, 370: 1803, 1803, 380: 1803, 502: 1803, 1803, 1803, 1803, 509: 1803, 511: 1803}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 4668}, + {1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 14: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 29: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 332: 1804, 337: 1804, 1804, 1804, 342: 1804, 1804, 354: 1804, 370: 1804, 1804, 380: 1804, 502: 1804, 1804, 1804, 1804, 509: 1804, 511: 1804}, + {335: 4670}, + {1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 14: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 29: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 332: 1805, 337: 1805, 1805, 1805, 342: 1805, 1805, 354: 1805, 370: 1805, 1805, 380: 1805, 502: 1805, 1805, 1805, 1805, 509: 1805, 511: 1805}, + // 2550 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 4672}, + {1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 14: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 29: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 332: 1806, 337: 1806, 1806, 1806, 342: 1806, 1806, 354: 1806, 370: 1806, 1806, 380: 1806, 502: 1806, 1806, 1806, 1806, 509: 1806, 511: 1806}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 4676}, + {438, 438, 438, 438, 438, 438, 438, 438, 438, 14: 438, 438, 438, 438, 19: 438, 438, 438, 438, 438, 29: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 332: 438, 337: 438, 438, 438, 342: 438, 438, 354: 438, 370: 438, 438, 380: 438, 502: 438, 438, 438, 438, 509: 438, 511: 438}, + {437, 437, 437, 437, 437, 437, 437, 437, 437, 14: 437, 437, 437, 437, 19: 437, 437, 437, 437, 437, 29: 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 332: 437, 337: 437, 437, 437, 342: 437, 437, 354: 437, 370: 437, 437, 380: 437, 502: 437, 437, 437, 437, 509: 437, 511: 437}, + // 2555 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 4677}, + {1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 14: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 29: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 332: 1807, 337: 1807, 1807, 1807, 342: 1807, 1807, 354: 1807, 370: 1807, 1807, 380: 1807, 502: 1807, 1807, 1807, 1807, 509: 1807, 511: 1807}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 4679}, + {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 14: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 29: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 332: 1808, 337: 1808, 1808, 1808, 342: 1808, 1808, 354: 1808, 370: 1808, 1808, 380: 1808, 502: 1808, 1808, 1808, 1808, 509: 1808, 511: 1808}, + {335: 4681}, + // 2560 + {1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 14: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 29: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 332: 1809, 337: 1809, 1809, 1809, 342: 1809, 1809, 354: 1809, 370: 1809, 1809, 380: 1809, 502: 1809, 1809, 1809, 1809, 509: 1809, 511: 1809}, + {2: 4565, 5: 4569, 4567, 431, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 54: 4560, 94: 4544, 120: 4540, 129: 4537, 156: 4542, 166: 4547, 168: 4548, 178: 4557, 196: 4539, 204: 4543, 211: 4549, 215: 4545, 221: 4558, 4559, 337: 4556, 339: 4564, 342: 4593, 1842, 353: 4561, 357: 4546, 370: 1842, 429: 4536, 446: 4534, 505: 1842, 509: 4572, 511: 4555, 525: 4551, 527: 4538, 531: 4535, 535: 4552, 539: 4541, 546: 4550, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 4596, 719: 4554, 732: 4553, 807: 4533, 823: 4683}, + {2040, 2040, 3: 2040, 2040, 8: 2040, 354: 2040}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 339: 4685, 506: 4686, 2311, 2310}, + {2054, 2054, 3: 2054, 2054, 8: 2054, 54: 2054, 354: 2054}, + // 2565 + {2053, 2053, 3: 2053, 2053, 8: 2053, 54: 2053, 354: 2053}, + {109: 4692, 190: 4689, 206: 4690, 4691, 339: 4688}, + {2059, 2059, 3: 2059, 2059, 8: 2059, 353: 2059, 2059}, + {2058, 2058, 3: 2058, 2058, 8: 2058, 353: 2058, 2058}, + {2057, 2057, 3: 2057, 2057, 8: 2057, 353: 2057, 2057}, + // 2570 + {2056, 2056, 3: 2056, 2056, 8: 2056, 353: 2056, 2056}, + {2055, 2055, 3: 2055, 2055, 8: 2055, 353: 2055, 2055}, + {2073, 2073, 3: 2073, 2073, 8: 2073, 354: 2073}, + {2074, 2074, 3: 2074, 2074, 8: 2074, 354: 2074}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4706, 2311, 2310}, + // 2575 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4705}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4704}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4703}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4700, 2311, 2310}, + {510: 4701}, + // 2580 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4702, 2311, 2310}, + {2078, 2078, 3: 2078, 2078, 8: 2078, 354: 2078}, + {2079, 2079, 3: 2079, 2079, 8: 2079, 354: 2079}, + {2080, 2080, 3: 2080, 2080, 8: 2080, 354: 2080}, + {2081, 2081, 3: 2081, 2081, 8: 2081, 354: 2081}, + // 2585 + {510: 4707}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4708, 2311, 2310}, + {2082, 2082, 3: 2082, 2082, 8: 2082, 354: 2082}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4724}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4719, 2311, 2310}, + // 2590 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 4715, 2311, 2310}, + {2: 2047, 2047, 2047, 2047, 2047, 2047, 9: 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 19: 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047}, + {2: 464, 464, 464, 464, 464, 464, 9: 464, 464, 464, 464, 464, 464, 464, 464, 464, 19: 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464}, + {2: 463, 463, 463, 463, 463, 463, 9: 463, 463, 463, 463, 463, 463, 463, 463, 463, 19: 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463}, + {55: 4718, 4717, 687: 4716}, + // 2595 + {2068, 2068, 3: 2068, 2068, 8: 2068, 354: 2068}, + {1598, 1598, 1598, 1598, 1598, 1598, 8: 1598, 18: 1598, 22: 1598, 53: 1598, 1598, 1598, 1598, 337: 1598, 353: 1598, 1598, 361: 1598}, + {1597, 1597, 1597, 1597, 1597, 1597, 8: 1597, 18: 1597, 22: 1597, 53: 1597, 1597, 1597, 1597, 337: 1597, 353: 1597, 1597, 361: 1597}, + {122: 4721, 334: 3528, 336: 3527, 666: 4722, 778: 4720}, + {2070, 2070, 3: 2070, 2070, 8: 2070, 354: 2070}, + // 2600 + {1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 18: 1971, 333: 1971, 1971, 336: 1971, 338: 1971, 1971, 343: 1971, 349: 1971, 354: 1971, 423: 1971, 429: 1971, 433: 1971, 438: 1971, 1971, 445: 1971, 454: 1971}, + {122: 4723}, + {1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 18: 1970, 333: 1970, 1970, 336: 1970, 338: 1970, 1970, 343: 1970, 349: 1970, 354: 1970, 423: 1970, 429: 1970, 433: 1970, 438: 1970, 1970, 445: 1970, 454: 1970}, + {367: 4725, 527: 4726}, + {339: 4728}, + // 2605 + {339: 4727}, + {2083, 2083, 3: 2083, 2083, 8: 2083, 354: 2083}, + {332: 4730, 335: 2649, 344: 4732, 4733, 349: 2640, 375: 2644, 426: 2647, 2648, 436: 2643, 2642, 441: 2639, 443: 2641, 455: 2646, 573: 4731, 2645, 803: 4729}, + {2085, 2085, 3: 2085, 2085, 8: 2085, 354: 2085}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4736}, + // 2610 + {1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 18: 1882, 333: 1882, 1882, 336: 1882, 338: 1882, 1882, 343: 1882, 349: 1882, 354: 1882, 423: 1882, 429: 1882, 433: 1882, 438: 1882, 1882, 445: 1882, 454: 1882}, + {375: 2833, 436: 2835, 2834, 709: 4735}, + {375: 2833, 436: 2835, 2834, 709: 4734}, + {1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 18: 1880, 333: 1880, 1880, 336: 1880, 338: 1880, 1880, 343: 1880, 349: 1880, 354: 1880, 423: 1880, 429: 1880, 433: 1880, 438: 1880, 1880, 445: 1880, 454: 1880}, + {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 18: 1881, 333: 1881, 1881, 336: 1881, 338: 1881, 1881, 343: 1881, 349: 1881, 354: 1881, 423: 1881, 429: 1881, 433: 1881, 438: 1881, 1881, 445: 1881, 454: 1881}, + // 2615 + {18: 4737, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {2084, 2084, 3: 2084, 2084, 8: 2084, 354: 2084}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4739}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4741, 697: 4740}, + {2046, 2046, 3: 2046, 2046, 8: 2046, 5022, 5023, 354: 2046, 773: 5021}, + // 2620 + {11: 4743, 62: 4802, 88: 4803, 108: 4812, 116: 4815, 130: 4785, 133: 4814, 136: 4813, 138: 4788, 4789, 141: 4790, 4791, 4792, 145: 4793, 4794, 150: 4768, 183: 4765, 237: 4774, 4764, 245: 4783, 250: 4787, 266: 4798, 4797, 271: 4801, 294: 4809, 367: 4784, 370: 4796, 400: 4779, 505: 4795, 536: 4766, 4771, 4769, 540: 4770, 4800, 4799, 4762, 4756, 547: 4780, 4763, 4805, 4772, 4773, 4757, 4758, 4759, 4760, 4761, 4786, 4807, 4811, 4806, 4754, 4810, 4755, 4767, 4753, 4804, 4752, 4808, 722: 4775, 974: 4777, 1002: 4751, 4781, 4748, 1021: 4746, 1033: 4749, 4750, 1051: 4747, 1068: 4776, 1070: 4744, 4778, 1122: 4745, 1132: 4782, 1136: 4742, 1157: 4816}, + {1934, 1934, 4893, 1934, 1934, 4900, 4899, 4887, 1934, 1934, 1934, 4891, 4898, 4901, 18: 1934, 333: 4892, 3528, 336: 3527, 338: 1941, 4890, 343: 4897, 349: 4886, 354: 1934, 423: 1975, 429: 2037, 433: 4884, 438: 4889, 4882, 445: 4905, 454: 4902, 666: 4885, 684: 4894, 760: 4896, 772: 4903, 780: 4895, 793: 4888, 837: 4904, 5020}, + {1934, 1934, 4893, 1934, 1934, 4900, 4899, 4887, 1934, 1934, 1934, 4891, 4898, 4901, 18: 1934, 333: 4892, 3528, 336: 3527, 338: 1941, 4890, 343: 4897, 349: 4886, 354: 1934, 423: 1975, 429: 2037, 433: 4884, 438: 4889, 4882, 445: 4905, 454: 4902, 666: 4885, 684: 4894, 760: 4896, 772: 4903, 780: 4895, 793: 4888, 837: 4904, 4883}, + {413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 18: 413, 333: 413, 413, 336: 413, 338: 413, 413, 343: 413, 349: 413, 354: 413, 423: 413, 429: 413, 433: 413, 438: 413, 413, 445: 413, 454: 413}, + {412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 18: 412, 333: 412, 412, 336: 412, 338: 412, 412, 343: 412, 349: 412, 354: 412, 423: 412, 429: 412, 433: 412, 438: 412, 412, 445: 412, 454: 412}, + // 2625 + {411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 18: 411, 333: 411, 411, 336: 411, 338: 411, 411, 343: 411, 349: 411, 354: 411, 423: 411, 429: 411, 433: 411, 438: 411, 411, 445: 411, 454: 411}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 44: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 599: 317, 317, 611: 3240, 640: 4880}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 18: 312, 44: 312, 333: 312, 312, 336: 312, 338: 312, 312, 343: 312, 349: 312, 354: 312, 423: 312, 429: 312, 433: 312, 438: 312, 312, 445: 312, 454: 312, 599: 312, 312, 727: 4879}, + {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 18: 310, 44: 310, 332: 3225, 310, 310, 336: 310, 338: 310, 310, 343: 310, 349: 310, 354: 310, 423: 310, 429: 310, 433: 310, 438: 310, 310, 445: 310, 454: 310, 599: 310, 310, 611: 3226, 745: 4877, 758: 3227}, + {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 18: 310, 44: 310, 332: 3225, 310, 310, 336: 310, 338: 310, 310, 343: 310, 349: 310, 354: 310, 423: 310, 429: 310, 433: 310, 438: 310, 310, 445: 310, 454: 310, 599: 310, 310, 611: 3226, 745: 4875, 758: 3227}, + // 2630 + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4874}, + {405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 18: 405, 44: 405, 332: 405, 405, 405, 336: 405, 338: 405, 405, 343: 405, 349: 405, 354: 405, 423: 405, 429: 405, 433: 405, 438: 405, 405, 445: 405, 454: 405, 599: 405, 405}, + {404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 18: 404, 44: 404, 332: 404, 404, 404, 336: 404, 338: 404, 404, 343: 404, 349: 404, 354: 404, 423: 404, 429: 404, 433: 404, 438: 404, 404, 445: 404, 454: 404, 599: 404, 404}, + {403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 18: 403, 44: 403, 332: 403, 403, 403, 336: 403, 338: 403, 403, 343: 403, 349: 403, 354: 403, 423: 403, 429: 403, 433: 403, 438: 403, 403, 445: 403, 454: 403, 599: 403, 403}, + {402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 18: 402, 44: 402, 332: 402, 402, 402, 336: 402, 338: 402, 402, 343: 402, 349: 402, 354: 402, 423: 402, 429: 402, 433: 402, 438: 402, 402, 445: 402, 454: 402, 599: 402, 402}, + // 2635 + {401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 18: 401, 44: 401, 332: 401, 401, 401, 336: 401, 338: 401, 401, 343: 401, 349: 401, 354: 401, 423: 401, 429: 401, 433: 401, 438: 401, 401, 445: 401, 454: 401, 599: 401, 401}, + {400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 18: 400, 44: 400, 332: 400, 400, 400, 336: 400, 338: 400, 400, 343: 400, 349: 400, 354: 400, 423: 400, 429: 400, 433: 400, 438: 400, 400, 445: 400, 454: 400, 599: 400, 400}, + {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 18: 399, 44: 399, 332: 399, 399, 399, 336: 399, 338: 399, 399, 343: 399, 349: 399, 354: 399, 423: 399, 429: 399, 433: 399, 438: 399, 399, 445: 399, 454: 399, 599: 399, 399}, + {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 18: 398, 44: 398, 332: 398, 398, 398, 336: 398, 338: 398, 398, 343: 398, 349: 398, 354: 398, 423: 398, 429: 398, 433: 398, 438: 398, 398, 445: 398, 454: 398, 599: 398, 398}, + {397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 18: 397, 44: 397, 332: 397, 397, 397, 336: 397, 338: 397, 397, 343: 397, 349: 397, 354: 397, 423: 397, 429: 397, 433: 397, 438: 397, 397, 445: 397, 454: 397, 599: 397, 397}, + // 2640 + {396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 18: 396, 44: 396, 332: 396, 396, 396, 336: 396, 338: 396, 396, 343: 396, 349: 396, 354: 396, 423: 396, 429: 396, 433: 396, 438: 396, 396, 445: 396, 454: 396, 599: 396, 396}, + {395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 18: 395, 44: 395, 332: 395, 395, 395, 336: 395, 338: 395, 395, 343: 395, 349: 395, 354: 395, 423: 395, 429: 395, 433: 395, 438: 395, 395, 445: 395, 454: 395, 599: 395, 395}, + {394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 18: 394, 44: 394, 332: 394, 394, 394, 336: 394, 338: 394, 394, 343: 394, 349: 394, 354: 394, 423: 394, 429: 394, 433: 394, 438: 394, 394, 445: 394, 454: 394, 599: 394, 394}, + {393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 18: 393, 44: 393, 333: 393, 393, 336: 393, 338: 393, 393, 343: 393, 349: 393, 354: 393, 423: 393, 429: 393, 433: 393, 438: 393, 393, 445: 393, 454: 393, 599: 393, 393}, + {392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 18: 392, 44: 392, 333: 392, 392, 336: 392, 338: 392, 392, 343: 392, 349: 392, 354: 392, 423: 392, 429: 392, 433: 392, 438: 392, 392, 445: 392, 454: 392, 599: 392, 392}, + // 2645 + {388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 18: 388, 44: 388, 332: 388, 388, 388, 336: 388, 338: 388, 388, 343: 388, 349: 388, 354: 388, 423: 388, 429: 388, 433: 388, 438: 388, 388, 445: 388, 454: 388, 599: 388, 388}, + {387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 18: 387, 44: 387, 332: 387, 387, 387, 336: 387, 338: 387, 387, 343: 387, 349: 387, 354: 387, 423: 387, 429: 387, 433: 387, 438: 387, 387, 445: 387, 454: 387, 599: 387, 387}, + {386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 18: 386, 44: 386, 332: 386, 386, 386, 336: 386, 338: 386, 386, 343: 386, 349: 386, 354: 386, 423: 386, 429: 386, 433: 386, 438: 386, 386, 445: 386, 454: 386, 599: 386, 386}, + {385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 18: 385, 44: 385, 332: 385, 385, 385, 336: 385, 338: 385, 385, 343: 385, 349: 385, 354: 385, 423: 385, 429: 385, 433: 385, 438: 385, 385, 445: 385, 454: 385, 599: 385, 385}, + {384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 18: 384, 44: 384, 332: 384, 384, 384, 336: 384, 338: 384, 384, 343: 384, 349: 384, 354: 384, 423: 384, 429: 384, 433: 384, 438: 384, 384, 445: 384, 454: 384, 599: 384, 384}, + // 2650 + {383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 18: 383, 44: 383, 332: 383, 383, 383, 336: 383, 338: 383, 383, 343: 383, 349: 383, 354: 383, 423: 383, 429: 383, 433: 383, 438: 383, 383, 445: 383, 454: 383, 599: 383, 383, 1090: 4873}, + {381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 18: 381, 44: 381, 332: 381, 381, 381, 336: 381, 338: 381, 381, 343: 381, 349: 381, 354: 381, 423: 381, 429: 381, 433: 381, 438: 381, 381, 445: 381, 454: 381, 599: 381, 381}, + {380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 18: 380, 44: 380, 332: 380, 380, 380, 336: 380, 338: 380, 380, 343: 380, 349: 380, 354: 380, 423: 380, 429: 380, 433: 380, 438: 380, 380, 445: 380, 454: 380, 599: 380, 380}, + {379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 18: 379, 332: 379, 379, 379, 336: 379, 338: 379, 379, 343: 379, 349: 379, 354: 379, 423: 379, 429: 379, 433: 379, 438: 379, 379, 445: 379, 454: 379}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 332: 3239, 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 611: 4870, 628: 3247, 647: 4871}, + // 2655 + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 332: 3239, 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 611: 4867, 628: 3247, 647: 4868}, + {332: 3239, 611: 4865}, + {332: 3239, 611: 4863}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4862}, + {332: 3239, 611: 4861}, + // 2660 + {370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 18: 370, 333: 370, 370, 336: 370, 338: 370, 370, 343: 370, 349: 370, 354: 370, 423: 370, 429: 370, 433: 370, 438: 370, 370, 445: 370, 454: 370}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 58: 4845, 63: 4847, 4846, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4844, 733: 4860}, + {332: 4856}, + {332: 4849}, + {366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 18: 366, 333: 366, 366, 336: 366, 338: 366, 366, 343: 366, 349: 366, 354: 366, 423: 366, 429: 366, 433: 366, 438: 366, 366, 445: 366, 454: 366}, + // 2665 + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 58: 4845, 63: 4847, 4846, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 4842, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 4841, 541: 4800, 4799, 547: 4843, 628: 3247, 647: 4844, 733: 4840, 974: 4839}, + {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 18: 363, 333: 363, 363, 336: 363, 338: 363, 363, 343: 363, 349: 363, 354: 363, 423: 363, 429: 363, 433: 363, 438: 363, 363, 445: 363, 454: 363}, + {362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 18: 362, 333: 362, 362, 336: 362, 338: 362, 362, 343: 362, 349: 362, 354: 362, 423: 362, 429: 362, 433: 362, 438: 362, 362, 445: 362, 454: 362}, + {361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 18: 361, 333: 361, 361, 336: 361, 338: 361, 361, 343: 361, 349: 361, 354: 361, 423: 361, 429: 361, 433: 361, 438: 361, 361, 445: 361, 454: 361}, + {360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 18: 360, 333: 360, 360, 336: 360, 338: 360, 360, 343: 360, 349: 360, 354: 360, 423: 360, 429: 360, 433: 360, 438: 360, 360, 445: 360, 454: 360}, + // 2670 + {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 18: 359, 333: 359, 359, 336: 359, 338: 359, 359, 343: 359, 349: 359, 354: 359, 423: 359, 429: 359, 433: 359, 438: 359, 359, 445: 359, 454: 359}, + {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 18: 358, 333: 358, 358, 336: 358, 338: 358, 358, 343: 358, 349: 358, 354: 358, 423: 358, 429: 358, 433: 358, 438: 358, 358, 445: 358, 454: 358}, + {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 18: 357, 333: 357, 357, 336: 357, 338: 357, 357, 343: 357, 349: 357, 354: 357, 423: 357, 429: 357, 433: 357, 438: 357, 357, 445: 357, 454: 357}, + {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 18: 356, 333: 356, 356, 336: 356, 338: 356, 356, 343: 356, 349: 356, 354: 356, 423: 356, 429: 356, 433: 356, 438: 356, 356, 445: 356, 454: 356}, + {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 16: 355, 18: 355, 332: 355, 355, 355, 336: 355, 338: 355, 355, 343: 355, 349: 355, 354: 355, 370: 355, 400: 355, 423: 355, 429: 355, 433: 355, 438: 355, 355, 445: 355, 454: 355, 505: 355, 694: 4838}, + // 2675 + {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 16: 354, 18: 354, 332: 354, 354, 354, 336: 354, 338: 354, 354, 343: 354, 349: 354, 354: 354, 370: 354, 400: 354, 423: 354, 429: 354, 433: 354, 438: 354, 354, 445: 354, 454: 354, 505: 354, 694: 4837}, + {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 16: 353, 18: 353, 332: 353, 353, 353, 336: 353, 338: 353, 353, 343: 353, 349: 353, 354: 353, 370: 353, 400: 353, 423: 353, 429: 353, 433: 353, 438: 353, 353, 445: 353, 454: 353, 505: 353, 541: 4835, 4834, 694: 4836}, + {370: 4829, 505: 4828, 541: 4831, 4830}, + {348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 16: 348, 18: 348, 58: 348, 63: 348, 348, 332: 348, 348, 348, 336: 348, 338: 348, 348, 343: 348, 349: 348, 354: 348, 370: 348, 400: 348, 423: 348, 429: 348, 433: 348, 438: 348, 348, 445: 348, 454: 348, 505: 348}, + {347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 16: 347, 18: 347, 58: 347, 63: 347, 347, 332: 347, 347, 347, 336: 347, 338: 347, 347, 343: 347, 349: 347, 354: 347, 370: 347, 400: 347, 423: 347, 429: 347, 433: 347, 438: 347, 347, 445: 347, 454: 347, 505: 347}, + // 2680 + {332: 344}, + {338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 18: 338, 44: 338, 332: 338, 338, 338, 336: 338, 338: 338, 338, 343: 338, 349: 338, 354: 338, 423: 338, 429: 338, 433: 338, 438: 338, 338, 445: 338, 454: 338, 599: 338, 338}, + {337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 18: 337, 44: 337, 332: 337, 337, 337, 336: 337, 338: 337, 337, 343: 337, 349: 337, 354: 337, 423: 337, 429: 337, 433: 337, 438: 337, 337, 445: 337, 454: 337, 599: 337, 337}, + {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 18: 336, 333: 336, 336, 336: 336, 338: 336, 336, 343: 336, 349: 336, 354: 336, 423: 336, 429: 336, 433: 336, 438: 336, 336, 445: 336, 454: 336}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4827}, + // 2685 + {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 18: 334, 333: 334, 334, 336: 334, 338: 334, 334, 343: 334, 349: 334, 354: 334, 423: 334, 429: 334, 433: 334, 438: 334, 334, 445: 334, 454: 334}, + {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 18: 333, 333: 333, 333, 336: 333, 338: 333, 333, 343: 333, 349: 333, 354: 333, 423: 333, 429: 333, 433: 333, 438: 333, 333, 445: 333, 454: 333}, + {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 16: 331, 18: 331, 58: 331, 63: 331, 331, 333: 331, 331, 336: 331, 338: 331, 331, 343: 331, 349: 331, 354: 331, 370: 331, 400: 331, 423: 331, 429: 331, 433: 331, 438: 331, 331, 445: 331, 454: 331, 505: 331}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 16: 317, 18: 317, 58: 317, 63: 317, 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 370: 317, 400: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 505: 317, 611: 3240, 640: 4826}, + {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 16: 329, 18: 329, 58: 329, 63: 329, 329, 333: 329, 329, 336: 329, 338: 329, 329, 343: 329, 349: 329, 354: 329, 370: 329, 400: 329, 423: 329, 429: 329, 433: 329, 438: 329, 329, 445: 329, 454: 329, 505: 329}, + // 2690 + {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 16: 328, 18: 328, 58: 328, 63: 328, 328, 333: 328, 328, 336: 328, 338: 328, 328, 343: 328, 349: 328, 354: 328, 370: 328, 400: 328, 423: 328, 429: 328, 433: 328, 438: 328, 328, 445: 328, 454: 328, 505: 328}, + {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 18: 323, 333: 323, 323, 336: 323, 338: 323, 323, 343: 323, 349: 323, 354: 323, 423: 323, 429: 323, 433: 323, 438: 323, 323, 445: 323, 454: 323}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4825}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4824}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 611: 3240, 640: 4823}, + // 2695 + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 18: 317, 44: 317, 332: 3239, 317, 317, 336: 317, 338: 317, 317, 343: 317, 349: 317, 354: 317, 423: 317, 429: 317, 433: 317, 438: 317, 317, 445: 317, 454: 317, 599: 317, 317, 611: 3240, 640: 4817}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 18: 312, 44: 312, 333: 312, 312, 336: 312, 338: 312, 312, 343: 312, 349: 312, 354: 312, 423: 312, 429: 312, 433: 312, 438: 312, 312, 445: 312, 454: 312, 599: 312, 312, 727: 4818}, + {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 18: 319, 44: 4820, 333: 319, 319, 336: 319, 338: 319, 319, 343: 319, 349: 319, 354: 319, 423: 319, 429: 319, 433: 319, 438: 319, 319, 445: 319, 454: 319, 599: 4819, 4821, 726: 4822}, + {315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 18: 315, 44: 315, 333: 315, 315, 336: 315, 338: 315, 315, 343: 315, 349: 315, 354: 315, 423: 315, 429: 315, 433: 315, 438: 315, 315, 445: 315, 454: 315, 599: 315, 315}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 18: 314, 44: 314, 333: 314, 314, 336: 314, 338: 314, 314, 343: 314, 349: 314, 354: 314, 423: 314, 429: 314, 433: 314, 438: 314, 314, 445: 314, 454: 314, 599: 314, 314}, + // 2700 + {313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 18: 313, 44: 313, 333: 313, 313, 336: 313, 338: 313, 313, 343: 313, 349: 313, 354: 313, 423: 313, 429: 313, 433: 313, 438: 313, 313, 445: 313, 454: 313, 599: 313, 313}, + {311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 18: 311, 44: 311, 333: 311, 311, 336: 311, 338: 311, 311, 343: 311, 349: 311, 354: 311, 423: 311, 429: 311, 433: 311, 438: 311, 311, 445: 311, 454: 311, 599: 311, 311}, + {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 18: 320, 333: 320, 320, 336: 320, 338: 320, 320, 343: 320, 349: 320, 354: 320, 423: 320, 429: 320, 433: 320, 438: 320, 320, 445: 320, 454: 320}, + {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 18: 321, 333: 321, 321, 336: 321, 338: 321, 321, 343: 321, 349: 321, 354: 321, 423: 321, 429: 321, 433: 321, 438: 321, 321, 445: 321, 454: 321}, + {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 18: 322, 333: 322, 322, 336: 322, 338: 322, 322, 343: 322, 349: 322, 354: 322, 423: 322, 429: 322, 433: 322, 438: 322, 322, 445: 322, 454: 322}, + // 2705 + {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 16: 330, 18: 330, 58: 330, 63: 330, 330, 333: 330, 330, 336: 330, 338: 330, 330, 343: 330, 349: 330, 354: 330, 370: 330, 400: 330, 423: 330, 429: 330, 433: 330, 438: 330, 330, 445: 330, 454: 330, 505: 330}, + {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 18: 335, 333: 335, 335, 336: 335, 338: 335, 335, 343: 335, 349: 335, 354: 335, 423: 335, 429: 335, 433: 335, 438: 335, 335, 445: 335, 454: 335}, + {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 16: 352, 18: 352, 332: 352, 352, 352, 336: 352, 338: 352, 352, 343: 352, 349: 352, 354: 352, 370: 352, 400: 352, 423: 352, 429: 352, 433: 352, 438: 352, 352, 445: 352, 454: 352, 505: 352, 694: 4833}, + {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 16: 351, 18: 351, 332: 351, 351, 351, 336: 351, 338: 351, 351, 343: 351, 349: 351, 354: 351, 370: 351, 400: 351, 423: 351, 429: 351, 433: 351, 438: 351, 351, 445: 351, 454: 351, 505: 351, 694: 4832}, + {332: 346}, + // 2710 + {332: 345}, + {332: 340}, + {332: 341}, + {332: 343}, + {332: 342}, + // 2715 + {332: 339}, + {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 16: 349, 18: 349, 58: 349, 63: 349, 349, 332: 349, 349, 349, 336: 349, 338: 349, 349, 343: 349, 349: 349, 354: 349, 370: 349, 400: 349, 423: 349, 429: 349, 433: 349, 438: 349, 349, 445: 349, 454: 349, 505: 349}, + {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 16: 350, 18: 350, 58: 350, 63: 350, 350, 332: 350, 350, 350, 336: 350, 338: 350, 350, 343: 350, 349: 350, 354: 350, 370: 350, 400: 350, 423: 350, 429: 350, 433: 350, 438: 350, 350, 445: 350, 454: 350, 505: 350}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 58: 4845, 63: 4847, 4846, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4844, 733: 4848}, + {364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 18: 364, 333: 364, 364, 336: 364, 338: 364, 364, 343: 364, 349: 364, 354: 364, 423: 364, 429: 364, 433: 364, 438: 364, 364, 445: 364, 454: 364}, + // 2720 + {367: 3252, 694: 4838}, + {367: 3251, 694: 4837}, + {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 18: 332, 333: 332, 332, 336: 332, 338: 332, 332, 343: 332, 349: 332, 354: 332, 423: 332, 429: 332, 433: 332, 438: 332, 332, 445: 332, 454: 332}, + {327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 18: 327, 333: 327, 327, 336: 327, 338: 327, 327, 343: 327, 349: 327, 354: 327, 423: 327, 429: 327, 433: 327, 438: 327, 327, 445: 327, 454: 327}, + {326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 18: 326, 333: 326, 326, 336: 326, 338: 326, 326, 343: 326, 349: 326, 354: 326, 423: 326, 429: 326, 433: 326, 438: 326, 326, 445: 326, 454: 326}, + // 2725 + {325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 18: 325, 333: 325, 325, 336: 325, 338: 325, 325, 343: 325, 349: 325, 354: 325, 423: 325, 429: 325, 433: 325, 438: 325, 325, 445: 325, 454: 325}, + {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 18: 324, 333: 324, 324, 336: 324, 338: 324, 324, 343: 324, 349: 324, 354: 324, 423: 324, 429: 324, 433: 324, 438: 324, 324, 445: 324, 454: 324}, + {365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 18: 365, 333: 365, 365, 336: 365, 338: 365, 365, 343: 365, 349: 365, 354: 365, 423: 365, 429: 365, 433: 365, 438: 365, 365, 445: 365, 454: 365}, + {335: 3391, 426: 3392, 3393, 658: 4851, 968: 4850}, + {8: 4853, 18: 4852}, + // 2730 + {8: 291, 18: 291}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 58: 4845, 63: 4847, 4846, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4844, 733: 4855}, + {335: 3391, 426: 3392, 3393, 658: 4854}, + {8: 290, 18: 290}, + {367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 18: 367, 333: 367, 367, 336: 367, 338: 367, 367, 343: 367, 349: 367, 354: 367, 423: 367, 429: 367, 433: 367, 438: 367, 367, 445: 367, 454: 367}, + // 2735 + {335: 3391, 426: 3392, 3393, 658: 4851, 968: 4857}, + {8: 4853, 18: 4858}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 58: 4845, 63: 4847, 4846, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4844, 733: 4859}, + {368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 18: 368, 333: 368, 368, 336: 368, 338: 368, 368, 343: 368, 349: 368, 354: 368, 423: 368, 429: 368, 433: 368, 438: 368, 368, 445: 368, 454: 368}, + {369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 18: 369, 333: 369, 369, 336: 369, 338: 369, 369, 343: 369, 349: 369, 354: 369, 423: 369, 429: 369, 433: 369, 438: 369, 369, 445: 369, 454: 369}, + // 2740 + {371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 18: 371, 333: 371, 371, 336: 371, 338: 371, 371, 343: 371, 349: 371, 354: 371, 423: 371, 429: 371, 433: 371, 438: 371, 371, 445: 371, 454: 371}, + {372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 18: 372, 333: 372, 372, 336: 372, 338: 372, 372, 343: 372, 349: 372, 354: 372, 423: 372, 429: 372, 433: 372, 438: 372, 372, 445: 372, 454: 372}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4864}, + {373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 18: 373, 333: 373, 373, 336: 373, 338: 373, 373, 343: 373, 349: 373, 354: 373, 423: 373, 429: 373, 433: 373, 438: 373, 373, 445: 373, 454: 373}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4866}, + // 2745 + {374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 18: 374, 333: 374, 374, 336: 374, 338: 374, 374, 343: 374, 349: 374, 354: 374, 423: 374, 429: 374, 433: 374, 438: 374, 374, 445: 374, 454: 374}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4869}, + {375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 18: 375, 333: 375, 375, 336: 375, 338: 375, 375, 343: 375, 349: 375, 354: 375, 423: 375, 429: 375, 433: 375, 438: 375, 375, 445: 375, 454: 375}, + {376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 18: 376, 333: 376, 376, 336: 376, 338: 376, 376, 343: 376, 349: 376, 354: 376, 423: 376, 429: 376, 433: 376, 438: 376, 376, 445: 376, 454: 376}, + {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 16: 3249, 18: 304, 333: 304, 304, 336: 304, 338: 304, 304, 343: 304, 349: 304, 354: 304, 370: 3250, 400: 3246, 423: 304, 429: 304, 433: 304, 438: 304, 304, 445: 304, 454: 304, 505: 3248, 628: 3247, 647: 4872}, + // 2750 + {377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 18: 377, 333: 377, 377, 336: 377, 338: 377, 377, 343: 377, 349: 377, 354: 377, 423: 377, 429: 377, 433: 377, 438: 377, 377, 445: 377, 454: 377}, + {378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, 18: 378, 333: 378, 378, 336: 378, 338: 378, 378, 343: 378, 349: 378, 354: 378, 423: 378, 429: 378, 433: 378, 438: 378, 378, 445: 378, 454: 378}, + {382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 18: 382, 44: 382, 332: 382, 382, 382, 336: 382, 338: 382, 382, 343: 382, 349: 382, 354: 382, 423: 382, 429: 382, 433: 382, 438: 382, 382, 445: 382, 454: 382, 599: 382, 382}, + {406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 18: 406, 333: 406, 406, 336: 406, 338: 406, 406, 343: 406, 349: 406, 354: 406, 423: 406, 429: 406, 433: 406, 438: 406, 406, 445: 406, 454: 406}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 18: 312, 44: 312, 333: 312, 312, 336: 312, 338: 312, 312, 343: 312, 349: 312, 354: 312, 423: 312, 429: 312, 433: 312, 438: 312, 312, 445: 312, 454: 312, 599: 312, 312, 727: 4876}, + // 2755 + {407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 18: 407, 44: 4820, 333: 407, 407, 336: 407, 338: 407, 407, 343: 407, 349: 407, 354: 407, 423: 407, 429: 407, 433: 407, 438: 407, 407, 445: 407, 454: 407, 599: 4819, 4821, 726: 4822}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 18: 312, 44: 312, 333: 312, 312, 336: 312, 338: 312, 312, 343: 312, 349: 312, 354: 312, 423: 312, 429: 312, 433: 312, 438: 312, 312, 445: 312, 454: 312, 599: 312, 312, 727: 4878}, + {408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 18: 408, 44: 4820, 333: 408, 408, 336: 408, 338: 408, 408, 343: 408, 349: 408, 354: 408, 423: 408, 429: 408, 433: 408, 438: 408, 408, 445: 408, 454: 408, 599: 4819, 4821, 726: 4822}, + {409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 18: 409, 44: 4820, 333: 409, 409, 336: 409, 338: 409, 409, 343: 409, 349: 409, 354: 409, 423: 409, 429: 409, 433: 409, 438: 409, 409, 445: 409, 454: 409, 599: 4819, 4821, 726: 4822}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 18: 312, 44: 312, 333: 312, 312, 336: 312, 338: 312, 312, 343: 312, 349: 312, 354: 312, 423: 312, 429: 312, 433: 312, 438: 312, 312, 445: 312, 454: 312, 599: 312, 312, 727: 4881}, + // 2760 + {410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 18: 410, 44: 4820, 333: 410, 410, 336: 410, 338: 410, 410, 343: 410, 349: 410, 354: 410, 423: 410, 429: 410, 433: 410, 438: 410, 410, 445: 410, 454: 410, 599: 4819, 4821, 726: 4822}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 423: 2036, 429: 2036, 433: 2036, 438: 2036, 506: 5019, 2311, 2310, 2036, 530: 2036, 533: 2036, 2036, 960: 5018}, + {1997, 1997, 3: 1997, 1997, 8: 1997, 1997, 1997, 18: 1997, 354: 1997}, + {423: 1974}, + {349: 5017}, + // 2765 + {1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 18: 1964, 333: 1964, 1964, 336: 1964, 338: 1964, 1964, 343: 1964, 349: 1964, 354: 1964, 423: 1964, 429: 1964, 433: 1964, 438: 1964, 1964, 445: 1964, 454: 1964}, + {1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 18: 1963, 333: 1963, 1963, 336: 1963, 338: 1963, 1963, 343: 1963, 349: 1963, 354: 1963, 423: 1963, 429: 1963, 433: 1963, 438: 1963, 1963, 445: 1963, 454: 1963}, + {423: 5016}, + {1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 18: 1961, 333: 1961, 1961, 336: 1961, 338: 1961, 1961, 343: 1961, 349: 1961, 354: 1961, 423: 5015, 429: 1961, 433: 1961, 438: 1961, 1961, 445: 1961, 454: 1961}, + {16: 2258, 58: 2257, 60: 2263, 62: 2292, 65: 2265, 2272, 2273, 2274, 2280, 2286, 72: 2291, 106: 2290, 108: 2261, 2254, 116: 2287, 120: 2289, 129: 2259, 133: 2288, 135: 2260, 137: 2270, 2264, 2268, 2269, 2275, 2276, 2277, 145: 2278, 2279, 157: 2283, 159: 2285, 332: 5002, 335: 2649, 340: 2271, 2284, 344: 4732, 4733, 349: 2640, 375: 2644, 380: 2282, 426: 2647, 2648, 2266, 431: 2267, 436: 2643, 2642, 440: 2262, 2639, 443: 2641, 447: 2281, 4989, 4988, 4984, 4985, 4986, 4987, 455: 2646, 570: 2255, 573: 4731, 2645, 720: 5001, 744: 4983, 749: 4981, 4982, 5003, 789: 4999, 803: 5000, 1022: 4998}, + // 2770 + {339: 4996}, + {517: 4979}, + {335: 4978}, + {429: 4969}, + {338: 4962}, + // 2775 + {1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 18: 1953, 333: 1953, 1953, 336: 1953, 338: 1953, 1953, 343: 1953, 349: 1953, 354: 1953, 423: 1953, 429: 1953, 433: 1953, 438: 1953, 1953, 445: 1953, 454: 1953}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 2899, 506: 2901, 2311, 2310, 596: 2898, 723: 4961}, + {150: 4959, 167: 4960, 339: 4958, 1008: 4957}, + {153: 4956, 194: 4955, 339: 4954, 1120: 4953}, + {335: 1731, 366: 4598, 597: 4951}, + // 2780 + {375: 2256, 595: 4950}, + {236: 4949}, + {1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 18: 1936, 333: 1936, 1936, 336: 1936, 338: 1936, 1936, 343: 1936, 349: 1936, 354: 1936, 423: 1936, 429: 1936, 433: 1936, 438: 1936, 1936, 445: 1936, 454: 1936}, + {1933, 1933, 4893, 1933, 1933, 4900, 4899, 4887, 1933, 1933, 1933, 4891, 4898, 4901, 18: 1933, 333: 4892, 3528, 336: 3527, 338: 1941, 4890, 343: 4897, 349: 4886, 354: 1933, 423: 1975, 429: 2037, 433: 4884, 438: 4889, 4882, 445: 4905, 454: 4902, 666: 4885, 684: 4894, 760: 4896, 772: 4948, 780: 4895, 793: 4888}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 4906}, + // 2785 + {1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 18: 1875, 332: 4908, 1875, 1875, 336: 1875, 338: 1875, 1875, 343: 1875, 349: 1875, 354: 1875, 423: 1875, 429: 1875, 433: 1875, 438: 1875, 1875, 445: 1875, 454: 1875, 501: 1875, 1047: 4907}, + {1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 18: 1922, 333: 1922, 1922, 336: 1922, 338: 1922, 1922, 343: 1922, 349: 1922, 354: 1922, 423: 1922, 429: 1922, 433: 1922, 438: 1922, 1922, 445: 1922, 454: 1922, 501: 4923, 1065: 4924, 4925}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 4909}, + {8: 4921, 18: 4920}, + {8: 1873, 18: 1873}, + // 2790 + {8: 317, 18: 317, 332: 3239, 385: 317, 317, 611: 3240, 640: 4918}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4913}, + {18: 4914, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {8: 1204, 18: 1204, 385: 4917, 4916, 790: 4915}, + {8: 1870, 18: 1870}, + // 2795 + {1203, 1203, 3: 1203, 1203, 8: 1203, 18: 1203, 354: 1203}, + {1202, 1202, 3: 1202, 1202, 8: 1202, 18: 1202, 354: 1202}, + {8: 1204, 18: 1204, 385: 4917, 4916, 790: 4919}, + {8: 1871, 18: 1871}, + {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 18: 1874, 333: 1874, 1874, 336: 1874, 338: 1874, 1874, 343: 1874, 349: 1874, 354: 1874, 423: 1874, 429: 1874, 433: 1874, 438: 1874, 1874, 445: 1874, 454: 1874, 501: 1874}, + // 2800 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4922}, + {8: 1872, 18: 1872}, + {170: 4945, 274: 4946, 290: 4947}, + {1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 18: 1921, 333: 1921, 1921, 336: 1921, 338: 1921, 1921, 343: 1921, 349: 1921, 354: 1921, 423: 1921, 429: 1921, 433: 1921, 438: 1921, 1921, 445: 1921, 454: 1921}, + {1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 18: 1917, 333: 4927, 1917, 336: 1917, 338: 1917, 1917, 343: 1917, 349: 1917, 354: 1917, 423: 1917, 429: 1917, 433: 1917, 438: 1917, 1917, 445: 1917, 454: 1917, 907: 4928, 4929, 1072: 4926}, + // 2805 + {1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 18: 1920, 333: 1920, 1920, 336: 1920, 338: 1920, 1920, 343: 1920, 349: 1920, 354: 1920, 423: 1920, 429: 1920, 433: 1920, 438: 1920, 1920, 445: 1920, 454: 1920}, + {517: 4943, 609: 4932}, + {1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 18: 1916, 333: 4941, 1916, 336: 1916, 338: 1916, 1916, 343: 1916, 349: 1916, 354: 1916, 423: 1916, 429: 1916, 433: 1916, 438: 1916, 1916, 445: 1916, 454: 1916, 908: 4942}, + {1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 18: 1915, 333: 4930, 1915, 336: 1915, 338: 1915, 1915, 343: 1915, 349: 1915, 354: 1915, 423: 1915, 429: 1915, 433: 1915, 438: 1915, 1915, 445: 1915, 454: 1915, 907: 4931}, + {609: 4932}, + // 2810 + {1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 18: 1913, 333: 1913, 1913, 336: 1913, 338: 1913, 1913, 343: 1913, 349: 1913, 354: 1913, 423: 1913, 429: 1913, 433: 1913, 438: 1913, 1913, 445: 1913, 454: 1913}, + {75: 4937, 367: 4936, 528: 4935, 4934, 928: 4933}, + {1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 18: 1919, 333: 1919, 1919, 336: 1919, 338: 1919, 1919, 343: 1919, 349: 1919, 354: 1919, 423: 1919, 429: 1919, 433: 1919, 438: 1919, 1919, 445: 1919, 454: 1919}, + {1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 18: 1912, 333: 1912, 1912, 336: 1912, 338: 1912, 1912, 343: 1912, 349: 1912, 354: 1912, 423: 1912, 429: 1912, 433: 1912, 438: 1912, 1912, 445: 1912, 454: 1912}, + {1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 18: 1911, 333: 1911, 1911, 336: 1911, 338: 1911, 1911, 343: 1911, 349: 1911, 354: 1911, 423: 1911, 429: 1911, 433: 1911, 438: 1911, 1911, 445: 1911, 454: 1911}, + // 2815 + {339: 4940, 349: 4939}, + {234: 4938}, + {1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 18: 1909, 333: 1909, 1909, 336: 1909, 338: 1909, 1909, 343: 1909, 349: 1909, 354: 1909, 423: 1909, 429: 1909, 433: 1909, 438: 1909, 1909, 445: 1909, 454: 1909}, + {1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 18: 1910, 333: 1910, 1910, 336: 1910, 338: 1910, 1910, 343: 1910, 349: 1910, 354: 1910, 423: 1910, 429: 1910, 433: 1910, 438: 1910, 1910, 445: 1910, 454: 1910}, + {1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 18: 1908, 333: 1908, 1908, 336: 1908, 338: 1908, 1908, 343: 1908, 349: 1908, 354: 1908, 423: 1908, 429: 1908, 433: 1908, 438: 1908, 1908, 445: 1908, 454: 1908}, + // 2820 + {517: 4943}, + {1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 18: 1914, 333: 1914, 1914, 336: 1914, 338: 1914, 1914, 343: 1914, 349: 1914, 354: 1914, 423: 1914, 429: 1914, 433: 1914, 438: 1914, 1914, 445: 1914, 454: 1914}, + {75: 4937, 367: 4936, 528: 4935, 4934, 928: 4944}, + {1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 18: 1918, 333: 1918, 1918, 336: 1918, 338: 1918, 1918, 343: 1918, 349: 1918, 354: 1918, 423: 1918, 429: 1918, 433: 1918, 438: 1918, 1918, 445: 1918, 454: 1918}, + {1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 18: 1925, 333: 1925, 1925, 336: 1925, 338: 1925, 1925, 343: 1925, 349: 1925, 354: 1925, 423: 1925, 429: 1925, 433: 1925, 438: 1925, 1925, 445: 1925, 454: 1925}, + // 2825 + {1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 18: 1924, 333: 1924, 1924, 336: 1924, 338: 1924, 1924, 343: 1924, 349: 1924, 354: 1924, 423: 1924, 429: 1924, 433: 1924, 438: 1924, 1924, 445: 1924, 454: 1924}, + {1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 18: 1923, 333: 1923, 1923, 336: 1923, 338: 1923, 1923, 343: 1923, 349: 1923, 354: 1923, 423: 1923, 429: 1923, 433: 1923, 438: 1923, 1923, 445: 1923, 454: 1923}, + {1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 18: 1935, 333: 1935, 1935, 336: 1935, 338: 1935, 1935, 343: 1935, 349: 1935, 354: 1935, 423: 1935, 429: 1935, 433: 1935, 438: 1935, 1935, 445: 1935, 454: 1935}, + {338: 1940}, + {1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 18: 1948, 333: 1948, 1948, 336: 1948, 338: 1948, 1948, 343: 1948, 349: 1948, 354: 1948, 423: 1948, 429: 1948, 433: 1948, 438: 1948, 1948, 445: 1948, 454: 1948}, + // 2830 + {335: 4952}, + {1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 18: 1949, 333: 1949, 1949, 336: 1949, 338: 1949, 1949, 343: 1949, 349: 1949, 354: 1949, 423: 1949, 429: 1949, 433: 1949, 438: 1949, 1949, 445: 1949, 454: 1949}, + {1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 1950, 18: 1950, 333: 1950, 1950, 336: 1950, 338: 1950, 1950, 343: 1950, 349: 1950, 354: 1950, 423: 1950, 429: 1950, 433: 1950, 438: 1950, 1950, 445: 1950, 454: 1950}, + {1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 18: 1947, 333: 1947, 1947, 336: 1947, 338: 1947, 1947, 343: 1947, 349: 1947, 354: 1947, 423: 1947, 429: 1947, 433: 1947, 438: 1947, 1947, 445: 1947, 454: 1947}, + {1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 18: 1946, 333: 1946, 1946, 336: 1946, 338: 1946, 1946, 343: 1946, 349: 1946, 354: 1946, 423: 1946, 429: 1946, 433: 1946, 438: 1946, 1946, 445: 1946, 454: 1946}, + // 2835 + {1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 18: 1945, 333: 1945, 1945, 336: 1945, 338: 1945, 1945, 343: 1945, 349: 1945, 354: 1945, 423: 1945, 429: 1945, 433: 1945, 438: 1945, 1945, 445: 1945, 454: 1945}, + {1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 18: 1951, 333: 1951, 1951, 336: 1951, 338: 1951, 1951, 343: 1951, 349: 1951, 354: 1951, 423: 1951, 429: 1951, 433: 1951, 438: 1951, 1951, 445: 1951, 454: 1951}, + {1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 18: 1944, 333: 1944, 1944, 336: 1944, 338: 1944, 1944, 343: 1944, 349: 1944, 354: 1944, 423: 1944, 429: 1944, 433: 1944, 438: 1944, 1944, 445: 1944, 454: 1944}, + {1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 18: 1943, 333: 1943, 1943, 336: 1943, 338: 1943, 1943, 343: 1943, 349: 1943, 354: 1943, 423: 1943, 429: 1943, 433: 1943, 438: 1943, 1943, 445: 1943, 454: 1943}, + {1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 18: 1942, 333: 1942, 1942, 336: 1942, 338: 1942, 1942, 343: 1942, 349: 1942, 354: 1942, 423: 1942, 429: 1942, 433: 1942, 438: 1942, 1942, 445: 1942, 454: 1942}, + // 2840 + {1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 1952, 18: 1952, 333: 1952, 1952, 336: 1952, 338: 1952, 1952, 343: 1952, 349: 1952, 354: 1952, 423: 1952, 429: 1952, 433: 1952, 438: 1952, 1952, 445: 1952, 454: 1952}, + {332: 4963}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4964}, + {18: 4965, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 18: 1939, 333: 1939, 1939, 336: 1939, 338: 1939, 1939, 343: 1939, 349: 1939, 354: 1939, 423: 1939, 429: 1939, 433: 1939, 438: 1939, 1939, 445: 1939, 454: 1939, 1121: 4968, 1143: 4967, 4966}, + // 2845 + {1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 18: 1954, 333: 1954, 1954, 336: 1954, 338: 1954, 1954, 343: 1954, 349: 1954, 354: 1954, 423: 1954, 429: 1954, 433: 1954, 438: 1954, 1954, 445: 1954, 454: 1954}, + {1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 18: 1938, 333: 1938, 1938, 336: 1938, 338: 1938, 1938, 343: 1938, 349: 1938, 354: 1938, 423: 1938, 429: 1938, 433: 1938, 438: 1938, 1938, 445: 1938, 454: 1938}, + {1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 18: 1937, 333: 1937, 1937, 336: 1937, 338: 1937, 1937, 343: 1937, 349: 1937, 354: 1937, 423: 1937, 429: 1937, 433: 1937, 438: 1937, 1937, 445: 1937, 454: 1937}, + {332: 4970}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 4971}, + // 2850 + {18: 4972, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 18: 1969, 122: 4721, 333: 1969, 3528, 336: 3527, 338: 1969, 1969, 343: 1969, 349: 1969, 354: 1969, 423: 1969, 429: 1969, 433: 1969, 438: 1969, 1969, 445: 1969, 454: 1969, 666: 4973, 778: 4974, 871: 4975, 1025: 4976}, + {122: 4723, 349: 4977}, + {1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 18: 1968, 333: 1968, 1968, 336: 1968, 338: 1968, 1968, 343: 1968, 349: 1968, 354: 1968, 423: 1968, 429: 1968, 433: 1968, 438: 1968, 1968, 445: 1968, 454: 1968}, + {1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 18: 1966, 333: 1966, 1966, 336: 1966, 338: 1966, 1966, 343: 1966, 349: 1966, 354: 1966, 423: 1966, 429: 1966, 433: 1966, 438: 1966, 1966, 445: 1966, 454: 1966}, + // 2855 + {1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 1955, 18: 1955, 333: 1955, 1955, 336: 1955, 338: 1955, 1955, 343: 1955, 349: 1955, 354: 1955, 423: 1955, 429: 1955, 433: 1955, 438: 1955, 1955, 445: 1955, 454: 1955}, + {1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 18: 1967, 333: 1967, 1967, 336: 1967, 338: 1967, 1967, 343: 1967, 349: 1967, 354: 1967, 423: 1967, 429: 1967, 433: 1967, 438: 1967, 1967, 445: 1967, 454: 1967}, + {1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 1956, 18: 1956, 333: 1956, 1956, 336: 1956, 338: 1956, 1956, 343: 1956, 349: 1956, 354: 1956, 423: 1956, 429: 1956, 433: 1956, 438: 1956, 1956, 445: 1956, 454: 1956}, + {448: 4989, 4988, 4984, 4985, 4986, 4987, 744: 4983, 749: 4981, 4982, 4980}, + {1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 18: 1957, 333: 1957, 1957, 336: 1957, 338: 1957, 1957, 343: 1957, 349: 1957, 354: 1957, 423: 1957, 429: 1957, 433: 1957, 438: 1957, 1957, 445: 1957, 454: 1957}, + // 2860 + {1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 18: 1896, 333: 1896, 1896, 336: 1896, 338: 1896, 1896, 343: 1896, 349: 1896, 354: 1896, 423: 1896, 429: 1896, 433: 1896, 438: 1896, 1896, 445: 1896, 454: 1896}, + {332: 4992}, + {332: 4990}, + {1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 18: 1892, 332: 1883, 1892, 1892, 336: 1892, 338: 1892, 1892, 343: 1892, 349: 1892, 354: 1892, 423: 1892, 429: 1892, 433: 1892, 438: 1892, 1892, 445: 1892, 454: 1892}, + {1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 18: 1887, 332: 1891, 1887, 1887, 336: 1887, 338: 1887, 1887, 343: 1887, 349: 1887, 354: 1887, 423: 1887, 429: 1887, 433: 1887, 438: 1887, 1887, 445: 1887, 454: 1887}, + // 2865 + {1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 18: 1886, 332: 1890, 1886, 1886, 336: 1886, 338: 1886, 1886, 343: 1886, 349: 1886, 354: 1886, 423: 1886, 429: 1886, 433: 1886, 438: 1886, 1886, 445: 1886, 454: 1886}, + {1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 18: 1885, 332: 1889, 1885, 1885, 336: 1885, 338: 1885, 1885, 343: 1885, 349: 1885, 354: 1885, 423: 1885, 429: 1885, 433: 1885, 438: 1885, 1885, 445: 1885, 454: 1885}, + {332: 1888}, + {332: 1884}, + {18: 4991}, + // 2870 + {1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 18: 1893, 333: 1893, 1893, 336: 1893, 338: 1893, 1893, 343: 1893, 349: 1893, 354: 1893, 423: 1893, 429: 1893, 433: 1893, 438: 1893, 1893, 445: 1893, 454: 1893}, + {18: 4993, 375: 2256, 595: 4994}, + {1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 18: 1895, 333: 1895, 1895, 336: 1895, 338: 1895, 1895, 343: 1895, 349: 1895, 354: 1895, 423: 1895, 429: 1895, 433: 1895, 438: 1895, 1895, 445: 1895, 454: 1895}, + {18: 4995}, + {1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 18: 1894, 333: 1894, 1894, 336: 1894, 338: 1894, 1894, 343: 1894, 349: 1894, 354: 1894, 423: 1894, 429: 1894, 433: 1894, 438: 1894, 1894, 445: 1894, 454: 1894}, + // 2875 + {134: 4997}, + {1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 18: 1958, 333: 1958, 1958, 336: 1958, 338: 1958, 1958, 343: 1958, 349: 1958, 354: 1958, 423: 1958, 429: 1958, 433: 1958, 438: 1958, 1958, 445: 1958, 454: 1958}, + {1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 18: 1959, 333: 1959, 1959, 336: 1959, 338: 1959, 1959, 343: 1959, 349: 1959, 354: 1959, 423: 1959, 429: 1959, 433: 1959, 438: 1959, 1959, 445: 1959, 454: 1959}, + {1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 18: 1907, 333: 1907, 1907, 336: 1907, 338: 1907, 1907, 343: 1907, 349: 1907, 354: 1907, 423: 1907, 429: 1907, 433: 1907, 438: 1907, 1907, 445: 1907, 454: 1907}, + {1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 18: 1906, 333: 1906, 1906, 336: 1906, 338: 1906, 1906, 343: 1906, 349: 1906, 354: 1906, 423: 1906, 429: 1906, 433: 1906, 438: 1906, 1906, 445: 1906, 454: 1906}, + // 2880 + {1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 18: 1905, 333: 1905, 1905, 336: 1905, 338: 1905, 1905, 343: 1905, 349: 1905, 354: 1905, 423: 1905, 429: 1905, 433: 1905, 438: 1905, 1905, 445: 1905, 454: 1905}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 5009, 5007, 2566, 2601, 2605, 2613, 2549, 2615, 5010, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 5011, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 5006, 335: 2649, 340: 2271, 2284, 344: 4732, 4733, 349: 2640, 375: 2644, 380: 2282, 426: 2647, 2648, 2266, 431: 2267, 436: 2643, 2642, 440: 2262, 2639, 443: 2641, 447: 2281, 4989, 4988, 4984, 4985, 4986, 4987, 455: 2646, 506: 5004, 2311, 2310, 570: 2255, 573: 4731, 2645, 720: 3621, 744: 4983, 749: 4981, 4982, 5003, 789: 5008, 803: 5005}, + {1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 1897, 18: 1897, 333: 1897, 1897, 336: 1897, 338: 1897, 1897, 343: 1897, 349: 1897, 354: 1897, 423: 1897, 429: 1897, 433: 1897, 438: 1897, 1897, 445: 1897, 454: 1897}, + {18: 5014}, + {18: 5013}, + // 2885 + {16: 2258, 58: 2257, 60: 2263, 62: 2292, 65: 2265, 2272, 2273, 2274, 2280, 2286, 72: 2291, 106: 2290, 108: 2261, 2254, 116: 2287, 120: 2289, 129: 2259, 133: 2288, 135: 2260, 137: 2270, 2264, 2268, 2269, 2275, 2276, 2277, 145: 2278, 2279, 157: 2283, 159: 2285, 332: 5006, 340: 2271, 2284, 380: 2282, 428: 2266, 431: 2267, 440: 2262, 447: 2281, 4989, 4988, 4984, 4985, 4986, 4987, 570: 2255, 720: 3621, 744: 4983, 749: 4981, 4982, 5003, 789: 5008}, + {18: 1596, 332: 3617}, + {18: 5012}, + {18: 1568, 332: 1130}, + {18: 1500, 332: 1104}, + // 2890 + {18: 1499, 332: 1103}, + {1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 18: 1898, 333: 1898, 1898, 336: 1898, 338: 1898, 1898, 343: 1898, 349: 1898, 354: 1898, 423: 1898, 429: 1898, 433: 1898, 438: 1898, 1898, 445: 1898, 454: 1898}, + {1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 18: 1903, 333: 1903, 1903, 336: 1903, 338: 1903, 1903, 343: 1903, 349: 1903, 354: 1903, 423: 1903, 429: 1903, 433: 1903, 438: 1903, 1903, 445: 1903, 454: 1903}, + {1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 18: 1904, 333: 1904, 1904, 336: 1904, 338: 1904, 1904, 343: 1904, 349: 1904, 354: 1904, 423: 1904, 429: 1904, 433: 1904, 438: 1904, 1904, 445: 1904, 454: 1904}, + {1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 18: 1960, 333: 1960, 1960, 336: 1960, 338: 1960, 1960, 343: 1960, 349: 1960, 354: 1960, 423: 1960, 429: 1960, 433: 1960, 438: 1960, 1960, 445: 1960, 454: 1960}, + // 2895 + {1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 1962, 18: 1962, 333: 1962, 1962, 336: 1962, 338: 1962, 1962, 343: 1962, 349: 1962, 354: 1962, 423: 1962, 429: 1962, 433: 1962, 438: 1962, 1962, 445: 1962, 454: 1962}, + {1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 18: 1965, 333: 1965, 1965, 336: 1965, 338: 1965, 1965, 343: 1965, 349: 1965, 354: 1965, 423: 1965, 429: 1965, 433: 1965, 438: 1965, 1965, 445: 1965, 454: 1965}, + {423: 2035, 429: 2035, 433: 2035, 438: 2035, 509: 2035, 530: 2035, 533: 2035, 2035}, + {2034, 2034, 3: 2034, 2034, 8: 2034, 354: 2034, 423: 2034, 429: 2034, 433: 2034, 438: 2034, 509: 2034, 530: 2034, 533: 2034, 2034}, + {1998, 1998, 3: 1998, 1998, 8: 1998, 1998, 1998, 18: 1998, 354: 1998}, + // 2900 + {2086, 2086, 3: 2086, 2086, 8: 2086, 354: 2086}, + {2045, 2045, 3: 2045, 2045, 8: 2045, 354: 2045}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 5024}, + {2044, 2044, 3: 2044, 2044, 8: 2044, 354: 2044}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 4741, 697: 5026}, + // 2905 + {2046, 2046, 3: 2046, 2046, 8: 2046, 5022, 5023, 354: 2046, 773: 5027}, + {2087, 2087, 3: 2087, 2087, 8: 2087, 354: 2087}, + {2088, 2088, 3: 2088, 2088, 8: 2088, 354: 2088}, + {2089, 2089, 3: 2089, 2089, 8: 2089, 354: 2089}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 5033, 821: 5032, 989: 5031}, + // 2910 + {2090, 2090, 3: 2090, 2090, 8: 5035, 354: 2090}, + {1214, 1214, 3: 1214, 1214, 8: 1214, 354: 1214}, + {1204, 1204, 3: 1204, 1204, 8: 1204, 354: 1204, 385: 4917, 4916, 790: 5034}, + {1212, 1212, 3: 1212, 1212, 8: 1212, 354: 1212}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 5033, 821: 5036}, + // 2915 + {1213, 1213, 3: 1213, 1213, 8: 1213, 354: 1213}, + {2: 554, 554, 554, 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 19: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 3624, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 594: 554, 656: 3623, 5038}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5039}, + {2093, 2093, 3: 2093, 2093, 8: 2093, 354: 2093}, + {2065, 2065, 3: 2065, 2065, 8: 2065, 23: 2065, 354: 2065}, + // 2920 + {2064, 2064, 3: 2064, 2064, 8: 3938, 23: 2064, 354: 2064}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5044}, + {2094, 2094, 3: 2094, 2094, 8: 2094, 354: 2094}, + {23: 5045}, + {2096, 2096, 3: 2096, 2096, 8: 2096, 354: 2096}, + // 2925 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5048}, + {2095, 2095, 3: 2095, 2095, 8: 2095, 354: 2095}, + {23: 5049}, + {2097, 2097, 3: 2097, 2097, 8: 2097, 354: 2097}, + {2: 554, 554, 554, 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 19: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 3624, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 594: 554, 656: 3623, 5051}, + // 2930 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5052}, + {2098, 2098, 3: 2098, 2098, 8: 2098, 354: 2098}, + {2: 554, 554, 554, 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 19: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 3624, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 594: 554, 656: 3623, 5054}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5055}, + {2099, 2099, 3: 2099, 2099, 8: 2099, 354: 2099}, + // 2935 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5057}, + {2100, 2100, 3: 2100, 2100, 8: 2100, 354: 2100}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5059, 2311, 2310}, + {337: 5060}, + {502: 5061}, + // 2940 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5062}, + {2063, 2063, 3: 2063, 2063, 8: 2063, 178: 5066, 337: 5065, 354: 2063, 1155: 5064, 5063}, + {2101, 2101, 3: 2101, 2101, 8: 2101, 354: 2101}, + {2062, 2062, 3: 2062, 2062, 8: 2062, 354: 2062}, + {161: 5068}, + // 2945 + {161: 5067}, + {2060, 2060, 3: 2060, 2060, 8: 2060, 354: 2060}, + {2061, 2061, 3: 2061, 2061, 8: 2061, 354: 2061}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 5081}, + {423: 5080}, + // 2950 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 652: 5079}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5078, 2311, 2310}, + {423: 5076}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5075, 2311, 2310}, + {2069, 2069, 3: 2069, 2069, 8: 2069, 354: 2069}, + // 2955 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5019, 2311, 2310, 960: 5077}, + {2091, 2091, 3: 2091, 2091, 8: 2091, 354: 2091}, + {2092, 2092, 3: 2092, 2092, 8: 2092, 354: 2092}, + {2102, 2102, 3: 2102, 2102, 8: 3938, 354: 2102}, + {2103, 2103, 3: 2103, 2103, 8: 2103, 354: 2103}, + // 2960 + {1736, 1736, 3: 1736, 1736, 8: 1736, 354: 1736, 528: 5084, 5083, 761: 5082}, + {2104, 2104, 3: 2104, 2104, 8: 2104, 354: 2104}, + {1735, 1735, 3: 1735, 1735, 8: 1735, 354: 1735}, + {1734, 1734, 3: 1734, 1734, 8: 1734, 354: 1734}, + {76: 3624, 375: 554, 656: 3623, 5086}, + // 2965 + {375: 2256, 595: 5087}, + {2105, 2105, 3: 2105, 2105, 8: 2105, 354: 2105}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 594: 5040, 652: 5041, 682: 5089}, + {2106, 2106, 3: 2106, 2106, 8: 2106, 354: 2106}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 5213, 506: 3586, 2311, 2310, 602: 4741, 697: 5212}, + // 2970 + {2109, 2109, 3: 2109, 2109, 8: 2109, 354: 2109}, + {554, 554, 3: 554, 554, 8: 554, 76: 3624, 98: 554, 332: 554, 354: 554, 656: 3623, 5170}, + {423: 3965, 429: 5100, 433: 5094, 438: 5098, 509: 3966, 530: 5096, 533: 5099, 5095, 665: 5097, 1016: 5101}, + {423: 5164}, + {2: 2050, 2050, 2050, 2050, 2050, 2050, 9: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 19: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 423: 3965, 509: 3966, 665: 5113, 786: 5158}, + // 2975 + {2: 2050, 2050, 2050, 2050, 2050, 2050, 9: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 19: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 423: 3965, 509: 3966, 665: 5113, 786: 5152}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 361: 1618, 506: 5116, 2311, 2310, 706: 5117, 784: 5147}, + {2: 2050, 2050, 2050, 2050, 2050, 2050, 9: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 19: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 361: 2050, 423: 3965, 509: 3966, 665: 5113, 786: 5114}, + {423: 5106}, + {332: 5102}, + // 2980 + {465, 465, 3: 465, 465, 8: 465, 18: 465, 354: 465}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 5103}, + {18: 5104, 358: 2745, 362: 2743, 2744, 2742, 2740, 592: 2741, 2739}, + {1969, 1969, 3: 1969, 1969, 8: 1969, 18: 1969, 122: 4721, 334: 3528, 336: 3527, 354: 1969, 666: 4722, 778: 4974, 871: 5105}, + {1926, 1926, 3: 1926, 1926, 8: 1926, 18: 1926, 354: 1926}, + // 2985 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 506: 5108, 2311, 2310, 706: 5107}, + {332: 5109}, + {332: 1617}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5110}, + {8: 4921, 18: 5111}, + // 2990 + {445: 4905, 760: 5112}, + {1927, 1927, 3: 1927, 1927, 8: 1927, 18: 1927, 354: 1927}, + {2: 2049, 2049, 2049, 2049, 2049, 2049, 9: 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 19: 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 361: 2049}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 361: 1618, 506: 5116, 2311, 2310, 706: 5117, 784: 5115}, + {332: 5125}, + // 2995 + {53: 5123, 332: 1617, 361: 1617}, + {332: 1608, 361: 5118}, + {118: 5121, 149: 5120, 160: 5122, 748: 5119}, + {332: 1607}, + {1601, 1601, 1601, 1601, 1601, 1601, 8: 1601, 18: 1601, 22: 1601, 53: 1601, 1601, 1601, 1601, 332: 1601, 1601, 337: 1601, 353: 1601, 1601, 361: 1601}, + // 3000 + {1600, 1600, 1600, 1600, 1600, 1600, 8: 1600, 18: 1600, 22: 1600, 53: 1600, 1600, 1600, 1600, 332: 1600, 1600, 337: 1600, 353: 1600, 1600, 361: 1600}, + {1599, 1599, 1599, 1599, 1599, 1599, 8: 1599, 18: 1599, 22: 1599, 53: 1599, 1599, 1599, 1599, 332: 1599, 1599, 337: 1599, 353: 1599, 1599, 361: 1599}, + {118: 5121, 149: 5120, 160: 5122, 748: 5124}, + {332: 1606}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5126}, + // 3005 + {8: 4921, 18: 5127}, + {1616, 1616, 1616, 1616, 1616, 1616, 8: 1616, 18: 1616, 22: 1616, 53: 1616, 55: 1616, 1616, 337: 1616, 354: 1616, 361: 1616, 708: 5128}, + {1928, 1928, 5133, 1928, 1928, 5135, 8: 1928, 18: 1928, 22: 5130, 53: 5137, 55: 4718, 4717, 337: 5132, 354: 1928, 361: 5136, 687: 5134, 5131, 707: 5129}, + {1615, 1615, 1615, 1615, 1615, 1615, 8: 1615, 18: 1615, 22: 1615, 53: 1615, 1615, 1615, 1615, 337: 1615, 353: 1615, 1615, 361: 1615}, + {366: 4598, 375: 1731, 597: 5145}, + // 3010 + {1613, 1613, 1613, 1613, 1613, 1613, 8: 1613, 18: 1613, 22: 1613, 53: 1613, 1613, 1613, 1613, 337: 1613, 353: 1613, 1613, 361: 1613}, + {273: 5143}, + {335: 5142}, + {1610, 1610, 1610, 1610, 1610, 1610, 8: 1610, 18: 1610, 22: 1610, 53: 1610, 1610, 1610, 1610, 337: 1610, 353: 1610, 1610, 361: 1610}, + {335: 1731, 366: 4598, 597: 5140}, + // 3015 + {118: 5121, 149: 5120, 160: 5122, 748: 5139}, + {118: 5121, 149: 5120, 160: 5122, 748: 5138}, + {1602, 1602, 1602, 1602, 1602, 1602, 8: 1602, 18: 1602, 22: 1602, 53: 1602, 1602, 1602, 1602, 333: 1602, 337: 1602, 353: 1602, 1602, 361: 1602}, + {1603, 1603, 1603, 1603, 1603, 1603, 8: 1603, 18: 1603, 22: 1603, 53: 1603, 1603, 1603, 1603, 333: 1603, 337: 1603, 353: 1603, 1603, 361: 1603}, + {335: 5141}, + // 3020 + {1609, 1609, 1609, 1609, 1609, 1609, 8: 1609, 18: 1609, 22: 1609, 53: 1609, 1609, 1609, 1609, 337: 1609, 353: 1609, 1609, 361: 1609}, + {1611, 1611, 1611, 1611, 1611, 1611, 8: 1611, 18: 1611, 22: 1611, 53: 1611, 1611, 1611, 1611, 337: 1611, 353: 1611, 1611, 361: 1611}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5144, 2311, 2310}, + {1612, 1612, 1612, 1612, 1612, 1612, 8: 1612, 18: 1612, 22: 1612, 53: 1612, 1612, 1612, 1612, 337: 1612, 353: 1612, 1612, 361: 1612}, + {375: 2256, 595: 3228, 613: 5146}, + // 3025 + {1614, 1614, 1614, 1614, 1614, 1614, 8: 1614, 18: 1614, 22: 1614, 53: 1614, 1614, 1614, 1614, 337: 1614, 353: 1614, 1614, 361: 1614}, + {332: 5148}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5149}, + {8: 4921, 18: 5150}, + {1616, 1616, 1616, 1616, 1616, 1616, 8: 1616, 18: 1616, 22: 1616, 53: 1616, 55: 1616, 1616, 337: 1616, 354: 1616, 361: 1616, 708: 5151}, + // 3030 + {1929, 1929, 5133, 1929, 1929, 5135, 8: 1929, 18: 1929, 22: 5130, 53: 5137, 55: 4718, 4717, 337: 5132, 354: 1929, 361: 5136, 687: 5134, 5131, 707: 5129}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 506: 5108, 2311, 2310, 706: 5153}, + {332: 5154}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5155}, + {8: 4921, 18: 5156}, + // 3035 + {1616, 1616, 1616, 1616, 1616, 1616, 8: 1616, 18: 1616, 22: 1616, 53: 1616, 55: 1616, 1616, 337: 1616, 354: 1616, 361: 1616, 708: 5157}, + {1930, 1930, 5133, 1930, 1930, 5135, 8: 1930, 18: 1930, 22: 5130, 53: 5137, 55: 4718, 4717, 337: 5132, 354: 1930, 361: 5136, 687: 5134, 5131, 707: 5129}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 506: 5108, 2311, 2310, 706: 5159}, + {332: 5160}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5161}, + // 3040 + {8: 4921, 18: 5162}, + {1616, 1616, 1616, 1616, 1616, 1616, 8: 1616, 18: 1616, 22: 1616, 53: 1616, 55: 1616, 1616, 337: 1616, 354: 1616, 361: 1616, 708: 5163}, + {1931, 1931, 5133, 1931, 1931, 5135, 8: 1931, 18: 1931, 22: 5130, 53: 5137, 55: 4718, 4717, 337: 5132, 354: 1931, 361: 5136, 687: 5134, 5131, 707: 5129}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 1618, 361: 1618, 506: 5116, 2311, 2310, 706: 5117, 784: 5165}, + {332: 5166}, + // 3045 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5167}, + {8: 4921, 18: 5168}, + {1616, 1616, 1616, 1616, 1616, 1616, 8: 1616, 18: 1616, 22: 1616, 53: 1616, 55: 1616, 1616, 337: 1616, 354: 1616, 361: 1616, 708: 5169}, + {1932, 1932, 5133, 1932, 1932, 5135, 8: 1932, 18: 1932, 22: 5130, 53: 5137, 55: 4718, 4717, 337: 5132, 354: 1932, 361: 5136, 687: 5134, 5131, 707: 5129}, + {1821, 1821, 3: 1821, 1821, 8: 1821, 98: 5172, 332: 5173, 354: 1821, 920: 5171}, + // 3050 + {2108, 2108, 3: 2108, 2108, 8: 2108, 354: 2108}, + {375: 2256, 595: 5211}, + {354: 5176, 791: 5175, 919: 5174}, + {8: 5209, 18: 5208}, + {8: 1819, 18: 1819}, + // 3055 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5177, 2311, 2310}, + {2: 1797, 5: 1797, 1797, 8: 1797, 17: 1797, 1797, 1797, 1797, 23: 1797, 29: 1797, 1797, 1797, 1797, 332: 1797, 371: 5179, 509: 1797, 1086: 5178}, + {2: 1811, 5: 1811, 1811, 8: 1811, 17: 1811, 1811, 1811, 1811, 23: 1811, 29: 1811, 1811, 1811, 1811, 332: 1811, 509: 1811, 918: 5195}, + {261: 5180, 398: 5181}, + {295: 5185}, + // 3060 + {332: 5182}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 2303, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2301, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 2304, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 2308, 2307, 2305, 2302, 621: 5183}, + {8: 2999, 18: 5184}, + {2: 1794, 5: 1794, 1794, 8: 1794, 17: 1794, 1794, 1794, 1794, 23: 1794, 29: 1794, 1794, 1794, 1794, 332: 1794, 509: 1794}, + {332: 5187, 788: 5186}, + // 3065 + {2: 1796, 5: 1796, 1796, 8: 1796, 17: 1796, 1796, 1796, 1796, 23: 1796, 29: 1796, 1796, 1796, 1796, 332: 1796, 509: 1796}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 5190, 788: 5189, 903: 5191, 1067: 5188}, + {8: 5193, 18: 5192}, + {8: 1698, 18: 1698}, + {8: 1697, 18: 1697, 344: 3099, 3100, 3105, 359: 3101, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + // 3070 + {8: 1685, 18: 1685}, + {2: 1795, 5: 1795, 1795, 8: 1795, 17: 1795, 1795, 1795, 1795, 23: 1795, 29: 1795, 1795, 1795, 1795, 332: 1795, 509: 1795}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 5190, 788: 5189, 903: 5194}, + {8: 1684, 18: 1684}, + {2: 4565, 5: 4569, 5199, 8: 1816, 17: 4566, 1816, 4568, 4576, 23: 4575, 29: 4571, 4570, 4573, 4574, 332: 5197, 509: 4572, 676: 5198, 1124: 5196}, + // 3075 + {8: 1817, 18: 1817}, + {71: 5202, 958: 5201, 1123: 5200}, + {2: 1810, 5: 1810, 1810, 8: 1810, 17: 1810, 1810, 1810, 1810, 23: 1810, 29: 1810, 1810, 1810, 1810, 332: 1810, 509: 1810}, + {17: 4673}, + {8: 5206, 18: 5205}, + // 3080 + {8: 1814, 18: 1814}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5203, 2311, 2310}, + {2: 1811, 5: 1811, 1811, 8: 1811, 17: 1811, 1811, 1811, 1811, 23: 1811, 29: 1811, 1811, 1811, 1811, 509: 1811, 918: 5204}, + {2: 4565, 5: 4569, 5199, 8: 1812, 17: 4566, 1812, 4568, 4576, 23: 4575, 29: 4571, 4570, 4573, 4574, 509: 4572, 676: 5198}, + {8: 1815, 18: 1815}, + // 3085 + {71: 5202, 958: 5207}, + {8: 1813, 18: 1813}, + {1820, 1820, 3: 1820, 1820, 8: 1820, 332: 1820, 337: 1820, 1820, 354: 1820, 371: 1820, 380: 1820, 502: 1820, 1820, 1820}, + {354: 5176, 791: 5210}, + {8: 1818, 18: 1818}, + // 3090 + {2107, 2107, 3: 2107, 2107, 8: 2107, 354: 2107}, + {2046, 2046, 3: 2046, 2046, 8: 2046, 5022, 5023, 354: 2046, 773: 5221}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 423: 2037, 429: 2037, 433: 2037, 438: 2037, 4882, 506: 3586, 2311, 2310, 2037, 530: 2037, 533: 2037, 2037, 602: 4741, 684: 5093, 697: 5215, 743: 5216, 805: 5217, 962: 5214}, + {8: 5219, 18: 5218}, + {8: 462, 18: 462}, + // 3095 + {8: 461, 18: 461}, + {8: 460, 18: 460}, + {2110, 2110, 3: 2110, 2110, 8: 2110, 354: 2110}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 423: 2037, 429: 2037, 433: 2037, 438: 2037, 4882, 506: 3586, 2311, 2310, 2037, 530: 2037, 533: 2037, 2037, 602: 4741, 684: 5093, 697: 5215, 743: 5216, 805: 5220}, + {8: 459, 18: 459}, + // 3100 + {2111, 2111, 3: 2111, 2111, 8: 2111, 354: 2111}, + {16: 3249, 370: 3250, 505: 3248, 628: 5223}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 339: 5225, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 5224}, + {296, 296, 3: 296, 296, 8: 296, 343: 5227, 354: 296, 909: 5229}, + {296, 296, 3: 296, 296, 8: 296, 343: 5227, 354: 296, 909: 5226}, + // 3105 + {2112, 2112, 3: 2112, 2112, 8: 2112, 354: 2112}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 2899, 506: 2901, 2311, 2310, 596: 2898, 723: 5228}, + {295, 295, 3: 295, 295, 8: 295, 354: 295}, + {2113, 2113, 3: 2113, 2113, 8: 2113, 354: 2113}, + {7: 430}, + // 3110 + {424, 424, 424, 424, 424, 424, 424, 424, 424, 14: 424, 424, 424, 424, 19: 424, 424, 424, 424, 424, 29: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 332: 424, 337: 424, 424, 424, 342: 424, 424, 354: 424, 370: 424, 424, 380: 424, 502: 424, 424, 424, 424, 509: 424, 511: 424}, + {2: 4565, 5: 4569, 4567, 431, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 339: 4564, 342: 4593, 1842, 370: 1842, 505: 1842, 509: 4572, 511: 5230, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 5233}, + {423, 423, 423, 423, 423, 423, 423, 423, 423, 14: 423, 423, 423, 423, 19: 423, 423, 423, 423, 423, 29: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 332: 423, 337: 423, 423, 423, 342: 423, 423, 354: 423, 370: 423, 423, 380: 423, 502: 423, 423, 423, 423, 509: 423, 511: 423}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 652: 5235}, + {2118, 2118, 8: 3938}, + // 3115 + {2119, 2119}, + {2117, 2117}, + {275: 5293}, + {354: 5285}, + {522: 5241}, + // 3120 + {118: 1829, 263: 5246, 383: 5245, 423: 1829, 897: 5247, 5243, 959: 5244, 1088: 5242}, + {1823, 1823, 71: 1823, 98: 5275, 332: 1823, 337: 1823, 1823, 371: 1823, 380: 1823, 502: 1823, 1823, 1823, 1089: 5274}, + {118: 5263, 423: 5262}, + {1834, 1834, 71: 1834, 98: 1834, 332: 1834, 337: 1834, 1834, 371: 1834, 380: 1834, 502: 1834, 1834, 1834}, + {73: 3381, 3380, 332: 5255, 702: 5256}, + // 3125 + {73: 3381, 3380, 332: 5248, 702: 5249}, + {118: 1828, 423: 1828}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 5253}, + {332: 5250}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 5251}, + // 3130 + {8: 3589, 18: 5252}, + {1830, 1830, 71: 1830, 98: 1830, 332: 1830, 337: 1830, 1830, 371: 1830, 380: 1830, 502: 1830, 1830, 1830}, + {18: 5254, 344: 3099, 3100, 3105, 359: 3101, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + {1831, 1831, 71: 1831, 98: 1831, 332: 1831, 337: 1831, 1831, 371: 1831, 380: 1831, 502: 1831, 1831, 1831}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 5260}, + // 3135 + {332: 5257}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 5258}, + {8: 3589, 18: 5259}, + {1832, 1832, 71: 1832, 98: 1832, 332: 1832, 337: 1832, 1832, 371: 1832, 380: 1832, 502: 1832, 1832, 1832}, + {18: 5261, 344: 3099, 3100, 3105, 359: 3101, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + // 3140 + {1833, 1833, 71: 1833, 98: 1833, 332: 1833, 337: 1833, 1833, 371: 1833, 380: 1833, 502: 1833, 1833, 1833}, + {54: 5268, 332: 1836, 1087: 5267}, + {332: 5264}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2379, 2344, 2327, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2313, 2401, 2339, 2626, 2413, 2325, 2550, 2369, 2475, 2476, 2471, 2434, 2481, 2400, 2415, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2419, 2589, 2337, 2309, 2566, 2601, 2605, 2613, 2549, 2615, 2405, 2357, 2368, 2441, 2408, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2470, 2439, 2444, 2380, 2406, 2411, 2421, 2338, 2364, 2581, 2582, 2630, 2583, 2584, 2585, 2376, 2398, 2586, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2455, 2389, 2469, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2623, 2417, 2318, 2624, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2627, 2636, 2635, 2637, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2632, 2466, 2633, 2634, 2416, 2668, 334: 2666, 2649, 339: 2676, 2271, 2284, 344: 2665, 2664, 2697, 349: 2640, 370: 2695, 2677, 375: 2644, 380: 2282, 400: 2672, 424: 2748, 2680, 2647, 2648, 2266, 430: 2696, 2650, 2659, 434: 2669, 2671, 2643, 2642, 440: 2262, 2639, 443: 2641, 2670, 446: 2675, 2281, 2693, 2679, 2681, 2685, 2686, 2687, 455: 2646, 2736, 2714, 2662, 2663, 2709, 2710, 2711, 2712, 2713, 2673, 2698, 2707, 2708, 2702, 2715, 2716, 2717, 2703, 2719, 2720, 2704, 2718, 2699, 2706, 2705, 2691, 2721, 2722, 2674, 2726, 2682, 2684, 2725, 2731, 2730, 2732, 2729, 2733, 2728, 2727, 2724, 2723, 2683, 2688, 2689, 506: 2652, 2311, 2310, 569: 2667, 2678, 2735, 2653, 2658, 2645, 2656, 2654, 2655, 2690, 2701, 2700, 2694, 2692, 2651, 2661, 2734, 2660, 2657, 5265}, + {18: 5266, 344: 3099, 3100, 3105, 359: 3101, 411: 3103, 3096, 3102, 3106, 3095, 417: 3104, 3097, 3098}, + // 3145 + {1837, 1837, 71: 1837, 98: 1837, 176: 1837, 332: 1837, 337: 1837, 1837, 371: 1837, 380: 1837, 502: 1837, 1837, 1837}, + {332: 5271}, + {366: 5269}, + {375: 2256, 595: 5270}, + {332: 1835}, + // 3150 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 1991, 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3586, 2311, 2310, 602: 3587, 661: 4456, 835: 5272}, + {18: 5273}, + {1838, 1838, 71: 1838, 98: 1838, 176: 1838, 332: 1838, 337: 1838, 1838, 371: 1838, 380: 1838, 502: 1838, 1838, 1838}, + {1827, 1827, 71: 5278, 332: 1827, 337: 1827, 1827, 371: 1827, 380: 1827, 502: 1827, 1827, 1827, 1126: 5277}, + {375: 2256, 595: 3228, 613: 5276}, + // 3155 + {1822, 1822, 71: 1822, 332: 1822, 337: 1822, 1822, 371: 1822, 380: 1822, 502: 1822, 1822, 1822}, + {1821, 1821, 332: 5173, 337: 1821, 1821, 371: 1821, 380: 1821, 502: 1821, 1821, 1821, 920: 5284}, + {522: 5279}, + {118: 1829, 423: 1829, 897: 5247, 5243, 959: 5280}, + {1825, 1825, 176: 5282, 332: 1825, 337: 1825, 1825, 371: 1825, 380: 1825, 502: 1825, 1825, 1825, 1125: 5281}, + // 3160 + {1826, 1826, 332: 1826, 337: 1826, 1826, 371: 1826, 380: 1826, 502: 1826, 1826, 1826}, + {375: 2256, 595: 3228, 613: 5283}, + {1824, 1824, 332: 1824, 337: 1824, 1824, 371: 1824, 380: 1824, 502: 1824, 1824, 1824}, + {1839, 1839, 332: 1839, 337: 1839, 1839, 371: 1839, 380: 1839, 502: 1839, 1839, 1839}, + {554, 554, 554, 554, 554, 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 19: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 3624, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 656: 3623, 5286}, + // 3165 + {2067, 2067, 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3936, 2311, 2310, 652: 5288, 1096: 5287}, + {2115, 2115}, + {8: 3938, 351: 5289}, + {332: 5290}, + {354: 5176, 791: 5175, 919: 5291}, + // 3170 + {8: 5209, 18: 5292}, + {2066, 2066}, + {2116, 2116}, + {2: 1748, 1748, 1748, 1748, 1748, 1748, 9: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 19: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 339: 1748, 343: 1748, 370: 1748, 428: 1748, 505: 1748, 518: 1748}, + {2: 1624, 1624, 1624, 1624, 1624, 1624, 9: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 19: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 428: 5361, 747: 5391}, + // 3175 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5383, 2311, 2310}, + {59: 3627, 502: 3626, 717: 5379}, + {59: 1743, 502: 1743}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 428: 5374, 506: 3355, 2311, 2310, 598: 3357, 669: 5373}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 428: 5370, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 5369}, + // 3180 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 428: 5366, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 5365}, + {173: 5359}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5357, 2311, 2310}, + {23: 5354}, + {368: 5306}, + // 3185 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5307, 2311, 2310}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5308}, + {244, 244}, + {242, 242, 5321, 8: 5352, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5351}, + {241, 241, 241, 8: 241, 15: 241, 17: 241, 19: 241, 241, 241, 45: 241, 241, 241, 241, 241, 241, 241, 241}, + // 3190 + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5349}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5347}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5345}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5343}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5341}, + // 3195 + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5339}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 366: 4598, 375: 1731, 597: 5335}, + {366: 4598, 375: 1731, 597: 5333}, + {230, 230, 230, 8: 230, 15: 230, 17: 230, 19: 230, 230, 230, 45: 230, 230, 230, 230, 230, 230, 230, 230}, + {229, 229, 229, 8: 229, 15: 229, 17: 229, 19: 229, 229, 229, 45: 229, 229, 229, 229, 229, 229, 229, 229}, + // 3200 + {335: 1731, 366: 4598, 597: 5331}, + {335: 1731, 366: 4598, 597: 5329}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 597: 5327}, + {335: 1731, 366: 4598, 597: 5325}, + {335: 5326}, + // 3205 + {225, 225, 225, 8: 225, 15: 225, 17: 225, 19: 225, 225, 225, 45: 225, 225, 225, 225, 225, 225, 225, 225}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 5328}, + {226, 226, 226, 8: 226, 15: 226, 17: 226, 19: 226, 226, 226, 45: 226, 226, 226, 226, 226, 226, 226, 226}, + {335: 5330}, + {227, 227, 227, 8: 227, 15: 227, 17: 227, 19: 227, 227, 227, 45: 227, 227, 227, 227, 227, 227, 227, 227}, + // 3210 + {335: 5332}, + {228, 228, 228, 8: 228, 15: 228, 17: 228, 19: 228, 228, 228, 45: 228, 228, 228, 228, 228, 228, 228, 228}, + {375: 2256, 595: 5334}, + {231, 231, 231, 8: 231, 15: 231, 17: 231, 19: 231, 231, 231, 45: 231, 231, 231, 231, 231, 231, 231, 231}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5336}, + // 3215 + {232, 232, 232, 8: 232, 15: 232, 17: 232, 19: 232, 232, 232, 45: 232, 232, 232, 232, 232, 232, 232, 232}, + {224, 224, 224, 8: 224, 15: 224, 17: 224, 19: 224, 224, 224, 45: 224, 224, 224, 224, 224, 224, 224, 224}, + {223, 223, 223, 8: 223, 15: 223, 17: 223, 19: 223, 223, 223, 45: 223, 223, 223, 223, 223, 223, 223, 223}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5340}, + {233, 233, 233, 8: 233, 15: 233, 17: 233, 19: 233, 233, 233, 45: 233, 233, 233, 233, 233, 233, 233, 233}, + // 3220 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5342}, + {234, 234, 234, 8: 234, 15: 234, 17: 234, 19: 234, 234, 234, 45: 234, 234, 234, 234, 234, 234, 234, 234}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5344}, + {235, 235, 235, 8: 235, 15: 235, 17: 235, 19: 235, 235, 235, 45: 235, 235, 235, 235, 235, 235, 235, 235}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5346}, + // 3225 + {236, 236, 236, 8: 236, 15: 236, 17: 236, 19: 236, 236, 236, 45: 236, 236, 236, 236, 236, 236, 236, 236}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5348}, + {237, 237, 237, 8: 237, 15: 237, 17: 237, 19: 237, 237, 237, 45: 237, 237, 237, 237, 237, 237, 237, 237}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 375: 2256, 506: 5338, 2311, 2310, 595: 5337, 692: 5350}, + {238, 238, 238, 8: 238, 15: 238, 17: 238, 19: 238, 238, 238, 45: 238, 238, 238, 238, 238, 238, 238, 238}, + // 3230 + {240, 240, 240, 8: 240, 15: 240, 17: 240, 19: 240, 240, 240, 45: 240, 240, 240, 240, 240, 240, 240, 240}, + {2: 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5353}, + {239, 239, 239, 8: 239, 15: 239, 17: 239, 19: 239, 239, 239, 45: 239, 239, 239, 239, 239, 239, 239, 239}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5355, 2311, 2310}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5356}, + // 3235 + {247, 247}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5358}, + {248, 248}, + {804: 5360}, + {375: 1624, 428: 5361, 747: 5362}, + // 3240 + {444: 5364}, + {375: 2256, 595: 5363}, + {269, 269}, + {2: 1623, 1623, 1623, 1623, 1623, 1623, 9: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 19: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 335: 1623, 359: 1623, 375: 1623, 425: 1623}, + {1738, 1738, 8: 4158}, + // 3245 + {444: 5367}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 4156, 4154, 711: 5368}, + {1737, 1737, 8: 4158}, + {1740, 1740, 8: 3752}, + {444: 5371}, + // 3250 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3750, 718: 5372}, + {1739, 1739, 8: 3752}, + {1736, 1736, 8: 3359, 528: 5084, 5083, 761: 5378}, + {444: 5375}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 5376}, + // 3255 + {1736, 1736, 8: 3359, 528: 5084, 5083, 761: 5377}, + {1741, 1741}, + {1742, 1742}, + {2: 1624, 1624, 1624, 1624, 1624, 1624, 9: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 19: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 359: 1624, 428: 5361, 747: 5380}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 5381}, + // 3260 + {1736, 1736, 8: 3359, 528: 5084, 5083, 761: 5382}, + {1745, 1745}, + {333: 5384}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5385}, + {1869, 1869, 54: 4560, 353: 4561, 719: 5387, 732: 5386, 891: 5388}, + // 3265 + {1868, 1868, 54: 4560, 719: 5390}, + {1867, 1867, 353: 4561, 732: 5389}, + {1746, 1746}, + {1865, 1865}, + {1866, 1866}, + // 3270 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3850, 2311, 2310, 700: 5392}, + {1747, 1747}, + {1750, 1750}, + {1749, 1749}, + {219, 219}, + // 3275 + {2: 953, 953, 953, 953, 953, 953, 9: 953, 953, 953, 953, 953, 953, 953, 953, 953, 19: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 356: 953, 503: 953, 606: 3855, 3857, 3856, 710: 3858, 759: 5397}, + {2: 940, 940, 940, 940, 940, 940, 9: 940, 940, 940, 940, 940, 940, 940, 940, 940, 19: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 5399, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 356: 940, 503: 940, 1093: 5398}, + {2: 1620, 1620, 1620, 1620, 1620, 1620, 9: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 19: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 356: 1620, 503: 3860, 728: 5400}, + {2: 939, 939, 939, 939, 939, 939, 9: 939, 939, 939, 939, 939, 939, 939, 939, 939, 19: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 356: 939, 503: 939}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 356: 5401, 506: 5403, 2311, 2310, 806: 5404, 961: 5402}, + // 3280 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 5418, 2311, 2310, 598: 5416, 806: 5404, 961: 5417}, + {8: 5412, 356: 5411}, + {8: 942, 356: 942, 361: 942, 512: 5406, 755: 5405}, + {8: 944, 356: 944, 361: 944}, + {8: 946, 356: 946, 361: 946}, + // 3285 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 5408, 506: 5407, 2311, 2310}, + {8: 942, 356: 942, 361: 942, 512: 5410, 755: 5409}, + {8: 941, 356: 941, 361: 941}, + {8: 945, 356: 945, 361: 945}, + {359: 5408}, + // 3290 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 435: 3865, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3873, 701: 3862, 739: 5414}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5403, 2311, 2310, 806: 5413}, + {8: 943, 356: 943, 361: 943}, + {214, 214, 8: 3921, 360: 3979, 680: 3980, 5415}, + {1754, 1754}, + // 3295 + {829, 829, 829, 829, 829, 829, 829, 829, 9: 829, 829, 829, 829, 829, 829, 829, 829, 829, 19: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 338: 829, 352: 829, 354: 3934, 357: 829, 360: 829, 503: 829, 511: 829, 523: 829, 757: 5424}, + {8: 5412, 361: 5421}, + {951, 951, 951, 951, 951, 951, 951, 951, 942, 951, 951, 951, 951, 951, 951, 951, 951, 951, 19: 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 951, 338: 951, 352: 951, 354: 951, 357: 951, 360: 951, 942, 503: 951, 511: 951, 5419, 523: 951, 755: 5405}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 5408, 506: 5420, 2311, 2310}, + {950, 950, 950, 950, 950, 950, 950, 950, 942, 950, 950, 950, 950, 950, 950, 950, 950, 950, 19: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 338: 950, 352: 950, 354: 950, 357: 950, 360: 950, 942, 503: 950, 511: 950, 5410, 523: 950, 755: 5409}, + // 3300 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 3871, 359: 3356, 435: 3865, 506: 3355, 2311, 2310, 521: 3870, 569: 3869, 598: 3868, 646: 3867, 649: 3866, 3873, 701: 3862, 739: 5422}, + {214, 214, 8: 3921, 360: 3979, 680: 3980, 5423}, + {1753, 1753}, + {827, 827, 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 338: 3878, 352: 827, 357: 827, 360: 827, 503: 827, 506: 3877, 2311, 2310, 511: 827, 523: 827, 738: 3876, 764: 5425}, + {808, 808, 352: 808, 357: 808, 360: 808, 503: 3944, 511: 3945, 523: 3943, 782: 3947, 3946, 889: 3948, 5426}, + // 3305 + {214, 214, 352: 214, 357: 214, 360: 3979, 680: 3980, 5427}, + {1201, 1201, 352: 1201, 357: 3000, 630: 3001, 675: 5428}, + {789, 789, 352: 3983, 896: 5429}, + {1755, 1755}, + {1756, 1756, 8: 2999}, + // 3310 + {509: 5637}, + {509: 1863}, + {173: 5632, 509: 1862}, + {509: 1861}, + {2: 1622, 1622, 1622, 1622, 1622, 1622, 9: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 428: 4165, 686: 5610}, + // 3315 + {502: 5586}, + {54: 5548, 57: 1773, 91: 1773, 526: 1773, 976: 5547}, + {380: 5528}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5520, 2311, 2310}, + {23: 5513}, + // 3320 + {368: 5507}, + {2: 1622, 1622, 1622, 1622, 1622, 1622, 9: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 335: 1622, 425: 1622, 428: 4165, 686: 5450}, + {2: 1622, 1622, 1622, 1622, 1622, 1622, 9: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 335: 1622, 428: 4165, 686: 5444}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 5446, 4154, 940: 5447, 1101: 5445}, + {211, 211, 8: 5448}, + // 3325 + {132, 132, 8: 132}, + {131, 131, 8: 131}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 4152, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 4153, 506: 2901, 2311, 2310, 596: 3703, 648: 4155, 667: 5446, 4154, 940: 5449}, + {130, 130, 8: 130}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 3766, 767: 3767, 813: 5451}, + // 3330 + {178, 178, 178, 8: 3769, 14: 178, 24: 178, 178, 178, 178, 178, 337: 178, 519: 3813, 796: 3812, 5452}, + {186, 186, 186, 14: 186, 24: 186, 186, 186, 186, 186, 337: 5454, 843: 5453}, + {159, 159, 159, 14: 5470, 24: 159, 159, 5469, 5471, 5472, 792: 5468, 923: 5467, 5466}, + {82: 5459, 5457, 5458, 5460, 842: 5456, 1015: 5455}, + {185, 185, 185, 14: 185, 24: 185, 185, 185, 185, 185, 82: 5459, 5457, 5458, 5460, 842: 5465}, + // 3335 + {184, 184, 184, 14: 184, 24: 184, 184, 184, 184, 184, 82: 184, 184, 184, 184}, + {375: 2256, 595: 4135, 674: 5464}, + {375: 2256, 595: 4135, 674: 5463}, + {375: 2256, 595: 4135, 674: 5462}, + {375: 2256, 595: 4135, 674: 5461}, + // 3340 + {179, 179, 179, 14: 179, 24: 179, 179, 179, 179, 179, 82: 179, 179, 179, 179}, + {180, 180, 180, 14: 180, 24: 180, 180, 180, 180, 180, 82: 180, 180, 180, 180}, + {181, 181, 181, 14: 181, 24: 181, 181, 181, 181, 181, 82: 181, 181, 181, 181}, + {182, 182, 182, 14: 182, 24: 182, 182, 182, 182, 182, 82: 182, 182, 182, 182}, + {183, 183, 183, 14: 183, 24: 183, 183, 183, 183, 183, 82: 183, 183, 183, 183}, + // 3345 + {164, 164, 5497, 24: 164, 5498, 839: 5496}, + {158, 158, 158, 14: 5470, 24: 158, 158, 5469, 5471, 5472, 792: 5495}, + {157, 157, 157, 14: 157, 24: 157, 157, 157, 157, 157}, + {353: 5494, 811: 5493}, + {247: 5478, 253: 5476, 284: 5477, 519: 5479}, + // 3350 + {375: 2256, 595: 4135, 674: 5475}, + {127: 5474, 375: 2256, 595: 4135, 674: 5473}, + {144, 144, 144, 14: 144, 24: 144, 144, 144, 144, 144}, + {143, 143, 143, 14: 143, 24: 143, 143, 143, 143, 143}, + {145, 145, 145, 14: 145, 24: 145, 145, 145, 145, 145}, + // 3355 + {339: 5491, 375: 2256, 595: 5492}, + {431: 5487}, + {149, 149, 149, 14: 149, 24: 149, 149, 149, 149, 149, 268: 5483, 339: 5484, 431: 5482}, + {80: 5480}, + {339: 5481}, + // 3360 + {142, 142, 142, 14: 142, 24: 142, 142, 142, 142, 142}, + {375: 2256, 595: 4135, 674: 5485}, + {147, 147, 147, 14: 147, 24: 147, 147, 147, 147, 147}, + {146, 146, 146, 14: 146, 24: 146, 146, 146, 146, 146}, + {60: 5486}, + // 3365 + {148, 148, 148, 14: 148, 24: 148, 148, 148, 148, 148}, + {339: 5488, 375: 2256, 595: 5489}, + {151, 151, 151, 14: 151, 24: 151, 151, 151, 151, 151}, + {60: 5490}, + {150, 150, 150, 14: 150, 24: 150, 150, 150, 150, 150}, + // 3370 + {153, 153, 153, 14: 153, 24: 153, 153, 153, 153, 153}, + {152, 152, 152, 14: 152, 24: 152, 152, 152, 152, 152}, + {155, 155, 155, 14: 155, 24: 155, 155, 155, 155, 155}, + {154, 154, 154, 14: 154, 24: 154, 154, 154, 154, 154}, + {156, 156, 156, 14: 156, 24: 156, 156, 156, 156, 156}, + // 3375 + {161, 161, 24: 5502, 934: 5501}, + {335: 5500}, + {335: 5499}, + {162, 162, 24: 162}, + {163, 163, 24: 163}, + // 3380 + {212, 212}, + {368: 5503}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 339: 5505, 506: 5504, 2311, 2310, 1100: 5506}, + {1856, 1856}, + {1855, 1855}, + // 3385 + {160, 160}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5508, 2311, 2310}, + {531: 5509}, + {230: 5510}, + {335: 5511}, + // 3390 + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5512}, + {246, 246}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5514, 2311, 2310}, + {260, 260, 260, 15: 260, 17: 260, 19: 260, 260, 260, 45: 260, 260, 260, 260, 260, 260, 260, 260, 531: 5516, 965: 5515}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5519}, + // 3395 + {165: 5517}, + {335: 5518}, + {259, 259, 259, 15: 259, 17: 259, 19: 259, 259, 259, 45: 259, 259, 259, 259, 259, 259, 259, 259, 523: 259}, + {261, 261}, + {260, 260, 260, 15: 260, 17: 260, 19: 260, 260, 260, 45: 260, 260, 260, 260, 260, 260, 260, 260, 523: 260, 531: 5516, 965: 5521}, + // 3400 + {258, 258, 258, 15: 258, 17: 258, 19: 258, 258, 258, 45: 258, 258, 258, 258, 258, 258, 258, 258, 523: 5523, 1130: 5522}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5527}, + {152: 5524}, + {368: 5525}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5526, 2311, 2310}, + // 3405 + {257, 257, 257, 15: 257, 17: 257, 19: 257, 257, 257, 45: 257, 257, 257, 257, 257, 257, 257, 257}, + {262, 262}, + {54: 1774, 57: 1774, 91: 1774, 526: 1774, 530: 5529}, + {173: 5530}, + {804: 5531}, + // 3410 + {375: 1622, 428: 4165, 686: 5532}, + {375: 2256, 595: 5533}, + {268, 268, 92: 268, 268, 96: 268, 268, 954: 5534}, + {270, 270, 92: 5537, 5539, 96: 5536, 5538, 953: 5535}, + {267, 267, 92: 267, 267, 96: 267, 267}, + // 3415 + {335: 5546}, + {335: 5545}, + {335: 5541}, + {335: 5540}, + {263, 263, 92: 263, 263, 96: 263, 263}, + // 3420 + {95: 5542}, + {522: 5543}, + {375: 2256, 595: 5544}, + {264, 264, 92: 264, 264, 96: 264, 264}, + {265, 265, 92: 265, 265, 96: 265, 265}, + // 3425 + {266, 266, 92: 266, 266, 96: 266, 266}, + {57: 1769, 91: 5554, 526: 1769, 978: 5553}, + {366: 5549}, + {264: 5551, 293: 5552, 300: 5550}, + {57: 1772, 91: 1772, 526: 1772}, + // 3430 + {57: 1771, 91: 1771, 526: 1771}, + {57: 1770, 91: 1770, 526: 1770}, + {57: 1767, 526: 5558, 981: 5557}, + {366: 5555}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5556}, + // 3435 + {57: 1768, 526: 1768}, + {57: 5562}, + {287: 5559}, + {91: 5560, 256: 5561}, + {57: 1766}, + // 3440 + {57: 1765}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5564, 980: 5563}, + {332: 5566, 338: 1763, 979: 5565}, + {332: 1764, 338: 1764}, + {338: 5572}, + // 3445 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5568, 2311, 2310, 1009: 5567}, + {8: 5570, 18: 5569}, + {8: 1761, 18: 1761}, + {338: 1762}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5571, 2311, 2310}, + // 3450 + {8: 1760, 18: 1760}, + {332: 2161, 337: 2160, 371: 2159, 502: 2158, 504: 2154, 569: 5576, 617: 5574, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 5575, 5573, 3295, 852: 5577}, + {1783, 1783, 337: 1783}, + {1782, 1782, 337: 1782, 342: 721, 347: 721, 721}, + {1781, 1781, 337: 1781}, + // 3455 + {1780, 1780, 337: 1780, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + {1759, 1759, 337: 5579, 977: 5578}, + {1777, 1777}, + {76: 5581, 239: 5580}, + {429: 5584}, + // 3460 + {429: 5582}, + {753: 5583}, + {1757, 1757}, + {753: 5585}, + {1758, 1758}, + // 3465 + {2: 1622, 1622, 1622, 1622, 1622, 1622, 9: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 19: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 359: 1622, 428: 4165, 686: 5587}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5588}, + {458, 458, 458, 5: 458, 458, 458, 14: 458, 458, 458, 458, 19: 458, 458, 458, 458, 458, 29: 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 332: 5592, 337: 458, 458, 458, 342: 458, 458, 354: 458, 370: 458, 458, 380: 458, 5591, 502: 458, 458, 458, 458, 509: 458, 511: 458, 1057: 5590, 1127: 5589}, + {427, 427, 4565, 5: 4569, 4567, 431, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 332: 427, 337: 427, 427, 4564, 342: 4593, 1842, 354: 427, 370: 1842, 427, 380: 427, 502: 427, 427, 427, 1842, 509: 4572, 511: 5230, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 4596, 807: 5600, 1017: 5599}, + {1843, 1843}, + // 3470 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5598}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 381: 5593, 423: 2037, 429: 2037, 433: 2037, 438: 2037, 4882, 506: 3586, 2311, 2310, 2037, 530: 2037, 533: 2037, 2037, 602: 4741, 684: 5093, 697: 5215, 743: 5216, 805: 5217, 962: 5594}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5596}, + {8: 5219, 18: 5595}, + {457, 457, 457, 5: 457, 457, 457, 14: 457, 457, 457, 457, 19: 457, 457, 457, 457, 457, 29: 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 332: 457, 337: 457, 457, 457, 342: 457, 457, 354: 457, 370: 457, 457, 380: 457, 502: 457, 457, 457, 457, 509: 457, 511: 457}, + // 3475 + {18: 5597}, + {1778, 1778}, + {1779, 1779}, + {1840, 1840, 332: 1840, 337: 1840, 1840, 354: 5240, 371: 1840, 380: 1840, 502: 1840, 1840, 1840, 921: 5601}, + {426, 426, 4565, 5: 4569, 4567, 431, 5232, 14: 4583, 4594, 1842, 4566, 19: 4568, 4576, 4595, 4585, 4575, 29: 4571, 4570, 4573, 4574, 4581, 4580, 4582, 4584, 4586, 4591, 4597, 4592, 4589, 4588, 4590, 332: 426, 337: 426, 426, 4564, 342: 4593, 1842, 354: 426, 370: 1842, 426, 380: 426, 502: 426, 426, 426, 1842, 509: 4572, 511: 5230, 643: 4578, 676: 4577, 704: 4579, 712: 4587, 716: 5231}, + // 3480 + {1793, 1793, 332: 1793, 337: 1793, 1793, 371: 1793, 380: 3659, 502: 1793, 3658, 1793, 868: 5602}, + {1790, 1790, 332: 1790, 337: 1790, 5604, 371: 1790, 502: 1790, 504: 1790, 998: 5603}, + {1788, 1788, 332: 2161, 337: 2160, 371: 2159, 502: 2158, 504: 2154, 569: 5609, 617: 5607, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 5608, 5606, 3295, 1018: 5605}, + {1789, 1789, 332: 1789, 337: 1789, 371: 1789, 502: 1789, 504: 1789}, + {1844, 1844}, + // 3485 + {1787, 1787}, + {1786, 1786, 342: 721, 347: 721, 721}, + {1785, 1785}, + {1784, 1784, 342: 720, 347: 720, 720, 352: 3306, 355: 3307, 357: 3000, 630: 3308, 3309}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3850, 2311, 2310, 700: 5611}, + // 3490 + {1848, 1848, 15: 1842, 1842, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 518: 5614, 643: 5613, 699: 5616, 775: 5615, 1019: 5612}, + {1858, 1858}, + {15: 5625, 3249, 343: 5624, 370: 3250, 505: 3248, 628: 5623}, + {131: 5618}, + {1847, 1847, 15: 1842, 1842, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 518: 5614, 643: 5613, 699: 5617}, + // 3495 + {1846, 1846, 15: 1846, 1846, 339: 1846, 343: 1846, 370: 1846, 505: 1846, 518: 1846}, + {1845, 1845, 15: 1845, 1845, 339: 1845, 343: 1845, 370: 1845, 505: 1845, 518: 1845}, + {339: 1731, 366: 4598, 375: 1731, 597: 5619}, + {339: 5621, 375: 2256, 595: 5622, 1020: 5620}, + {1851, 1851, 15: 1851, 1851, 339: 1851, 343: 1851, 370: 1851, 505: 1851, 518: 1851}, + // 3500 + {1850, 1850, 15: 1850, 1850, 339: 1850, 343: 1850, 370: 1850, 505: 1850, 518: 1850}, + {1849, 1849, 15: 1849, 1849, 339: 1849, 343: 1849, 370: 1849, 505: 1849, 518: 1849}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 400: 1731, 597: 5630}, + {2: 1731, 1731, 1731, 1731, 1731, 1731, 9: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 19: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 335: 1731, 366: 4598, 400: 1731, 597: 5628}, + {335: 1731, 366: 4598, 597: 5626}, + // 3505 + {335: 4610, 870: 5627}, + {1852, 1852, 15: 1852, 1852, 339: 1852, 343: 1852, 370: 1852, 505: 1852, 518: 1852}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 2899, 506: 2901, 2311, 2310, 596: 2898, 723: 5629}, + {1853, 1853, 15: 1853, 1853, 339: 1853, 343: 1853, 370: 1853, 505: 1853, 518: 1853}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 400: 3173, 506: 2901, 2311, 2310, 596: 3172, 654: 5631}, + // 3510 + {1854, 1854, 15: 1854, 1854, 339: 1854, 343: 1854, 370: 1854, 505: 1854, 518: 1854}, + {804: 5633}, + {375: 1622, 428: 4165, 686: 5634}, + {375: 2256, 595: 5635}, + {268, 268, 92: 268, 268, 96: 268, 268, 954: 5636}, + // 3515 + {271, 271, 92: 5537, 5539, 96: 5536, 5538, 953: 5535}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5638, 2311, 2310}, + {53: 5137, 333: 1605, 361: 5136, 688: 5640, 1048: 5639}, + {333: 5641}, + {333: 1604}, + // 3520 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5642}, + {332: 5643}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 4912, 506: 3586, 2311, 2310, 602: 4911, 663: 4910, 673: 5644}, + {8: 4921, 18: 5645}, + {1616, 1616, 1616, 5: 1616, 22: 1616, 53: 1616, 1616, 1616, 1616, 337: 1616, 353: 1616, 361: 1616, 708: 5646}, + // 3525 + {1869, 1869, 5133, 5: 5135, 22: 5130, 53: 5137, 4560, 4718, 4717, 337: 5132, 353: 4561, 361: 5136, 687: 5134, 5131, 707: 5129, 719: 5387, 732: 5386, 891: 5647}, + {1876, 1876}, + {1977, 1977, 75: 4395, 358: 4393, 653: 4394, 841: 5649}, + {1976, 1976}, + {1999, 1999}, + // 3530 + {2008, 2008, 337: 5655, 518: 5654, 955: 5653, 1118: 5652}, + {2007, 2007, 8: 5660}, + {2006, 2006, 8: 2006}, + {131: 5658, 545: 5659}, + {242: 5656}, + // 3535 + {291: 5657}, + {2002, 2002, 8: 2002}, + {2004, 2004, 8: 2004}, + {2003, 2003, 8: 2003}, + {337: 5655, 518: 5654, 955: 5661}, + // 3540 + {2005, 2005, 8: 2005}, + {2009, 2009}, + {59: 3627, 502: 3626, 717: 5664}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 3357, 669: 5665}, + {2025, 2025, 8: 3359, 517: 5666, 527: 5667}, + // 3545 + {201: 5671}, + {201: 5668}, + {333: 5669}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3929, 2311, 2310, 746: 5670}, + {2022, 2022, 8: 3931}, + // 3550 + {333: 5672}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 3929, 2311, 2310, 746: 5673}, + {2018, 2018, 8: 3931, 107: 2018, 111: 2018, 337: 5676, 361: 5675, 995: 5674}, + {2021, 2021, 107: 5688, 111: 5687, 1042: 5686}, + {29: 5684}, + // 3555 + {375: 2256, 595: 5679, 769: 5678, 994: 5677}, + {2017, 2017, 8: 5681, 107: 2017, 111: 2017, 375: 2256, 595: 5679, 769: 5682}, + {2016, 2016, 8: 2016, 107: 2016, 111: 2016, 375: 2016}, + {184: 5680}, + {2013, 2013, 8: 2013, 107: 2013, 111: 2013, 375: 2013}, + // 3560 + {375: 2256, 595: 5679, 769: 5683}, + {2014, 2014, 8: 2014, 107: 2014, 111: 2014, 375: 2014}, + {2015, 2015, 8: 2015, 107: 2015, 111: 2015, 375: 2015}, + {335: 5685}, + {2023, 2023}, + // 3565 + {2024, 2024}, + {517: 5690}, + {517: 5689}, + {2019, 2019}, + {2020, 2020}, + // 3570 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5702, 967: 5701, 1131: 5700}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5695, 971: 5694, 1137: 5693}, + {2029, 2029, 8: 5698}, + {2028, 2028, 8: 2028}, + {510: 5696}, + // 3575 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5697}, + {2026, 2026, 8: 2026}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5695, 971: 5699}, + {2027, 2027, 8: 2027}, + {2033, 2033, 8: 5705}, + // 3580 + {2032, 2032, 8: 2032}, + {510: 5703}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5704}, + {2030, 2030, 8: 2030}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5702, 967: 5706}, + // 3585 + {2031, 2031, 8: 2031}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 3850, 2311, 2310, 518: 5614, 643: 5613, 699: 5616, 5814, 775: 5815}, + {57: 1769, 91: 5554, 526: 1769, 978: 5806}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5788, 2311, 2310}, + {23: 5781}, + // 3590 + {368: 5775}, + {2: 1624, 1624, 1624, 1624, 1624, 1624, 9: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 19: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 335: 1624, 425: 1624, 428: 5361, 747: 5737}, + {166: 5718, 168: 5717, 281: 5715, 286: 5716, 1050: 5714}, + {206, 206}, + {258: 5727, 296: 5726}, + // 3595 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5723, 2311, 2310}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5721, 2311, 2310}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5719, 2311, 2310}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5720, 2311, 2310}, + {201, 201}, + // 3600 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5722, 2311, 2310}, + {202, 202}, + {210: 5724}, + {423: 5725}, + {203, 203}, + // 3605 + {200, 200, 75: 200, 350: 5729, 1133: 5728}, + {204, 204}, + {198, 198, 75: 5733, 1069: 5732}, + {186: 5730}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5731, 2311, 2310}, + // 3610 + {199, 199, 75: 199}, + {205, 205}, + {158: 5734}, + {333: 5735}, + {169: 5736}, + // 3615 + {197, 197}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 5738, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5740, 824: 5741, 993: 5739}, + {1486, 1486, 1486, 8: 1486, 14: 1486, 24: 1486, 1486, 1486, 1486, 1486, 94: 1486, 1486, 332: 5764, 337: 1486, 424: 1486, 519: 1486, 524: 1486}, + {178, 178, 178, 8: 5758, 14: 178, 24: 178, 178, 178, 178, 178, 337: 178, 519: 3813, 796: 3812, 5757}, + {141, 141, 141, 8: 141, 14: 141, 24: 141, 141, 141, 141, 141, 94: 5744, 5745, 337: 141, 519: 141, 828: 5742, 999: 5743}, + // 3620 + {190, 190, 190, 8: 190, 14: 190, 24: 190, 190, 190, 190, 190, 337: 190, 519: 190}, + {193, 193, 193, 8: 193, 14: 193, 24: 193, 193, 193, 193, 193, 337: 193, 519: 193}, + {114: 5754}, + {213: 5752}, + {337: 5747, 522: 5746}, + // 3625 + {14: 3785, 335: 3782, 695: 5751}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 506: 2901, 2311, 2310, 596: 3776, 829: 5748}, + {139, 139, 139, 8: 139, 14: 139, 24: 139, 139, 139, 139, 139, 337: 139, 3778, 519: 139, 522: 5749}, + {335: 3782, 695: 5750}, + {138, 138, 138, 8: 138, 14: 138, 24: 138, 138, 138, 138, 138, 114: 187, 337: 138, 519: 138}, + // 3630 + {140, 140, 140, 8: 140, 14: 140, 24: 140, 140, 140, 140, 140, 114: 188, 337: 140, 519: 140}, + {14: 5753}, + {191, 191, 191, 8: 191, 14: 191, 24: 191, 191, 191, 191, 191, 337: 191, 519: 191}, + {80: 5755}, + {14: 5756}, + // 3635 + {192, 192, 192, 8: 192, 14: 192, 24: 192, 192, 192, 192, 192, 337: 192, 519: 192}, + {186, 186, 186, 14: 186, 24: 186, 186, 186, 186, 186, 337: 5454, 843: 5760}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 335: 2900, 425: 3749, 506: 2901, 2311, 2310, 596: 3748, 624: 5740, 824: 5759}, + {189, 189, 189, 8: 189, 14: 189, 24: 189, 189, 189, 189, 189, 337: 189, 519: 189}, + {159, 159, 159, 14: 5470, 24: 159, 159, 5469, 5471, 5472, 792: 5468, 923: 5467, 5761}, + // 3640 + {164, 164, 5497, 24: 164, 5498, 839: 5762}, + {161, 161, 24: 5502, 934: 5763}, + {210, 210}, + {18: 5765}, + {94: 5767, 5766}, + // 3645 + {522: 5770}, + {213: 5768}, + {14: 5769}, + {207, 207}, + {335: 3782, 695: 5771}, + // 3650 + {209, 209, 114: 5772}, + {80: 5773}, + {14: 5774}, + {208, 208}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5776, 2311, 2310}, + // 3655 + {531: 5777}, + {230: 5778}, + {335: 5779}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5780}, + {245, 245}, + // 3660 + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5782, 2311, 2310}, + {367: 5783}, + {180: 5784, 205: 5785}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5787}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5786}, + // 3665 + {249, 249}, + {250, 250}, + {2: 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 367: 5793, 527: 5790, 531: 5789, 535: 5791, 637: 5310, 641: 5792}, + {165: 5803}, + {165: 5800}, + // 3670 + {510: 5798}, + {253, 253, 5321, 8: 5352, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5351}, + {180: 5794, 205: 5795}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5797}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5796}, + // 3675 + {251, 251}, + {252, 252}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 506: 5799, 2311, 2310}, + {254, 254}, + {335: 5801}, + // 3680 + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5802}, + {255, 255}, + {335: 5804}, + {243, 243, 5321, 15: 5322, 17: 5323, 19: 5324, 5318, 5314, 45: 5319, 5313, 5315, 5311, 5312, 5320, 5317, 5316, 637: 5310, 641: 5309, 5805}, + {256, 256}, + // 3685 + {57: 1767, 526: 5558, 981: 5807}, + {57: 5808}, + {2: 2422, 2532, 2385, 2350, 2534, 2315, 9: 2360, 2316, 2445, 2544, 2587, 2771, 2344, 2766, 2347, 19: 2349, 2529, 2579, 2427, 2402, 2386, 2314, 2510, 2575, 2576, 2336, 2370, 2429, 2430, 2424, 2423, 2425, 2426, 2437, 2377, 2433, 2537, 2468, 2467, 2536, 2392, 2571, 2595, 2596, 2598, 2602, 2610, 2609, 2617, 2562, 2496, 2560, 2561, 2460, 2764, 2401, 2768, 2626, 2776, 2325, 2550, 2770, 2786, 2787, 2785, 2781, 2788, 2400, 2777, 2328, 2358, 2457, 2372, 2482, 2396, 2504, 2335, 2506, 2485, 2486, 2487, 2488, 2478, 2330, 2559, 2505, 2574, 2497, 2592, 2593, 2547, 2420, 2604, 2606, 2463, 2551, 2552, 2553, 2554, 2555, 2556, 2558, 2779, 2589, 2767, 2763, 2566, 2601, 2605, 2613, 2549, 2615, 2773, 2357, 2368, 2441, 2775, 2345, 2346, 2363, 2563, 2382, 2572, 2409, 2618, 2784, 2439, 2444, 2380, 2774, 2411, 2780, 2338, 2769, 2789, 2790, 2798, 2791, 2792, 2793, 2376, 2772, 2794, 2388, 2410, 2323, 2361, 2438, 2600, 2513, 2456, 2479, 2545, 2782, 2389, 2783, 2542, 2540, 2448, 2319, 2331, 2591, 2453, 2343, 2454, 2352, 2365, 2414, 2451, 2611, 2480, 2395, 2399, 2493, 2541, 2620, 2588, 2458, 2514, 2322, 2324, 2326, 2590, 2332, 2333, 2516, 2625, 2511, 2340, 2525, 2535, 2341, 2543, 2355, 2569, 2362, 2366, 2526, 2567, 2353, 2546, 2597, 2628, 2629, 2520, 2573, 2428, 2461, 2465, 2548, 2518, 2383, 2384, 2612, 2387, 2494, 2631, 2538, 2539, 2483, 2393, 2491, 2484, 2522, 2521, 2523, 2616, 2619, 2412, 2621, 2312, 2568, 2317, 2320, 2321, 2503, 2490, 2442, 2334, 2342, 2348, 2351, 2462, 2509, 2594, 2519, 2580, 2367, 2435, 2527, 2450, 2564, 2498, 2515, 2599, 2557, 2373, 2371, 2447, 2528, 2499, 2603, 2431, 2432, 2508, 2570, 2464, 2375, 2397, 2378, 2530, 2533, 2607, 2477, 2473, 2474, 2608, 2492, 2440, 2565, 2577, 2390, 2614, 2502, 2446, 2391, 2531, 2394, 2517, 2500, 2403, 2404, 2638, 2407, 2436, 2443, 2501, 2507, 2622, 2795, 2417, 2765, 2796, 2329, 2354, 2495, 2356, 2359, 2578, 2459, 2797, 2803, 2802, 2804, 2512, 2374, 2472, 2381, 2489, 2418, 2524, 2449, 2452, 2799, 2466, 2800, 2801, 2778, 359: 3356, 506: 3355, 2311, 2310, 598: 5564, 980: 5809}, + {332: 5566, 338: 1763, 979: 5810}, + {338: 5811}, + // 3690 + {332: 2161, 337: 2160, 371: 2159, 502: 2158, 504: 2154, 569: 5576, 617: 5574, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 5575, 5573, 3295, 852: 5812}, + {1759, 1759, 337: 5579, 977: 5813}, + {1776, 1776}, + {15: 1842, 1842, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 518: 5614, 643: 5613, 699: 5616, 775: 5816}, + {1859, 1859, 15: 1842, 1842, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 518: 5614, 643: 5613, 699: 5617}, + // 3695 + {1860, 1860, 15: 1842, 1842, 339: 4564, 343: 1842, 370: 1842, 505: 1842, 518: 5614, 643: 5613, 699: 5617}, + {1729, 1729, 120: 2240, 132: 2147, 156: 2250, 158: 2151, 163: 2127, 2130, 174: 2142, 2128, 181: 2129, 192: 2150, 195: 2132, 197: 2148, 199: 2170, 218: 2153, 224: 2152, 233: 2241, 332: 2161, 337: 2160, 353: 2249, 367: 2168, 371: 2159, 380: 2146, 385: 2140, 430: 2145, 502: 2158, 504: 2154, 517: 2243, 523: 2244, 525: 2124, 527: 2137, 532: 2126, 535: 2125, 539: 2251, 569: 2165, 609: 2133, 617: 2167, 2155, 2156, 2157, 622: 2166, 625: 2164, 2163, 2162, 634: 2226, 2225, 2136, 653: 2143, 671: 2134, 2135, 678: 2242, 683: 2173, 685: 2181, 689: 2202, 2220, 693: 2232, 698: 2131, 705: 2245, 731: 2247, 737: 2169, 811: 2248, 818: 2172, 2175, 2217, 822: 2214, 825: 2174, 2209, 2176, 830: 2177, 2178, 2144, 2201, 840: 2179, 844: 2184, 2185, 2216, 2189, 2211, 2213, 2186, 2188, 853: 2187, 855: 2180, 2149, 2139, 2190, 2191, 2192, 2218, 2196, 2212, 2215, 2193, 2195, 2194, 869: 2171, 872: 2182, 2138, 875: 2183, 2141, 880: 2197, 883: 2199, 2200, 2198, 894: 2252, 2203, 901: 2204, 2235, 911: 2238, 925: 2205, 930: 2221, 2207, 2219, 2208, 935: 2237, 2246, 2223, 2222, 941: 2206, 2224, 946: 2229, 2228, 2227, 950: 2230, 952: 2236, 956: 5818, 969: 2231, 2234, 972: 2233, 988: 2210}, + {466, 466}, + } +) + +var yyDebug = 0 + +type yyLexer interface { + Lex(lval *yySymType) int + Errorf(format string, a ...interface{}) error + AppendError(err error) + AppendWarn(err error) + Errors() (warns []error, errs []error) +} + +type yyLexerEx interface { + yyLexer + Reduced(rule, state int, lval *yySymType) bool +} + +func yySymName(c int) (s string) { + x, ok := yyXLAT[c] + if ok { + return yySymNames[x] + } + + return __yyfmt__.Sprintf("%d", c) +} + +func yylex1(yylex yyLexer, lval *yySymType) (n int) { + n = yylex.Lex(lval) + if n <= 0 { + n = yyEOFCode + } + if yyDebug >= 3 { + __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yySymName(n), n, n, lval) + } + return n +} + +func yyParse(yylex yyLexer, parser *Parser) int { + const yyError = 1161 + + yyEx, _ := yylex.(yyLexerEx) + var yyn int + parser.yylval = yySymType{} + yyS := parser.cache + + Nerrs := 0 /* number of errors */ + Errflag := 0 /* error recovery flag */ + yyerrok := func() { + if yyDebug >= 2 { + __yyfmt__.Printf("yyerrok()\n") + } + Errflag = 0 + } + _ = yyerrok + yystate := 0 + yychar := -1 + var yyxchar int + var yyshift int + yyp := -1 + goto yystack + +ret0: + return 0 + +ret1: + return 1 + +yystack: + /* put a state and value onto the stack */ + yyp++ + if yyp+1 >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + yyS[yyp].yys = yystate + +yynewstate: + if yychar < 0 { + yychar = yylex1(yylex, &parser.yylval) + var ok bool + if yyxchar, ok = yyXLAT[yychar]; !ok { + yyxchar = len(yySymNames) // > tab width + } + } + if yyDebug >= 4 { + var a []int + for _, v := range yyS[:yyp+1] { + a = append(a, v.yys) + } + __yyfmt__.Printf("state stack %v\n", a) + } + row := yyParseTab[yystate] + yyn = 0 + if yyxchar < len(row) { + if yyn = int(row[yyxchar]); yyn != 0 { + yyn += yyTabOfs + } + } + switch { + case yyn > 0: // shift + yychar = -1 + *parser.yyVAL = parser.yylval + yystate = yyn + yyshift = yyn + if yyDebug >= 2 { + __yyfmt__.Printf("shift, and goto state %d\n", yystate) + } + if Errflag > 0 { + Errflag-- + } + goto yystack + case yyn < 0: // reduce + case yystate == 1: // accept + if yyDebug >= 2 { + __yyfmt__.Println("accept") + } + goto ret0 + } + + if yyn == 0 { + /* error ... attempt to resume parsing */ + switch Errflag { + case 0: /* brand new error */ + if yyDebug >= 1 { + __yyfmt__.Printf("no action for %s in state %d\n", yySymName(yychar), yystate) + } + msg, ok := yyXErrors[yyXError{yystate, yyxchar}] + if !ok { + msg, ok = yyXErrors[yyXError{yystate, -1}] + } + if !ok && yyshift != 0 { + msg, ok = yyXErrors[yyXError{yyshift, yyxchar}] + } + if !ok { + msg, ok = yyXErrors[yyXError{yyshift, -1}] + } + if !ok || msg == "" { + msg = "syntax error" + } + // ignore goyacc error message + yylex.AppendError(yylex.Errorf("")) + Nerrs++ + fallthrough + + case 1, 2: /* incompletely recovered error ... try again */ + Errflag = 3 + + /* find a state where "error" is a legal shift action */ + for yyp >= 0 { + row := yyParseTab[yyS[yyp].yys] + if yyError < len(row) { + yyn = int(row[yyError]) + yyTabOfs + if yyn > 0 { // hit + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) + } + yystate = yyn /* simulate a shift of "error" */ + goto yystack + } + } + + /* the current p has no shift on "error", pop stack */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) + } + yyp-- + } + /* there is no state on the stack with an error shift ... abort */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery failed\n") + } + goto ret1 + + case 3: /* no shift yet; clobber input char */ + if yyDebug >= 2 { + __yyfmt__.Printf("error recovery discards %s\n", yySymName(yychar)) + } + if yychar == yyEOFCode { + goto ret1 + } + + yychar = -1 + goto yynewstate /* try again in the same state */ + } + } + + r := -yyn + x0 := yyReductions[r] + x, n := x0.xsym, x0.components + yypt := yyp + _ = yypt // guard against "declared and not used" + + yyp -= n + if yyp+1 >= len(yyS) { + nyys := make([]yySymType, len(yyS)*2) + copy(nyys, yyS) + yyS = nyys + parser.cache = yyS + } + parser.yyVAL = &yyS[yyp+1] + + /* consult goto table to find next state */ + exState := yystate + yystate = int(yyParseTab[yyS[yyp].yys][x]) + yyTabOfs + /* reduction by production r */ + if yyDebug >= 2 { + __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yySymNames[x], yystate) + } + + switch r { + case 2: + { + specs := yyS[yypt-1].item.([]*ast.AlterTableSpec) + if yyS[yypt-0].item != nil { + specs = append(specs, yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + parser.yyVAL.statement = &ast.AlterTableStmt{ + Table: yyS[yypt-2].item.(*ast.TableName), + Specs: specs, + } + } + case 3: + { + // MySQL partition maintenance: ALTER TABLE t ANALYZE PARTITION p1 [, p2 ...]. + // Kept from the TiDB grammar (minus TiDB analyze options), which maps it + // to an AnalyzeTableStmt rather than an AlterTableSpec. + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, PartitionNames: yyS[yypt-0].item.([]ast.CIStr)} + } + case 4: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTablePartition, + Partition: yyS[yypt-0].item.(*ast.PartitionOptions), + } + } else { + parser.yyVAL.item = nil + } + } + case 5: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemovePartitioning, + } + } + case 6: + { + ret := yyS[yypt-0].item.(*ast.AlterTableSpec) + ret.NoWriteToBinlog = yyS[yypt-1].item.(bool) + parser.yyVAL.item = ret + } + case 7: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 8: + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-1].ident, + UintValue: ast.TableOptionCharsetWithConvertTo}}, + } + if yyS[yypt-0].ident != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident}) + } + parser.yyVAL.item = op + } + case 9: + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, Default: true, + UintValue: ast.TableOptionCharsetWithConvertTo}}, + } + if yyS[yypt-0].ident != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident}) + } + parser.yyVAL.item = op + } + case 10: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 11: + { + tes := yyS[yypt-1].item.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: columnDefs, + NewConstraints: constraints, + } + } + case 12: + { + constraint := yyS[yypt-0].item.(*ast.Constraint) + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } + case 13: + { + var defs []*ast.PartitionDefinition + if yyS[yypt-0].item != nil { + defs = yyS[yypt-0].item.([]*ast.PartitionDefinition) + } + noWriteToBinlog := yyS[yypt-1].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } + case 14: + { + noWriteToBinlog := yyS[yypt-2].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + Num: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 15: + { + yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableCheckPartitions, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + } + case 16: + { + noWriteToBinlog := yyS[yypt-1].item.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableCoalescePartitions, + NoWriteToBinlog: noWriteToBinlog, + Num: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 17: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), + } + } + case 18: + { + parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } + case 19: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + PartitionNames: yyS[yypt-0].item.([]ast.CIStr), + } + } + case 20: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableExchangePartition, + PartitionNames: []ast.CIStr{ast.NewCIStr(yyS[yypt-4].ident)}, + NewTable: yyS[yypt-1].item.(*ast.TableName), + WithValidation: yyS[yypt-0].item.(bool), + } + } + case 21: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableTruncatePartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + } + case 22: + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableOptimizePartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + } + case 23: + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: yyS[yypt-1].item.(bool), + Tp: ast.AlterTableRepairPartition, + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + } + case 24: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportPartitionTablespace, + } + if yyS[yypt-1].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-1].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 25: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardPartitionTablespace, + } + if yyS[yypt-1].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-1].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 26: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportTablespace, + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 27: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardTablespace, + } + parser.yyVAL.item = ret + yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 28: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableRebuildPartition, + NoWriteToBinlog: yyS[yypt-1].item.(bool), + } + if yyS[yypt-0].item == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = yyS[yypt-0].item.([]ast.CIStr) + } + parser.yyVAL.item = ret + } + case 29: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: yyS[yypt-0].ident, + } + } + case 30: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: yyS[yypt-0].ident, + } + } + case 31: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableOrderByColumns, + OrderByList: yyS[yypt-0].item.([]*ast.AlterOrderItem), + } + } + case 32: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDisableKeys, + } + } + case 33: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableEnableKeys, + } + } + case 34: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 35: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: yyS[yypt-2].item.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{yyS[yypt-1].item.(*ast.ColumnDef)}, + Position: yyS[yypt-0].item.(*ast.ColumnPosition), + } + } + case 36: + { + option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-3].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 37: + { + // As in DefaultValueExpr, keep the parentheses: SET DEFAULT ('{}') + // is an expression default and must not restore as SET DEFAULT '{}'. + option := &ast.ColumnOption{Expr: &ast.ParenthesesExpr{Expr: yyS[yypt-1].expr}} + colDef := &ast.ColumnDef{ + Name: yyS[yypt-5].item.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 38: + { + colDef := &ast.ColumnDef{ + Name: yyS[yypt-2].item.(*ast.ColumnName), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } + case 39: + { + oldColName := &ast.ColumnName{Name: ast.NewCIStr(yyS[yypt-2].ident)} + newColName := &ast.ColumnName{Name: ast.NewCIStr(yyS[yypt-0].ident)} + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameColumn, + OldColumnName: oldColName, + NewColumnName: newColName, + } + } + case 40: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 41: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 42: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 43: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: ast.NewCIStr(yyS[yypt-2].ident), + ToKey: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 44: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: yyS[yypt-0].item.(ast.LockType), + } + } + case 45: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + Algorithm: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 46: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } + case 47: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithValidation, + } + } + case 48: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithoutValidation, + } + } + case 49: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryLoad, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } + case 50: + { + // Parse it and ignore it. Just for compatibility. + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryUnload, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } + case 51: + { + c := &ast.Constraint{ + Name: yyS[yypt-1].ident, + Enforced: yyS[yypt-0].item.(bool), + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterCheck, + Constraint: c, + } + } + case 52: + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: yyS[yypt-0].ident, + } + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropCheck, + Constraint: c, + } + } + case 53: + { + parser.yyVAL.item = &ast.AlterTableSpec{ + Tp: ast.AlterTableIndexInvisible, + IndexName: ast.NewCIStr(yyS[yypt-1].ident), + Visibility: yyS[yypt-0].item.(ast.IndexVisibility), + } + } + case 54: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + OnAllPartitions: true, + } + parser.yyVAL.item = ret + } + case 55: + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + PartitionNames: yyS[yypt-4].item.([]ast.CIStr), + PartDefinitions: yyS[yypt-1].item.([]*ast.PartitionDefinition), + } + parser.yyVAL.item = ret + } + case 56: + { + parser.yyVAL.item = nil + } + case 58: + { + parser.yyVAL.item = true + } + case 60: + { + parser.yyVAL.item = true + } + case 61: + { + parser.yyVAL.item = false + } + case 62: + { + parser.yyVAL.item = ast.AlgorithmTypeDefault + } + case 63: + { + parser.yyVAL.item = ast.AlgorithmTypeCopy + } + case 64: + { + parser.yyVAL.item = ast.AlgorithmTypeInplace + } + case 65: + { + parser.yyVAL.item = ast.AlgorithmTypeInstant + } + case 66: + { + yylex.AppendError(ErrUnknownAlterAlgorithm.GenByArgs(yyS[yypt-2].ident)) + return 1 + } + case 67: + { + parser.yyVAL.item = ast.LockTypeDefault + } + case 68: + { + id := strings.ToUpper(yyS[yypt-0].ident) + + if id == "NONE" { + parser.yyVAL.item = ast.LockTypeNone + } else if id == "SHARED" { + parser.yyVAL.item = ast.LockTypeShared + } else if id == "EXCLUSIVE" { + parser.yyVAL.item = ast.LockTypeExclusive + } else { + yylex.AppendError(ErrUnknownAlterLock.GenByArgs(yyS[yypt-0].ident)) + return 1 + } + } + case 75: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } + case 76: + { + parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } + case 77: + { + parser.yyVAL.item = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), + } + } + case 78: + { + parser.yyVAL.item = make([]*ast.AlterTableSpec, 0, 1) + } + case 80: + { + parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} + } + case 81: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) + } + case 82: + { + parser.yyVAL.item = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 83: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.CIStr), ast.NewCIStr(yyS[yypt-0].ident)) + } + case 84: + { + parser.yyVAL.item = nil + } + case 85: + { + parser.yyVAL.item = nil + } + case 86: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 88: + { + parser.yyVAL.statement = &ast.RenameTableStmt{ + TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), + } + } + case 89: + { + parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} + } + case 90: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) + } + case 91: + { + parser.yyVAL.item = &ast.TableToTable{ + OldTable: yyS[yypt-2].item.(*ast.TableName), + NewTable: yyS[yypt-0].item.(*ast.TableName), + } + } + case 92: + { + parser.yyVAL.statement = &ast.RenameUserStmt{ + UserToUsers: yyS[yypt-0].item.([]*ast.UserToUser), + } + } + case 93: + { + parser.yyVAL.item = []*ast.UserToUser{yyS[yypt-0].item.(*ast.UserToUser)} + } + case 94: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserToUser), yyS[yypt-0].item.(*ast.UserToUser)) + } + case 95: + { + parser.yyVAL.item = &ast.UserToUser{ + OldUser: yyS[yypt-2].item.(*auth.UserIdentity), + NewUser: yyS[yypt-0].item.(*auth.UserIdentity), + } + } + case 96: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-0].item.([]*ast.TableName), NoWriteToBinLog: yyS[yypt-2].item.(bool)} + } + case 97: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: yyS[yypt-6].item.([]*ast.TableName), + NoWriteToBinLog: yyS[yypt-8].item.(bool), + ColumnNames: yyS[yypt-2].item.([]ast.CIStr), + AnalyzeOpts: yyS[yypt-1].item.([]ast.AnalyzeOpt), + HistogramUpdate: yyS[yypt-0].item.(ast.HistogramUpdateType), + HistogramOperation: ast.HistogramOperationUpdate, + } + } + case 98: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: yyS[yypt-7].item.([]*ast.TableName), + NoWriteToBinLog: yyS[yypt-9].item.(bool), + ColumnNames: yyS[yypt-3].item.([]ast.CIStr), + HistogramOperation: ast.HistogramOperationUpdate, + UsingData: true, + HistogramData: yyS[yypt-0].ident, + } + } + case 99: + { + parser.yyVAL.statement = &ast.AnalyzeTableStmt{ + TableNames: yyS[yypt-4].item.([]*ast.TableName), + NoWriteToBinLog: yyS[yypt-6].item.(bool), + ColumnNames: yyS[yypt-0].item.([]ast.CIStr), + HistogramOperation: ast.HistogramOperationDrop, + } + } + case 100: + { + parser.yyVAL.item = ast.HistogramUpdateNop + } + case 101: + { + parser.yyVAL.item = ast.HistogramUpdateManual + } + case 102: + { + parser.yyVAL.item = ast.HistogramUpdateAuto + } + case 103: + { + parser.yyVAL.item = []ast.AnalyzeOpt{} + } + case 104: + { + parser.yyVAL.item = yyS[yypt-0].item.([]ast.AnalyzeOpt) + } + case 105: + { + parser.yyVAL.item = []ast.AnalyzeOpt{yyS[yypt-0].item.(ast.AnalyzeOpt)} + } + case 106: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) + } + case 107: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) + } + case 108: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} + } + case 109: + { + parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} + } + case 110: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 111: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) + } + case 112: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 113: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 114: + { + parser.yyVAL.statement = &ast.BeginStmt{ + ReadOnly: yyS[yypt-0].item.(bool), + } + } + case 116: + { + parser.yyVAL.item = yyS[yypt-2].item.(bool) || yyS[yypt-0].item.(bool) + } + case 117: + { + parser.yyVAL.item = true + } + case 118: + { + parser.yyVAL.item = false + } + case 119: + { + parser.yyVAL.item = false + } + case 122: + { + parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} + } + case 123: + { + colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.(ast.ColumnOptionList).Options} + if err := colDef.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.item = colDef + } + case 124: + { + // TODO: check flen 0 + tp := types.NewFieldType(mysql.TypeLonglong) + options := []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + options = append(options, yyS[yypt-0].item.(ast.ColumnOptionList).Options...) + tp.AddFlag(mysql.UnsignedFlag) + colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: tp, Options: options} + if err := colDef.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.item = colDef + } + case 125: + { + parser.yyVAL.item = &ast.ColumnName{Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 126: + { + parser.yyVAL.item = &ast.ColumnName{Table: ast.NewCIStr(yyS[yypt-2].ident), Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 127: + { + parser.yyVAL.item = &ast.ColumnName{Schema: ast.NewCIStr(yyS[yypt-4].ident), Table: ast.NewCIStr(yyS[yypt-2].ident), Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 128: + { + parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} + } + case 129: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) + } + case 130: + { + parser.yyVAL.item = []*ast.ColumnName{} + } + case 132: + { + parser.yyVAL.item = []ast.CIStr{} + } + case 133: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 134: + { + parser.yyVAL.item = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 135: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.CIStr), ast.NewCIStr(yyS[yypt-0].ident)) + } + case 136: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} + } + case 138: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)} + } + case 139: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnNameOrUserVar), yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)) + } + case 140: + { + parser.yyVAL.item = &ast.ColumnNameOrUserVar{ColumnName: yyS[yypt-0].item.(*ast.ColumnName)} + } + case 141: + { + parser.yyVAL.item = &ast.ColumnNameOrUserVar{UserVar: yyS[yypt-0].expr.(*ast.VariableExpr)} + } + case 142: + { + parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} + } + case 143: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar) + } + case 144: + { + parser.yyVAL.statement = &ast.CommitStmt{} + } + case 145: + { + parser.yyVAL.statement = &ast.CommitStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} + } + case 149: + { + parser.yyVAL.ident = "NOT" + } + case 150: + { + parser.yyVAL.item = true + } + case 151: + { + parser.yyVAL.item = false + } + case 152: + { + parser.yyVAL.item = true + } + case 154: + { + parser.yyVAL.item = 0 + } + case 155: + { + if yyS[yypt-0].item.(bool) { + parser.yyVAL.item = 1 + } else { + parser.yyVAL.item = 2 + } + } + case 156: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } + case 157: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } + case 158: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } + case 159: + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } + case 160: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 161: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } + case 162: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} + } + case 163: + { + parser.yyVAL.item = ast.ColumnOptionList{ + Options: []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}}, + } + } + case 164: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} + } + case 165: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident, "", "")} + } + case 166: + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + // See the branch named `EnforcedOrNotOrNotNullOpt`. + + optionCheck := &ast.ColumnOption{ + Tp: ast.ColumnOptionCheck, + Expr: yyS[yypt-2].expr, + Enforced: true, + } + // Keep the column type check constraint name. + if yyS[yypt-5].item != nil { + optionCheck.ConstraintName = yyS[yypt-5].item.(string) + } + switch yyS[yypt-0].item.(int) { + case 0: + parser.yyVAL.item = ast.ColumnOptionList{ + Options: []*ast.ColumnOption{optionCheck, {Tp: ast.ColumnOptionNotNull}}, + } + case 1: + optionCheck.Enforced = true + parser.yyVAL.item = optionCheck + case 2: + optionCheck.Enforced = false + parser.yyVAL.item = optionCheck + default: + } + } + case 167: + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := yyS[yypt-2].expr + parser.setNodeText(expr, parser.src[startOffset:endOffset]) + + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: yyS[yypt-0].item.(bool), + } + } + case 168: + { + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + } + } + case 169: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: yyS[yypt-0].ident} + } + case 170: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: yyS[yypt-0].ident} + } + case 171: + { + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionStorage, StrValue: yyS[yypt-0].ident} + yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 172: + { + parser.yyVAL.item = &ast.ColumnOption{ + Tp: ast.ColumnOptionSecondaryEngineAttribute, + StrValue: yyS[yypt-0].ident, + } + } + case 173: + { + srid := getUint64FromNUM(yyS[yypt-0].item) + // MySQL limits the SRID range to MaxUint32 + if srid > 4294967295 { + yylex.AppendError(ErrDataOutOfRange.GenByArgs("SRID", "SRID")) + return 1 + } + parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionSrid, Srid: uint32(srid)} + } + case 177: + { + parser.yyVAL.ident = "DEFAULT" + } + case 178: + { + parser.yyVAL.ident = "FIXED" + } + case 179: + { + parser.yyVAL.ident = "DYNAMIC" + } + case 182: + { + parser.yyVAL.item = false + } + case 183: + { + parser.yyVAL.item = false + } + case 184: + { + parser.yyVAL.item = true + } + case 185: + { + if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { + hasCollateOption := false + if columnOption.Tp == ast.ColumnOptionCollate { + hasCollateOption = true + } + parser.yyVAL.item = ast.ColumnOptionList{ + HasCollateOption: hasCollateOption, + Options: []*ast.ColumnOption{columnOption}, + } + } else { + parser.yyVAL.item = yyS[yypt-0].item + } + } + case 186: + { + columnOptionList := yyS[yypt-1].item.(ast.ColumnOptionList) + if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { + if columnOption.Tp == ast.ColumnOptionCollate && columnOptionList.HasCollateOption { + yylex.AppendError(ErrParse.GenByArgs("Multiple COLLATE clauses", yylex.Errorf("").Error())) + return 1 + } + columnOptionList.Options = append(columnOptionList.Options, columnOption) + } else { + if columnOptionList.HasCollateOption && yyS[yypt-0].item.(ast.ColumnOptionList).HasCollateOption { + yylex.AppendError(ErrParse.GenByArgs("Multiple COLLATE clauses", yylex.Errorf("").Error())) + return 1 + } + columnOptionList.Options = append(columnOptionList.Options, yyS[yypt-0].item.(ast.ColumnOptionList).Options...) + } + parser.yyVAL.item = columnOptionList + } + case 187: + { + parser.yyVAL.item = ast.ColumnOptionList{} + } + case 189: + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).Empty, + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + parser.yyVAL.item = c + } + case 190: + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.(*ast.NullString).String, + IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } else { + c.Option = &ast.IndexOption{} + } + parser.yyVAL.item = c + } + case 191: + { + c := &ast.Constraint{ + Tp: ast.ConstraintSpatial, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.(*ast.NullString).String, + IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } else { + c.Option = &ast.IndexOption{} + } + parser.yyVAL.item = c + } + case 192: + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).Empty, + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + parser.yyVAL.item = c + } + case 193: + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: yyS[yypt-4].item.([]interface{})[0].(*ast.NullString).Empty, + } + if yyS[yypt-0].item != nil { + c.Option = yyS[yypt-0].item.(*ast.IndexOption) + } + if indexType := yyS[yypt-4].item.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + parser.yyVAL.item = c + } + case 194: + { + parser.yyVAL.item = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + Name: yyS[yypt-4].item.(*ast.NullString).String, + Refer: yyS[yypt-0].item.(*ast.ReferenceDef), + IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, + } + } + case 195: + { + parser.yyVAL.item = &ast.Constraint{ + Tp: ast.ConstraintCheck, + Expr: yyS[yypt-2].expr.(ast.ExprNode), + Enforced: yyS[yypt-0].item.(bool), + } + } + case 196: + { + parser.yyVAL.item = ast.MatchFull + } + case 197: + { + parser.yyVAL.item = ast.MatchPartial + } + case 198: + { + parser.yyVAL.item = ast.MatchSimple + } + case 199: + { + parser.yyVAL.item = ast.MatchNone + } + case 200: + { + parser.yyVAL.item = yyS[yypt-0].item + yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 201: + { + onDeleteUpdate := yyS[yypt-0].item.([2]interface{}) + parser.yyVAL.item = &ast.ReferenceDef{ + Table: yyS[yypt-3].item.(*ast.TableName), + IndexPartSpecifications: yyS[yypt-2].item.([]*ast.IndexPartSpecification), + OnDelete: onDeleteUpdate[0].(*ast.OnDeleteOpt), + OnUpdate: onDeleteUpdate[1].(*ast.OnUpdateOpt), + Match: yyS[yypt-1].item.(ast.MatchType), + } + } + case 202: + { + parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 203: + { + parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} + } + case 204: + { + parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} + } + case 205: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, &ast.OnUpdateOpt{}} + } + case 206: + { + parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, yyS[yypt-0].item} + } + case 207: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-1].item, yyS[yypt-0].item} + } + case 208: + { + parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, yyS[yypt-1].item} + } + case 209: + { + parser.yyVAL.item = ast.ReferOptionRestrict + } + case 210: + { + parser.yyVAL.item = ast.ReferOptionCascade + } + case 211: + { + parser.yyVAL.item = ast.ReferOptionSetNull + } + case 212: + { + parser.yyVAL.item = ast.ReferOptionNoAction + } + case 213: + { + parser.yyVAL.item = ast.ReferOptionSetDefault + yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 217: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + }} + } + case 218: + { + // MySQL 8.0.13+ distinguishes literal defaults (DEFAULT '{}') from + // expression defaults (DEFAULT ('{}')): BLOB/TEXT/JSON/GEOMETRY + // columns only accept the parenthesized form. Keep the parentheses + // in the AST so restoring the statement preserves the distinction. + parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: yyS[yypt-1].expr} + } + case 219: + { + parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) + } + case 220: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-2].ident), + } + } + case 221: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 222: + { + // Function names that lex as keyword tokens rather than plain + // identifiers (POINT, REPEAT, LEFT, ...). MySQL accepts them in + // expression defaults — DEFAULT (POINT(0,0)) is the manual's own + // example — and SHOW CREATE TABLE emits them, so without this a + // table using one is unparseable (block/spirit#1128). NOW is + // excluded: DEFAULT (NOW()) must keep resolving through + // NowSymOptionFractionParentheses to CURRENT_TIMESTAMP. + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 223: + { + parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) + } + case 225: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP")} + } + case 226: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP")} + } + case 227: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}} + } + case 228: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_DATE")} + } + case 229: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_DATE")} + } + case 239: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr, parser.charset, parser.collation) + } + case 240: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} + } + case 241: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} + } + case 245: + { + var indexOption *ast.IndexOption + if yyS[yypt-1].item != nil { + indexOption = yyS[yypt-1].item.(*ast.IndexOption) + if indexOption.Tp == ast.IndexTypeInvalid { + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(ast.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if yyS[yypt-7].item != nil { + indexOption.Tp = yyS[yypt-7].item.(ast.IndexType) + } + } + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if yyS[yypt-0].item != nil { + indexLockAndAlgorithm = yyS[yypt-0].item.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + parser.yyVAL.statement = &ast.CreateIndexStmt{ + IndexName: yyS[yypt-8].ident, + Table: yyS[yypt-5].item.(*ast.TableName), + IndexPartSpecifications: yyS[yypt-3].item.([]*ast.IndexPartSpecification), + IndexOption: indexOption, + KeyType: yyS[yypt-10].item.(ast.IndexKeyType), + LockAlg: indexLockAndAlgorithm, + } + } + case 246: + { + parser.yyVAL.item = ([]*ast.IndexPartSpecification)(nil) + } + case 247: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 248: + { + parser.yyVAL.item = []*ast.IndexPartSpecification{yyS[yypt-0].item.(*ast.IndexPartSpecification)} + } + case 249: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexPartSpecification), yyS[yypt-0].item.(*ast.IndexPartSpecification)) + } + case 250: + { + parser.yyVAL.item = &ast.IndexPartSpecification{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int), Desc: yyS[yypt-0].item.(bool)} + } + case 251: + { + parser.yyVAL.item = &ast.IndexPartSpecification{Expr: yyS[yypt-2].expr, Desc: yyS[yypt-0].item.(bool)} + } + case 252: + { + parser.yyVAL.item = nil + } + case 253: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-0].item.(ast.LockType), + AlgorithmTp: ast.AlgorithmTypeDefault, + } + } + case 254: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: ast.LockTypeDefault, + AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 255: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-1].item.(ast.LockType), + AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), + } + } + case 256: + { + parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ + LockTp: yyS[yypt-0].item.(ast.LockType), + AlgorithmTp: yyS[yypt-1].item.(ast.AlgorithmType), + } + } + case 257: + { + parser.yyVAL.item = ast.IndexKeyTypeNone + } + case 258: + { + parser.yyVAL.item = ast.IndexKeyTypeUnique + } + case 259: + { + parser.yyVAL.item = ast.IndexKeyTypeSpatial + } + case 260: + { + parser.yyVAL.item = ast.IndexKeyTypeFulltext + } + case 261: + { + parser.yyVAL.statement = &ast.AlterDatabaseStmt{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + AlterDefaultDatabase: false, + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 262: + { + parser.yyVAL.statement = &ast.AlterDatabaseStmt{ + Name: ast.NewCIStr(""), + AlterDefaultDatabase: true, + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 263: + { + parser.yyVAL.statement = &ast.CreateDatabaseStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.DatabaseOption), + } + } + case 267: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].ident} + } + case 268: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].ident} + } + case 269: + { + parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: yyS[yypt-0].ident} + } + case 270: + { + opt := yyS[yypt-0].item.(*ast.DatabaseOption) + opt.Tp = ast.DatabaseOptionReadOnly + parser.yyVAL.item = opt + } + case 271: + { + parser.yyVAL.item = &ast.DatabaseOption{Value: "DEFAULT"} + } + case 272: + { + parser.yyVAL.item = &ast.DatabaseOption{UintValue: getUint64FromNUM(yyS[yypt-0].item)} + } + case 273: + { + parser.yyVAL.item = []*ast.DatabaseOption{} + } + case 275: + { + parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} + } + case 276: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) + } + case 277: + { + stmt := yyS[yypt-5].item.(*ast.CreateTableStmt) + stmt.Table = yyS[yypt-6].item.(*ast.TableName) + stmt.IfNotExists = yyS[yypt-7].item.(bool) + stmt.TemporaryKeyword = yyS[yypt-9].item.(ast.TemporaryKeyword) + stmt.Options = yyS[yypt-4].item.([]*ast.TableOption) + if yyS[yypt-3].item != nil { + stmt.Partition = yyS[yypt-3].item.(*ast.PartitionOptions) + } + stmt.OnDuplicate = yyS[yypt-2].item.(ast.OnDuplicateKeyHandlingType) + stmt.Select = yyS[yypt-0].item.(*ast.CreateTableStmt).Select + parser.yyVAL.statement = stmt + } + case 278: + { + tmp := &ast.CreateTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + ReferTable: yyS[yypt-0].item.(*ast.TableName), + IfNotExists: yyS[yypt-2].item.(bool), + TemporaryKeyword: yyS[yypt-4].item.(ast.TemporaryKeyword), + } + parser.yyVAL.statement = tmp + } + case 281: + { + parser.yyVAL.item = nil + } + case 282: + { + method := yyS[yypt-3].item.(*ast.PartitionMethod) + method.Num = yyS[yypt-2].item.(uint64) + sub, _ := yyS[yypt-1].item.(*ast.PartitionMethod) + defs, _ := yyS[yypt-0].item.([]*ast.PartitionDefinition) + opt := &ast.PartitionOptions{ + PartitionMethod: *method, + Sub: sub, + Definitions: defs, + } + if err := opt.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.item = opt + } + case 283: + { + keyAlgorithm, _ := yyS[yypt-3].item.(*ast.PartitionKeyAlgorithm) + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeKey, + Linear: len(yyS[yypt-5].ident) != 0, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + KeyAlgorithm: keyAlgorithm, + } + } + case 284: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeHash, + Linear: len(yyS[yypt-4].ident) != 0, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 285: + { + parser.yyVAL.item = nil + } + case 286: + { + tp := getUint64FromNUM(yyS[yypt-0].item) + if tp != 1 && tp != 2 { + yylex.AppendError(ErrSyntax) + return 1 + } + parser.yyVAL.item = &ast.PartitionKeyAlgorithm{ + Type: tp, + } + } + case 288: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeRange, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 289: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeRange, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 290: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeList, + Expr: yyS[yypt-1].expr.(ast.ExprNode), + } + } + case 291: + { + parser.yyVAL.item = &ast.PartitionMethod{ + Tp: ast.PartitionTypeList, + ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 292: + { + parser.yyVAL.ident = "" + } + case 294: + { + parser.yyVAL.item = nil + } + case 295: + { + method := yyS[yypt-1].item.(*ast.PartitionMethod) + method.Num = yyS[yypt-0].item.(uint64) + parser.yyVAL.item = method + } + case 296: + { + parser.yyVAL.item = uint64(0) + } + case 297: + { + res := yyS[yypt-0].item.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenByArgs("subpartitions")) + return 1 + } + parser.yyVAL.item = res + } + case 298: + { + parser.yyVAL.item = uint64(0) + } + case 299: + { + res := yyS[yypt-0].item.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenByArgs("partitions")) + return 1 + } + parser.yyVAL.item = res + } + case 300: + { + parser.yyVAL.item = nil + } + case 301: + { + parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) + } + case 302: + { + parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} + } + case 303: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) + } + case 304: + { + parser.yyVAL.item = &ast.PartitionDefinition{ + Name: ast.NewCIStr(yyS[yypt-3].ident), + Clause: yyS[yypt-2].item.(ast.PartitionDefinitionClause), + Options: yyS[yypt-1].item.([]*ast.TableOption), + Sub: yyS[yypt-0].item.([]*ast.SubPartitionDefinition), + } + } + case 305: + { + parser.yyVAL.item = make([]*ast.SubPartitionDefinition, 0) + } + case 306: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 307: + { + parser.yyVAL.item = []*ast.SubPartitionDefinition{yyS[yypt-0].item.(*ast.SubPartitionDefinition)} + } + case 308: + { + list := yyS[yypt-2].item.([]*ast.SubPartitionDefinition) + parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.SubPartitionDefinition)) + } + case 309: + { + parser.yyVAL.item = &ast.SubPartitionDefinition{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TableOption), + } + } + case 310: + { + parser.yyVAL.item = make([]*ast.TableOption, 0) + } + case 311: + { + list := yyS[yypt-1].item.([]*ast.TableOption) + parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.TableOption)) + } + case 312: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} + } + case 313: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} + } + case 314: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} + } + case 315: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngineAttribute, StrValue: yyS[yypt-0].ident} + } + case 316: + { + parser.yyVAL.item = &ast.TableOption{ + Tp: ast.TableOptionSecondaryEngineAttribute, + StrValue: yyS[yypt-0].ident, + } + } + case 317: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: yyS[yypt-0].ident} + } + case 318: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: yyS[yypt-0].ident} + } + case 319: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: yyS[yypt-0].ident} + } + case 320: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 321: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} + } + case 322: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: yyS[yypt-0].ident} + } + case 323: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: yyS[yypt-0].item.(uint64)} + } + case 324: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseNone{} + } + case 325: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ + Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, + } + } + case 326: + { + parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ + Exprs: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 327: + { + exprs := yyS[yypt-1].item.([]ast.ExprNode) + values := make([][]ast.ExprNode, 0, len(exprs)) + for _, expr := range exprs { + if row, ok := expr.(*ast.RowExpr); ok { + values = append(values, row.Values) + } else { + values = append(values, []ast.ExprNode{expr}) + } + } + parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{Values: values} + } + case 328: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingError + } + case 329: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingIgnore + } + case 330: + { + parser.yyVAL.item = ast.OnDuplicateKeyHandlingReplace + } + case 333: + { + parser.yyVAL.item = &ast.CreateTableStmt{} + } + case 334: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 335: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 336: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 337: + { + var sel ast.ResultSetNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.item = &ast.CreateTableStmt{Select: sel} + } + case 341: + { + var sel ast.StmtNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.statement = sel + } + case 342: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 343: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 344: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.yylval.offset + selStmt := yyS[yypt-1].statement.(ast.StmtNode) + x := &ast.CreateViewStmt{ + OrReplace: yyS[yypt-9].item.(bool), + ViewName: yyS[yypt-4].item.(*ast.TableName), + Select: selStmt, + Algorithm: yyS[yypt-8].item.(ast.ViewAlgorithm), + Definer: yyS[yypt-7].item.(*auth.UserIdentity), + Security: yyS[yypt-6].item.(ast.ViewSecurity), + } + if yyS[yypt-3].item != nil { + x.Cols = yyS[yypt-3].item.([]ast.CIStr) + } + if yyS[yypt-0].item != nil { + x.CheckOption = yyS[yypt-0].item.(ast.ViewCheckOption) + endOffset = parser.startOffset(&yyS[yypt]) + } else { + x.CheckOption = ast.CheckOptionCascaded + } + parser.setNodeText(selStmt, strings.TrimSpace(parser.src[startOffset:endOffset])) + parser.yyVAL.statement = x + } + case 345: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.yylval.offset + selStmt := yyS[yypt-1].statement.(ast.StmtNode) + x := &ast.AlterViewStmt{ + ViewName: yyS[yypt-4].item.(*ast.TableName), + Select: selStmt, + Algorithm: yyS[yypt-8].item.(ast.ViewAlgorithm), + Definer: yyS[yypt-7].item.(*auth.UserIdentity), + Security: yyS[yypt-6].item.(ast.ViewSecurity), + } + if yyS[yypt-3].item != nil { + x.Cols = yyS[yypt-3].item.([]ast.CIStr) + } + if yyS[yypt-0].item != nil { + x.CheckOption = yyS[yypt-0].item.(ast.ViewCheckOption) + endOffset = parser.startOffset(&yyS[yypt]) + } else { + x.CheckOption = ast.CheckOptionCascaded + } + parser.setNodeText(selStmt, strings.TrimSpace(parser.src[startOffset:endOffset])) + parser.yyVAL.statement = x + } + case 346: + { + parser.yyVAL.item = false + } + case 347: + { + parser.yyVAL.item = true + } + case 348: + { + parser.yyVAL.item = ast.AlgorithmUndefined + } + case 349: + { + parser.yyVAL.item = ast.AlgorithmUndefined + } + case 350: + { + parser.yyVAL.item = ast.AlgorithmMerge + } + case 351: + { + parser.yyVAL.item = ast.AlgorithmTemptable + } + case 352: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 353: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 354: + { + parser.yyVAL.item = ast.SecurityDefiner + } + case 355: + { + parser.yyVAL.item = ast.SecurityDefiner + } + case 356: + { + parser.yyVAL.item = ast.SecurityInvoker + } + case 358: + { + parser.yyVAL.item = nil + } + case 359: + { + parser.yyVAL.item = yyS[yypt-1].item.([]ast.CIStr) + } + case 360: + { + parser.yyVAL.item = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 361: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.CIStr), ast.NewCIStr(yyS[yypt-0].ident)) + } + case 362: + { + parser.yyVAL.item = nil + } + case 363: + { + parser.yyVAL.item = ast.CheckOptionCascaded + } + case 364: + { + parser.yyVAL.item = ast.CheckOptionLocal + } + case 365: + { + parser.yyVAL.statement = &ast.DoStmt{ + Exprs: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 366: + { + // Single Table + tn := yyS[yypt-6].item.(*ast.TableName) + tn.IndexHints = yyS[yypt-3].item.([]*ast.IndexHint) + tn.PartitionNames = yyS[yypt-5].item.([]ast.CIStr) + join := &ast.Join{Left: &ast.TableSource{Source: tn, AsName: yyS[yypt-4].item.(ast.CIStr)}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: yyS[yypt-10].item.(mysql.PriorityEnum), + Quick: yyS[yypt-9].item.(bool), + IgnoreErr: yyS[yypt-8].item.(bool), + } + if yyS[yypt-11].item != nil { + x.TableHints = yyS[yypt-11].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-2].item != nil { + x.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + x.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + x.Limit = yyS[yypt-0].item.(*ast.Limit) + } + + parser.yyVAL.statement = x + } + case 367: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-6].item.(mysql.PriorityEnum), + Quick: yyS[yypt-5].item.(bool), + IgnoreErr: yyS[yypt-4].item.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-7].item != nil { + x.TableHints = yyS[yypt-7].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 368: + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + Quick: yyS[yypt-6].item.(bool), + IgnoreErr: yyS[yypt-5].item.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, + } + if yyS[yypt-8].item != nil { + x.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + x.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = x + } + case 371: + { + d := yyS[yypt-0].statement.(*ast.DeleteStmt) + d.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = d + } + case 372: + { + d := yyS[yypt-0].statement.(*ast.DeleteStmt) + d.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = d + } + case 374: + { + parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 375: + { + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if yyS[yypt-0].item != nil { + indexLockAndAlgorithm = yyS[yypt-0].item.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + parser.yyVAL.statement = &ast.DropIndexStmt{IndexName: yyS[yypt-3].ident, Table: yyS[yypt-1].item.(*ast.TableName), LockAlg: indexLockAndAlgorithm} + } + case 376: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: yyS[yypt-2].item.(bool), Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: false, TemporaryKeyword: yyS[yypt-4].item.(ast.TemporaryKeyword)} + } + case 377: + { + parser.yyVAL.item = ast.TemporaryNone + } + case 378: + { + parser.yyVAL.item = ast.TemporaryLocal + } + case 379: + { + parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} + } + case 380: + { + parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} + } + case 381: + { + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 382: + { + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} + } + case 383: + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} + } + case 384: + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} + } + case 392: + { + parser.yyVAL.statement = nil + } + case 396: + { + startOffset := parser.startOffset(&yyS[yypt]) + stmt := yyS[yypt-0].statement + parser.setNodeText(stmt, strings.TrimSpace(parser.src[startOffset:])) + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: stmt, + Explore: true, + } + } + case 397: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-0].item.(*ast.TableName), + }, + } + } + case 398: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + Column: yyS[yypt-0].item.(*ast.ColumnName), + }, + } + } + case 399: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + } + } + case 400: + { + parser.yyVAL.statement = &ast.ExplainForStmt{ + Format: "row", + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 401: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + } + case 402: + { + parser.yyVAL.statement = &ast.ExplainForStmt{ + Format: yyS[yypt-3].ident, + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 403: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + } + } + case 404: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: "row", + Analyze: true, + } + } + case 405: + { + parser.yyVAL.statement = &ast.ExplainStmt{ + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + Analyze: true, + } + } + case 408: + { + parser.yyVAL.statement = &ast.SavepointStmt{Name: yyS[yypt-0].ident} + } + case 409: + { + parser.yyVAL.statement = &ast.ReleaseSavepointStmt{Name: yyS[yypt-0].ident} + } + case 410: + { + parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) + } + case 411: + { + v, rangeErrMsg := getInt64FromNUM(yyS[yypt-0].item) + if len(rangeErrMsg) != 0 { + yylex.AppendError(yylex.Errorf("%s", rangeErrMsg)) + return 1 + } + parser.yyVAL.item = v + } + case 413: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + } + case 414: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 415: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 416: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 417: + { + expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = !expr.Not + parser.yyVAL.expr = yyS[yypt-0].expr + } else { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} + } + } + case 418: + { + parser.yyVAL.expr = &ast.MatchAgainst{ + ColumnNames: yyS[yypt-6].item.([]*ast.ColumnName), + Against: yyS[yypt-2].expr, + Modifier: ast.FulltextSearchModifier(yyS[yypt-1].item.(int)), + } + } + case 419: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} + } + case 420: + { + parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} + } + case 421: + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 423: + { + parser.yyVAL.expr = &ast.MaxValueExpr{} + } + case 425: + { + parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode + } + case 426: + { + parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode + } + case 427: + { + parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion + } + case 428: + { + parser.yyVAL.item = ast.FulltextSearchModifierBooleanMode + } + case 429: + { + parser.yyVAL.item = ast.FulltextSearchModifierWithQueryExpansion + } + case 434: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 435: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 436: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 437: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 438: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 440: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 442: + { + expr := ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + parser.yyVAL.item = []ast.ExprNode{expr} + } + case 443: + { + parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 444: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 445: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].expr, R: sq, All: yyS[yypt-1].item.(bool)} + } + case 446: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: yyS[yypt-0].expr, + } + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} + } + case 448: + { + parser.yyVAL.item = opcode.GE + } + case 449: + { + parser.yyVAL.item = opcode.GT + } + case 450: + { + parser.yyVAL.item = opcode.LE + } + case 451: + { + parser.yyVAL.item = opcode.LT + } + case 452: + { + parser.yyVAL.item = opcode.NE + } + case 453: + { + parser.yyVAL.item = opcode.NE + } + case 454: + { + parser.yyVAL.item = opcode.EQ + } + case 455: + { + parser.yyVAL.item = opcode.NullEQ + } + case 456: + { + parser.yyVAL.item = true + } + case 457: + { + parser.yyVAL.item = false + } + case 458: + { + parser.yyVAL.item = true + } + case 459: + { + parser.yyVAL.item = false + } + case 460: + { + parser.yyVAL.item = true + } + case 461: + { + parser.yyVAL.item = false + } + case 462: + { + parser.yyVAL.item = true + } + case 463: + { + parser.yyVAL.item = false + } + case 464: + { + parser.yyVAL.item = true + } + case 465: + { + parser.yyVAL.item = false + } + case 466: + { + parser.yyVAL.item = false + } + case 467: + { + parser.yyVAL.item = false + } + case 468: + { + parser.yyVAL.item = true + } + case 469: + { + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 470: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.MultiRows = true + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), Sel: sq} + } + case 471: + { + parser.yyVAL.expr = &ast.BetweenExpr{ + Expr: yyS[yypt-4].expr, + Left: yyS[yypt-2].expr, + Right: yyS[yypt-0].expr, + Not: !yyS[yypt-3].item.(bool), + } + } + case 472: + { + escapeSpec := yyS[yypt-0].item.(*likeEscapeSpec) + escape := escapeSpec.escape + explicit := escapeSpec.explicit + if len(escape) > 1 { + yylex.AppendError(ErrWrongArguments.GenByArgs("ESCAPE")) + return 1 + } + // When ESCAPE empty string is specified, escape is empty and explicit is true. + // This means no escape character should be used (Escape = 0). + var escapeChar byte + if len(escape) > 0 { + escapeChar = escape[0] + } + parser.yyVAL.expr = &ast.PatternLikeExpr{ + Expr: yyS[yypt-3].expr, + Pattern: yyS[yypt-1].expr, + Not: !yyS[yypt-2].item.(bool), + Escape: escapeChar, + EscapeExplicit: explicit, + } + } + case 473: + { + parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} + } + case 474: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONMemberOf), Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-1].expr}} + } + case 478: + { + parser.yyVAL.item = &likeEscapeSpec{escape: "\\", explicit: false} + } + case 479: + { + parser.yyVAL.item = &likeEscapeSpec{escape: yyS[yypt-0].ident, explicit: true} + } + case 480: + { + parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} + } + case 481: + { + wildCard := &ast.WildCardField{Table: ast.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 482: + { + wildCard := &ast.WildCardField{Schema: ast.NewCIStr(yyS[yypt-4].ident), Table: ast.NewCIStr(yyS[yypt-2].ident)} + parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} + } + case 483: + { + expr := yyS[yypt-1].expr + asName := yyS[yypt-0].ident + parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: ast.NewCIStr(asName)} + } + case 484: + { + parser.yyVAL.ident = "" + } + case 487: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 489: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 490: + { + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil { + endOffset := parser.yylval.offset + parser.setNodeText(field, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } + parser.yyVAL.item = []*ast.SelectField{field} + } + case 491: + { + fl := yyS[yypt-2].item.([]*ast.SelectField) + field := yyS[yypt-0].item.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil { + endOffset := parser.yylval.offset + parser.setNodeText(field, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } + parser.yyVAL.item = append(fl, field) + } + case 492: + { + parser.yyVAL.item = false + } + case 493: + { + parser.yyVAL.item = true + } + case 494: + { + parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-1].item.([]*ast.ByItem), Rollup: yyS[yypt-0].item.(bool)} + } + case 495: + { + parser.yyVAL.item = nil + } + case 496: + { + parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} + } + case 497: + { + parser.yyVAL.item = false + } + case 498: + { + parser.yyVAL.item = true + } + case 499: + { + parser.yyVAL.item = false + } + case 500: + { + parser.yyVAL.item = true + } + case 501: + { + parser.yyVAL.item = false + } + case 502: + { + parser.yyVAL.item = true + } + case 503: + { + parser.yyVAL.item = &ast.NullString{ + String: "", + Empty: false, + } + } + case 504: + { + parser.yyVAL.item = &ast.NullString{ + String: yyS[yypt-0].ident, + Empty: len(yyS[yypt-0].ident) == 0, + } + } + case 505: + { + parser.yyVAL.item = nil + } + case 506: + { + // Merge the options + if yyS[yypt-1].item == nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + opt1 := yyS[yypt-1].item.(*ast.IndexOption) + opt2 := yyS[yypt-0].item.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } else if opt2.KeyBlockSize > 0 { + opt1.KeyBlockSize = opt2.KeyBlockSize + } else if len(opt2.ParserName.O) > 0 { + opt1.ParserName = opt2.ParserName + } else if opt2.Visibility != ast.IndexVisibilityDefault { + opt1.Visibility = opt2.Visibility + } else if len(opt2.SecondaryEngineAttr) > 0 { + opt1.SecondaryEngineAttr = opt2.SecondaryEngineAttr + } + parser.yyVAL.item = opt1 + } + } + case 507: + { + parser.yyVAL.item = &ast.IndexOption{ + KeyBlockSize: yyS[yypt-0].item.(uint64), + } + } + case 508: + { + parser.yyVAL.item = &ast.IndexOption{ + Tp: yyS[yypt-0].item.(ast.IndexType), + } + } + case 509: + { + parser.yyVAL.item = &ast.IndexOption{ + ParserName: ast.NewCIStr(yyS[yypt-0].ident), + } + } + case 510: + { + parser.yyVAL.item = &ast.IndexOption{ + Comment: yyS[yypt-0].ident, + } + } + case 511: + { + parser.yyVAL.item = &ast.IndexOption{ + Visibility: yyS[yypt-0].item.(ast.IndexVisibility), + } + } + case 512: + { + parser.yyVAL.item = &ast.IndexOption{SecondaryEngineAttr: yyS[yypt-0].ident} + } + case 513: + { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} + } + case 514: + { + parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} + } + case 515: + { + parser.yyVAL.item = []interface{}{&ast.NullString{String: yyS[yypt-2].ident, Empty: len(yyS[yypt-2].ident) == 0}, yyS[yypt-0].item} + } + case 516: + { + parser.yyVAL.item = nil + } + case 518: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 519: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 520: + { + parser.yyVAL.item = ast.IndexTypeBtree + } + case 521: + { + parser.yyVAL.item = ast.IndexTypeHash + } + case 522: + { + parser.yyVAL.item = ast.IndexTypeRtree + } + case 523: + { + parser.yyVAL.item = ast.IndexVisibilityVisible + } + case 524: + { + parser.yyVAL.item = ast.IndexVisibilityInvisible + } + case 855: + { + parser.yyVAL.statement = &ast.CallStmt{ + Procedure: yyS[yypt-0].expr.(*ast.FuncCallExpr), + } + } + case 856: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + FnName: ast.NewCIStr(yyS[yypt-0].ident), + Args: []ast.ExprNode{}, + } + } + case 857: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + Schema: ast.NewCIStr(yyS[yypt-2].ident), + FnName: ast.NewCIStr(yyS[yypt-0].ident), + Args: []ast.ExprNode{}, + } + } + case 858: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 859: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + Schema: ast.NewCIStr(yyS[yypt-5].ident), + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 860: + { + x := yyS[yypt-1].item.(*ast.InsertStmt) + x.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) + x.IgnoreErr = yyS[yypt-5].item.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: yyS[yypt-3].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if yyS[yypt-0].item != nil { + x.OnDuplicate = yyS[yypt-0].item.([]*ast.Assignment) + } + if yyS[yypt-7].item != nil { + x.TableHints = yyS[yypt-7].item.([]*ast.TableOptimizerHint) + } + x.PartitionNames = yyS[yypt-2].item.([]ast.CIStr) + parser.yyVAL.statement = x + } + case 863: + { + x := &ast.InsertStmt{ + Columns: yyS[yypt-4].item.([]*ast.ColumnName), + Lists: yyS[yypt-1].item.([][]ast.ExprNode), + } + if yyS[yypt-0].item != nil { + alias := yyS[yypt-0].item.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + parser.yyVAL.item = x + } + case 864: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 865: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 866: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 867: + { + var sel ast.ResultSetNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: sel} + } + case 868: + { + x := &ast.InsertStmt{Lists: yyS[yypt-1].item.([][]ast.ExprNode)} + if yyS[yypt-0].item != nil { + alias := yyS[yypt-0].item.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + parser.yyVAL.item = x + } + case 869: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 870: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 871: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 872: + { + var sel ast.ResultSetNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.item = &ast.InsertStmt{Select: sel} + } + case 873: + { + x := yyS[yypt-1].item.(*ast.InsertStmt) + if yyS[yypt-0].item != nil { + alias := yyS[yypt-0].item.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + parser.yyVAL.item = x + } + case 876: + { + parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} + } + case 877: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) + } + case 878: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 879: + { + parser.yyVAL.item = []ast.ExprNode{} + } + case 881: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 882: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 884: + { + parser.yyVAL.expr = &ast.DefaultExpr{} + } + case 885: + { + parser.yyVAL.item = &ast.InsertStmt{ + Columns: []*ast.ColumnName{yyS[yypt-2].item.(*ast.ColumnName)}, + Lists: [][]ast.ExprNode{{yyS[yypt-0].expr.(ast.ExprNode)}}, + Setlist: true, + } + } + case 886: + { + ins := yyS[yypt-4].item.(*ast.InsertStmt) + ins.Columns = append(ins.Columns, yyS[yypt-2].item.(*ast.ColumnName)) + ins.Lists[0] = append(ins.Lists[0], yyS[yypt-0].expr.(ast.ExprNode)) + parser.yyVAL.item = ins + } + case 887: + { + parser.yyVAL.item = nil + } + case 888: + { + parser.yyVAL.item = &insertRowAlias{rowAlias: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 889: + { + parser.yyVAL.item = &insertRowAlias{rowAlias: ast.NewCIStr(yyS[yypt-3].ident), columnAliases: yyS[yypt-1].item.([]ast.CIStr)} + } + case 890: + { + parser.yyVAL.item = nil + } + case 891: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 892: + { + x := yyS[yypt-0].item.(*ast.InsertStmt) + if x.RowAlias.O != "" || len(x.ColumnAliases) > 0 { + yylex.AppendError(ErrSyntax) + return 1 + } + if yyS[yypt-5].item != nil { + x.TableHints = yyS[yypt-5].item.([]*ast.TableOptimizerHint) + } + x.IsReplace = true + x.Priority = yyS[yypt-4].item.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + x.PartitionNames = yyS[yypt-1].item.([]ast.CIStr) + parser.yyVAL.statement = x + } + case 893: + { + parser.yyVAL.expr = ast.NewValueExpr(false, parser.charset, parser.collation) + } + case 894: + { + parser.yyVAL.expr = ast.NewValueExpr(nil, parser.charset, parser.collation) + } + case 895: + { + parser.yyVAL.expr = ast.NewValueExpr(true, parser.charset, parser.collation) + } + case 896: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 897: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 898: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 900: + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", yyS[yypt-1].ident)) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].ident, yyS[yypt-1].ident, co) + tp := expr.GetType() + tp.SetCharset(yyS[yypt-1].ident) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.expr = expr + } + case 901: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 902: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 903: + { + co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", yyS[yypt-1].ident)) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].item, yyS[yypt-1].ident, co) + tp := expr.GetType() + tp.SetCharset(yyS[yypt-1].ident) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.expr = expr + } + case 904: + { + co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", yyS[yypt-1].ident)) + return 1 + } + expr := ast.NewValueExpr(yyS[yypt-0].item, yyS[yypt-1].ident, co) + tp := expr.GetType() + tp.SetCharset(yyS[yypt-1].ident) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.expr = expr + } + case 905: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) + parser.yyVAL.expr = expr + } + case 906: + { + valExpr := yyS[yypt-1].expr.(*ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit+yyS[yypt-0].ident, parser.charset, parser.collation) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + parser.yyVAL.expr = expr + } + case 907: + { + parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} + } + case 908: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) + } + case 909: + { + parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} + } + case 910: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 911: + { + parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} + } + case 912: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) + } + case 913: + { + expr := yyS[yypt-0].expr + valueExpr, ok := expr.(*ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + parser.yyVAL.item = &ast.ByItem{Expr: expr, NullOrder: true} + } + case 914: + { + expr := yyS[yypt-1].expr + valueExpr, ok := expr.(*ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} + } + case 915: + { + parser.yyVAL.item = false + } + case 916: + { + parser.yyVAL.item = true + } + case 917: + { + parser.yyVAL.item = false // ASC by default + } + case 918: + { + parser.yyVAL.item = false + } + case 919: + { + parser.yyVAL.item = true + } + case 920: + { + parser.yyVAL.item = nil + } + case 922: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 923: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 924: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 925: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 926: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 927: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 928: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-0].item.(ast.TimeUnitType)}, + }, + } + } + case 929: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + yyS[yypt-4].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-0].item.(ast.TimeUnitType)}, + }, + } + } + case 930: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + yyS[yypt-0].expr, + yyS[yypt-3].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-2].item.(ast.TimeUnitType)}, + }, + } + } + case 931: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 932: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 933: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 934: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 935: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 936: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} + } + case 938: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: ast.NewCIStr(yyS[yypt-0].ident), + }} + } + case 939: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: ast.NewCIStr(yyS[yypt-2].ident), + Name: ast.NewCIStr(yyS[yypt-0].ident), + }} + } + case 940: + { + parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: ast.NewCIStr(yyS[yypt-4].ident), + Table: ast.NewCIStr(yyS[yypt-2].ident), + Name: ast.NewCIStr(yyS[yypt-0].ident), + }} + } + case 945: + { + parser.yyVAL.expr = &ast.SetCollationExpr{Expr: yyS[yypt-2].expr, Collate: yyS[yypt-0].ident} + } + case 948: + { + parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 951: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} + } + case 952: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} + } + case 953: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} + } + case 954: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} + } + case 955: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} + } + case 956: + { + parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} + } + case 958: + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := yyS[yypt-1].expr + parser.setNodeText(expr, parser.src[startOffset:endOffset]) + parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} + } + case 959: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 960: + { + values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) + parser.yyVAL.expr = &ast.RowExpr{Values: values} + } + case 961: + { + sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) + sq.Exists = true + parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} + } + case 962: + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + tp := yyS[yypt-1].expr.GetType() + switch yyS[yypt-2].ident { + case "d": + tp.SetCharset("") + tp.SetCollate("") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{yyS[yypt-1].expr}} + case "t": + tp.SetCharset("") + tp.SetCollate("") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{yyS[yypt-1].expr}} + case "ts": + tp.SetCharset("") + tp.SetCollate("") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{yyS[yypt-1].expr}} + default: + parser.yyVAL.expr = yyS[yypt-1].expr + } + } + case 963: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-0].expr, + Tp: tp, + FunctionType: ast.CastBinaryOperator, + } + } + case 964: + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := yyS[yypt-2].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + isArray := yyS[yypt-1].item.(bool) + tp.SetArray(isArray) + explicitCharset := parser.explicitCharset + if isArray && !explicitCharset && tp.GetCharset() != charset.CharsetBin { + tp.SetCharset(charset.CharsetUTF8MB4) + tp.SetCollate(charset.CollationUTF8MB4) + } + parser.explicitCharset = false + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-4].expr, + Tp: tp, + FunctionType: ast.CastFunction, + ExplicitCharSet: explicitCharset, + } + } + case 965: + { + /* Copied from CAST function, except that ARRAY is enforced to be true */ + tp := yyS[yypt-2].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + tp.SetArray(true) + explicitCharset := parser.explicitCharset + if !explicitCharset && tp.GetCharset() != charset.CharsetBin { + tp.SetCharset(charset.CharsetUTF8MB4) + tp.SetCollate(charset.CollationUTF8MB4) + } + parser.explicitCharset = false + parser.yyVAL.expr = &ast.JSONSumCrc32Expr{ + Expr: yyS[yypt-4].expr, + Tp: tp, + ExplicitCharSet: explicitCharset, + } + } + case 966: + { + x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} + if yyS[yypt-3].expr != nil { + x.Value = yyS[yypt-3].expr + } + if yyS[yypt-1].item != nil { + x.ElseClause = yyS[yypt-1].item.(ast.ExprNode) + } + parser.yyVAL.expr = x + } + case 967: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := yyS[yypt-1].item.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + explicitCharset := parser.explicitCharset + parser.explicitCharset = false + parser.yyVAL.expr = &ast.FuncCastExpr{ + Expr: yyS[yypt-3].expr, + Tp: tp, + FunctionType: ast.CastConvertFunction, + ExplicitCharSet: explicitCharset, + } + } + case 968: + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, + } + } + case 969: + { + parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} + } + case 970: + { + parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} + } + case 971: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + } + case 972: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) + extract := &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + case 973: + { + parser.yyVAL.item = false + } + case 974: + { + parser.yyVAL.item = true + } + case 977: + { + parser.yyVAL.item = false + } + case 978: + { + parser.yyVAL.item = true + } + case 979: + { + parser.yyVAL.item = false + } + case 981: + { + parser.yyVAL.item = true + } + case 984: + { + parser.yyVAL.item = true + } + case 1035: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1036: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1037: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-1].ident)} + } + case 1038: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-2].ident)} + } + case 1039: + { + args := []ast.ExprNode{} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-1].ident), Args: args} + } + case 1040: + { + nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) + args := yyS[yypt-1].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } + case 1041: + { + charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") + args := yyS[yypt-3].item.([]ast.ExprNode) + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } + case 1042: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } + case 1043: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } + case 1044: + { + expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } + case 1045: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1046: + { + parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} + } + case 1047: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1048: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1049: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1050: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + yyS[yypt-3].expr, + yyS[yypt-1].expr, + &ast.TimeUnitExpr{Unit: ast.TimeUnitDay}, + }, + } + } + case 1051: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-1].item.(ast.TimeUnitType)}, + }, + } + } + case 1052: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{ + yyS[yypt-5].expr, + yyS[yypt-2].expr, + &ast.TimeUnitExpr{Unit: yyS[yypt-1].item.(ast.TimeUnitType)}, + }, + } + } + case 1053: + { + timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, + } + } + case 1054: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{ + &ast.GetFormatSelectorExpr{Selector: yyS[yypt-3].item.(ast.GetFormatSelectorType)}, + yyS[yypt-1].expr, + }, + } + } + case 1055: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} + } + case 1056: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1057: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1058: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1059: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1060: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1061: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1062: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr}, + } + } + case 1063: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, + } + } + case 1064: + { + spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) + direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-5].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, spaceVal, direction}, + } + } + case 1065: + { + direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, + } + } + case 1066: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: []ast.ExprNode{yyS[yypt-1].expr}, + } + } + case 1067: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("CHAR", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, + } + } + case 1068: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-6].ident), + Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("BINARY", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, + } + } + case 1069: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-7].ident), + Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-3].expr, yyS[yypt-1].expr}, + } + } + case 1070: + { + parser.yyVAL.expr = &ast.FuncCallExpr{FnName: ast.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1071: + { + parser.yyVAL.item = ast.GetFormatSelectorDate + } + case 1072: + { + parser.yyVAL.item = ast.GetFormatSelectorDatetime + } + case 1073: + { + parser.yyVAL.item = ast.GetFormatSelectorTime + } + case 1074: + { + parser.yyVAL.item = ast.GetFormatSelectorDatetime + } + case 1079: + { + parser.yyVAL.item = ast.TrimBoth + } + case 1080: + { + parser.yyVAL.item = ast.TrimLeading + } + case 1081: + { + parser.yyVAL.item = ast.TrimTrailing + } + case 1082: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1083: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: false} + } + case 1084: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 1085: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1086: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1087: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1088: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1089: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1090: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1091: + { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} + } + case 1092: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1093: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1094: + { + args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: args, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} + } + } + case 1095: + { + args := yyS[yypt-4].item.([]ast.ExprNode) + args = append(args, yyS[yypt-2].item.(ast.ExprNode)) + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-7].ident, Args: args, Distinct: yyS[yypt-5].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + agg := &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: args, Distinct: yyS[yypt-5].item.(bool)} + if yyS[yypt-3].item != nil { + agg.Order = yyS[yypt-3].item.(*ast.OrderByClause) + } + parser.yyVAL.expr = agg + } + } + case 1096: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1097: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1098: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1099: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1100: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1101: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1102: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} + } + } + case 1103: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1104: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} + } + } + case 1105: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} + } + } + case 1106: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} + } + } + case 1107: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} + } + } + case 1108: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} + } else { + parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} + } + } + case 1109: + { + parser.yyVAL.item = ast.NewValueExpr(",", parser.charset, parser.collation) + } + case 1110: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) + } + case 1111: + { + parser.yyVAL.expr = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 1112: + { + var tp ast.FuncCallExprType + if isInTokenMap(yyS[yypt-3].ident) { + tp = ast.FuncCallExprTypeKeyword + } else { + tp = ast.FuncCallExprTypeGeneric + } + parser.yyVAL.expr = &ast.FuncCallExpr{ + Tp: tp, + Schema: ast.NewCIStr(yyS[yypt-5].ident), + FnName: ast.NewCIStr(yyS[yypt-3].ident), + Args: yyS[yypt-1].item.([]ast.ExprNode), + } + } + case 1113: + { + parser.yyVAL.item = nil + } + case 1114: + { + parser.yyVAL.item = nil + } + case 1115: + { + expr := ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation) + parser.yyVAL.item = expr + } + case 1117: + { + parser.yyVAL.item = ast.TimeUnitSecondMicrosecond + } + case 1118: + { + parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond + } + case 1119: + { + parser.yyVAL.item = ast.TimeUnitMinuteSecond + } + case 1120: + { + parser.yyVAL.item = ast.TimeUnitHourMicrosecond + } + case 1121: + { + parser.yyVAL.item = ast.TimeUnitHourSecond + } + case 1122: + { + parser.yyVAL.item = ast.TimeUnitHourMinute + } + case 1123: + { + parser.yyVAL.item = ast.TimeUnitDayMicrosecond + } + case 1124: + { + parser.yyVAL.item = ast.TimeUnitDaySecond + } + case 1125: + { + parser.yyVAL.item = ast.TimeUnitDayMinute + } + case 1126: + { + parser.yyVAL.item = ast.TimeUnitDayHour + } + case 1127: + { + parser.yyVAL.item = ast.TimeUnitYearMonth + } + case 1128: + { + parser.yyVAL.item = ast.TimeUnitMicrosecond + } + case 1129: + { + parser.yyVAL.item = ast.TimeUnitSecond + } + case 1130: + { + parser.yyVAL.item = ast.TimeUnitMinute + } + case 1131: + { + parser.yyVAL.item = ast.TimeUnitHour + } + case 1132: + { + parser.yyVAL.item = ast.TimeUnitDay + } + case 1133: + { + parser.yyVAL.item = ast.TimeUnitWeek + } + case 1134: + { + parser.yyVAL.item = ast.TimeUnitMonth + } + case 1135: + { + parser.yyVAL.item = ast.TimeUnitQuarter + } + case 1136: + { + parser.yyVAL.item = ast.TimeUnitYear + } + case 1137: + { + parser.yyVAL.item = ast.TimeUnitSecond + } + case 1138: + { + parser.yyVAL.item = ast.TimeUnitMinute + } + case 1139: + { + parser.yyVAL.item = ast.TimeUnitHour + } + case 1140: + { + parser.yyVAL.item = ast.TimeUnitDay + } + case 1141: + { + parser.yyVAL.item = ast.TimeUnitWeek + } + case 1142: + { + parser.yyVAL.item = ast.TimeUnitMonth + } + case 1143: + { + parser.yyVAL.item = ast.TimeUnitQuarter + } + case 1144: + { + parser.yyVAL.item = ast.TimeUnitYear + } + case 1145: + { + parser.yyVAL.expr = nil + } + case 1147: + { + parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} + } + case 1148: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) + } + case 1149: + { + parser.yyVAL.item = &ast.WhenClause{ + Expr: yyS[yypt-2].expr, + Result: yyS[yypt-0].expr, + } + } + case 1150: + { + parser.yyVAL.item = nil + } + case 1151: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1152: + { + tp := types.NewFieldType(mysql.TypeVarString) + tp.SetFlen(yyS[yypt-0].item.(int)) // TODO: Flen should be the flen of expression + if tp.GetFlen() != types.UnspecifiedLength { + tp.SetType(mysql.TypeString) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1153: + { + tp := types.NewFieldType(mysql.TypeVarString) + tp.SetFlen(yyS[yypt-1].item.(int)) // TODO: Flen should be the flen of expression + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + } else if tp.GetCharset() != "" { + co, err := charset.GetDefaultCollation(tp.GetCharset()) + if err != nil { + yylex.AppendError(yylex.Errorf("Get collation error for charset: %s", tp.GetCharset())) + return 1 + } + tp.SetCollate(co) + parser.explicitCharset = true + } else { + tp.SetCharset(parser.charset) + tp.SetCollate(parser.collation) + } + parser.yyVAL.item = tp + } + case 1154: + { + tp := types.NewFieldType(mysql.TypeDate) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1155: + { + tp := types.NewFieldType(mysql.TypeYear) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1156: + { + tp := types.NewFieldType(mysql.TypeDatetime) + flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + tp.SetFlen(flen) + tp.SetDecimal(yyS[yypt-0].item.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1157: + { + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + tp := types.NewFieldType(mysql.TypeNewDecimal) + tp.SetFlen(fopt.Flen) + tp.SetDecimal(fopt.Decimal) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1158: + { + tp := types.NewFieldType(mysql.TypeDuration) + flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + tp.SetFlen(flen) + tp.SetDecimal(yyS[yypt-0].item.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1159: + { + tp := types.NewFieldType(mysql.TypeLonglong) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1160: + { + tp := types.NewFieldType(mysql.TypeLonglong) + tp.AddFlag(mysql.UnsignedFlag | mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1161: + { + tp := types.NewFieldType(mysql.TypeJSON) + tp.AddFlag(mysql.BinaryFlag | mysql.ParseToJSONFlag) + tp.SetCharset(mysql.DefaultCharset) + tp.SetCollate(mysql.DefaultCollationName) + parser.yyVAL.item = tp + } + case 1162: + { + tp := types.NewFieldType(mysql.TypeDouble) + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1163: + { + tp := types.NewFieldType(mysql.TypeFloat) + fopt := yyS[yypt-0].item.(*ast.FloatOpt) + if fopt.Flen >= 54 { + yylex.AppendError(ErrTooBigPrecision.GenByArgs(fopt.Flen, "CAST", 53)) + } else if fopt.Flen >= 25 { + tp = types.NewFieldType(mysql.TypeDouble) + } + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1164: + { + var tp *types.FieldType + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + tp = types.NewFieldType(mysql.TypeFloat) + } else { + tp = types.NewFieldType(mysql.TypeDouble) + } + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1165: + { + parser.yyVAL.item = mysql.LowPriority + } + case 1166: + { + parser.yyVAL.item = mysql.HighPriority + } + case 1167: + { + parser.yyVAL.item = mysql.DelayedPriority + } + case 1168: + { + parser.yyVAL.item = mysql.NoPriority + } + case 1170: + { + parser.yyVAL.item = &ast.TableName{Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 1171: + { + schema := yyS[yypt-2].ident + if isInCorrectIdentifierName(schema) { + yylex.AppendError(ErrWrongDBName.GenByArgs(schema)) + return 1 + } + parser.yyVAL.item = &ast.TableName{Schema: ast.NewCIStr(schema), Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 1172: + { + parser.yyVAL.item = &ast.TableName{Schema: ast.NewCIStr("*"), Name: ast.NewCIStr(yyS[yypt-0].ident)} + } + case 1173: + { + tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} + parser.yyVAL.item = tbl + } + case 1174: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) + } + case 1175: + { + parser.yyVAL.item = &ast.TableName{Name: ast.NewCIStr(yyS[yypt-1].ident)} + } + case 1176: + { + parser.yyVAL.item = &ast.TableName{Schema: ast.NewCIStr(yyS[yypt-3].ident), Name: ast.NewCIStr(yyS[yypt-1].ident)} + } + case 1177: + { + tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} + parser.yyVAL.item = tbl + } + case 1178: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) + } + case 1181: + { + parser.yyVAL.item = false + } + case 1182: + { + parser.yyVAL.item = true + } + case 1183: + { + var sqlText string + var sqlVar *ast.VariableExpr + switch x := yyS[yypt-0].item.(type) { + case string: + sqlText = x + case *ast.VariableExpr: + sqlVar = x + } + parser.yyVAL.statement = &ast.PrepareStmt{ + Name: yyS[yypt-2].ident, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + case 1184: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 1185: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1186: + { + parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} + } + case 1187: + { + parser.yyVAL.statement = &ast.ExecuteStmt{ + Name: yyS[yypt-2].ident, + UsingVars: yyS[yypt-0].item.([]ast.ExprNode), + } + } + case 1188: + { + parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} + } + case 1189: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) + } + case 1190: + { + parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} + } + case 1193: + { + parser.yyVAL.statement = &ast.RollbackStmt{} + } + case 1194: + { + parser.yyVAL.statement = &ast.RollbackStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} + } + case 1195: + { + parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} + } + case 1196: + { + parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} + } + case 1197: + { + parser.yyVAL.item = ast.CompletionTypeChain + } + case 1198: + { + parser.yyVAL.item = ast.CompletionTypeRelease + } + case 1199: + { + parser.yyVAL.item = ast.CompletionTypeDefault + } + case 1200: + { + parser.yyVAL.item = ast.CompletionTypeChain + } + case 1201: + { + parser.yyVAL.item = ast.CompletionTypeDefault + } + case 1202: + { + parser.yyVAL.item = ast.CompletionTypeRelease + } + case 1203: + { + parser.yyVAL.item = ast.CompletionTypeDefault + } + case 1204: + { + parser.yyVAL.statement = &ast.ShutdownStmt{} + } + case 1205: + { + parser.yyVAL.statement = &ast.RestartStmt{} + } + case 1206: + { + st := &ast.SelectStmt{ + SelectStmtOpts: yyS[yypt-2].item.(*ast.SelectStmtOpts), + Distinct: yyS[yypt-2].item.(*ast.SelectStmtOpts).Distinct, + Fields: yyS[yypt-1].item.(*ast.FieldList), + Kind: ast.SelectStmtKindSelect, + } + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + if yyS[yypt-0].item != nil { + st.Having = yyS[yypt-0].item.(*ast.HavingClause) + } + parser.yyVAL.item = st + } + case 1207: + { + st := yyS[yypt-2].item.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-1].offset - 1 + parser.setNodeText(lastField, parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + case 1208: + { + st := yyS[yypt-6].item.(*ast.SelectStmt) + st.From = yyS[yypt-4].item.(*ast.TableRefsClause) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-5]) + parser.setNodeText(lastField, parser.src[lastField.Offset:lastEnd]) + } + if yyS[yypt-3].item != nil { + st.Where = yyS[yypt-3].item.(ast.ExprNode) + } + if yyS[yypt-2].item != nil { + st.GroupBy = yyS[yypt-2].item.(*ast.GroupByClause) + } + if yyS[yypt-1].item != nil { + st.Having = yyS[yypt-1].item.(*ast.HavingClause) + } + if yyS[yypt-0].item != nil { + st.WindowSpecs = (yyS[yypt-0].item.([]ast.WindowSpec)) + } + parser.yyVAL.item = st + } + case 1209: + { + st := yyS[yypt-6].item.(*ast.SelectStmt) + if yyS[yypt-1].item != nil { + st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) + } + if yyS[yypt-5].item != nil { + st.Where = yyS[yypt-5].item.(ast.ExprNode) + } + if yyS[yypt-4].item != nil { + st.GroupBy = yyS[yypt-4].item.(*ast.GroupByClause) + } + if yyS[yypt-3].item != nil { + st.OrderBy = yyS[yypt-3].item.(*ast.OrderByClause) + } + if yyS[yypt-2].item != nil { + st.Limit = yyS[yypt-2].item.(*ast.Limit) + } + if yyS[yypt-0].item != nil { + st.SelectIntoOpt = yyS[yypt-0].item.(*ast.SelectIntoOption) + } + parser.yyVAL.statement = st + } + case 1210: + { + st := yyS[yypt-5].item.(*ast.SelectStmt) + if yyS[yypt-4].item != nil { + st.GroupBy = yyS[yypt-4].item.(*ast.GroupByClause) + } + if yyS[yypt-3].item != nil { + st.OrderBy = yyS[yypt-3].item.(*ast.OrderByClause) + } + if yyS[yypt-2].item != nil { + st.Limit = yyS[yypt-2].item.(*ast.Limit) + } + if yyS[yypt-1].item != nil { + st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) + } + if yyS[yypt-0].item != nil { + st.SelectIntoOpt = yyS[yypt-0].item.(*ast.SelectIntoOption) + } + parser.yyVAL.statement = st + } + case 1211: + { + st := yyS[yypt-4].item.(*ast.SelectStmt) + if yyS[yypt-1].item != nil { + st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) + } + if yyS[yypt-3].item != nil { + st.OrderBy = yyS[yypt-3].item.(*ast.OrderByClause) + } + if yyS[yypt-2].item != nil { + st.Limit = yyS[yypt-2].item.(*ast.Limit) + } + if yyS[yypt-0].item != nil { + st.SelectIntoOpt = yyS[yypt-0].item.(*ast.SelectIntoOption) + } + parser.yyVAL.statement = st + } + case 1212: + { + st := &ast.SelectStmt{ + Kind: ast.SelectStmtKindTable, + Fields: &ast.FieldList{Fields: []*ast.SelectField{{WildCard: &ast.WildCardField{}}}}, + } + ts := &ast.TableSource{Source: yyS[yypt-4].item.(*ast.TableName)} + st.From = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if yyS[yypt-3].item != nil { + st.OrderBy = yyS[yypt-3].item.(*ast.OrderByClause) + } + if yyS[yypt-2].item != nil { + st.Limit = yyS[yypt-2].item.(*ast.Limit) + } + if yyS[yypt-1].item != nil { + st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) + } + if yyS[yypt-0].item != nil { + st.SelectIntoOpt = yyS[yypt-0].item.(*ast.SelectIntoOption) + } + parser.yyVAL.statement = st + } + case 1213: + { + st := &ast.SelectStmt{ + Kind: ast.SelectStmtKindValues, + Fields: &ast.FieldList{Fields: []*ast.SelectField{{WildCard: &ast.WildCardField{}}}}, + Lists: yyS[yypt-4].item.([]*ast.RowExpr), + } + if yyS[yypt-3].item != nil { + st.OrderBy = yyS[yypt-3].item.(*ast.OrderByClause) + } + if yyS[yypt-2].item != nil { + st.Limit = yyS[yypt-2].item.(*ast.Limit) + } + if yyS[yypt-1].item != nil { + st.LockInfo = yyS[yypt-1].item.(*ast.SelectLockInfo) + } + if yyS[yypt-0].item != nil { + st.SelectIntoOpt = yyS[yypt-0].item.(*ast.SelectIntoOption) + } + parser.yyVAL.statement = st + } + case 1214: + { + sel := yyS[yypt-0].statement.(*ast.SelectStmt) + sel.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = sel + } + case 1215: + { + var sel ast.StmtNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + x.WithBeforeBraces = true + x.With = yyS[yypt-1].item.(*ast.WithClause) + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + x.With = yyS[yypt-1].item.(*ast.WithClause) + sel = x + } + parser.yyVAL.statement = sel + } + case 1216: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1217: + { + ws := yyS[yypt-0].item.(*ast.WithClause) + ws.IsRecursive = true + for _, cte := range ws.CTEs { + cte.IsRecursive = true + } + parser.yyVAL.item = ws + } + case 1218: + { + ws := yyS[yypt-2].item.(*ast.WithClause) + ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) + parser.yyVAL.item = ws + } + case 1219: + { + ws := &ast.WithClause{} + ws.CTEs = make([]*ast.CommonTableExpression, 0, 4) + ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) + parser.yyVAL.item = ws + } + case 1220: + { + cte := &ast.CommonTableExpression{} + cte.Name = ast.NewCIStr(yyS[yypt-3].ident) + cte.ColNameList = yyS[yypt-2].item.([]ast.CIStr) + cte.Query = yyS[yypt-0].expr.(*ast.SubqueryExpr) + parser.yyVAL.item = cte + } + case 1222: + { + parser.yyVAL.item = nil + } + case 1223: + { + parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) + } + case 1224: + { + parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1225: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) + } + case 1226: + { + var spec = yyS[yypt-0].item.(ast.WindowSpec) + spec.Name = yyS[yypt-2].item.(ast.CIStr) + parser.yyVAL.item = spec + } + case 1227: + { + parser.yyVAL.item = ast.NewCIStr(yyS[yypt-0].ident) + } + case 1228: + { + parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) + } + case 1229: + { + spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(ast.CIStr)} + if yyS[yypt-2].item != nil { + spec.PartitionBy = yyS[yypt-2].item.(*ast.PartitionByClause) + } + if yyS[yypt-1].item != nil { + spec.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + spec.Frame = yyS[yypt-0].item.(*ast.FrameClause) + } + parser.yyVAL.item = spec + } + case 1230: + { + parser.yyVAL.item = ast.CIStr{} + } + case 1232: + { + parser.yyVAL.item = nil + } + case 1233: + { + parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 1234: + { + parser.yyVAL.item = nil + } + case 1235: + { + parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} + } + case 1236: + { + parser.yyVAL.item = nil + } + case 1237: + { + parser.yyVAL.item = &ast.FrameClause{ + Type: yyS[yypt-1].item.(ast.FrameType), + Extent: yyS[yypt-0].item.(ast.FrameExtent), + } + } + case 1238: + { + parser.yyVAL.item = ast.FrameType(ast.Rows) + } + case 1239: + { + parser.yyVAL.item = ast.FrameType(ast.Ranges) + } + case 1240: + { + parser.yyVAL.item = ast.FrameType(ast.Groups) + } + case 1241: + { + parser.yyVAL.item = ast.FrameExtent{ + Start: yyS[yypt-0].item.(ast.FrameBound), + End: ast.FrameBound{Type: ast.CurrentRow}, + } + } + case 1243: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} + } + case 1244: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} + } + case 1245: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } + case 1246: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} + } + case 1247: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} + } + case 1248: + { + parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} + } + case 1250: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} + } + case 1251: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} + } + case 1252: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } + case 1253: + { + parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} + } + case 1254: + { + parser.yyVAL.item = nil + } + case 1255: + { + spec := yyS[yypt-0].item.(ast.WindowSpec) + parser.yyVAL.item = &spec + } + case 1256: + { + parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) + } + case 1257: + { + parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(ast.CIStr), OnlyAlias: true} + } + case 1259: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1260: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1261: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1262: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1263: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1264: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1265: + { + args := []ast.ExprNode{yyS[yypt-4].expr} + if yyS[yypt-3].item != nil { + args = append(args, yyS[yypt-3].item.([]ast.ExprNode)...) + } + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1266: + { + args := []ast.ExprNode{yyS[yypt-4].expr} + if yyS[yypt-3].item != nil { + args = append(args, yyS[yypt-3].item.([]ast.ExprNode)...) + } + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1267: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1268: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1269: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{Name: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-6].expr, yyS[yypt-4].expr}, FromLast: yyS[yypt-2].item.(bool), IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1270: + { + parser.yyVAL.item = nil + } + case 1271: + { + args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.item = args + } + case 1272: + { + args := []ast.ExprNode{ast.NewParamMarkerExpr(yyS[yypt-1].offset)} + if yyS[yypt-0].item != nil { + args = append(args, yyS[yypt-0].item.(ast.ExprNode)) + } + parser.yyVAL.item = args + } + case 1273: + { + parser.yyVAL.item = nil + } + case 1274: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1275: + { + parser.yyVAL.item = false + } + case 1276: + { + parser.yyVAL.item = false + } + case 1277: + { + parser.yyVAL.item = true + } + case 1278: + { + parser.yyVAL.item = false + } + case 1279: + { + parser.yyVAL.item = false + } + case 1280: + { + parser.yyVAL.item = true + } + case 1281: + { + parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + } + case 1282: + { + if j, ok := yyS[yypt-0].item.(*ast.Join); ok { + // if $1 is Join, use it directly + parser.yyVAL.item = j + } else { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} + } + } + case 1283: + { + /* from a, b is default cross join */ + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + case 1285: + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + parser.yyVAL.item = yyS[yypt-1].item + } + case 1288: + { + tn := yyS[yypt-3].item.(*ast.TableName) + tn.PartitionNames = yyS[yypt-2].item.([]ast.CIStr) + tn.IndexHints = yyS[yypt-0].item.([]*ast.IndexHint) + parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-1].item.(ast.CIStr)} + } + case 1289: + { + resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query + parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(ast.CIStr)} + } + case 1290: + { + resultNode := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query + ts := &ast.TableSource{Source: resultNode, AsName: yyS[yypt-1].item.(ast.CIStr)} + ts.Lateral = true + ts.ColumnNames = yyS[yypt-0].item.([]ast.CIStr) + parser.yyVAL.item = ts + } + case 1291: + { + j := yyS[yypt-1].item.(*ast.Join) + j.ExplicitParens = true + parser.yyVAL.item = yyS[yypt-1].item + } + case 1292: + { + parser.yyVAL.item = []ast.CIStr{} + } + case 1293: + { + parser.yyVAL.item = yyS[yypt-1].item + } + case 1294: + { + parser.yyVAL.item = ast.CIStr{} + } + case 1296: + { + parser.yyVAL.item = ast.NewCIStr(yyS[yypt-0].ident) + } + case 1297: + { + parser.yyVAL.item = ast.NewCIStr(yyS[yypt-0].ident) + } + case 1298: + { + parser.yyVAL.item = ast.HintUse + } + case 1299: + { + parser.yyVAL.item = ast.HintIgnore + } + case 1300: + { + parser.yyVAL.item = ast.HintForce + } + case 1301: + { + parser.yyVAL.item = ast.HintForScan + } + case 1302: + { + parser.yyVAL.item = ast.HintForJoin + } + case 1303: + { + parser.yyVAL.item = ast.HintForOrderBy + } + case 1304: + { + parser.yyVAL.item = ast.HintForGroupBy + } + case 1305: + { + parser.yyVAL.item = &ast.IndexHint{ + IndexNames: yyS[yypt-1].item.([]ast.CIStr), + HintType: yyS[yypt-4].item.(ast.IndexHintType), + HintScope: yyS[yypt-3].item.(ast.IndexHintScope), + } + } + case 1306: + { + var nameList []ast.CIStr + parser.yyVAL.item = nameList + } + case 1307: + { + parser.yyVAL.item = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 1308: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.CIStr), ast.NewCIStr(yyS[yypt-0].ident)) + } + case 1309: + { + parser.yyVAL.item = []ast.CIStr{ast.NewCIStr(yyS[yypt-0].ident)} + } + case 1310: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.CIStr), ast.NewCIStr(yyS[yypt-0].ident)) + } + case 1311: + { + parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} + } + case 1312: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) + } + case 1313: + { + parser.yyVAL.item = []*ast.IndexHint{} + } + case 1315: + { + parser.yyVAL.item = ast.NewCrossJoin(yyS[yypt-2].item.(ast.ResultSetNode), yyS[yypt-0].item.(ast.ResultSetNode)) + } + case 1316: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } + case 1317: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 1318: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} + } + case 1319: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-8].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), Tp: yyS[yypt-7].item.(ast.JoinType), Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 1320: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} + } + case 1321: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: yyS[yypt-3].item.(ast.JoinType), NaturalJoin: true} + } + case 1322: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} + } + case 1323: + { + on := &ast.OnCondition{Expr: yyS[yypt-0].expr} + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), StraightJoin: true, On: on} + } + case 1324: + { + parser.yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-4].item.(ast.ResultSetNode), StraightJoin: true, Using: yyS[yypt-1].item.([]*ast.ColumnName)} + } + case 1325: + { + parser.yyVAL.item = ast.LeftJoin + } + case 1326: + { + parser.yyVAL.item = ast.RightJoin + } + case 1332: + { + parser.yyVAL.item = nil + } + case 1333: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(*ast.ValueExpr)} + } + case 1334: + { + parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) + } + case 1335: + { + parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + case 1340: + { + parser.yyVAL.item = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) + } + case 1342: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 1343: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} + } + case 1344: + { + parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} + } + case 1345: + { + parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-2].item.(ast.ExprNode)} + } + case 1346: + { + parser.yyVAL.item = nil + } + case 1348: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.TableHints = yyS[yypt-0].item.([]*ast.TableOptimizerHint) + parser.yyVAL.item = opt + } + case 1349: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + if yyS[yypt-0].item.(bool) { + opt.Distinct = true + } else { + opt.Distinct = false + opt.ExplicitAll = true + } + parser.yyVAL.item = opt + } + case 1350: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.Priority = yyS[yypt-0].item.(mysql.PriorityEnum) + parser.yyVAL.item = opt + } + case 1351: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLSmallResult = true + parser.yyVAL.item = opt + } + case 1352: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLBigResult = true + parser.yyVAL.item = opt + } + case 1353: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLBufferResult = true + parser.yyVAL.item = opt + } + case 1354: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = yyS[yypt-0].item.(bool) + parser.yyVAL.item = opt + } + case 1355: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.CalcFoundRows = true + parser.yyVAL.item = opt + } + case 1356: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.StraightJoin = true + parser.yyVAL.item = opt + } + case 1357: + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + parser.yyVAL.item = opt + } + case 1359: + { + opts := yyS[yypt-1].item.(*ast.SelectStmtOpts) + opt := yyS[yypt-0].item.(*ast.SelectStmtOpts) + + // Merge options. + // Always use the first hint. + if opt.TableHints != nil && opts.TableHints == nil { + opts.TableHints = opt.TableHints + } + if opt.Distinct { + opts.Distinct = true + } + if opt.Priority != mysql.NoPriority { + opts.Priority = opt.Priority + } + if opt.SQLSmallResult { + opts.SQLSmallResult = true + } + if opt.SQLBigResult { + opts.SQLBigResult = true + } + if opt.SQLBufferResult { + opts.SQLBufferResult = true + } + if !opt.SQLCache { + opts.SQLCache = false + } + if opt.CalcFoundRows { + opts.CalcFoundRows = true + } + if opt.StraightJoin { + opts.StraightJoin = true + } + if opt.ExplicitAll { + opts.ExplicitAll = true + } + + if opts.Distinct && opts.ExplicitAll { + yylex.AppendError(ErrWrongUsage.GenByArgs("ALL", "DISTINCT")) + return 1 + } + + parser.yyVAL.item = opts + } + case 1361: + { + hints, warns := parser.parseHint(yyS[yypt-0].ident) + for _, w := range warns { + yylex.AppendError(w) + parser.lastErrorAsWarn() + } + parser.yyVAL.item = hints + } + case 1362: + { + parser.yyVAL.item = nil + } + case 1364: + { + parser.yyVAL.item = true + } + case 1365: + { + parser.yyVAL.item = false + } + case 1366: + { + parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} + } + case 1367: + { + parser.yyVAL.item = nil + } + case 1369: + { + parser.yyVAL.item = nil + } + case 1370: + { + x := &ast.SelectIntoOption{ + Tp: ast.SelectIntoOutfile, + FileName: yyS[yypt-2].ident, + } + if yyS[yypt-1].item != nil { + x.FieldsInfo = yyS[yypt-1].item.(*ast.FieldsClause) + } + if yyS[yypt-0].item != nil { + x.LinesInfo = yyS[yypt-0].item.(*ast.LinesClause) + } + + parser.yyVAL.item = x + } + case 1371: + { + rs := yyS[yypt-1].statement.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + // See the implementation of yyParse function + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + case 1372: + { + rs := yyS[yypt-1].statement.(*ast.SetOprStmt) + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + case 1373: + { + switch rs := yyS[yypt-1].statement.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + // See the implementation of yyParse function + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + } + case 1374: + { + subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + } + case 1375: + { + parser.yyVAL.item = nil + } + case 1376: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdate, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 1377: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShare, + Tables: yyS[yypt-0].item.([]*ast.TableName), + } + } + case 1378: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateNoWait, + Tables: yyS[yypt-1].item.([]*ast.TableName), + } + } + case 1379: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateWaitN, + WaitSec: getUint64FromNUM(yyS[yypt-0].item), + Tables: yyS[yypt-2].item.([]*ast.TableName), + } + } + case 1380: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShareNoWait, + Tables: yyS[yypt-1].item.([]*ast.TableName), + } + } + case 1381: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateSkipLocked, + Tables: yyS[yypt-2].item.([]*ast.TableName), + } + } + case 1382: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShareSkipLocked, + Tables: yyS[yypt-2].item.([]*ast.TableName), + } + } + case 1383: + { + parser.yyVAL.item = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShare, + Tables: []*ast.TableName{}, + } + } + case 1384: + { + parser.yyVAL.item = []*ast.TableName{} + } + case 1385: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableName) + } + case 1388: + { + setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) + setOpr.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = setOpr + } + case 1389: + { + setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) + setOpr.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = setOpr + } + case 1390: + { + setOprList1 := yyS[yypt-2].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: yyS[yypt-2].item.([]ast.Node)}} + st := yyS[yypt-0].statement.(*ast.SelectStmt) + setOpr.Limit = st.Limit + setOpr.OrderBy = st.OrderBy + st.Limit = nil + st.OrderBy = nil + st.AfterSetOperator = yyS[yypt-1].item.(*ast.SetOprType) + setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) + parser.yyVAL.statement = setOpr + } + case 1391: + { + setOprList1 := yyS[yypt-2].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + // child setOprStmt's limit and order should also make sense + // we should separate it out from other normal SetOprSelectList. + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = yyS[yypt-1].item.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + parser.yyVAL.statement = setOpr + } + case 1392: + { + setOprList1 := yyS[yypt-3].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) + parser.yyVAL.statement = setOpr + } + case 1393: + { + setOprList1 := yyS[yypt-3].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = yyS[yypt-2].item.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) + parser.yyVAL.statement = setOpr + } + case 1394: + { + setOprList1 := yyS[yypt-4].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-3]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = yyS[yypt-3].item.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) + parser.yyVAL.statement = setOpr + } + case 1395: + { + var setOprList []ast.Node + switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) + parser.yyVAL.statement = setOpr + } + case 1396: + { + var setOprList []ast.Node + switch x := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) + parser.yyVAL.statement = setOpr + } + case 1397: + { + var setOprList []ast.Node + switch x := yyS[yypt-2].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) + setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) + parser.yyVAL.statement = setOpr + } + case 1399: + { + setOprList1 := yyS[yypt-2].item.([]ast.Node) + setOprList2 := yyS[yypt-0].item.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + switch x := setOprList2[0].(type) { + case *ast.SelectStmt: + x.AfterSetOperator = yyS[yypt-1].item.(*ast.SetOprType) + case *ast.SetOprSelectList: + x.AfterSetOperator = yyS[yypt-1].item.(*ast.SetOprType) + } + parser.yyVAL.item = append(setOprList1, setOprList2...) + } + case 1400: + { + parser.yyVAL.item = []ast.Node{yyS[yypt-0].statement.(*ast.SelectStmt)} + } + case 1401: + { + var setOprList []ast.Node + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + parser.yyVAL.item = setOprList + } + case 1402: + { + var tp ast.SetOprType + tp = ast.Union + if yyS[yypt-0].item == false { + tp = ast.UnionAll + } + parser.yyVAL.item = &tp + } + case 1403: + { + var tp ast.SetOprType + tp = ast.Except + if yyS[yypt-0].item == false { + tp = ast.ExceptAll + } + parser.yyVAL.item = &tp + } + case 1404: + { + var tp ast.SetOprType + tp = ast.Intersect + if yyS[yypt-0].item == false { + tp = ast.IntersectAll + } + parser.yyVAL.item = &tp + } + case 1406: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 1407: + { + parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].ident} + } + case 1408: + { + parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-3].ident, RetainCurrentPassword: true} + } + case 1409: + { + parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].ident} + } + case 1410: + { + parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-5].item.(*auth.UserIdentity), Password: yyS[yypt-3].ident, RetainCurrentPassword: true} + } + case 1411: + { + vars := yyS[yypt-0].item.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + parser.yyVAL.statement = &ast.SetStmt{Variables: vars} + } + case 1412: + { + parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} + } + case 1413: + { + assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + for i := 0; i < len(assigns); i++ { + if assigns[i].Name == "tx_isolation" { + // A special session variable that make setting tx_isolation take effect one time. + assigns[i].Name = "tx_isolation_one_shot" + } + } + parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} + } + case 1414: + { + parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) + } + case 1415: + { + tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) + parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ + SetRoleOpt: tmp.SetRoleOpt, + RoleList: tmp.RoleList, + UserList: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + case 1416: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} + } + case 1417: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} + } + case 1418: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} + } + case 1419: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} + } + case 1421: + { + parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} + } + case 1422: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = yyS[yypt-0].item + } else { + parser.yyVAL.item = []*ast.VariableAssignment{} + } + } + case 1423: + { + if yyS[yypt-0].item != nil { + varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), varAssigns...) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1424: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1425: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("0", parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1426: + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("1", parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + parser.yyVAL.item = varAssigns + } + case 1427: + { + parser.yyVAL.ident = ast.RepeatableRead + } + case 1428: + { + parser.yyVAL.ident = ast.ReadCommitted + } + case 1429: + { + parser.yyVAL.ident = ast.ReadUncommitted + } + case 1430: + { + parser.yyVAL.ident = ast.Serializable + } + case 1431: + { + parser.yyVAL.expr = ast.NewValueExpr("ON", parser.charset, parser.collation) + } + case 1432: + { + parser.yyVAL.expr = ast.NewValueExpr("BINARY", parser.charset, parser.collation) + } + case 1437: + { + parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident + } + case 1438: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1439: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} + } + case 1440: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsInstance: true, IsSystem: true} + } + case 1441: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1442: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} + } + case 1443: + { + v := strings.ToLower(yyS[yypt-2].ident) + var isGlobal bool + var isInstance bool + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@instance.") { + isInstance = true + v = strings.TrimPrefix(v, "@@instance.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v = strings.TrimPrefix(v, "@@") + } + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsInstance: isInstance, IsSystem: true} + } + case 1444: + { + v := yyS[yypt-2].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} + } + case 1445: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), + } + } + case 1446: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), + } + } + case 1447: + { + parser.yyVAL.item = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), + ExtendValue: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), + } + } + case 1448: + { + v := &ast.DefaultExpr{} + parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetNames, Value: v} + } + case 1449: + { + parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetCharset, Value: yyS[yypt-0].expr} + } + case 1450: + { + parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].ident, "", "") + } + case 1451: + { + parser.yyVAL.expr = &ast.DefaultExpr{} + } + case 1452: + { + // Validate input charset name to keep the same behavior as parser of MySQL. + cs, err := charset.GetCharsetInfo(yyS[yypt-0].ident) + if err != nil { + yylex.AppendError(ErrUnknownCharacterSet.GenByArgs(yyS[yypt-0].ident)) + return 1 + } + // Use charset name returned from charset.GetCharsetInfo(), + // to keep lower case of input for generated column restore. + parser.yyVAL.ident = cs.Name + } + case 1453: + { + parser.yyVAL.ident = charset.CharsetBin + } + case 1454: + { + info, err := charset.GetCollationByName(yyS[yypt-0].ident) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.ident = info.Name + } + case 1455: + { + parser.yyVAL.ident = charset.CollationBin + } + case 1456: + { + parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} + } + case 1457: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) + } + case 1460: + { + v := strings.ToLower(yyS[yypt-0].ident) + var isGlobal bool + var isInstance bool + explicitScope := true + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@instance.") { + isInstance = true + v = strings.TrimPrefix(v, "@@instance.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v, explicitScope = strings.TrimPrefix(v, "@@"), false + } + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsInstance: isInstance, IsSystem: true, ExplicitScope: explicitScope} + } + case 1461: + { + v := yyS[yypt-0].ident + v = strings.TrimPrefix(v, "@") + parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} + } + case 1462: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} + } + case 1463: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} + } + case 1464: + { + parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} + } + case 1465: + { + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + } + case 1466: + { + parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} + } + case 1467: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) + } + case 1469: + { + parser.yyVAL.ident = yyS[yypt-1].ident + } + case 1473: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} + } + case 1474: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} + } + case 1475: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} + } + case 1476: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1477: + { + parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} + } + case 1478: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1479: + { + parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} + } + case 1480: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) + } + case 1481: + { + stmt := yyS[yypt-1].item.(*ast.ShowStmt) + if yyS[yypt-0].item != nil { + if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = yyS[yypt-0].item.(ast.ExprNode) + } + } + parser.yyVAL.statement = stmt + } + case 1482: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateTable, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1483: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateView, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1484: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateDatabase, + IfNotExists: yyS[yypt-1].item.(bool), + DBName: yyS[yypt-0].ident, + } + } + case 1485: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowCreateUser, + User: yyS[yypt-0].item.(*auth.UserIdentity), + } + } + case 1486: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} + } + case 1487: + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + if yyS[yypt-0].item != nil { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-1].item.(*auth.UserIdentity), + Roles: yyS[yypt-0].item.([]*auth.RoleIdentity), + } + } else { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: yyS[yypt-1].item.(*auth.UserIdentity), + Roles: nil, + } + } + } + case 1488: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowMasterStatus, + } + } + case 1489: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowBinlogStatus, + } + } + case 1490: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowReplicaStatus, + } + } + case 1491: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProcessList, + Full: yyS[yypt-1].item.(bool), + } + } + case 1492: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowProfiles, + } + } + case 1493: + { + v := &ast.ShowStmt{ + Tp: ast.ShowProfile, + } + if yyS[yypt-2].item != nil { + v.ShowProfileTypes = yyS[yypt-2].item.([]int) + } + if yyS[yypt-1].item != nil { + v.ShowProfileArgs = yyS[yypt-1].item.(*int64) + } + if yyS[yypt-0].item != nil { + v.ShowProfileLimit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = v + } + case 1494: + { + parser.yyVAL.statement = &ast.ShowStmt{ + Tp: ast.ShowPrivileges, + } + } + case 1495: + { + parser.yyVAL.item = nil + } + case 1497: + { + parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} + } + case 1498: + { + l := yyS[yypt-2].item.([]int) + l = append(l, yyS[yypt-0].item.(int)) + parser.yyVAL.item = l + } + case 1499: + { + parser.yyVAL.item = ast.ProfileTypeCPU + } + case 1500: + { + parser.yyVAL.item = ast.ProfileTypeMemory + } + case 1501: + { + parser.yyVAL.item = ast.ProfileTypeBlockIo + } + case 1502: + { + parser.yyVAL.item = ast.ProfileTypeContextSwitch + } + case 1503: + { + parser.yyVAL.item = ast.ProfileTypePageFaults + } + case 1504: + { + parser.yyVAL.item = ast.ProfileTypeIpc + } + case 1505: + { + parser.yyVAL.item = ast.ProfileTypeSwaps + } + case 1506: + { + parser.yyVAL.item = ast.ProfileTypeSource + } + case 1507: + { + parser.yyVAL.item = ast.ProfileTypeAll + } + case 1508: + { + parser.yyVAL.item = nil + } + case 1509: + { + v := yyS[yypt-0].item.(int64) + parser.yyVAL.item = &v + } + case 1510: + { + parser.yyVAL.item = nil + } + case 1511: + { + parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) + } + case 1517: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} + } + case 1518: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} + } + case 1519: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} + } + case 1520: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTables, + DBName: yyS[yypt-0].ident, + Full: yyS[yypt-2].item.(bool), + } + } + case 1521: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowOpenTables, + DBName: yyS[yypt-0].ident, + } + } + case 1522: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTableStatus, + DBName: yyS[yypt-0].ident, + } + } + case 1523: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: yyS[yypt-0].item.(*ast.TableName), + } + } + case 1524: + { + show := &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: &ast.TableName{Name: ast.NewCIStr(yyS[yypt-2].ident), Schema: ast.NewCIStr(yyS[yypt-0].ident)}, + } + parser.yyVAL.item = show + } + case 1525: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].ident, + Full: yyS[yypt-3].item.(bool), + } + } + case 1526: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: yyS[yypt-1].item.(*ast.TableName), + DBName: yyS[yypt-0].ident, + Full: yyS[yypt-3].item.(bool), + Extended: true, + } + } + case 1527: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings, CountWarningsOrErrors: true} + } + case 1528: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} + } + case 1529: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors, CountWarningsOrErrors: true} + } + case 1530: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} + } + case 1531: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowVariables, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1532: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowStatus, + GlobalScope: yyS[yypt-1].item.(bool), + } + } + case 1533: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowCollation, + } + } + case 1534: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowTriggers, + DBName: yyS[yypt-0].ident, + } + } + case 1535: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowEvents, + DBName: yyS[yypt-0].ident, + } + } + case 1536: + { + parser.yyVAL.item = &ast.ShowStmt{ + Tp: ast.ShowPlugins, + } + } + case 1537: + { + parser.yyVAL.item = nil + } + case 1538: + { + parser.yyVAL.item = &ast.PatternLikeExpr{ + Pattern: yyS[yypt-0].expr, + Escape: '\\', + EscapeExplicit: false, + } + } + case 1539: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1540: + { + parser.yyVAL.item = false + } + case 1541: + { + parser.yyVAL.item = true + } + case 1542: + { + parser.yyVAL.item = false + } + case 1543: + { + parser.yyVAL.item = false + } + case 1544: + { + parser.yyVAL.item = true + } + case 1545: + { + parser.yyVAL.ident = "" + } + case 1546: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1547: + { + parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) + } + case 1550: + { + tmp := yyS[yypt-0].item.(*ast.FlushStmt) + tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) + parser.yyVAL.statement = tmp + } + case 1551: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushPrivileges, + } + } + case 1552: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushStatus, + } + } + case 1553: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushHosts, + } + } + case 1554: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushUserResources, + } + } + case 1555: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushOptimizerCosts, + } + } + case 1556: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushLogs, + LogType: yyS[yypt-1].item.(ast.LogType), + } + } + case 1557: + { + parser.yyVAL.item = &ast.FlushStmt{ + Tp: ast.FlushLogs, + LogType: ast.LogTypeRelay, + Channel: yyS[yypt-0].ident, + } + } + case 1558: + { + stmt := &ast.FlushStmt{ + Tp: ast.FlushTables, + Tables: yyS[yypt-1].item.([]*ast.TableName), + } + switch yyS[yypt-0].item.(int) { + case 1: + stmt.ReadLock = true + case 2: + stmt.ForExport = true + } + parser.yyVAL.item = stmt + } + case 1559: + { + parser.yyVAL.ident = "" + } + case 1560: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1561: + { + parser.yyVAL.item = ast.LogTypeDefault + } + case 1562: + { + parser.yyVAL.item = ast.LogTypeBinary + } + case 1563: + { + parser.yyVAL.item = ast.LogTypeEngine + } + case 1564: + { + parser.yyVAL.item = ast.LogTypeError + } + case 1565: + { + parser.yyVAL.item = ast.LogTypeGeneral + } + case 1566: + { + parser.yyVAL.item = ast.LogTypeSlow + } + case 1567: + { + parser.yyVAL.item = false + } + case 1568: + { + parser.yyVAL.item = true + } + case 1569: + { + parser.yyVAL.item = true + } + case 1570: + { + parser.yyVAL.item = []*ast.TableName{} + } + case 1572: + { + parser.yyVAL.item = 0 + } + case 1573: + { + parser.yyVAL.item = 1 + } + case 1574: + { + parser.yyVAL.item = 2 + } + case 1632: + { + var sel ast.StmtNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.statement = sel + } + case 1652: + { + var sel ast.StmtNode + switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + parser.yyVAL.statement = sel + } + case 1654: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + parser.setNodeText(s, lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1655: + { + if yyS[yypt-0].statement != nil { + s := yyS[yypt-0].statement + if lexer, ok := yylex.(stmtTexter); ok { + parser.setNodeText(s, lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + case 1656: + { + cst := yyS[yypt-0].item.(*ast.Constraint) + if yyS[yypt-1].item != nil { + cst.Name = yyS[yypt-1].item.(string) + cst.IsEmptyIndex = len(cst.Name) == 0 + } + parser.yyVAL.item = cst + } + case 1661: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} + } else { + parser.yyVAL.item = []interface{}{} + } + } + case 1662: + { + if yyS[yypt-0].item != nil { + parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) + } else { + parser.yyVAL.item = yyS[yypt-2].item + } + } + case 1663: + { + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1664: + { + tes := yyS[yypt-1].item.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + parser.yyVAL.item = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + case 1666: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].ident, + UintValue: ast.TableOptionCharsetWithoutConvertTo} + } + case 1667: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident, + UintValue: ast.TableOptionCharsetWithoutConvertTo} + } + case 1668: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} + } + case 1669: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1670: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} + } + case 1671: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1672: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} + yylex.AppendError(yylex.Errorf("The PASSWORD option is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 1673: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} + } + case 1674: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1675: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1676: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} + } + case 1677: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} + } + case 1678: + { + n := yyS[yypt-0].item.(uint64) + if n != 0 && n != 1 { + yylex.AppendError(yylex.Errorf("The value of STATS_AUTO_RECALC must be one of [0|1|DEFAULT].")) + return 1 + } + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, UintValue: n} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 1679: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, Default: true} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + case 1680: + { + // Parse it but will ignore it. + // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 mysql.MaxFloatPrecisionLength { + tp.SetType(mysql.TypeDouble) + } + tp.SetFlen(types.UnspecifiedLength) + } + tp.SetDecimal(fopt.Decimal) + for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { + if o.IsUnsigned { + tp.AddFlag(mysql.UnsignedFlag) + } + if o.IsZerofill { + tp.AddFlag(mysql.ZerofillFlag) + } + } + parser.yyVAL.item = tp + } + case 1715: + { + tp := types.NewFieldType(yyS[yypt-1].item.(byte)) + tp.SetFlen(yyS[yypt-0].item.(int)) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(1) + } + parser.yyVAL.item = tp + } + case 1716: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1717: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1718: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1719: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1720: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1721: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1722: + { + parser.yyVAL.item = mysql.TypeShort + } + case 1723: + { + parser.yyVAL.item = mysql.TypeInt24 + } + case 1724: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1725: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1726: + { + parser.yyVAL.item = mysql.TypeLong + } + case 1727: + { + parser.yyVAL.item = mysql.TypeLonglong + } + case 1728: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1729: + { + parser.yyVAL.item = mysql.TypeTiny + } + case 1733: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1734: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1735: + { + parser.yyVAL.item = mysql.TypeNewDecimal + } + case 1736: + { + parser.yyVAL.item = mysql.TypeFloat + } + case 1737: + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + parser.yyVAL.item = mysql.TypeFloat + } else { + parser.yyVAL.item = mysql.TypeDouble + } + } + case 1738: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1739: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1740: + { + parser.yyVAL.item = mysql.TypeFloat + } + case 1741: + { + parser.yyVAL.item = mysql.TypeDouble + } + case 1742: + { + parser.yyVAL.item = mysql.TypeBit + } + case 1743: + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen(yyS[yypt-1].item.(int)) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1744: + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1745: + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen(yyS[yypt-1].item.(int)) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1746: + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1747: + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen(yyS[yypt-1].item.(int)) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1748: + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen(yyS[yypt-1].item.(int)) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1749: + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen(yyS[yypt-0].item.(int)) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1750: + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen(yyS[yypt-0].item.(int)) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1751: + { + tp := yyS[yypt-0].item.(*types.FieldType) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + parser.yyVAL.item = tp + } + case 1752: + { + tp := yyS[yypt-1].item.(*types.FieldType) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1753: + { + tp := types.NewFieldType(mysql.TypeEnum) + elems := yyS[yypt-2].item.([]*ast.TextString) + opt := yyS[yypt-0].item.(*ast.OptBinary) + tp.SetElems(make([]string, len(elems))) + fieldLen := -1 // enum_flen = max(ele_flen) + for i, e := range elems { + trimmed := strings.TrimRight(e.Value, " ") + tp.SetElemWithIsBinaryLit(i, trimmed, e.IsBinaryLiteral) + if len(trimmed) > fieldLen { + fieldLen = len(trimmed) + } + } + tp.SetFlen(fieldLen) + tp.SetCharset(opt.Charset) + if opt.IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1754: + { + tp := types.NewFieldType(mysql.TypeSet) + elems := yyS[yypt-2].item.([]*ast.TextString) + opt := yyS[yypt-0].item.(*ast.OptBinary) + tp.SetElems(make([]string, len(elems))) + fieldLen := len(elems) - 1 // set_flen = sum(ele_flen) + number_of_ele - 1 + for i, e := range elems { + trimmed := strings.TrimRight(e.Value, " ") + tp.SetElemWithIsBinaryLit(i, trimmed, e.IsBinaryLiteral) + fieldLen += len(trimmed) + } + tp.SetFlen(fieldLen) + tp.SetCharset(opt.Charset) + if opt.IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1755: + { + tp := types.NewFieldType(mysql.TypeJSON) + tp.SetDecimal(0) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1756: + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1757: + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + tp.SetCharset(yyS[yypt-0].item.(*ast.OptBinary).Charset) + if yyS[yypt-0].item.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if yyS[yypt-0].item.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + parser.yyVAL.item = tp + } + case 1758: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomGeometry) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1759: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomGeometryCollection) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1760: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomLineString) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1761: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiLineString) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1762: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiPoint) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1763: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiPolygon) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1764: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomPoint) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1765: + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomPolygon) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + parser.yyVAL.item = tp + } + case 1785: + { + tp := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = tp + } + case 1786: + { + tp := types.NewFieldType(mysql.TypeBlob) + tp.SetFlen(yyS[yypt-0].item.(int)) + parser.yyVAL.item = tp + } + case 1787: + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = tp + } + case 1788: + { + tp := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = tp + } + case 1789: + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = tp + } + case 1790: + { + tp := types.NewFieldType(mysql.TypeTinyBlob) + parser.yyVAL.item = tp + } + case 1791: + { + tp := types.NewFieldType(mysql.TypeBlob) + tp.SetFlen(yyS[yypt-0].item.(int)) + parser.yyVAL.item = tp + } + case 1792: + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + parser.yyVAL.item = tp + } + case 1793: + { + tp := types.NewFieldType(mysql.TypeLongBlob) + parser.yyVAL.item = tp + } + case 1795: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: charset.CharsetLatin1, + } + } + case 1796: + { + cs, err := charset.GetCharsetInfo("ucs2") + if err != nil { + yylex.AppendError(ErrUnknownCharacterSet.GenByArgs("ucs2")) + return 1 + } + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: cs.Name, + } + } + case 1797: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: charset.CharsetBin, + } + } + case 1798: + { + tp := types.NewFieldType(mysql.TypeDate) + parser.yyVAL.item = tp + } + case 1799: + { + tp := types.NewFieldType(mysql.TypeDatetime) + tp.SetFlen(mysql.MaxDatetimeWidthNoFsp) + tp.SetDecimal(yyS[yypt-0].item.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + parser.yyVAL.item = tp + } + case 1800: + { + tp := types.NewFieldType(mysql.TypeTimestamp) + tp.SetFlen(mysql.MaxDatetimeWidthNoFsp) + tp.SetDecimal(yyS[yypt-0].item.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + parser.yyVAL.item = tp + } + case 1801: + { + tp := types.NewFieldType(mysql.TypeDuration) + tp.SetFlen(mysql.MaxDurationWidthNoFsp) + tp.SetDecimal(yyS[yypt-0].item.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + parser.yyVAL.item = tp + } + case 1802: + { + tp := types.NewFieldType(mysql.TypeYear) + tp.SetFlen(yyS[yypt-1].item.(int)) + if tp.GetFlen() != types.UnspecifiedLength && tp.GetFlen() != 4 { + yylex.AppendError(ErrInvalidYearColumnLength.GenByArgs()) + return -1 + } + parser.yyVAL.item = tp + } + case 1803: + { + parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) + } + case 1804: + { + parser.yyVAL.item = types.UnspecifiedLength + } + case 1806: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} + } + case 1807: + { + parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} + } + case 1808: + { + parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + case 1809: + { + parser.yyVAL.item = []*ast.TypeOpt{} + } + case 1810: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) + } + case 1811: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } + case 1812: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} + } + case 1814: + { + parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} + } + case 1815: + { + parser.yyVAL.item = false + } + case 1816: + { + parser.yyVAL.item = true + } + case 1817: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } + case 1818: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: true, + Charset: yyS[yypt-0].ident, + } + } + case 1819: + { + parser.yyVAL.item = &ast.OptBinary{ + IsBinary: yyS[yypt-0].item.(bool), + Charset: yyS[yypt-1].ident, + } + } + case 1820: + { + parser.yyVAL.ident = "" + } + case 1821: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1825: + { + parser.yyVAL.ident = "" + } + case 1826: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1827: + { + parser.yyVAL.item = &ast.TextString{Value: yyS[yypt-0].ident} + } + case 1828: + { + parser.yyVAL.item = &ast.TextString{Value: yyS[yypt-0].item.(ast.HexLiteral).ToString(), IsBinaryLiteral: true} + } + case 1829: + { + parser.yyVAL.item = &ast.TextString{Value: yyS[yypt-0].item.(ast.BitLiteral).ToString(), IsBinaryLiteral: true} + } + case 1830: + { + parser.yyVAL.item = []*ast.TextString{yyS[yypt-0].item.(*ast.TextString)} + } + case 1831: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TextString), yyS[yypt-0].item.(*ast.TextString)) + } + case 1832: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpStart, Xid: yyS[yypt-0].item.(*ast.XAXid)} + } + case 1833: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpStart, Xid: yyS[yypt-1].item.(*ast.XAXid), Join: true} + } + case 1834: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpStart, Xid: yyS[yypt-1].item.(*ast.XAXid), Resume: true} + } + case 1835: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpEnd, Xid: yyS[yypt-0].item.(*ast.XAXid)} + } + case 1836: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpEnd, Xid: yyS[yypt-1].item.(*ast.XAXid), Suspend: true} + } + case 1837: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpEnd, Xid: yyS[yypt-3].item.(*ast.XAXid), Suspend: true, ForMigrate: true} + } + case 1838: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpPrepare, Xid: yyS[yypt-0].item.(*ast.XAXid)} + } + case 1839: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpCommit, Xid: yyS[yypt-0].item.(*ast.XAXid)} + } + case 1840: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpCommit, Xid: yyS[yypt-2].item.(*ast.XAXid), OnePhase: true} + } + case 1841: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpRollback, Xid: yyS[yypt-0].item.(*ast.XAXid)} + } + case 1842: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpRecover} + } + case 1843: + { + parser.yyVAL.statement = &ast.XAStmt{Op: ast.XAOpRecover, ConvertXid: true} + } + case 1846: + { + parser.yyVAL.item = &ast.XAXid{GTRID: yyS[yypt-0].item.(*ast.TextString).Value, NParts: 1} + } + case 1847: + { + parser.yyVAL.item = &ast.XAXid{GTRID: yyS[yypt-2].item.(*ast.TextString).Value, BQual: yyS[yypt-0].item.(*ast.TextString).Value, NParts: 2} + } + case 1848: + { + parser.yyVAL.item = &ast.XAXid{GTRID: yyS[yypt-4].item.(*ast.TextString).Value, BQual: yyS[yypt-2].item.(*ast.TextString).Value, FormatID: getUint64FromNUM(yyS[yypt-0].item), NParts: 3} + } + case 1849: + { + // MySQL's ulong_num accepts a hex number (0xb) as the formatID. + var formatID uint64 + for _, b := range []byte(yyS[yypt-0].item.(ast.HexLiteral)) { + formatID = formatID<<8 | uint64(b) + } + parser.yyVAL.item = &ast.XAXid{GTRID: yyS[yypt-4].item.(*ast.TextString).Value, BQual: yyS[yypt-2].item.(*ast.TextString).Value, FormatID: formatID, NParts: 3} + } + case 1850: + { + parser.yyVAL.statement = &ast.CreateSpatialRefSysStmt{ + IfNotExists: yyS[yypt-2].item.(bool), + SRID: getUint64FromNUM(yyS[yypt-1].item), + Attributes: yyS[yypt-0].item.([]*ast.SRSAttribute), + } + } + case 1851: + { + parser.yyVAL.statement = &ast.CreateSpatialRefSysStmt{ + OrReplace: true, + IfNotExists: yyS[yypt-2].item.(bool), + SRID: getUint64FromNUM(yyS[yypt-1].item), + Attributes: yyS[yypt-0].item.([]*ast.SRSAttribute), + } + } + case 1852: + { + parser.yyVAL.statement = &ast.DropSpatialRefSysStmt{ + IfExists: yyS[yypt-1].item.(bool), + SRID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 1853: + { + parser.yyVAL.item = []*ast.SRSAttribute{} + } + case 1854: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SRSAttribute), yyS[yypt-0].item.(*ast.SRSAttribute)) + } + case 1855: + { + parser.yyVAL.item = &ast.SRSAttribute{Tp: ast.SRSAttrName, Value: yyS[yypt-0].ident} + } + case 1856: + { + parser.yyVAL.item = &ast.SRSAttribute{Tp: ast.SRSAttrDefinition, Value: yyS[yypt-0].ident} + } + case 1857: + { + parser.yyVAL.item = &ast.SRSAttribute{Tp: ast.SRSAttrOrganization, Value: yyS[yypt-3].ident, OrgID: getUint64FromNUM(yyS[yypt-0].item)} + } + case 1858: + { + parser.yyVAL.item = &ast.SRSAttribute{Tp: ast.SRSAttrDescription, Value: yyS[yypt-0].ident} + } + case 1859: + { + stmt := &ast.CreateTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-3].ident), + LogfileGroup: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + if yyS[yypt-2].ident != "" { + stmt.DataFile = yyS[yypt-2].ident + stmt.HasDataFile = true + } + parser.yyVAL.statement = stmt + } + case 1860: + { + stmt := &ast.CreateTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr(yyS[yypt-2].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + if yyS[yypt-1].ident != "" { + stmt.DataFile = yyS[yypt-1].ident + stmt.HasDataFile = true + } + parser.yyVAL.statement = stmt + } + case 1861: + { + parser.yyVAL.ident = "" + } + case 1862: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1863: + { + parser.yyVAL.ident = "" + } + case 1864: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1865: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-4].ident), + Action: ast.AlterTablespaceAddDataFile, + DataFile: yyS[yypt-1].ident, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1866: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-4].ident), + Action: ast.AlterTablespaceDropDataFile, + DataFile: yyS[yypt-1].ident, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1867: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-3].ident), + Action: ast.AlterTablespaceRenameTo, + NewName: ast.NewCIStr(yyS[yypt-0].ident), + Options: []*ast.TablespaceOption{}, + } + } + case 1868: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1869: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-3].ident), + Action: ast.AlterTablespaceSetActive, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1870: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-3].ident), + Action: ast.AlterTablespaceSetInactive, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1871: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr(yyS[yypt-3].ident), + Action: ast.AlterTablespaceSetActive, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1872: + { + parser.yyVAL.statement = &ast.AlterTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr(yyS[yypt-3].ident), + Action: ast.AlterTablespaceSetInactive, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1873: + { + parser.yyVAL.statement = &ast.DropTablespaceStmt{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1874: + { + parser.yyVAL.statement = &ast.DropTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1875: + { + parser.yyVAL.statement = &ast.CreateLogfileGroupStmt{ + Name: ast.NewCIStr(yyS[yypt-4].ident), + UndoFile: yyS[yypt-1].ident, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1876: + { + parser.yyVAL.statement = &ast.AlterLogfileGroupStmt{ + Name: ast.NewCIStr(yyS[yypt-4].ident), + UndoFile: yyS[yypt-1].ident, + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1877: + { + parser.yyVAL.statement = &ast.DropLogfileGroupStmt{ + Name: ast.NewCIStr(yyS[yypt-1].ident), + Options: yyS[yypt-0].item.([]*ast.TablespaceOption), + } + } + case 1878: + { + parser.yyVAL.item = []*ast.TablespaceOption{} + } + case 1880: + { + parser.yyVAL.item = []*ast.TablespaceOption{yyS[yypt-0].item.(*ast.TablespaceOption)} + } + case 1881: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TablespaceOption), yyS[yypt-0].item.(*ast.TablespaceOption)) + } + case 1882: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TablespaceOption), yyS[yypt-0].item.(*ast.TablespaceOption)) + } + case 1883: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptInitialSize + parser.yyVAL.item = opt + } + case 1884: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptMaxSize + parser.yyVAL.item = opt + } + case 1885: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptExtentSize + parser.yyVAL.item = opt + } + case 1886: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptAutoextendSize + parser.yyVAL.item = opt + } + case 1887: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptFileBlockSize + parser.yyVAL.item = opt + } + case 1888: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptUndoBufferSize + parser.yyVAL.item = opt + } + case 1889: + { + opt := yyS[yypt-0].item.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptRedoBufferSize + parser.yyVAL.item = opt + } + case 1890: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptNodegroup, UintValue: getUint64FromNUM(yyS[yypt-0].item)} + } + case 1891: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptWait} + } + case 1892: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptNoWait} + } + case 1893: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptComment, StrValue: yyS[yypt-0].ident} + } + case 1894: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptEncryption, StrValue: yyS[yypt-0].ident} + } + case 1895: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptEngine, StrValue: yyS[yypt-0].ident} + } + case 1896: + { + parser.yyVAL.item = &ast.TablespaceOption{Tp: ast.TablespaceOptEngineAttribute, StrValue: yyS[yypt-0].ident} + } + case 1897: + { + parser.yyVAL.item = &ast.TablespaceOption{UintValue: getUint64FromNUM(yyS[yypt-0].item)} + } + case 1898: + { + parser.yyVAL.item = &ast.TablespaceOption{StrValue: yyS[yypt-0].ident} + } + case 1902: + { + u := yyS[yypt-0].statement.(*ast.UpdateStmt) + u.With = yyS[yypt-1].item.(*ast.WithClause) + parser.yyVAL.statement = u + } + case 1903: + { + var refs *ast.Join + if x, ok := yyS[yypt-5].item.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: yyS[yypt-7].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: yyS[yypt-3].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-6].item.(bool), + } + if yyS[yypt-8].item != nil { + st.TableHints = yyS[yypt-8].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-2].item != nil { + st.Where = yyS[yypt-2].item.(ast.ExprNode) + } + if yyS[yypt-1].item != nil { + st.Order = yyS[yypt-1].item.(*ast.OrderByClause) + } + if yyS[yypt-0].item != nil { + st.Limit = yyS[yypt-0].item.(*ast.Limit) + } + parser.yyVAL.statement = st + } + case 1904: + { + st := &ast.UpdateStmt{ + Priority: yyS[yypt-5].item.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-3].item.(*ast.Join)}, + List: yyS[yypt-1].item.([]*ast.Assignment), + IgnoreErr: yyS[yypt-4].item.(bool), + } + if yyS[yypt-6].item != nil { + st.TableHints = yyS[yypt-6].item.([]*ast.TableOptimizerHint) + } + if yyS[yypt-0].item != nil { + st.Where = yyS[yypt-0].item.(ast.ExprNode) + } + parser.yyVAL.statement = st + } + case 1905: + { + parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].ident} + } + case 1906: + { + parser.yyVAL.item = yyS[yypt-0].expr + } + case 1907: + { + parser.yyVAL.item = nil + } + case 1909: + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-user.html + ret := &ast.CreateUserStmt{ + IsCreateRole: false, + IfNotExists: yyS[yypt-6].item.(bool), + Specs: yyS[yypt-5].item.([]*ast.UserSpec), + AuthTokenOrTLSOptions: yyS[yypt-4].item.([]*ast.AuthTokenOrTLSOption), + ResourceOptions: yyS[yypt-3].item.([]*ast.ResourceOption), + PasswordOrLockOptions: yyS[yypt-2].item.([]*ast.PasswordOrLockOption), + } + if yyS[yypt-1].item != nil { + ret.CommentOrAttributeOption = yyS[yypt-1].item.(*ast.CommentOrAttributeOption) + } + if yyS[yypt-0].item != nil { + ret.ResourceGroupNameOption = yyS[yypt-0].item.(*ast.ResourceGroupNameOption) + } + parser.yyVAL.statement = ret + } + case 1910: + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html + parser.yyVAL.statement = &ast.CreateUserStmt{ + IsCreateRole: true, + IfNotExists: yyS[yypt-1].item.(bool), + Specs: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 1911: + { + ret := &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + Specs: yyS[yypt-5].item.([]*ast.UserSpec), + AuthTokenOrTLSOptions: yyS[yypt-4].item.([]*ast.AuthTokenOrTLSOption), + ResourceOptions: yyS[yypt-3].item.([]*ast.ResourceOption), + PasswordOrLockOptions: yyS[yypt-2].item.([]*ast.PasswordOrLockOption), + } + if yyS[yypt-1].item != nil { + ret.CommentOrAttributeOption = yyS[yypt-1].item.(*ast.CommentOrAttributeOption) + } + if yyS[yypt-0].item != nil { + ret.ResourceGroupNameOption = yyS[yypt-0].item.(*ast.ResourceGroupNameOption) + } + parser.yyVAL.statement = ret + } + case 1912: + { + auth := &ast.AuthOption{ + AuthString: yyS[yypt-0].ident, + ByAuthString: true, + } + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + CurrentAuth: auth, + } + } + case 1913: + { + // MySQL 8.0 user_func_auth_option allows RETAIN CURRENT PASSWORD on + // the current-user form. + auth := &ast.AuthOption{ + AuthString: yyS[yypt-3].ident, + ByAuthString: true, + } + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-9].item.(bool), + CurrentAuth: auth, + CurrentDualPasswordOption: ast.DualPasswordRetainCurrent, + } + } + case 1914: + { + // MySQL 8.0 user_func_auth_option allows DISCARD OLD PASSWORD as a + // standalone clause on the current-user form (no IDENTIFIED BY). + parser.yyVAL.statement = &ast.AlterUserStmt{ + IfExists: yyS[yypt-6].item.(bool), + CurrentDualPasswordOption: ast.DualPasswordDiscardOld, + } + } + case 1915: + { + parser.yyVAL.statement = yyS[yypt-0].item.(*ast.AlterInstanceStmt) + } + case 1916: + { + parser.yyVAL.item = &ast.AlterInstanceStmt{ + ReloadTLS: true, + TLSChannel: yyS[yypt-1].ident, + NoRollbackOnError: yyS[yypt-0].item.(bool), + } + } + case 1917: + { + parser.yyVAL.item = &ast.AlterInstanceStmt{ + ReloadKeyring: true, + } + } + case 1918: + { + engine := strings.ToUpper(yyS[yypt-2].ident) + if engine != "INNODB" && engine != "BINLOG" { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE ROTATE %s MASTER KEY is not supported", yyS[yypt-2].ident)) + return 1 + } + parser.yyVAL.item = &ast.AlterInstanceStmt{ + RotateMasterKey: engine, + } + } + case 1919: + { + if !strings.EqualFold(yyS[yypt-1].ident, "INNODB") || !strings.EqualFold(yyS[yypt-0].ident, "REDO_LOG") { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE ENABLE %s %s is not supported", yyS[yypt-1].ident, yyS[yypt-0].ident)) + return 1 + } + parser.yyVAL.item = &ast.AlterInstanceStmt{ + RedoLog: ast.RedoLogActionEnable, + } + } + case 1920: + { + if !strings.EqualFold(yyS[yypt-1].ident, "INNODB") || !strings.EqualFold(yyS[yypt-0].ident, "REDO_LOG") { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE DISABLE %s %s is not supported", yyS[yypt-1].ident, yyS[yypt-0].ident)) + return 1 + } + parser.yyVAL.item = &ast.AlterInstanceStmt{ + RedoLog: ast.RedoLogActionDisable, + } + } + case 1921: + { + parser.yyVAL.ident = "" + } + case 1922: + { + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 1923: + { + parser.yyVAL.item = false + } + case 1924: + { + parser.yyVAL.item = true + } + case 1925: + { + userSpec := &ast.UserSpec{ + User: yyS[yypt-1].item.(*auth.UserIdentity), + } + if yyS[yypt-0].item != nil { + userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) + } + parser.yyVAL.item = userSpec + } + case 1926: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1927: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1928: + { + userSpec := &ast.UserSpec{ + User: yyS[yypt-1].item.(*auth.UserIdentity), + } + if yyS[yypt-0].item != nil { + userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) + } + parser.yyVAL.item = userSpec + } + case 1929: + { + parser.yyVAL.item = &ast.UserSpec{ + User: yyS[yypt-4].item.(*auth.UserIdentity), + AuthOpt: yyS[yypt-3].item.(*ast.AuthOption), + DualPasswordOption: ast.DualPasswordRetainCurrent, + } + } + case 1930: + { + parser.yyVAL.item = &ast.UserSpec{ + User: yyS[yypt-3].item.(*auth.UserIdentity), + DualPasswordOption: ast.DualPasswordDiscardOld, + } + } + case 1931: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1932: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1933: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].ident, + ByAuthString: true, + } + } + case 1934: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthPlugin: yyS[yypt-2].ident, + AuthString: yyS[yypt-0].ident, + ByAuthString: true, + } + } + case 1935: + { + l := []*ast.ResourceOption{} + parser.yyVAL.item = l + } + case 1936: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1937: + { + parser.yyVAL.item = []*ast.ResourceOption{yyS[yypt-0].item.(*ast.ResourceOption)} + } + case 1938: + { + l := yyS[yypt-1].item.([]*ast.ResourceOption) + l = append(l, yyS[yypt-0].item.(*ast.ResourceOption)) + parser.yyVAL.item = l + } + case 1939: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxQueriesPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1940: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxUpdatesPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1941: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxConnectionsPerHour, + Count: yyS[yypt-0].item.(int64), + } + } + case 1942: + { + parser.yyVAL.item = &ast.ResourceOption{ + Type: ast.MaxUserConnections, + Count: yyS[yypt-0].item.(int64), + } + } + case 1943: + { + parser.yyVAL.item = []*ast.AuthTokenOrTLSOption{} + } + case 1945: + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.TlsNone, + } + parser.yyVAL.item = []*ast.AuthTokenOrTLSOption{t} + } + case 1946: + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.Ssl, + } + parser.yyVAL.item = []*ast.AuthTokenOrTLSOption{t} + } + case 1947: + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.X509, + } + parser.yyVAL.item = []*ast.AuthTokenOrTLSOption{t} + } + case 1948: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1949: + { + parser.yyVAL.item = []*ast.AuthTokenOrTLSOption{yyS[yypt-0].item.(*ast.AuthTokenOrTLSOption)} + } + case 1950: + { + l := yyS[yypt-2].item.([]*ast.AuthTokenOrTLSOption) + l = append(l, yyS[yypt-0].item.(*ast.AuthTokenOrTLSOption)) + parser.yyVAL.item = l + } + case 1951: + { + l := yyS[yypt-1].item.([]*ast.AuthTokenOrTLSOption) + l = append(l, yyS[yypt-0].item.(*ast.AuthTokenOrTLSOption)) + parser.yyVAL.item = l + } + case 1952: + { + parser.yyVAL.item = &ast.AuthTokenOrTLSOption{ + Type: ast.Issuer, + Value: yyS[yypt-0].ident, + } + } + case 1953: + { + parser.yyVAL.item = &ast.AuthTokenOrTLSOption{ + Type: ast.Subject, + Value: yyS[yypt-0].ident, + } + } + case 1954: + { + parser.yyVAL.item = &ast.AuthTokenOrTLSOption{ + Type: ast.Cipher, + Value: yyS[yypt-0].ident, + } + } + case 1955: + { + parser.yyVAL.item = &ast.AuthTokenOrTLSOption{ + Type: ast.SAN, + Value: yyS[yypt-0].ident, + } + } + case 1956: + { + parser.yyVAL.item = &ast.AuthTokenOrTLSOption{ + Type: ast.TokenIssuer, + Value: yyS[yypt-0].ident, + } + } + case 1957: + { + parser.yyVAL.item = nil + } + case 1958: + { + parser.yyVAL.item = &ast.CommentOrAttributeOption{Type: ast.UserCommentType, Value: yyS[yypt-0].ident} + } + case 1959: + { + parser.yyVAL.item = &ast.CommentOrAttributeOption{Type: ast.UserAttributeType, Value: yyS[yypt-0].ident} + } + case 1960: + { + parser.yyVAL.item = nil + } + case 1961: + { + parser.yyVAL.item = &ast.ResourceGroupNameOption{Value: yyS[yypt-0].ident} + } + case 1962: + { + parser.yyVAL.item = []*ast.PasswordOrLockOption{} + } + case 1963: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 1964: + { + parser.yyVAL.item = []*ast.PasswordOrLockOption{yyS[yypt-0].item.(*ast.PasswordOrLockOption)} + } + case 1965: + { + l := yyS[yypt-1].item.([]*ast.PasswordOrLockOption) + l = append(l, yyS[yypt-0].item.(*ast.PasswordOrLockOption)) + parser.yyVAL.item = l + } + case 1966: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.Unlock, + } + } + case 1967: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.Lock, + } + } + case 1968: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordHistoryDefault, + } + } + case 1969: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordHistory, + Count: yyS[yypt-0].item.(int64), + } + } + case 1970: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordReuseDefault, + } + } + case 1971: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordReuseInterval, + Count: yyS[yypt-1].item.(int64), + } + } + case 1972: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpire, + } + } + case 1973: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireInterval, + Count: yyS[yypt-1].item.(int64), + } + } + case 1974: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireNever, + } + } + case 1975: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireDefault, + } + } + case 1976: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.FailedLoginAttempts, + Count: yyS[yypt-0].item.(int64), + } + } + case 1977: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTime, + Count: yyS[yypt-0].item.(int64), + } + } + case 1978: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTimeUnbounded, + } + } + case 1979: + { + parser.yyVAL.item = &ast.PasswordOrLockOption{ + Type: ast.PasswordRequireCurrentDefault, + } + } + case 1980: + { + parser.yyVAL.item = nil + } + case 1981: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthString: yyS[yypt-0].ident, + ByAuthString: true, + } + } + case 1982: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthPlugin: yyS[yypt-0].ident, + } + } + case 1983: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthPlugin: yyS[yypt-2].ident, + AuthString: yyS[yypt-0].ident, + ByAuthString: true, + } + } + case 1984: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthPlugin: yyS[yypt-2].ident, + HashString: yyS[yypt-0].ident, + ByHashString: true, + } + } + case 1985: + { + parser.yyVAL.item = &ast.AuthOption{ + AuthPlugin: mysql.AuthNativePassword, + HashString: yyS[yypt-0].ident, + ByHashString: true, + } + } + case 1988: + { + parser.yyVAL.ident = yyS[yypt-0].item.(ast.HexLiteral).ToString() + } + case 1989: + { + role := yyS[yypt-0].item.(*auth.RoleIdentity) + roleSpec := &ast.UserSpec{ + User: &auth.UserIdentity{ + Username: role.Username, + Hostname: role.Hostname, + }, + IsRole: true, + } + parser.yyVAL.item = roleSpec + } + case 1990: + { + parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} + } + case 1991: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) + } + case 1992: + { + p, err := convertToPriv(yyS[yypt-7].item.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.statement = &ast.GrantStmt{ + Privs: p, + ObjectType: yyS[yypt-5].item.(ast.ObjectTypeType), + Level: yyS[yypt-4].item.(*ast.GrantLevel), + Users: yyS[yypt-2].item.([]*ast.UserSpec), + AuthTokenOrTLSOptions: yyS[yypt-1].item.([]*ast.AuthTokenOrTLSOption), + WithGrant: yyS[yypt-0].item.(bool), + } + } + case 1993: + { + parser.yyVAL.statement = &ast.GrantProxyStmt{ + LocalUser: yyS[yypt-3].item.(*auth.UserIdentity), + ExternalUsers: yyS[yypt-1].item.([]*auth.UserIdentity), + WithGrant: yyS[yypt-0].item.(bool), + } + } + case 1994: + { + r, err := convertToRole(yyS[yypt-2].item.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.statement = &ast.GrantRoleStmt{ + Roles: r, + Users: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + case 1995: + { + parser.yyVAL.item = false + } + case 1996: + { + parser.yyVAL.item = true + } + case 1997: + { + parser.yyVAL.item = false + } + case 1998: + { + parser.yyVAL.item = false + } + case 1999: + { + parser.yyVAL.item = false + } + case 2000: + { + parser.yyVAL.item = false + } + case 2001: + { + parser.yyVAL.item = []string{yyS[yypt-0].ident} + } + case 2002: + { + parser.yyVAL.item = append(yyS[yypt-1].item.([]string), yyS[yypt-0].ident) + } + case 2003: + { + parser.yyVAL.item = &ast.RoleOrPriv{ + Node: yyS[yypt-0].item, + } + } + case 2004: + { + parser.yyVAL.item = &ast.RoleOrPriv{ + Node: yyS[yypt-0].item, + } + } + case 2005: + { + parser.yyVAL.item = &ast.RoleOrPriv{ + Symbols: strings.Join(yyS[yypt-0].item.([]string), " "), + } + } + case 2006: + { + parser.yyVAL.item = &ast.RoleOrPriv{ + Symbols: "LOAD FROM S3", + } + } + case 2007: + { + parser.yyVAL.item = &ast.RoleOrPriv{ + Symbols: "SELECT INTO S3", + } + } + case 2008: + { + parser.yyVAL.item = []*ast.RoleOrPriv{yyS[yypt-0].item.(*ast.RoleOrPriv)} + } + case 2009: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RoleOrPriv), yyS[yypt-0].item.(*ast.RoleOrPriv)) + } + case 2010: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-0].item.(mysql.PrivilegeType), + } + } + case 2011: + { + parser.yyVAL.item = &ast.PrivElem{ + Priv: yyS[yypt-3].item.(mysql.PrivilegeType), + Cols: yyS[yypt-1].item.([]*ast.ColumnName), + } + } + case 2012: + { + parser.yyVAL.item = mysql.AllPriv + } + case 2013: + { + parser.yyVAL.item = mysql.AllPriv + } + case 2014: + { + parser.yyVAL.item = mysql.AlterPriv + } + case 2015: + { + parser.yyVAL.item = mysql.CreatePriv + } + case 2016: + { + parser.yyVAL.item = mysql.CreateUserPriv + } + case 2017: + { + parser.yyVAL.item = mysql.CreateTablespacePriv + } + case 2018: + { + parser.yyVAL.item = mysql.TriggerPriv + } + case 2019: + { + parser.yyVAL.item = mysql.DeletePriv + } + case 2020: + { + parser.yyVAL.item = mysql.DropPriv + } + case 2021: + { + parser.yyVAL.item = mysql.ProcessPriv + } + case 2022: + { + parser.yyVAL.item = mysql.ExecutePriv + } + case 2023: + { + parser.yyVAL.item = mysql.IndexPriv + } + case 2024: + { + parser.yyVAL.item = mysql.InsertPriv + } + case 2025: + { + parser.yyVAL.item = mysql.SelectPriv + } + case 2026: + { + parser.yyVAL.item = mysql.SuperPriv + } + case 2027: + { + parser.yyVAL.item = mysql.ShowDBPriv + } + case 2028: + { + parser.yyVAL.item = mysql.UpdatePriv + } + case 2029: + { + parser.yyVAL.item = mysql.GrantPriv + } + case 2030: + { + parser.yyVAL.item = mysql.ReferencesPriv + } + case 2031: + { + parser.yyVAL.item = mysql.ReplicationSlavePriv + } + case 2032: + { + parser.yyVAL.item = mysql.ReplicationClientPriv + } + case 2033: + { + parser.yyVAL.item = mysql.UsagePriv + } + case 2034: + { + parser.yyVAL.item = mysql.ReloadPriv + } + case 2035: + { + parser.yyVAL.item = mysql.FilePriv + } + case 2036: + { + parser.yyVAL.item = mysql.ConfigPriv + } + case 2037: + { + parser.yyVAL.item = mysql.CreateTMPTablePriv + } + case 2038: + { + parser.yyVAL.item = mysql.LockTablesPriv + } + case 2039: + { + parser.yyVAL.item = mysql.CreateViewPriv + } + case 2040: + { + parser.yyVAL.item = mysql.ShowViewPriv + } + case 2041: + { + parser.yyVAL.item = mysql.CreateRolePriv + } + case 2042: + { + parser.yyVAL.item = mysql.DropRolePriv + } + case 2043: + { + parser.yyVAL.item = mysql.CreateRoutinePriv + } + case 2044: + { + parser.yyVAL.item = mysql.AlterRoutinePriv + } + case 2045: + { + parser.yyVAL.item = mysql.EventPriv + } + case 2046: + { + parser.yyVAL.item = mysql.ShutdownPriv + } + case 2047: + { + parser.yyVAL.item = ast.ObjectTypeNone + } + case 2048: + { + parser.yyVAL.item = ast.ObjectTypeTable + } + case 2049: + { + parser.yyVAL.item = ast.ObjectTypeFunction + } + case 2050: + { + parser.yyVAL.item = ast.ObjectTypeProcedure + } + case 2051: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + } + } + case 2052: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelGlobal, + } + } + case 2053: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + DBName: yyS[yypt-2].ident, + } + } + case 2054: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + DBName: yyS[yypt-2].ident, + TableName: yyS[yypt-0].ident, + } + } + case 2055: + { + parser.yyVAL.item = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + TableName: yyS[yypt-0].ident, + } + } + case 2056: + { + p, err := convertToPriv(yyS[yypt-5].item.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.statement = &ast.RevokeStmt{ + Privs: p, + ObjectType: yyS[yypt-3].item.(ast.ObjectTypeType), + Level: yyS[yypt-2].item.(*ast.GrantLevel), + Users: yyS[yypt-0].item.([]*ast.UserSpec), + } + } + case 2057: + { + // MySQL has special syntax for REVOKE ALL [PRIVILEGES], GRANT OPTION + // which uses the RevokeRoleStmt syntax but is of type RevokeStmt. + // It is documented at https://dev.mysql.com/doc/refman/5.7/en/revoke.html + // as the "second syntax" for REVOKE. It is only valid if *both* + // ALL PRIVILEGES + GRANT OPTION are specified in that order. + if isRevokeAllGrant(yyS[yypt-2].item.([]*ast.RoleOrPriv)) { + var users []*ast.UserSpec + for _, u := range yyS[yypt-0].item.([]*auth.UserIdentity) { + users = append(users, &ast.UserSpec{ + User: u, + }) + } + parser.yyVAL.statement = &ast.RevokeStmt{ + Privs: []*ast.PrivElem{{Priv: mysql.AllPriv}, {Priv: mysql.GrantPriv}}, + ObjectType: ast.ObjectTypeNone, + Level: &ast.GrantLevel{Level: ast.GrantLevelGlobal}, + Users: users, + } + } else { + r, err := convertToRole(yyS[yypt-2].item.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + parser.yyVAL.statement = &ast.RevokeRoleStmt{ + Roles: r, + Users: yyS[yypt-0].item.([]*auth.UserIdentity), + } + } + } + case 2058: + { + x := &ast.LoadDataStmt{ + LowPriority: yyS[yypt-13].item.(bool), + FileLocRef: ast.FileLocServer, + Path: yyS[yypt-10].ident, + OnDuplicate: yyS[yypt-9].item.(ast.OnDuplicateKeyHandlingType), + Table: yyS[yypt-6].item.(*ast.TableName), + Charset: yyS[yypt-5].item.(*string), + FieldsInfo: yyS[yypt-4].item.(*ast.FieldsClause), + LinesInfo: yyS[yypt-3].item.(*ast.LinesClause), + IgnoreLines: yyS[yypt-2].item.(*uint64), + ColumnsAndUserVars: yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar), + ColumnAssignments: yyS[yypt-0].item.([]*ast.Assignment), + } + if yyS[yypt-12].item != nil { + x.FileLocRef = ast.FileLocClient + // See https://dev.mysql.com/doc/refman/5.7/en/load-data.html#load-data-duplicate-key-handling + // If you do not specify IGNORE or REPLACE modifier , then we set default behavior to IGNORE when LOCAL modifier is specified + if x.OnDuplicate == ast.OnDuplicateKeyHandlingError { + x.OnDuplicate = ast.OnDuplicateKeyHandlingIgnore + } + } + columns := []*ast.ColumnName{} + for _, v := range x.ColumnsAndUserVars { + if v.ColumnName != nil { + columns = append(columns, v.ColumnName) + } + } + x.Columns = columns + + parser.yyVAL.statement = x + } + case 2059: + { + parser.yyVAL.item = false + } + case 2060: + { + parser.yyVAL.item = true + } + case 2061: + { + parser.yyVAL.item = (*uint64)(nil) + } + case 2062: + { + v := getUint64FromNUM(yyS[yypt-1].item) + parser.yyVAL.item = &v + } + case 2063: + { + parser.yyVAL.item = (*string)(nil) + } + case 2064: + { + v := yyS[yypt-0].ident + parser.yyVAL.item = &v + } + case 2065: + { + parser.yyVAL.item = nil + } + case 2066: + { + parser.yyVAL.item = yyS[yypt-0].ident + } + case 2067: + { + parser.yyVAL.item = (*ast.FieldsClause)(nil) + } + case 2068: + { + fieldsClause := &ast.FieldsClause{} + fieldItems := yyS[yypt-0].item.([]*ast.FieldItem) + for _, item := range fieldItems { + switch item.Type { + case ast.Terminated: + fieldsClause.Terminated = &item.Value + case ast.Enclosed: + fieldsClause.Enclosed = &item.Value + fieldsClause.OptEnclosed = item.OptEnclosed + case ast.Escaped: + fieldsClause.Escaped = &item.Value + case ast.DefinedNullBy: + fieldsClause.DefinedNullBy = &item.Value + fieldsClause.NullValueOptEnclosed = item.OptEnclosed + } + } + parser.yyVAL.item = fieldsClause + } + case 2071: + { + fieldItems := yyS[yypt-1].item.([]*ast.FieldItem) + parser.yyVAL.item = append(fieldItems, yyS[yypt-0].item.(*ast.FieldItem)) + } + case 2072: + { + fieldItems := make([]*ast.FieldItem, 1, 1) + fieldItems[0] = yyS[yypt-0].item.(*ast.FieldItem) + parser.yyVAL.item = fieldItems + } + case 2073: + { + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Terminated, + Value: yyS[yypt-0].ident, + } + } + case 2074: + { + str := yyS[yypt-0].ident + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + OptEnclosed: true, + } + } + case 2075: + { + str := yyS[yypt-0].ident + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } + case 2076: + { + str := yyS[yypt-0].ident + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.Escaped, + Value: str, + } + } + case 2077: + { + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.DefinedNullBy, + Value: yyS[yypt-0].item.(*ast.TextString).Value, + } + } + case 2078: + { + parser.yyVAL.item = &ast.FieldItem{ + Type: ast.DefinedNullBy, + Value: yyS[yypt-2].item.(*ast.TextString).Value, + OptEnclosed: true, + } + } + case 2080: + { + parser.yyVAL.ident = yyS[yypt-0].item.(ast.HexLiteral).ToString() + } + case 2081: + { + parser.yyVAL.ident = yyS[yypt-0].item.(ast.BitLiteral).ToString() + } + case 2082: + { + parser.yyVAL.item = (*ast.LinesClause)(nil) + } + case 2083: + { + parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].item.(*string), Terminated: yyS[yypt-0].item.(*string)} + } + case 2084: + { + parser.yyVAL.item = (*string)(nil) + } + case 2085: + { + s := yyS[yypt-0].ident + parser.yyVAL.item = &s + } + case 2086: + { + parser.yyVAL.item = (*string)(nil) + } + case 2087: + { + s := yyS[yypt-0].ident + parser.yyVAL.item = &s + } + case 2088: + { + parser.yyVAL.item = ([]*ast.Assignment)(nil) + } + case 2089: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 2090: + { + l := yyS[yypt-2].item.([]*ast.Assignment) + parser.yyVAL.item = append(l, yyS[yypt-0].item.(*ast.Assignment)) + } + case 2091: + { + parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} + } + case 2092: + { + parser.yyVAL.item = &ast.Assignment{ + Column: yyS[yypt-2].expr.(*ast.ColumnNameExpr).Name, + Expr: yyS[yypt-0].expr, + } + } + case 2093: + { + parser.yyVAL.statement = &ast.UnlockTablesStmt{} + } + case 2094: + { + parser.yyVAL.statement = &ast.LockTablesStmt{ + TableLocks: yyS[yypt-0].item.([]ast.TableLock), + } + } + case 2097: + { + parser.yyVAL.item = ast.TableLock{ + Table: yyS[yypt-1].item.(*ast.TableName), + Type: yyS[yypt-0].item.(ast.TableLockType), + } + } + case 2098: + { + parser.yyVAL.item = ast.TableLockRead + } + case 2099: + { + parser.yyVAL.item = ast.TableLockReadLocal + } + case 2100: + { + parser.yyVAL.item = ast.TableLockWrite + } + case 2101: + { + parser.yyVAL.item = ast.TableLockWriteLocal + } + case 2102: + { + parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} + } + case 2103: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) + } + case 2104: + { + stmt := yyS[yypt-0].item.(*ast.RepairTableStmt) + stmt.NoWriteToBinLog = yyS[yypt-3].item.(bool) + stmt.Tables = yyS[yypt-1].item.([]*ast.TableName) + parser.yyVAL.statement = stmt + } + case 2105: + { + parser.yyVAL.item = &ast.RepairTableStmt{} + } + case 2106: + { + stmt := yyS[yypt-1].item.(*ast.RepairTableStmt) + stmt.Quick = true + parser.yyVAL.item = stmt + } + case 2107: + { + stmt := yyS[yypt-1].item.(*ast.RepairTableStmt) + stmt.Extended = true + parser.yyVAL.item = stmt + } + case 2108: + { + stmt := yyS[yypt-1].item.(*ast.RepairTableStmt) + stmt.UseFrm = true + parser.yyVAL.item = stmt + } + case 2109: + { + parser.yyVAL.statement = &ast.OptimizeTableStmt{ + Tables: yyS[yypt-0].item.([]*ast.TableName), + NoWriteToBinLog: yyS[yypt-2].item.(bool), + } + } + case 2110: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 2111: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + } + } + case 2112: + { + parser.yyVAL.statement = &ast.KillStmt{ + ConnectionID: getUint64FromNUM(yyS[yypt-0].item), + Query: true, + } + } + case 2113: + { + parser.yyVAL.statement = &ast.KillStmt{ + Expr: yyS[yypt-0].expr, + } + } + case 2115: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 2116: + { + unsigned_num := getUint64FromNUM(yyS[yypt-0].item) + if unsigned_num > 9223372036854775808 { + yylex.AppendError(yylex.Errorf("the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807].")) + return 1 + } else if unsigned_num == 9223372036854775808 { + signed_one := int64(1) + parser.yyVAL.item = signed_one << 63 + } else { + parser.yyVAL.item = -int64(unsigned_num) + } + } + case 2117: + { + // Parse it but will ignore it + switch yyS[yypt-0].ident { + case "Y", "y": + yylex.AppendError(yylex.Errorf("The ENCRYPTION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + case "N", "n": + break + default: + yylex.AppendError(ErrWrongValue.GenByArgs("argument (should be Y or N)", yyS[yypt-0].ident)) + return 1 + } + parser.yyVAL.ident = yyS[yypt-0].ident + } + case 2118: + { + parser.yyVAL.item = append([]*ast.RowExpr{}, yyS[yypt-0].item.(*ast.RowExpr)) + } + case 2119: + { + parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RowExpr), yyS[yypt-0].item.(*ast.RowExpr)) + } + case 2120: + { + parser.yyVAL.item = &ast.RowExpr{Values: yyS[yypt-0].item.([]ast.ExprNode)} + } + + } + + if !parser.lexer.skipPositionRecording { + yySetOffset(parser.yyVAL, parser.yyVAL.offset) + } + + if yyEx != nil && yyEx.Reduced(r, exState, parser.yyVAL) { + return -1 + } + goto yystack /* stack new state and value */ +} diff --git a/pkg/parser/parser.y b/pkg/parser/parser.y new file mode 100644 index 000000000..959f91ea3 --- /dev/null +++ b/pkg/parser/parser.y @@ -0,0 +1,12300 @@ +%{ +// Copyright 2013 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// Initial yacc source generated by ebnf2y[1] +// at 2013-10-04 23:10:47.861401015 +0200 CEST +// +// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ +// +// [1]: http://github.com/cznic/ebnf2y + +package parser + +import ( + "strings" + + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/opcode" + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/types" +) + +type insertRowAlias struct { + rowAlias ast.CIStr + columnAliases []ast.CIStr +} + +type likeEscapeSpec struct { + escape string + explicit bool +} +%} + +%union { + offset int // offset + item interface{} + ident string + expr ast.ExprNode + statement ast.StmtNode +} + +%token + + /*yy:token "%c" */ + identifier "identifier" + memberof "MEMBER OF" + optionallyEnclosedBy "OPTIONALLY ENCLOSED BY" + + /*yy:token "_%c" */ + underscoreCS "UNDERSCORE_CHARSET" + + /*yy:token "\"%c\"" */ + stringLit "string literal" + singleAtIdentifier "identifier with single leading at" + doubleAtIdentifier "identifier with double leading at" + invalid "a special token never used by parser, used by lexer to indicate error" + hintComment "an optimizer hint" + andand "&&" + pipes "||" + + /* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */ + add "ADD" + all "ALL" + alter "ALTER" + analyze "ANALYZE" + and "AND" + array "ARRAY" + as "AS" + asc "ASC" + between "BETWEEN" + bigIntType "BIGINT" + binaryType "BINARY" + blobType "BLOB" + both "BOTH" + by "BY" + call "CALL" + cascade "CASCADE" + caseKwd "CASE" + change "CHANGE" + charType "CHAR" + character "CHARACTER" + check "CHECK" + collate "COLLATE" + column "COLUMN" + constraint "CONSTRAINT" + convert "CONVERT" + create "CREATE" + cross "CROSS" + cumeDist "CUME_DIST" + currentDate "CURRENT_DATE" + currentRole "CURRENT_ROLE" + currentTime "CURRENT_TIME" + currentTs "CURRENT_TIMESTAMP" + currentUser "CURRENT_USER" + database "DATABASE" + databases "DATABASES" + dayHour "DAY_HOUR" + dayMicrosecond "DAY_MICROSECOND" + dayMinute "DAY_MINUTE" + daySecond "DAY_SECOND" + decimalType "DECIMAL" + defaultKwd "DEFAULT" + delayed "DELAYED" + deleteKwd "DELETE" + denseRank "DENSE_RANK" + desc "DESC" + describe "DESCRIBE" + distinct "DISTINCT" + distinctRow "DISTINCTROW" + div "DIV" + doubleType "DOUBLE" + drop "DROP" + dual "DUAL" + elseKwd "ELSE" + enclosed "ENCLOSED" + escaped "ESCAPED" + except "EXCEPT" + exists "EXISTS" + explain "EXPLAIN" + falseKwd "FALSE" + fetch "FETCH" + firstValue "FIRST_VALUE" + floatType "FLOAT" + float4Type "FLOAT4" + float8Type "FLOAT8" + forKwd "FOR" + force "FORCE" + foreign "FOREIGN" + from "FROM" + fulltext "FULLTEXT" + generated "GENERATED" + grant "GRANT" + group "GROUP" + groups "GROUPS" + having "HAVING" + highPriority "HIGH_PRIORITY" + hourMicrosecond "HOUR_MICROSECOND" + hourMinute "HOUR_MINUTE" + hourSecond "HOUR_SECOND" + ifKwd "IF" + ignore "IGNORE" + in "IN" + index "INDEX" + infile "INFILE" + inner "INNER" + insert "INSERT" + intType "INT" + int1Type "INT1" + int2Type "INT2" + int3Type "INT3" + int4Type "INT4" + int8Type "INT8" + integerType "INTEGER" + intersect "INTERSECT" + interval "INTERVAL" + into "INTO" + is "IS" + join "JOIN" + key "KEY" + keys "KEYS" + kill "KILL" + lag "LAG" + lastValue "LAST_VALUE" + lateral "LATERAL" + lead "LEAD" + leading "LEADING" + left "LEFT" + like "LIKE" + limit "LIMIT" + linear "LINEAR" + lines "LINES" + load "LOAD" + localTime "LOCALTIME" + localTs "LOCALTIMESTAMP" + lock "LOCK" + long "LONG" + longblobType "LONGBLOB" + longtextType "LONGTEXT" + lowPriority "LOW_PRIORITY" + match "MATCH" + maxValue "MAXVALUE" + mediumblobType "MEDIUMBLOB" + mediumIntType "MEDIUMINT" + mediumtextType "MEDIUMTEXT" + middleIntType "MIDDLEINT" + minuteMicrosecond "MINUTE_MICROSECOND" + minuteSecond "MINUTE_SECOND" + mod "MOD" + natural "NATURAL" + not "NOT" + noWriteToBinLog "NO_WRITE_TO_BINLOG" + nthValue "NTH_VALUE" + ntile "NTILE" + null "NULL" + numericType "NUMERIC" + of "OF" + on "ON" + optimize "OPTIMIZE" + optimizerCosts "OPTIMIZER_COSTS" + option "OPTION" + optionally "OPTIONALLY" + or "OR" + order "ORDER" + outer "OUTER" + outfile "OUTFILE" + over "OVER" + partition "PARTITION" + percentRank "PERCENT_RANK" + precisionType "PRECISION" + primary "PRIMARY" + procedure "PROCEDURE" + rangeKwd "RANGE" + rank "RANK" + read "READ" + realType "REAL" + recursive "RECURSIVE" + references "REFERENCES" + regexpKwd "REGEXP" + release "RELEASE" + rename "RENAME" + repeat "REPEAT" + replace "REPLACE" + requireKwd "REQUIRE" + restrict "RESTRICT" + revoke "REVOKE" + right "RIGHT" + rlike "RLIKE" + row "ROW" + rows "ROWS" + rowNumber "ROW_NUMBER" + secondMicrosecond "SECOND_MICROSECOND" + selectKwd "SELECT" + set "SET" + show "SHOW" + smallIntType "SMALLINT" + spatial "SPATIAL" + sql "SQL" + sqlBigResult "SQL_BIG_RESULT" + sqlCalcFoundRows "SQL_CALC_FOUND_ROWS" + sqlSmallResult "SQL_SMALL_RESULT" + ssl "SSL" + starting "STARTING" + stored "STORED" + straightJoin "STRAIGHT_JOIN" + system "SYSTEM" + tableKwd "TABLE" + terminated "TERMINATED" + then "THEN" + tinyblobType "TINYBLOB" + tinyIntType "TINYINT" + tinytextType "TINYTEXT" + to "TO" + trailing "TRAILING" + trigger "TRIGGER" + trueKwd "TRUE" + undo "UNDO" + union "UNION" + unique "UNIQUE" + unlock "UNLOCK" + unsigned "UNSIGNED" + update "UPDATE" + usage "USAGE" + use "USE" + using "USING" + utcDate "UTC_DATE" + utcTime "UTC_TIME" + utcTimestamp "UTC_TIMESTAMP" + values "VALUES" + varbinaryType "VARBINARY" + varcharType "VARCHAR" + varcharacter "VARCHARACTER" + varying "VARYING" + virtual "VIRTUAL" + when "WHEN" + where "WHERE" + window "WINDOW" + with "WITH" + write "WRITE" + xor "XOR" + yearMonth "YEAR_MONTH" + zerofill "ZEROFILL" + + /* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */ + account "ACCOUNT" + action "ACTION" + active "ACTIVE" + after "AFTER" + against "AGAINST" + algorithm "ALGORITHM" + always "ALWAYS" + any "ANY" + ascii "ASCII" + attribute "ATTRIBUTE" + auto "AUTO" + autoextendSize "AUTOEXTEND_SIZE" + autoIncrement "AUTO_INCREMENT" + avg "AVG" + avgRowLength "AVG_ROW_LENGTH" + begin "BEGIN" + binlog "BINLOG" + bitType "BIT" + block "BLOCK" + boolType "BOOL" + booleanType "BOOLEAN" + btree "BTREE" + buckets "BUCKETS" + byteType "BYTE" + cascaded "CASCADED" + chain "CHAIN" + channel "CHANNEL" + charsetKwd "CHARSET" + checksum "CHECKSUM" + cipher "CIPHER" + client "CLIENT" + coalesce "COALESCE" + collation "COLLATION" + columns "COLUMNS" + columnFormat "COLUMN_FORMAT" + comment "COMMENT" + commit "COMMIT" + committed "COMMITTED" + compact "COMPACT" + compressed "COMPRESSED" + compression "COMPRESSION" + config "CONFIG" + connection "CONNECTION" + consistent "CONSISTENT" + context "CONTEXT" + cpu "CPU" + current "CURRENT" + data "DATA" + datafile "DATAFILE" + dateType "DATE" + datetimeType "DATETIME" + day "DAY" + deallocate "DEALLOCATE" + definer "DEFINER" + definition "DEFINITION" + delayKeyWrite "DELAY_KEY_WRITE" + description "DESCRIPTION" + directory "DIRECTORY" + disable "DISABLE" + discard "DISCARD" + disk "DISK" + do "DO" + duplicate "DUPLICATE" + dynamic "DYNAMIC" + enable "ENABLE" + encryption "ENCRYPTION" + end "END" + enforced "ENFORCED" + engine "ENGINE" + engines "ENGINES" + engine_attribute "ENGINE_ATTRIBUTE" + enum "ENUM" + errorKwd "ERROR" + identSQLErrors "ERRORS" + escape "ESCAPE" + event "EVENT" + events "EVENTS" + exchange "EXCHANGE" + execute "EXECUTE" + expansion "EXPANSION" + expire "EXPIRE" + explore "EXPLORE" + export "EXPORT" + extended "EXTENDED" + extentSize "EXTENT_SIZE" + failedLoginAttempts "FAILED_LOGIN_ATTEMPTS" + faultsSym "FAULTS" + fields "FIELDS" + file "FILE" + fileBlockSize "FILE_BLOCK_SIZE" + first "FIRST" + fixed "FIXED" + flush "FLUSH" + following "FOLLOWING" + format "FORMAT" + found "FOUND" + full "FULL" + function "FUNCTION" + general "GENERAL" + geometry "GEOMETRY" + geometryCollection "GEOMETRYCOLLECTION" + global "GLOBAL" + grants "GRANTS" + hash "HASH" + histogram "HISTOGRAM" + history "HISTORY" + hosts "HOSTS" + hour "HOUR" + identified "IDENTIFIED" + importKwd "IMPORT" + inactive "INACTIVE" + indexes "INDEXES" + initialSize "INITIAL_SIZE" + insertMethod "INSERT_METHOD" + instance "INSTANCE" + invisible "INVISIBLE" + invoker "INVOKER" + io "IO" + ipc "IPC" + isolation "ISOLATION" + issuer "ISSUER" + jsonType "JSON" + keyring "KEYRING" + keyBlockSize "KEY_BLOCK_SIZE" + language "LANGUAGE" + last "LAST" + less "LESS" + level "LEVEL" + lineString "LINESTRING" + list "LIST" + local "LOCAL" + locked "LOCKED" + logfile "LOGFILE" + logs "LOGS" + manual "MANUAL" + master "MASTER" + maxConnectionsPerHour "MAX_CONNECTIONS_PER_HOUR" + maxQueriesPerHour "MAX_QUERIES_PER_HOUR" + maxRows "MAX_ROWS" + maxSize "MAX_SIZE" + maxUpdatesPerHour "MAX_UPDATES_PER_HOUR" + maxUserConnections "MAX_USER_CONNECTIONS" + member "MEMBER" + memory "MEMORY" + merge "MERGE" + microsecond "MICROSECOND" + migrate "MIGRATE" + minute "MINUTE" + minRows "MIN_ROWS" + mode "MODE" + modify "MODIFY" + month "MONTH" + multiLineString "MULTILINESTRING" + multiPoint "MULTIPOINT" + multiPolygon "MULTIPOLYGON" + nameKwd "NAME" + names "NAMES" + national "NATIONAL" + ncharType "NCHAR" + never "NEVER" + next "NEXT" + no "NO" + nodegroup "NODEGROUP" + none "NONE" + nowait "NOWAIT" + noWaitTablespace "NO_WAIT" + nulls "NULLS" + nvarcharType "NVARCHAR" + offset "OFFSET" + old "OLD" + one "ONE" + only "ONLY" + open "OPEN" + organization "ORGANIZATION" + packKeys "PACK_KEYS" + pageSym "PAGE" + parser "PARSER" + partial "PARTIAL" + partitioning "PARTITIONING" + partitions "PARTITIONS" + password "PASSWORD" + passwordLockTime "PASSWORD_LOCK_TIME" + phase "PHASE" + pipesAsOr + plugins "PLUGINS" + point "POINT" + polygon "POLYGON" + preceding "PRECEDING" + prepare "PREPARE" + privileges "PRIVILEGES" + process "PROCESS" + processlist "PROCESSLIST" + profile "PROFILE" + profiles "PROFILES" + proxy "PROXY" + quarter "QUARTER" + query "QUERY" + quick "QUICK" + rebuild "REBUILD" + recover "RECOVER" + redoBufferSize "REDO_BUFFER_SIZE" + redundant "REDUNDANT" + reference "REFERENCE" + relay "RELAY" + reload "RELOAD" + remove "REMOVE" + reorganize "REORGANIZE" + repair "REPAIR" + repeatable "REPEATABLE" + replica "REPLICA" + replication "REPLICATION" + resource "RESOURCE" + respect "RESPECT" + restart "RESTART" + resume "RESUME" + retain "RETAIN" + reuse "REUSE" + reverse "REVERSE" + role "ROLE" + rollback "ROLLBACK" + rollup "ROLLUP" + rotate "ROTATE" + routine "ROUTINE" + rowCount "ROW_COUNT" + rowFormat "ROW_FORMAT" + rtree "RTREE" + san "SAN" + savepoint "SAVEPOINT" + second "SECOND" + secondaryEngine "SECONDARY_ENGINE" + secondaryEngineAttribute "SECONDARY_ENGINE_ATTRIBUTE" + secondaryLoad "SECONDARY_LOAD" + secondaryUnload "SECONDARY_UNLOAD" + security "SECURITY" + separator "SEPARATOR" + serial "SERIAL" + serializable "SERIALIZABLE" + session "SESSION" + share "SHARE" + shutdown "SHUTDOWN" + signed "SIGNED" + simple "SIMPLE" + skip "SKIP" + slave "SLAVE" + slow "SLOW" + snapshot "SNAPSHOT" + some "SOME" + source "SOURCE" + sqlBufferResult "SQL_BUFFER_RESULT" + sqlCache "SQL_CACHE" + sqlNoCache "SQL_NO_CACHE" + sqlTsiDay "SQL_TSI_DAY" + sqlTsiHour "SQL_TSI_HOUR" + sqlTsiMinute "SQL_TSI_MINUTE" + sqlTsiMonth "SQL_TSI_MONTH" + sqlTsiQuarter "SQL_TSI_QUARTER" + sqlTsiSecond "SQL_TSI_SECOND" + sqlTsiWeek "SQL_TSI_WEEK" + sqlTsiYear "SQL_TSI_YEAR" + srid "SRID" + start "START" + statsAutoRecalc "STATS_AUTO_RECALC" + statsPersistent "STATS_PERSISTENT" + statsSamplePages "STATS_SAMPLE_PAGES" + status "STATUS" + storage "STORAGE" + subject "SUBJECT" + subpartition "SUBPARTITION" + subpartitions "SUBPARTITIONS" + super "SUPER" + suspend "SUSPEND" + swaps "SWAPS" + switchesSym "SWITCHES" + tables "TABLES" + tablespace "TABLESPACE" + temporary "TEMPORARY" + temptable "TEMPTABLE" + textType "TEXT" + than "THAN" + timeType "TIME" + timestampType "TIMESTAMP" + tokenIssuer "TOKEN_ISSUER" + traditional "TRADITIONAL" + transaction "TRANSACTION" + triggers "TRIGGERS" + truncate "TRUNCATE" + tp "TYPE" + unbounded "UNBOUNDED" + uncommitted "UNCOMMITTED" + undefined "UNDEFINED" + undofile "UNDOFILE" + undoBufferSize "UNDO_BUFFER_SIZE" + unicodeSym "UNICODE" + unknown "UNKNOWN" + user "USER" + useFrm "USE_FRM" + userResources "USER_RESOURCES" + validation "VALIDATION" + value "VALUE" + variables "VARIABLES" + view "VIEW" + visible "VISIBLE" + wait "WAIT" + warnings "WARNINGS" + week "WEEK" + weightString "WEIGHT_STRING" + without "WITHOUT" + work "WORK" + x509 "X509" + xa "XA" + xid "XID" + yearType "YEAR" + + /* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */ + addDate "ADDDATE" + compress "COMPRESS" + copyKwd "COPY" + defined "DEFINED" + getFormat "GET_FORMAT" + inplace "INPLACE" + instant "INSTANT" + jsonArrayagg "JSON_ARRAYAGG" + jsonObjectAgg "JSON_OBJECTAGG" + jsonSumCrc32 "JSON_SUM_CRC32" + log "LOG" + s3 "S3" + subDate "SUBDATE" + timestampAdd "TIMESTAMPADD" + timestampDiff "TIMESTAMPDIFF" + tls "TLS" + builtinApproxCountDistinct + builtinApproxPercentile + builtinBitAnd + builtinBitOr + builtinBitXor + builtinCast + builtinCount + builtinCurDate + builtinCurTime + builtinDateAdd + builtinDateSub + builtinExtract + builtinGroupConcat + builtinMax + builtinMin + builtinNow + builtinPosition + builtinStddevPop + builtinStddevSamp + builtinSubstring + builtinSum + builtinSysDate + builtinTranslate + builtinTrim + builtinUser + builtinVarPop + builtinVarSamp + +%token + + /*yy:token "1.%d" */ + floatLit "floating-point literal" + + /*yy:token "1.%d" */ + decLit "decimal literal" + + /*yy:token "%d" */ + intLit "integer literal" + + /*yy:token "%x" */ + hexLit "hexadecimal literal" + + /*yy:token "%b" */ + bitLit "bit literal" + assignmentEq ":=" + eq "=" + ge ">=" + le "<=" + jss "->" + juss "->>" + lsh "<<" + neq "!=" + neqSynonym "<>" + nulleq "<=>" + paramMarker "?" + rsh ">>" + +%token not2 +%type + Expression "expression" + MaxValueOrExpression "maxvalue or expression" + BoolPri "boolean primary expression" + ExprOrDefault "expression or default" + PredicateExpr "Predicate expression factor" + SetExpr "Set variable statement value's expression" + BitExpr "bit expression" + SimpleExpr "simple expression" + SimpleIdent "Simple Identifier expression" + SumExpr "aggregate functions" + FunctionCallGeneric "Function call with Identifier" + FunctionCallKeyword "Function call with keyword as function name" + FunctionCallNonKeyword "Function call with nonkeyword as function name" + Literal "literal value" + Variable "User or system variable" + SystemVariable "System defined variable name" + UserVariable "User defined variable name" + SubSelect "Sub Select" + StringLiteral "text literal" + ExpressionOpt "Optional expression" + SignedLiteral "Literal or NumLiteral with sign" + DefaultValueExpr "DefaultValueExpr(Now or Signed Literal)" + NowSymOptionFraction "NowSym with optional fraction part" + NowSymOptionFractionParentheses "NowSym with optional fraction part within potential parentheses" + CharsetNameOrDefault "Character set name or default" + BuiltinFunction "Default builtin functions for columns" + WindowFuncCall "WINDOW function call" + ProcedureCall "Procedure call with Identifier or identifier" + +%type + AlterDatabaseStmt "Alter database statement" + AlterTableStmt "Alter table statement" + AlterUserStmt "Alter user statement" + AlterInstanceStmt "Alter instance statement" + AnalyzeTableStmt "Analyze table statement" + BeginTransactionStmt "BEGIN TRANSACTION statement" + BinlogStmt "Binlog base64 statement" + CommitStmt "COMMIT statement" + CreateTableStmt "CREATE TABLE statement" + CreateViewStmt "CREATE VIEW statement" + CreateUserStmt "CREATE User statement" + CreateRoleStmt "CREATE Role statement" + CreateDatabaseStmt "Create Database Statement" + CreateIndexStmt "CREATE INDEX statement" + DoStmt "Do statement" + DropDatabaseStmt "DROP DATABASE statement" + DropIndexStmt "DROP INDEX statement" + DropTableStmt "DROP TABLE statement" + DropUserStmt "DROP USER" + DropRoleStmt "DROP ROLE" + DropViewStmt "DROP VIEW statement" + DeallocateStmt "Deallocate prepared statement" + DeleteFromStmt "DELETE FROM statement" + DeleteWithoutUsingStmt "Normal DELETE statement" + DeleteWithUsingStmt "DELETE USING statement" + EmptyStmt "empty statement" + ExecuteStmt "Execute statement" + ExplainStmt "EXPLAIN statement" + ExplainableStmt "explainable statement" + FlushStmt "Flush statement" + GrantStmt "Grant statement" + GrantProxyStmt "Grant proxy statement" + GrantRoleStmt "Grant role statement" + InsertIntoStmt "INSERT INTO statement" + CallStmt "CALL statement" + KillStmt "Kill statement" + LoadDataStmt "Load data statement" + LockTablesStmt "Lock tables statement" + OptimizeTableStmt "OPTIMIZE statement" + PreparedStmt "PreparedStmt" + SelectStmt "SELECT statement" + SelectStmtWithClause "common table expression SELECT statement" + RenameTableStmt "rename table statement" + RenameUserStmt "rename user statement" + RepairTableStmt "REPAIR TABLE statement" + AlterViewStmt "ALTER VIEW statement" + XAStmt "XA transaction statement" + CreateSpatialRefSysStmt "CREATE SPATIAL REFERENCE SYSTEM statement" + DropSpatialRefSysStmt "DROP SPATIAL REFERENCE SYSTEM statement" + CreateTablespaceStmt "CREATE [UNDO] TABLESPACE statement" + AlterTablespaceStmt "ALTER [UNDO] TABLESPACE statement" + DropTablespaceStmt "DROP [UNDO] TABLESPACE statement" + CreateLogfileGroupStmt "CREATE LOGFILE GROUP statement" + AlterLogfileGroupStmt "ALTER LOGFILE GROUP statement" + DropLogfileGroupStmt "DROP LOGFILE GROUP statement" + ReplaceIntoStmt "REPLACE INTO statement" + RevokeStmt "Revoke statement" + RevokeRoleStmt "Revoke role statement" + RollbackStmt "ROLLBACK statement" + ReleaseSavepointStmt "RELEASE SAVEPOINT statement" + SavepointStmt "SAVEPOINT statement" + SetStmt "Set variable statement" + SetRoleStmt "Set active role statement" + SetDefaultRoleStmt "Set default statement for some user" + ShowStmt "Show engines/databases/tables/user/columns/warnings/status statement" + Statement "statement" + TruncateTableStmt "TRUNCATE TABLE statement" + UnlockTablesStmt "Unlock tables statement" + UpdateStmt "UPDATE statement" + SetOprStmt "Union/Except/Intersect select statement" + SetOprStmtWithLimitOrderBy "Union/Except/Intersect select statement with limit and order by" + SetOprStmtWoutLimitOrderBy "Union/Except/Intersect select statement without limit and order by" + UseStmt "USE statement" + ShutdownStmt "SHUTDOWN statement" + RestartStmt "RESTART statement" + CreateViewSelectOpt "Select/Union/Except/Intersect statement in CREATE VIEW ... AS SELECT" + UpdateStmtNoWith "Update statement without CTE clause" + +%type + LikeEscapeOpt "like escape option" + AllOrPartitionNameList "All or partition name list" + AlgorithmClause "Alter table algorithm" + AlterTableSpecSingleOpt "Alter table single option" + AlterTableSpec "Alter table specification" + AlterTableSpecList "Alter table specification list" + AlterTableSpecListOpt "Alter table specification list optional" + ArrayKwdOpt "Array options" + AnalyzeOption "Analyze option" + AnalyzeOptionList "Analyze option list" + AnalyzeOptionListOpt "Optional analyze option list" + AnyOrAll "Any or All for subquery" + Assignment "assignment" + AssignmentList "assignment list" + AuthOption "User auth option" + OptionalBraces "optional braces" + CastType "Cast function target type" + CharsetOpt "CHARACTER SET option in LOAD DATA" + ColumnDef "table column definition" + ColumnName "column name" + ColumnNameOrUserVariable "column name or user variable" + ColumnNameList "column name list" + ColumnNameOrUserVariableList "column name or user variable list" + ColumnList "column list" + ColumnNameListOpt "column name list opt" + IdentList "identifier list" + IdentListWithParenOpt "column name list opt with parentheses" + ColumnNameOrUserVarListOpt "column name or user vairiabe list opt" + ColumnNameOrUserVarListOptWithBrackets "column name or user variable list opt with brackets" + ColumnSetValueList "insert statement set value by column name list" + CompareOp "Compare opcode" + ColumnOption "column definition option" + ColumnOptionList "column definition option list" + VirtualOrStored "indicate generated column is stored or not" + ColumnOptionListOpt "optional column definition option list" + CommonTableExpr "Common table expression" + CompletionTypeWithinTransaction "overwrite system variable completion_type within current transaction" + ConnectionOption "single connection options" + ConnectionOptionList "connection options for CREATE USER statement" + ConnectionOptions "optional connection options for CREATE USER statement" + Constraint "table constraint" + ConstraintElem "table constraint element" + ConstraintKeywordOpt "Constraint Keyword or empty" + CreateTableOptionListOpt "create table option list opt" + CreateTableSelectOpt "Select/Union statement in CREATE TABLE ... SELECT" + DatabaseOption "CREATE Database specification" + DatabaseOptionList "CREATE Database specification list" + DatabaseOptionListOpt "CREATE Database specification list opt" + DistinctOpt "Explicit distinct option" + DefaultFalseDistinctOpt "Distinct option which defaults to false" + DefaultTrueDistinctOpt "Distinct option which defaults to true" + BuggyDefaultFalseDistinctOpt "Distinct option which accepts DISTINCT ALL and defaults to false" + RequireClause "Encrypted connections options" + RequireClauseOpt "optional Encrypted connections options" + EqOpt "= or empty" + EscapedTableRef "escaped table reference" + ExpressionList "expression list" + ExtendedPriv "Extended privileges like LOAD FROM S3 or dynamic privileges" + MaxValueOrExpressionList "maxvalue or expression list" + ExpressionListOpt "expression list opt" + FetchFirstOpt "Fetch First/Next Option" + FuncDatetimePrecListOpt "Function datetime precision list opt" + FuncDatetimePrecList "Function datetime precision list" + Field "field expression" + Fields "Fields clause" + FieldList "field expression list" + FlushOption "Flush option" + ForceOpt "Force opt" + InstanceOption "Instance option" + FulltextSearchModifierOpt "Fulltext modifier" + TableRefsClause "Table references clause" + FieldItem "Field item for load data clause" + FieldItemList "Field items for load data clause" + FuncDatetimePrec "Function datetime precision" + GetFormatSelector "{DATE|DATETIME|TIME|TIMESTAMP}" + GlobalScope "The scope of variable" + GroupByClause "GROUP BY clause" + HavingClause "HAVING clause" + IfExists "If Exists" + IfNotExists "If Not Exists" + IgnoreOptional "IGNORE or empty" + IndexHint "index hint" + IndexHintList "index hint list" + IndexHintListOpt "index hint list opt" + IndexHintScope "index hint scope" + IndexHintType "index hint type" + IndexInvisible "index visible/invisible" + IndexKeyTypeOpt "index key type" + IndexLockAndAlgorithmOpt "index lock and algorithm" + IndexNameAndTypeOpt "index name and index type" + IndexNameList "index name list" + IndexOption "Index Option" + IndexOptionList "Index Option List or empty" + IndexType "index type" + IndexName "index name" + IndexTypeName "index type name" + IndexTypeOpt "optional index type" + IndexPartSpecification "Index column name or expression" + IndexPartSpecificationList "List of index column name or expression" + IndexPartSpecificationListOpt "Optional list of index column name or expression" + InsertValues "Rest part of INSERT/REPLACE INTO statement" + InsertRowAliasOpt "optional row alias for INSERT VALUES/SET" + JoinTable "join table" + JoinType "join type" + LikeTableWithOrWithoutParen "LIKE table_name or ( LIKE table_name )" + LimitClause "LIMIT clause" + LimitOption "Limit option could be integer or parameter marker." + Lines "Lines clause" + LinesTerminated "Lines terminated by" + LoadDataSetSpecOpt "Optional load data specification" + LoadDataSetList "Load data specifications" + LoadDataSetItem "Single load data specification" + LocalOpt "Local opt" + LockClause "Alter table lock clause" + LogTypeOpt "Optional log type used in FLUSH statements" + LowPriorityOpt "LOAD DATA low priority option" + NumLiteral "Num/Int/Float/Decimal Literal" + NoWriteToBinLogAliasOpt "NO_WRITE_TO_BINLOG alias LOCAL or empty" + ObjectType "Grant statement object type" + OnDuplicateKeyUpdate "ON DUPLICATE KEY UPDATE value list" + DuplicateOpt "[IGNORE|REPLACE] in CREATE TABLE ... SELECT statement or LOAD DATA statement" + OfTablesOpt "OF table_name [, ...]" + OptFull "Full or empty" + OptTemporary "TEMPORARY or empty" + OptOrder "Optional ordering keyword: ASC/DESC. Default to ASC" + Order "Ordering keyword: ASC or DESC" + OrderBy "ORDER BY clause" + OrReplace "or replace" + ByItem "BY item" + OrderByOptional "Optional ORDER BY clause optional" + ByList "BY list" + AlterOrderItem "Alter Order item" + AlterOrderList "Alter Order list" + QuickOptional "QUICK or empty" + PartitionDefinition "Partition definition" + PartitionDefinitionList "Partition definition list" + PartitionDefinitionListOpt "Partition definition list option" + PartitionKeyAlgorithmOpt "ALGORITHM = n option for KEY partition" + PartitionMethod "Partition method" + PartitionOpt "Partition option" + PartitionNameList "Partition name list" + PartitionNameListOpt "table partition names list optional" + PartitionNumOpt "PARTITION NUM option" + PartDefValuesOpt "VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN {value_list}" + PartDefOptionList "PartDefOption list" + PartDefOption "COMMENT [=] xxx | TABLESPACE [=] tablespace_name | ENGINE [=] xxx" + PasswordOrLockOption "Single password or lock option for create user statement" + PasswordOrLockOptionList "Password or lock options for create user statement" + PasswordOrLockOptions "Optional password or lock options for create user statement" + CommentOrAttributeOption "Optional comment or attribute option for CREATE/ALTER USER statements" + ColumnPosition "Column position [First|After ColumnName]" + PrepareSQL "Prepare statement sql string" + Priority "Statement priority" + PriorityOpt "Statement priority option" + PrivElem "Privilege element" + PrivLevel "Privilege scope" + PrivType "Privilege type" + ReferDef "Reference definition" + OnDelete "ON DELETE clause" + OnUpdate "ON UPDATE clause" + OnDeleteUpdateOpt "optional ON DELETE and UPDATE clause" + OptGConcatSeparator "optional GROUP_CONCAT SEPARATOR" + ReferOpt "reference option" + ReorganizePartitionRuleOpt "optional reorganize partition partition list and definitions" + RequireList "require list for tls options" + RequireListElement "require list element for tls option" + ResourceGroupNameOption "resource group name for user" + Rolename "Rolename" + RolenameComposed "Rolename that composed with more than 1 symbol" + RolenameList "RolenameList" + RolenameWithoutIdent "Rolename except identifier" + RoleOrPrivElem "Element that may be a Rolename or PrivElem" + RoleOrPrivElemList "RoleOrPrivElem list" + RoleSpec "Rolename and auth option" + RoleSpecList "Rolename and auth option list" + RowFormat "Row format option" + RowValue "Row value" + RowStmt "Row constructor" + SelectLockOpt "SELECT lock options" + SelectStmtSQLCache "SELECT statement optional SQL_CAHCE/SQL_NO_CACHE" + SelectStmtFieldList "SELECT statement field list" + SelectStmtLimit "SELECT statement LIMIT clause" + SelectStmtLimitOpt "SELECT statement optional LIMIT clause" + SelectStmtOpt "Select statement option" + SelectStmtOpts "Select statement options" + SelectStmtOptsList "Select statement options list" + SelectStmtBasic "SELECT statement from constant value" + SelectStmtFromDualTable "SELECT statement from dual table" + SelectStmtFromTable "SELECT statement from table" + SelectStmtGroup "SELECT statement optional GROUP BY clause" + SelectStmtIntoOption "SELECT statement into clause" + SetRoleOpt "Set role options" + SetDefaultRoleOpt "Set default role options" + SetOpr "Set operator contain UNION, EXCEPT and INTERSECT" + SetOprClause "Union/Except/Intersect select clause" + SetOprClauseList "Union/Except/Intersect select clause list" + ShowTargetFilterable "Show target that can be filtered by WHERE or LIKE" + ShowTableAliasOpt "Show table alias option" + ShowLikeOrWhereOpt "Show like or where clause option" + ShowProfileArgsOpt "Show profile args option" + ShowProfileTypesOpt "Show profile types option" + ShowProfileType "Show profile type" + ShowProfileTypes "Show profile types" + Starting "Starting by" + StatementList "statement list" + StatsPersistentVal "stats_persistent value" + SubPartDefinition "SubPartition definition" + SubPartDefinitionList "SubPartition definition list" + SubPartDefinitionListOpt "SubPartition definition list optional" + SubPartitionMethod "SubPartition method" + SubPartitionOpt "SubPartition option" + SubPartitionNumOpt "SubPartition NUM option" + TableAliasRefList "table alias reference list" + TableAsName "table alias name" + TableAsNameOpt "table alias name optional" + TableElement "table definition element" + TableElementList "table definition element list" + TableElementListOpt "table definition element list optional" + TableFactor "table factor" + TableLock "Table name and lock type" + TableLockList "Table lock list" + TableName "Table name" + TableNameOptWild "Table name with optional wildcard" + TableNameList "Table name list" + TableNameListOpt "Table name list opt" + TableOption "create table option" + TableOptionList "create table option list" + TableRef "table reference" + TableRefs "table references" + TableToTable "rename table to table" + TableToTableList "rename table to table by list" + TextString "text string item" + TextStringList "text string list" + TimeUnit "Time unit for 'DATE_ADD', 'DATE_SUB', 'ADDDATE', 'SUBDATE', 'EXTRACT'" + TimestampUnit "Time unit for 'TIMESTAMPADD' and 'TIMESTAMPDIFF'" + LockType "Table locks type" + TransactionChar "Transaction characteristic" + TransactionChars "Transaction characteristic list" + TrimDirection "Trim string direction" + SetOprOpt "Union/Except/Intersect Option(empty/ALL/DISTINCT)" + Username "Username" + UsernameList "UsernameList" + UserSpec "Username and auth option" + UserSpecList "Username and auth option list" + AlterUserSpec "ALTER USER username with optional auth option and dual-password clause" + AlterUserSpecList "ALTER USER spec list" + AuthOptionWithPassword "Auth option carrying a cleartext password (BY form), for RETAIN CURRENT PASSWORD" + UserVariableList "User defined variable name list" + UserToUser "rename user to user" + UserToUserList "rename user to user by list" + UsingRoles "UsingRoles is role option for SHOW GRANT" + Values "values" + ValuesList "values list" + ValuesOpt "values optional" + ValuesStmtList "VALUES statement field list" + VariableAssignment "set variable value" + VariableAssignmentList "set variable value list" + ViewAlgorithm "view algorithm" + ViewCheckOption "view check option" + ViewDefiner "view definer" + ViewName "view name" + ViewFieldList "create view statement field list" + ViewSQLSecurity "view sql security" + WhereClause "WHERE clause" + WhereClauseOptional "Optional WHERE clause" + WhenClause "When clause" + WhenClauseList "When clause list" + WithClause "With Clause" + WithList "With list" + WithReadLockOpt "FLUSH TABLES WITH READ LOCK / FOR EXPORT opt" + StartTransactionOpt "START TRANSACTION characteristic" + StartTransactionOptList "START TRANSACTION characteristic list" + RepairTypeListOpt "REPAIR TABLE options" + XAXid "XA transaction identifier" + SRSAttribute "Spatial reference system attribute" + SRSAttributeListOpt "Spatial reference system attribute list" + TablespaceOption "Tablespace or logfile group option" + TablespaceOptionList "Tablespace or logfile group option list" + TablespaceOptionListOpt "Optional tablespace or logfile group option list" + TablespaceSizeValue "Tablespace size value" + HistogramUpdateOpt "UPDATE HISTOGRAM MANUAL/AUTO UPDATE opt" + NoRollbackOnErrorOpt "NO ROLLBACK ON ERROR opt" + DatabaseOptionReadOnlyValue "READ ONLY option value" + WithGrantOptionOpt "With Grant Option opt" + WithValidation "with validation" + WithValidationOpt "optional with validation" + ElseOpt "Optional else clause" + Type "Types" + OptExistingWindowName "Optional existing WINDOW name" + OptFromFirstLast "Optional FROM FIRST/LAST" + OptLLDefault "Optional LEAD/LAG default" + OptLeadLagInfo "Optional LEAD/LAG info" + OptNullTreatment "Optional NULL treatment" + OptPartitionClause "Optional PARTITION clause" + OptWild "Optional Wildcard" + OptWindowOrderByClause "Optional ORDER BY clause in WINDOW" + OptWindowFrameClause "Optional FRAME clause in WINDOW" + OptWindowingClause "Optional OVER clause" + WindowingClause "OVER clause" + WindowClauseOptional "Optional WINDOW clause" + WindowDefinitionList "WINDOW definition list" + WindowDefinition "WINDOW definition" + WindowFrameUnits "WINDOW frame units" + WindowFrameBetween "WINDOW frame between" + WindowFrameBound "WINDOW frame bound" + WindowFrameExtent "WINDOW frame extent" + WindowFrameStart "WINDOW frame start" + WindowName "WINDOW name" + WindowNameOrSpec "WINDOW name or spec" + WindowSpec "WINDOW spec" + WindowSpecDetails "WINDOW spec details" + WithRollupClause "With rollup clause" + BetweenOrNotOp "Between predicate" + IsOrNotOp "Is predicate" + InOrNotOp "In predicate" + LikeOrNotOp "Like predicate" + RegexpOrNotOp "Regexp predicate" + NumericType "Numeric types" + IntegerType "Integer Types types" + BooleanType "Boolean Types types" + FixedPointType "Exact value types" + FloatingPointType "Approximate value types" + BitValueType "bit value types" + StringType "String types" + BlobType "Blob types" + TextType "Text types" + DateAndTimeType "Date and Time types" + OptFieldLen "Field length or empty" + FieldLen "Field length" + FieldOpts "Field type definition option list" + FieldOpt "Field type definition option" + FloatOpt "Floating-point type option" + Precision "Floating-point precision option" + OptBinary "Optional BINARY" + OptBinMod "Optional BINARY mode" + OptCharsetWithOptBinary "Optional BINARY or ASCII or UNICODE or BYTE" + IgnoreLines "Ignore num(int) lines" + Int64Num "a number that can be safely converted to int64" + NUM "A number" + LengthNum "Field length num(uint64)" + SignedNum "Signed num(int64)" + TableOptimizerHints "Table level optimizer hints" + TableOptimizerHintsOpt "Table level optimizer hints option" + EnforcedOrNot "{ENFORCED|NOT ENFORCED}" + EnforcedOrNotOpt "Optional {ENFORCED|NOT ENFORCED}" + EnforcedOrNotOrNotNullOpt "{[ENFORCED|NOT ENFORCED|NOT NULL]}" + Match "[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]" + MatchOpt "optional MATCH clause" + +%type + AsOpt "AS or EmptyString" + KeyOrIndex "{KEY|INDEX}" + ColumnKeywordOpt "Column keyword or empty" + PrimaryOpt "Optional primary keyword" + WorkOpt "Optional WORK keyword" + BeginOrStartSym "BEGIN or START" + TablespaceDataFileOpt "Tablespace ADD DATAFILE opt" + TablespaceLogfileGroupOpt "Tablespace USE LOGFILE GROUP opt" + TLSChannelOpt "ALTER INSTANCE RELOAD TLS FOR CHANNEL opt" + FlushRelayChannelOpt "FLUSH RELAY LOGS FOR CHANNEL opt" + NowSym "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP" + NowSymFunc "CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP/NOW" + CurdateSym "CURDATE or CURRENT_DATE" + DefaultKwdOpt "optional DEFAULT keyword" + DatabaseSym "DATABASE or SCHEMA" + ExplainSym "EXPLAIN or DESCRIBE or DESC" + RegexpSym "REGEXP or RLIKE" + IntoOpt "INTO or EmptyString" + ValueSym "Value or Values" + NotSym "Not token" + Char "{CHAR|CHARACTER}" + NChar "{NCHAR|NATIONAL CHARACTER|NATIONAL CHAR}" + Varchar "{VARCHAR|VARCHARACTER|CHARACTER VARYING|CHAR VARYING}" + NVarchar "{NATIONAL VARCHAR|NATIONAL VARCHARACTER|NVARCHAR|NCHAR VARCHAR|NATIONAL CHARACTER VARYING|NATIONAL CHAR VARYING|NCHAR VARYING}" + Year "{YEAR|SQL_TSI_YEAR}" + DeallocateSym "Deallocate or drop" + OuterOpt "optional OUTER clause" + CrossOpt "Cross join option" + TablesTerminalSym "{TABLE|TABLES}" + IsolationLevel "Isolation level" + ShowIndexKwd "Show index/indexs/key keyword" + DistinctKwd "DISTINCT/DISTINCTROW keyword" + FromOrIn "From or In" + OptTable "Optional table keyword" + OptInteger "Optional Integer keyword" + CharsetKw "charset or charater set" + logAnd "logical and operator" + logOr "logical or operator" + LinearOpt "linear or empty" + FieldsOrColumns "Fields or columns" + StorageMedia "{DISK|MEMORY|DEFAULT}" + EncryptionOpt "Encryption option 'Y' or 'N'" + FirstOrNext "FIRST or NEXT" + RowOrRows "ROW or ROWS" + Replica "{REPLICA | SLAVE}" + +%type + Identifier "identifier or unreserved keyword" + NotKeywordToken "Tokens not mysql keyword but treated specially" + UnReservedKeyword "MySQL unreserved keywords" + FunctionNameConflict "Built-in function call names which are conflict with keywords" + FunctionNameConflictNonNow "FunctionNameConflict except NOW, which DefaultValueExpr handles separately" + FunctionNameOptionalBraces "Function with optional braces, all of them are reserved keywords." + FunctionNameDatetimePrecision "Function with optional datetime precision, all of them are reserved keywords." + FunctionNameDateArith "Date arith function call names (date_add or date_sub)" + FunctionNameDateArithMultiForms "Date arith function call names (adddate or subdate)" + VariableName "A simple Identifier like xx or the xx.xx form" + AuthString "Password string value" + AuthPlugin "Authentication plugin name" + CharsetName "Character set name" + CollationName "Collation name" + ColumnFormat "Column format" + DBName "Database Name" + ResourceGroupName "Resource Group Name" + ExplainFormatType "explain format type" + FieldAsName "Field alias name" + FieldAsNameOpt "Field alias name opt" + FieldTerminator "Field terminator" + HashString "Hashed string" + OptCharset "Optional Character setting" + OptCollate "Optional Collate setting" + PasswordOpt "Password option" + RoleNameString "role name string" + ShowDatabaseNameOpt "Show tables/columns statement database name option" + StringName "string literal or identifier" + Symbol "Constraint Symbol" + +%precedence empty +%precedence as +%precedence lowerThanSelectOpt +%precedence sqlBufferResult +%precedence sqlBigResult +%precedence sqlSmallResult +%precedence sqlCache sqlNoCache +%precedence next +%precedence lowerThanValueKeyword +%precedence value +%precedence lowerThanWith +%precedence with +%precedence lowerThanStringLitToken +%precedence stringLit +%precedence lowerThanSetKeyword +%precedence set +%precedence selectKwd +%precedence lowerThanSelectStmt +%precedence lowerThanInsertValues +%precedence insertValues +%precedence lowerThanCreateTableSelect +%precedence createTableSelect +%precedence lowerThanCharsetKwd +%precedence charsetKwd +%precedence lowerThanKey +%precedence key +%precedence lowerThanLocal +%precedence local +%precedence lowerThanRemove +%precedence remove +%precedence lowerThenOrder +%precedence order +%precedence lowerThanFunction +%precedence function +%precedence constraint + +/* A dummy token to force the priority of TableRef production in a join. */ +%left tableRefPriority +%precedence lowerThanParenthese +%right '(' +%left ')' +%precedence higherThanParenthese +%left join straightJoin inner cross left right full natural +%precedence lowerThanOn +%precedence on using +%right assignmentEq +%left pipes or pipesAsOr +%left xor +%left andand and +%left between +%precedence lowerThanEq +%left eq ge le neq neqSynonym '>' '<' is like in +%left '|' +%left '&' +%left rsh lsh +%left '-' '+' +%left '*' '/' '%' div mod +%left '^' +%left '~' neg +%precedence lowerThanNot +%right not not2 +%right collate +%left interval +%right encryption +%precedence quick +%precedence escape +%precedence lowerThanComma +%precedence ',' +%precedence higherThanComma + +%start Start + +%% + +Start: + StatementList + +/**************************************AlterTableStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/alter-table.html + *******************************************************************************************/ +AlterTableStmt: + "ALTER" IgnoreOptional "TABLE" TableName AlterTableSpecListOpt AlterTableSpecSingleOpt + { + specs := $5.([]*ast.AlterTableSpec) + if $6 != nil { + specs = append(specs, $6.(*ast.AlterTableSpec)) + } + $$ = &ast.AlterTableStmt{ + Table: $4.(*ast.TableName), + Specs: specs, + } + } +| "ALTER" IgnoreOptional "TABLE" TableName "ANALYZE" "PARTITION" PartitionNameList + { + // MySQL partition maintenance: ALTER TABLE t ANALYZE PARTITION p1 [, p2 ...]. + // Kept from the TiDB grammar (minus TiDB analyze options), which maps it + // to an AnalyzeTableStmt rather than an AlterTableSpec. + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, PartitionNames: $7.([]ast.CIStr)} + } + +AlterTableSpecSingleOpt: + PartitionOpt + { + if $1 != nil { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTablePartition, + Partition: $1.(*ast.PartitionOptions), + } + } else { + $$ = nil + } + } +| "REMOVE" "PARTITIONING" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRemovePartitioning, + } + } +| "REORGANIZE" "PARTITION" NoWriteToBinLogAliasOpt ReorganizePartitionRuleOpt + { + ret := $4.(*ast.AlterTableSpec) + ret.NoWriteToBinlog = $3.(bool) + $$ = ret + } + +AlterTableSpec: + TableOptionList %prec higherThanComma + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: $1.([]*ast.TableOption), + } + } +| "CONVERT" "TO" CharsetKw CharsetName OptCollate + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, StrValue: $4, + UintValue: ast.TableOptionCharsetWithConvertTo}}, + } + if $5 != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $5}) + } + $$ = op + } +| "CONVERT" "TO" CharsetKw "DEFAULT" OptCollate + { + op := &ast.AlterTableSpec{ + Tp: ast.AlterTableOption, + Options: []*ast.TableOption{{Tp: ast.TableOptionCharset, Default: true, + UintValue: ast.TableOptionCharsetWithConvertTo}}, + } + if $5 != "" { + op.Options = append(op.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $5}) + } + $$ = op + } +| "ADD" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "ADD" ColumnKeywordOpt '(' TableElementList ')' + { + tes := $4.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddColumns, + NewColumns: columnDefs, + NewConstraints: constraints, + } + } +| "ADD" Constraint + { + constraint := $2.(*ast.Constraint) + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAddConstraint, + Constraint: constraint, + } + } +| "ADD" "PARTITION" NoWriteToBinLogAliasOpt PartitionDefinitionListOpt + { + var defs []*ast.PartitionDefinition + if $4 != nil { + defs = $4.([]*ast.PartitionDefinition) + } + noWriteToBinlog := $3.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + PartDefinitions: defs, + } + } +| "ADD" "PARTITION" NoWriteToBinLogAliasOpt "PARTITIONS" NUM + { + noWriteToBinlog := $3.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + NoWriteToBinlog: noWriteToBinlog, + Tp: ast.AlterTableAddPartitions, + Num: getUint64FromNUM($5), + } + } +| "CHECK" "PARTITION" AllOrPartitionNameList + { + yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableCheckPartitions, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]ast.CIStr) + } + $$ = ret + } +| "COALESCE" "PARTITION" NoWriteToBinLogAliasOpt NUM + { + noWriteToBinlog := $3.(bool) + if noWriteToBinlog { + yylex.AppendError(yylex.Errorf("The NO_WRITE_TO_BINLOG option is parsed but ignored for now.")) + parser.lastErrorAsWarn() + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableCoalescePartitions, + NoWriteToBinlog: noWriteToBinlog, + Num: getUint64FromNUM($4), + } + } +| "DROP" ColumnKeywordOpt ColumnName RestrictOrCascadeOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropColumn, + OldColumnName: $3.(*ast.ColumnName), + } + } +| "DROP" "PRIMARY" "KEY" + { + $$ = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} + } +| "DROP" "PARTITION" PartitionNameList %prec lowerThanComma + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropPartition, + PartitionNames: $3.([]ast.CIStr), + } + } +| "EXCHANGE" "PARTITION" Identifier "WITH" "TABLE" TableName WithValidationOpt + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableExchangePartition, + PartitionNames: []ast.CIStr{ast.NewCIStr($3)}, + NewTable: $6.(*ast.TableName), + WithValidation: $7.(bool), + } + } +| "TRUNCATE" "PARTITION" AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableTruncatePartition, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]ast.CIStr) + } + $$ = ret + } +| "OPTIMIZE" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: $3.(bool), + Tp: ast.AlterTableOptimizePartition, + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]ast.CIStr) + } + $$ = ret + } +| "REPAIR" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + NoWriteToBinlog: $3.(bool), + Tp: ast.AlterTableRepairPartition, + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]ast.CIStr) + } + $$ = ret + } +| "IMPORT" "PARTITION" AllOrPartitionNameList "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportPartitionTablespace, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]ast.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "DISCARD" "PARTITION" AllOrPartitionNameList "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardPartitionTablespace, + } + if $3 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $3.([]ast.CIStr) + } + $$ = ret + yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "IMPORT" "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableImportTablespace, + } + $$ = ret + yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "DISCARD" "TABLESPACE" + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableDiscardTablespace, + } + $$ = ret + yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "REBUILD" "PARTITION" NoWriteToBinLogAliasOpt AllOrPartitionNameList + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableRebuildPartition, + NoWriteToBinlog: $3.(bool), + } + if $4 == nil { + ret.OnAllPartitions = true + } else { + ret.PartitionNames = $4.([]ast.CIStr) + } + $$ = ret + } +| "DROP" KeyOrIndex Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropIndex, + Name: $3, + } + } +| "DROP" "FOREIGN" "KEY" Symbol + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropForeignKey, + Name: $4, + } + } +| "ORDER" "BY" AlterOrderList %prec lowerThenOrder + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableOrderByColumns, + OrderByList: $3.([]*ast.AlterOrderItem), + } + } +| "DISABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDisableKeys, + } + } +| "ENABLE" "KEYS" + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableEnableKeys, + } + } +| "MODIFY" ColumnKeywordOpt ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableModifyColumn, + NewColumns: []*ast.ColumnDef{$3.(*ast.ColumnDef)}, + Position: $4.(*ast.ColumnPosition), + } + } +| "CHANGE" ColumnKeywordOpt ColumnName ColumnDef ColumnPosition + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableChangeColumn, + OldColumnName: $3.(*ast.ColumnName), + NewColumns: []*ast.ColumnDef{$4.(*ast.ColumnDef)}, + Position: $5.(*ast.ColumnPosition), + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" SignedLiteral + { + option := &ast.ColumnOption{Expr: $6} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "SET" "DEFAULT" '(' Expression ')' + { + // As in DefaultValueExpr, keep the parentheses: SET DEFAULT ('{}') + // is an expression default and must not restore as SET DEFAULT '{}'. + option := &ast.ColumnOption{Expr: &ast.ParenthesesExpr{Expr: $7}} + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + Options: []*ast.ColumnOption{option}, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "ALTER" ColumnKeywordOpt ColumnName "DROP" "DEFAULT" + { + colDef := &ast.ColumnDef{ + Name: $3.(*ast.ColumnName), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterColumn, + NewColumns: []*ast.ColumnDef{colDef}, + } + } +| "RENAME" "COLUMN" Identifier "TO" Identifier + { + oldColName := &ast.ColumnName{Name: ast.NewCIStr($3)} + newColName := &ast.ColumnName{Name: ast.NewCIStr($5)} + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameColumn, + OldColumnName: oldColName, + NewColumnName: newColName, + } + } +| "RENAME" "TO" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" EqOpt TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" "AS" TableName + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameTable, + NewTable: $3.(*ast.TableName), + } + } +| "RENAME" KeyOrIndex Identifier "TO" Identifier + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableRenameIndex, + FromKey: ast.NewCIStr($3), + ToKey: ast.NewCIStr($5), + } + } +| LockClause + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableLock, + LockType: $1.(ast.LockType), + } + } +| AlgorithmClause + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlgorithm, + Algorithm: $1.(ast.AlgorithmType), + } + } +| "FORCE" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableForce, + } + } +| "WITH" "VALIDATION" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithValidation, + } + } +| "WITHOUT" "VALIDATION" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableWithoutValidation, + } + } +// Added in MySQL 8.0.13, see: https://dev.mysql.com/doc/refman/8.0/en/keywords.html for details +| "SECONDARY_LOAD" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryLoad, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } +// Added in MySQL 8.0.13, see: https://dev.mysql.com/doc/refman/8.0/en/keywords.html for details +| "SECONDARY_UNLOAD" + { + // Parse it and ignore it. Just for compatibility. + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableSecondaryUnload, + } + yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) + parser.lastErrorAsWarn() + } +| "ALTER" CheckConstraintKeyword Identifier EnforcedOrNot + { + c := &ast.Constraint{ + Name: $3, + Enforced: $4.(bool), + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableAlterCheck, + Constraint: c, + } + } +| "DROP" CheckConstraintKeyword Identifier + { + // Parse it and ignore it. Just for compatibility. + c := &ast.Constraint{ + Name: $3, + } + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableDropCheck, + Constraint: c, + } + } +| "ALTER" "INDEX" Identifier IndexInvisible + { + $$ = &ast.AlterTableSpec{ + Tp: ast.AlterTableIndexInvisible, + IndexName: ast.NewCIStr($3), + Visibility: $4.(ast.IndexVisibility), + } + } + +ReorganizePartitionRuleOpt: + /* empty */ %prec lowerThanRemove + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + OnAllPartitions: true, + } + $$ = ret + } +| PartitionNameList "INTO" '(' PartitionDefinitionList ')' + { + ret := &ast.AlterTableSpec{ + Tp: ast.AlterTableReorganizePartition, + PartitionNames: $1.([]ast.CIStr), + PartDefinitions: $4.([]*ast.PartitionDefinition), + } + $$ = ret + } + +AllOrPartitionNameList: + "ALL" + { + $$ = nil + } +| PartitionNameList %prec lowerThanComma + +WithValidationOpt: + { + $$ = true + } +| WithValidation + +WithValidation: + "WITH" "VALIDATION" + { + $$ = true + } +| "WITHOUT" "VALIDATION" + { + $$ = false + } + +AlgorithmClause: + "ALGORITHM" EqOpt "DEFAULT" + { + $$ = ast.AlgorithmTypeDefault + } +| "ALGORITHM" EqOpt "COPY" + { + $$ = ast.AlgorithmTypeCopy + } +| "ALGORITHM" EqOpt "INPLACE" + { + $$ = ast.AlgorithmTypeInplace + } +| "ALGORITHM" EqOpt "INSTANT" + { + $$ = ast.AlgorithmTypeInstant + } +| "ALGORITHM" EqOpt identifier + { + yylex.AppendError(ErrUnknownAlterAlgorithm.GenByArgs($1)) + return 1 + } + +LockClause: + "LOCK" EqOpt "DEFAULT" + { + $$ = ast.LockTypeDefault + } +| "LOCK" EqOpt Identifier + { + id := strings.ToUpper($3) + + if id == "NONE" { + $$ = ast.LockTypeNone + } else if id == "SHARED" { + $$ = ast.LockTypeShared + } else if id == "EXCLUSIVE" { + $$ = ast.LockTypeExclusive + } else { + yylex.AppendError(ErrUnknownAlterLock.GenByArgs($3)) + return 1 + } + } + +KeyOrIndex: + "KEY" +| "INDEX" + +KeyOrIndexOpt: + {} +| KeyOrIndex + +ColumnKeywordOpt: + /* empty */ %prec empty + {} +| "COLUMN" + +ColumnPosition: + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + } +| "FIRST" + { + $$ = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} + } +| "AFTER" ColumnName + { + $$ = &ast.ColumnPosition{ + Tp: ast.ColumnPositionAfter, + RelativeColumn: $2.(*ast.ColumnName), + } + } + +AlterTableSpecListOpt: + /* empty */ + { + $$ = make([]*ast.AlterTableSpec, 0, 1) + } +| AlterTableSpecList + +AlterTableSpecList: + AlterTableSpec + { + $$ = []*ast.AlterTableSpec{$1.(*ast.AlterTableSpec)} + } +| AlterTableSpecList ',' AlterTableSpec + { + $$ = append($1.([]*ast.AlterTableSpec), $3.(*ast.AlterTableSpec)) + } + +PartitionNameList: + Identifier + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| PartitionNameList ',' Identifier + { + $$ = append($1.([]ast.CIStr), ast.NewCIStr($3)) + } + +ConstraintKeywordOpt: + /* empty */ %prec empty + { + $$ = nil + } +| "CONSTRAINT" + { + $$ = nil + } +| "CONSTRAINT" Symbol + { + $$ = $2 + } + +Symbol: + Identifier + +/**************************************RenameTableStmt*************************************** + * See http://dev.mysql.com/doc/refman/5.7/en/rename-table.html + * + * RENAME TABLE + * tbl_name TO new_tbl_name + * [, tbl_name2 TO new_tbl_name2] ... + *******************************************************************************************/ +RenameTableStmt: + "RENAME" TableOrTables TableToTableList + { + $$ = &ast.RenameTableStmt{ + TableToTables: $3.([]*ast.TableToTable), + } + } + +TableToTableList: + TableToTable + { + $$ = []*ast.TableToTable{$1.(*ast.TableToTable)} + } +| TableToTableList ',' TableToTable + { + $$ = append($1.([]*ast.TableToTable), $3.(*ast.TableToTable)) + } + +TableToTable: + TableName "TO" TableName + { + $$ = &ast.TableToTable{ + OldTable: $1.(*ast.TableName), + NewTable: $3.(*ast.TableName), + } + } + +/**************************************RenameUserStmt*************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/rename-user.html + * + * RENAME USER + * old_user TO new_user + * [, old_user2 TO new_user2] ... + *******************************************************************************************/ +RenameUserStmt: + "RENAME" "USER" UserToUserList + { + $$ = &ast.RenameUserStmt{ + UserToUsers: $3.([]*ast.UserToUser), + } + } + +UserToUserList: + UserToUser + { + $$ = []*ast.UserToUser{$1.(*ast.UserToUser)} + } +| UserToUserList ',' UserToUser + { + $$ = append($1.([]*ast.UserToUser), $3.(*ast.UserToUser)) + } + +UserToUser: + Username "TO" Username + { + $$ = &ast.UserToUser{ + OldUser: $1.(*auth.UserIdentity), + NewUser: $3.(*auth.UserIdentity), + } + } + +/******************************************************************* + * + * Recover Table Statement + * + * Example: + * RECOVER TABLE t1; + * RECOVER TABLE BY JOB 100; + * + *******************************************************************/ +AnalyzeTableStmt: + "ANALYZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList + { + $$ = &ast.AnalyzeTableStmt{TableNames: $4.([]*ast.TableName), NoWriteToBinLog: $2.(bool)} + } +| "ANALYZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList "UPDATE" "HISTOGRAM" "ON" IdentList AnalyzeOptionListOpt HistogramUpdateOpt + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: $4.([]*ast.TableName), + NoWriteToBinLog: $2.(bool), + ColumnNames: $8.([]ast.CIStr), + AnalyzeOpts: $9.([]ast.AnalyzeOpt), + HistogramUpdate: $10.(ast.HistogramUpdateType), + HistogramOperation: ast.HistogramOperationUpdate, + } + } +| "ANALYZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList "UPDATE" "HISTOGRAM" "ON" IdentList "USING" "DATA" stringLit + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: $4.([]*ast.TableName), + NoWriteToBinLog: $2.(bool), + ColumnNames: $8.([]ast.CIStr), + HistogramOperation: ast.HistogramOperationUpdate, + UsingData: true, + HistogramData: $11, + } + } +| "ANALYZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList "DROP" "HISTOGRAM" "ON" IdentList + { + $$ = &ast.AnalyzeTableStmt{ + TableNames: $4.([]*ast.TableName), + NoWriteToBinLog: $2.(bool), + ColumnNames: $8.([]ast.CIStr), + HistogramOperation: ast.HistogramOperationDrop, + } + } + +HistogramUpdateOpt: + { + $$ = ast.HistogramUpdateNop + } +| "MANUAL" "UPDATE" + { + $$ = ast.HistogramUpdateManual + } +| "AUTO" "UPDATE" + { + $$ = ast.HistogramUpdateAuto + } + +AnalyzeOptionListOpt: + { + $$ = []ast.AnalyzeOpt{} + } +| "WITH" AnalyzeOptionList + { + $$ = $2.([]ast.AnalyzeOpt) + } + +AnalyzeOptionList: + AnalyzeOption + { + $$ = []ast.AnalyzeOpt{$1.(ast.AnalyzeOpt)} + } +| AnalyzeOptionList ',' AnalyzeOption + { + $$ = append($1.([]ast.AnalyzeOpt), $3.(ast.AnalyzeOpt)) + } +| AnalyzeOptionList AnalyzeOption + { + $$ = append($1.([]ast.AnalyzeOpt), $2.(ast.AnalyzeOpt)) + } + +AnalyzeOption: + NUM "BUCKETS" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr($1, "", "")} + } + +Assignment: + ColumnName EqOrAssignmentEq ExprOrDefault + { + $$ = &ast.Assignment{Column: $1.(*ast.ColumnName), Expr: $3} + } + +AssignmentList: + Assignment + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } +| AssignmentList ',' Assignment + { + $$ = append($1.([]*ast.Assignment), $3.(*ast.Assignment)) + } + +BeginTransactionStmt: + "BEGIN" WorkOpt + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" + { + $$ = &ast.BeginStmt{} + } +| "START" "TRANSACTION" StartTransactionOptList + { + $$ = &ast.BeginStmt{ + ReadOnly: $3.(bool), + } + } + +// StartTransactionOptList is a comma-separated list of transaction +// characteristics; its value is whether READ ONLY was among them. +StartTransactionOptList: + StartTransactionOpt +| StartTransactionOptList ',' StartTransactionOpt + { + $$ = $1.(bool) || $3.(bool) + } + +StartTransactionOpt: + "READ" "ONLY" + { + $$ = true + } +| "READ" "WRITE" + { + $$ = false + } +| "WITH" "CONSISTENT" "SNAPSHOT" + { + $$ = false + } + +WorkOpt: + {} +| "WORK" + +BinlogStmt: + "BINLOG" stringLit + { + $$ = &ast.BinlogStmt{Str: $2} + } + +ColumnDef: + ColumnName Type ColumnOptionListOpt + { + colDef := &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: $2.(*types.FieldType), Options: $3.(ast.ColumnOptionList).Options} + if err := colDef.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + $$ = colDef + } +| ColumnName "SERIAL" ColumnOptionListOpt + { + // TODO: check flen 0 + tp := types.NewFieldType(mysql.TypeLonglong) + options := []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} + options = append(options, $3.(ast.ColumnOptionList).Options...) + tp.AddFlag(mysql.UnsignedFlag) + colDef := &ast.ColumnDef{Name: $1.(*ast.ColumnName), Tp: tp, Options: options} + if err := colDef.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + $$ = colDef + } + +ColumnName: + Identifier + { + $$ = &ast.ColumnName{Name: ast.NewCIStr($1)} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnName{Table: ast.NewCIStr($1), Name: ast.NewCIStr($3)} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnName{Schema: ast.NewCIStr($1), Table: ast.NewCIStr($3), Name: ast.NewCIStr($5)} + } + +ColumnNameList: + ColumnName + { + $$ = []*ast.ColumnName{$1.(*ast.ColumnName)} + } +| ColumnNameList ',' ColumnName + { + $$ = append($1.([]*ast.ColumnName), $3.(*ast.ColumnName)) + } + +ColumnNameListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnName{} + } +| ColumnNameList + +IdentListWithParenOpt: + /* EMPTY */ + { + $$ = []ast.CIStr{} + } +| '(' IdentList ')' + { + $$ = $2 + } + +IdentList: + Identifier + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| IdentList ',' Identifier + { + $$ = append($1.([]ast.CIStr), ast.NewCIStr($3)) + } + +ColumnNameOrUserVarListOpt: + /* EMPTY */ + { + $$ = []*ast.ColumnNameOrUserVar{} + } +| ColumnNameOrUserVariableList + +ColumnNameOrUserVariableList: + ColumnNameOrUserVariable + { + $$ = []*ast.ColumnNameOrUserVar{$1.(*ast.ColumnNameOrUserVar)} + } +| ColumnNameOrUserVariableList ',' ColumnNameOrUserVariable + { + $$ = append($1.([]*ast.ColumnNameOrUserVar), $3.(*ast.ColumnNameOrUserVar)) + } + +ColumnNameOrUserVariable: + ColumnName + { + $$ = &ast.ColumnNameOrUserVar{ColumnName: $1.(*ast.ColumnName)} + } +| UserVariable + { + $$ = &ast.ColumnNameOrUserVar{UserVar: $1.(*ast.VariableExpr)} + } + +ColumnNameOrUserVarListOptWithBrackets: + /* EMPTY */ + { + $$ = []*ast.ColumnNameOrUserVar{} + } +| '(' ColumnNameOrUserVarListOpt ')' + { + $$ = $2.([]*ast.ColumnNameOrUserVar) + } + +CommitStmt: + "COMMIT" WorkOpt + { + $$ = &ast.CommitStmt{} + } +| "COMMIT" WorkOpt CompletionTypeWithinTransaction + { + $$ = &ast.CommitStmt{CompletionType: $3.(ast.CompletionType)} + } + +PrimaryOpt: + {} +| "PRIMARY" + +NotSym: + not +| not2 + { + $$ = "NOT" + } + +EnforcedOrNot: + "ENFORCED" + { + $$ = true + } +| NotSym "ENFORCED" + { + $$ = false + } + +EnforcedOrNotOpt: + %prec lowerThanNot + { + $$ = true + } +| EnforcedOrNot + +EnforcedOrNotOrNotNullOpt: + // This branch is needed to workaround the need of a lookahead of 2 for the grammar: + // + // { [NOT] NULL | CHECK(...) [NOT] ENFORCED } ... + NotSym "NULL" + { + $$ = 0 + } +| EnforcedOrNotOpt + { + if $1.(bool) { + $$ = 1 + } else { + $$ = 2 + } + } + +ColumnOption: + NotSym "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} + } +| "NULL" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionNull} + } +| "AUTO_INCREMENT" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} + } +| PrimaryOpt "KEY" + { + // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY + // can also be specified as just KEY when given in a column definition. + // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} + } +| "UNIQUE" %prec lowerThanKey + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "UNIQUE" "KEY" + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} + } +| "DEFAULT" DefaultValueExpr + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: $2} + } +| "SERIAL" "DEFAULT" "VALUE" + { + $$ = ast.ColumnOptionList{ + Options: []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}}, + } + } +| "ON" "UPDATE" NowSymOptionFraction + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: $3} + } +| "COMMENT" stringLit + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr($2, "", "")} + } +| ConstraintKeywordOpt "CHECK" '(' Expression ')' EnforcedOrNotOrNotNullOpt + { + // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html + // The CHECK clause is parsed but ignored by all storage engines. + // See the branch named `EnforcedOrNotOrNotNullOpt`. + + optionCheck := &ast.ColumnOption{ + Tp: ast.ColumnOptionCheck, + Expr: $4, + Enforced: true, + } + // Keep the column type check constraint name. + if $1 != nil { + optionCheck.ConstraintName = $1.(string) + } + switch $6.(int) { + case 0: + $$ = ast.ColumnOptionList{ + Options: []*ast.ColumnOption{optionCheck, {Tp: ast.ColumnOptionNotNull}}, + } + case 1: + optionCheck.Enforced = true + $$ = optionCheck + case 2: + optionCheck.Enforced = false + $$ = optionCheck + default: + } + } +| GeneratedAlways "AS" '(' Expression ')' VirtualOrStored + { + startOffset := parser.startOffset(&yyS[yypt-2]) + endOffset := parser.endOffset(&yyS[yypt-1]) + expr := $4 + parser.setNodeText(expr, parser.src[startOffset:endOffset]) + + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionGenerated, + Expr: expr, + Stored: $6.(bool), + } + } +| ReferDef + { + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionReference, + Refer: $1.(*ast.ReferenceDef), + } + } +| "COLLATE" CollationName + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: $2} + } +| "COLUMN_FORMAT" ColumnFormat + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: $2} + } +| "STORAGE" StorageMedia + { + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionStorage, StrValue: $2} + yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "SECONDARY_ENGINE_ATTRIBUTE" EqOpt stringLit + { + $$ = &ast.ColumnOption{ + Tp: ast.ColumnOptionSecondaryEngineAttribute, + StrValue: $3, + } + } +| "SRID" NUM + { + srid := getUint64FromNUM($2) + // MySQL limits the SRID range to MaxUint32 + if srid > 4294967295 { + yylex.AppendError(ErrDataOutOfRange.GenByArgs("SRID", "SRID")) + return 1 + } + $$ = &ast.ColumnOption{Tp: ast.ColumnOptionSrid, Srid: uint32(srid)} + } + +StorageMedia: + "DEFAULT" +| "DISK" +| "MEMORY" + +ColumnFormat: + "DEFAULT" + { + $$ = "DEFAULT" + } +| "FIXED" + { + $$ = "FIXED" + } +| "DYNAMIC" + { + $$ = "DYNAMIC" + } + +GeneratedAlways: + +| "GENERATED" "ALWAYS" + +VirtualOrStored: + { + $$ = false + } +| "VIRTUAL" + { + $$ = false + } +| "STORED" + { + $$ = true + } + +ColumnOptionList: + ColumnOption + { + if columnOption, ok := $1.(*ast.ColumnOption); ok { + hasCollateOption := false + if columnOption.Tp == ast.ColumnOptionCollate { + hasCollateOption = true + } + $$ = ast.ColumnOptionList{ + HasCollateOption: hasCollateOption, + Options: []*ast.ColumnOption{columnOption}, + } + } else { + $$ = $1 + } + } +| ColumnOptionList ColumnOption + { + columnOptionList := $1.(ast.ColumnOptionList) + if columnOption, ok := $2.(*ast.ColumnOption); ok { + if columnOption.Tp == ast.ColumnOptionCollate && columnOptionList.HasCollateOption { + yylex.AppendError(ErrParse.GenByArgs("Multiple COLLATE clauses", yylex.Errorf("").Error())) + return 1 + } + columnOptionList.Options = append(columnOptionList.Options, columnOption) + } else { + if columnOptionList.HasCollateOption && $2.(ast.ColumnOptionList).HasCollateOption { + yylex.AppendError(ErrParse.GenByArgs("Multiple COLLATE clauses", yylex.Errorf("").Error())) + return 1 + } + columnOptionList.Options = append(columnOptionList.Options, $2.(ast.ColumnOptionList).Options...) + } + $$ = columnOptionList + } + +ColumnOptionListOpt: + { + $$ = ast.ColumnOptionList{} + } +| ColumnOptionList + +ConstraintElem: + "PRIMARY" "KEY" IndexNameAndTypeOpt '(' IndexPartSpecificationList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintPrimaryKey, + Keys: $5.([]*ast.IndexPartSpecification), + Name: $3.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: $3.([]interface{})[0].(*ast.NullString).Empty, + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + if indexType := $3.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + $$ = c + } +| "FULLTEXT" KeyOrIndexOpt IndexName '(' IndexPartSpecificationList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintFulltext, + Keys: $5.([]*ast.IndexPartSpecification), + Name: $3.(*ast.NullString).String, + IsEmptyIndex: $3.(*ast.NullString).Empty, + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } else { + c.Option = &ast.IndexOption{} + } + $$ = c + } +| "SPATIAL" KeyOrIndexOpt IndexName '(' IndexPartSpecificationList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintSpatial, + Keys: $5.([]*ast.IndexPartSpecification), + Name: $3.(*ast.NullString).String, + IsEmptyIndex: $3.(*ast.NullString).Empty, + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } else { + c.Option = &ast.IndexOption{} + } + $$ = c + } +| KeyOrIndex IndexNameAndTypeOpt '(' IndexPartSpecificationList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintIndex, + Keys: $4.([]*ast.IndexPartSpecification), + Name: $2.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: $2.([]interface{})[0].(*ast.NullString).Empty, + } + if $6 != nil { + c.Option = $6.(*ast.IndexOption) + } + if indexType := $2.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + $$ = c + } +| "UNIQUE" KeyOrIndexOpt IndexNameAndTypeOpt '(' IndexPartSpecificationList ')' IndexOptionList + { + c := &ast.Constraint{ + Tp: ast.ConstraintUniq, + Keys: $5.([]*ast.IndexPartSpecification), + Name: $3.([]interface{})[0].(*ast.NullString).String, + IsEmptyIndex: $3.([]interface{})[0].(*ast.NullString).Empty, + } + if $7 != nil { + c.Option = $7.(*ast.IndexOption) + } + if indexType := $3.([]interface{})[1]; indexType != nil { + if c.Option == nil { + c.Option = &ast.IndexOption{} + } + c.Option.Tp = indexType.(ast.IndexType) + } + $$ = c + } +| "FOREIGN" "KEY" IndexName '(' IndexPartSpecificationList ')' ReferDef + { + $$ = &ast.Constraint{ + Tp: ast.ConstraintForeignKey, + Keys: $5.([]*ast.IndexPartSpecification), + Name: $3.(*ast.NullString).String, + Refer: $7.(*ast.ReferenceDef), + IsEmptyIndex: $3.(*ast.NullString).Empty, + } + } +| "CHECK" '(' Expression ')' EnforcedOrNotOpt + { + $$ = &ast.Constraint{ + Tp: ast.ConstraintCheck, + Expr: $3.(ast.ExprNode), + Enforced: $5.(bool), + } + } + +Match: + "MATCH" "FULL" + { + $$ = ast.MatchFull + } +| "MATCH" "PARTIAL" + { + $$ = ast.MatchPartial + } +| "MATCH" "SIMPLE" + { + $$ = ast.MatchSimple + } + +MatchOpt: + { + $$ = ast.MatchNone + } +| Match + { + $$ = $1 + yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +ReferDef: + "REFERENCES" TableName IndexPartSpecificationListOpt MatchOpt OnDeleteUpdateOpt + { + onDeleteUpdate := $5.([2]interface{}) + $$ = &ast.ReferenceDef{ + Table: $2.(*ast.TableName), + IndexPartSpecifications: $3.([]*ast.IndexPartSpecification), + OnDelete: onDeleteUpdate[0].(*ast.OnDeleteOpt), + OnUpdate: onDeleteUpdate[1].(*ast.OnUpdateOpt), + Match: $4.(ast.MatchType), + } + } + +OnDelete: + "ON" "DELETE" ReferOpt + { + $$ = &ast.OnDeleteOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnUpdate: + "ON" "UPDATE" ReferOpt + { + $$ = &ast.OnUpdateOpt{ReferOpt: $3.(ast.ReferOptionType)} + } + +OnDeleteUpdateOpt: + %prec lowerThanOn + { + $$ = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} + } +| OnDelete %prec lowerThanOn + { + $$ = [2]interface{}{$1, &ast.OnUpdateOpt{}} + } +| OnUpdate %prec lowerThanOn + { + $$ = [2]interface{}{&ast.OnDeleteOpt{}, $1} + } +| OnDelete OnUpdate + { + $$ = [2]interface{}{$1, $2} + } +| OnUpdate OnDelete + { + $$ = [2]interface{}{$2, $1} + } + +ReferOpt: + "RESTRICT" + { + $$ = ast.ReferOptionRestrict + } +| "CASCADE" + { + $$ = ast.ReferOptionCascade + } +| "SET" "NULL" + { + $$ = ast.ReferOptionSetNull + } +| "NO" "ACTION" + { + $$ = ast.ReferOptionNoAction + } +| "SET" "DEFAULT" + { + $$ = ast.ReferOptionSetDefault + yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } + +/* + * The DEFAULT clause specifies a default value for a column. + * It can be a function or an expression. This means, for example, + * that you can set the default for a date column to be the value of + * a function such as NOW() or CURRENT_DATE. MySQL 8.0 requires expression + * default values to be enclosed in parentheses; this parser also accepts + * them without. + * + * See https://dev.mysql.com/doc/refman/8.0/en/create-table.html + * https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html + */ +DefaultValueExpr: + NowSymOptionFractionParentheses +| SignedLiteral +| BuiltinFunction +| '(' Identifier ')' + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: ast.NewCIStr($2), + }} + } +| '(' SignedLiteral ')' + { + // MySQL 8.0.13+ distinguishes literal defaults (DEFAULT '{}') from + // expression defaults (DEFAULT ('{}')): BLOB/TEXT/JSON/GEOMETRY + // columns only accept the parenthesized form. Keep the parentheses + // in the AST so restoring the statement preserves the distinction. + $$ = &ast.ParenthesesExpr{Expr: $2} + } + +BuiltinFunction: + '(' BuiltinFunction ')' + { + $$ = $2.(*ast.FuncCallExpr) + } +| identifier '(' ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + } + } +| identifier '(' ExpressionList ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: $3.([]ast.ExprNode), + } + } +| FunctionNameConflictNonNow '(' ExpressionListOpt ')' + { + // Function names that lex as keyword tokens rather than plain + // identifiers (POINT, REPEAT, LEFT, ...). MySQL accepts them in + // expression defaults — DEFAULT (POINT(0,0)) is the manual's own + // example — and SHOW CREATE TABLE emits them, so without this a + // table using one is unparseable (block/spirit#1128). NOW is + // excluded: DEFAULT (NOW()) must keep resolving through + // NowSymOptionFractionParentheses to CURRENT_TIMESTAMP. + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: $3.([]ast.ExprNode), + } + } + +NowSymOptionFractionParentheses: + '(' NowSymOptionFractionParentheses ')' + { + $$ = $2.(*ast.FuncCallExpr) + } +| NowSymOptionFraction + +NowSymOptionFraction: + NowSym + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP")} + } +| NowSymFunc '(' NUM ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr($3, parser.charset, parser.collation)}} + } +| CurdateSym '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_DATE")} + } +| "CURRENT_DATE" + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr("CURRENT_DATE")} + } + +/* +* See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_localtime +* TODO: Process other three keywords +*/ +NowSymFunc: + "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" +| builtinNow + +NowSym: + "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" + +CurdateSym: + builtinCurDate +| "CURRENT_DATE" + +SignedLiteral: + Literal + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| '+' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr($2, parser.charset, parser.collation)} + } +| '-' NumLiteral + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr($2, parser.charset, parser.collation)} + } + +NumLiteral: + intLit +| floatLit +| decLit + +CreateIndexStmt: + "CREATE" IndexKeyTypeOpt "INDEX" Identifier IndexTypeOpt "ON" TableName '(' IndexPartSpecificationList ')' IndexOptionList IndexLockAndAlgorithmOpt + { + var indexOption *ast.IndexOption + if $11 != nil { + indexOption = $11.(*ast.IndexOption) + if indexOption.Tp == ast.IndexTypeInvalid { + if $5 != nil { + indexOption.Tp = $5.(ast.IndexType) + } + } + } else { + indexOption = &ast.IndexOption{} + if $5 != nil { + indexOption.Tp = $5.(ast.IndexType) + } + } + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if $12 != nil { + indexLockAndAlgorithm = $12.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + $$ = &ast.CreateIndexStmt{ + IndexName: $4, + Table: $7.(*ast.TableName), + IndexPartSpecifications: $9.([]*ast.IndexPartSpecification), + IndexOption: indexOption, + KeyType: $2.(ast.IndexKeyType), + LockAlg: indexLockAndAlgorithm, + } + } + +IndexPartSpecificationListOpt: + { + $$ = ([]*ast.IndexPartSpecification)(nil) + } +| '(' IndexPartSpecificationList ')' + { + $$ = $2 + } + +IndexPartSpecificationList: + IndexPartSpecification + { + $$ = []*ast.IndexPartSpecification{$1.(*ast.IndexPartSpecification)} + } +| IndexPartSpecificationList ',' IndexPartSpecification + { + $$ = append($1.([]*ast.IndexPartSpecification), $3.(*ast.IndexPartSpecification)) + } + +IndexPartSpecification: + ColumnName OptFieldLen OptOrder + { + $$ = &ast.IndexPartSpecification{Column: $1.(*ast.ColumnName), Length: $2.(int), Desc: $3.(bool)} + } +| '(' Expression ')' OptOrder + { + $$ = &ast.IndexPartSpecification{Expr: $2, Desc: $4.(bool)} + } + +IndexLockAndAlgorithmOpt: + { + $$ = nil + } +| LockClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $1.(ast.LockType), + AlgorithmTp: ast.AlgorithmTypeDefault, + } + } +| AlgorithmClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: ast.LockTypeDefault, + AlgorithmTp: $1.(ast.AlgorithmType), + } + } +| LockClause AlgorithmClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $1.(ast.LockType), + AlgorithmTp: $2.(ast.AlgorithmType), + } + } +| AlgorithmClause LockClause + { + $$ = &ast.IndexLockAndAlgorithm{ + LockTp: $2.(ast.LockType), + AlgorithmTp: $1.(ast.AlgorithmType), + } + } + +IndexKeyTypeOpt: + { + $$ = ast.IndexKeyTypeNone + } +| "UNIQUE" + { + $$ = ast.IndexKeyTypeUnique + } +| "SPATIAL" + { + $$ = ast.IndexKeyTypeSpatial + } +| "FULLTEXT" + { + $$ = ast.IndexKeyTypeFulltext + } + +AlterDatabaseStmt: + "ALTER" DatabaseSym DBName DatabaseOptionList + { + $$ = &ast.AlterDatabaseStmt{ + Name: ast.NewCIStr($3), + AlterDefaultDatabase: false, + Options: $4.([]*ast.DatabaseOption), + } + } +| "ALTER" DatabaseSym DatabaseOptionList + { + $$ = &ast.AlterDatabaseStmt{ + Name: ast.NewCIStr(""), + AlterDefaultDatabase: true, + Options: $3.([]*ast.DatabaseOption), + } + } + +/******************************************************************* + * + * Create Database Statement + * CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name + * [create_specification] ... + * + * create_specification: + * [DEFAULT] CHARACTER SET [=] charset_name + * | [DEFAULT] COLLATE [=] collation_name + * | [DEFAULT] ENCRYPTION [=] {'Y' | 'N'} + *******************************************************************/ +CreateDatabaseStmt: + "CREATE" DatabaseSym IfNotExists DBName DatabaseOptionListOpt + { + $$ = &ast.CreateDatabaseStmt{ + IfNotExists: $3.(bool), + Name: ast.NewCIStr($4), + Options: $5.([]*ast.DatabaseOption), + } + } + +DBName: + Identifier + +ResourceGroupName: + Identifier +| "DEFAULT" + +DatabaseOption: + DefaultKwdOpt CharsetKw EqOpt CharsetName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: $4} + } +| DefaultKwdOpt "COLLATE" EqOpt CollationName + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: $4} + } +| DefaultKwdOpt "ENCRYPTION" EqOpt EncryptionOpt + { + $$ = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: $4} + } +| "READ" "ONLY" EqOpt DatabaseOptionReadOnlyValue + { + opt := $4.(*ast.DatabaseOption) + opt.Tp = ast.DatabaseOptionReadOnly + $$ = opt + } + +DatabaseOptionReadOnlyValue: + "DEFAULT" + { + $$ = &ast.DatabaseOption{Value: "DEFAULT"} + } +| NUM + { + $$ = &ast.DatabaseOption{UintValue: getUint64FromNUM($1)} + } + +DatabaseOptionListOpt: + { + $$ = []*ast.DatabaseOption{} + } +| DatabaseOptionList + +DatabaseOptionList: + DatabaseOption + { + $$ = []*ast.DatabaseOption{$1.(*ast.DatabaseOption)} + } +| DatabaseOptionList DatabaseOption + { + $$ = append($1.([]*ast.DatabaseOption), $2.(*ast.DatabaseOption)) + } + +/******************************************************************* + * + * Create Table Statement + * + * Example: + * CREATE TABLE Persons + * ( + * P_Id int NOT NULL, + * LastName varchar(255) NOT NULL, + * FirstName varchar(255), + * Address varchar(255), + * City varchar(255), + * PRIMARY KEY (P_Id) + * ) + *******************************************************************/ +CreateTableStmt: + "CREATE" OptTemporary "TABLE" IfNotExists TableName TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt + { + stmt := $6.(*ast.CreateTableStmt) + stmt.Table = $5.(*ast.TableName) + stmt.IfNotExists = $4.(bool) + stmt.TemporaryKeyword = $2.(ast.TemporaryKeyword) + stmt.Options = $7.([]*ast.TableOption) + if $8 != nil { + stmt.Partition = $8.(*ast.PartitionOptions) + } + stmt.OnDuplicate = $9.(ast.OnDuplicateKeyHandlingType) + stmt.Select = $11.(*ast.CreateTableStmt).Select + $$ = stmt + } +| "CREATE" OptTemporary "TABLE" IfNotExists TableName LikeTableWithOrWithoutParen + { + tmp := &ast.CreateTableStmt{ + Table: $5.(*ast.TableName), + ReferTable: $6.(*ast.TableName), + IfNotExists: $4.(bool), + TemporaryKeyword: $2.(ast.TemporaryKeyword), + } + $$ = tmp + } + +DefaultKwdOpt: + %prec lowerThanCharsetKwd + {} +| "DEFAULT" + +PartitionOpt: + { + $$ = nil + } +| "PARTITION" "BY" PartitionMethod PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt + { + method := $3.(*ast.PartitionMethod) + method.Num = $4.(uint64) + sub, _ := $5.(*ast.PartitionMethod) + defs, _ := $6.([]*ast.PartitionDefinition) + opt := &ast.PartitionOptions{ + PartitionMethod: *method, + Sub: sub, + Definitions: defs, + } + if err := opt.Validate(); err != nil { + yylex.AppendError(err) + return 1 + } + $$ = opt + } + +SubPartitionMethod: + LinearOpt "KEY" PartitionKeyAlgorithmOpt '(' ColumnNameListOpt ')' + { + keyAlgorithm, _ := $3.(*ast.PartitionKeyAlgorithm) + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeKey, + Linear: len($1) != 0, + ColumnNames: $5.([]*ast.ColumnName), + KeyAlgorithm: keyAlgorithm, + } + } +| LinearOpt "HASH" '(' BitExpr ')' + { + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeHash, + Linear: len($1) != 0, + Expr: $4.(ast.ExprNode), + } + } + +PartitionKeyAlgorithmOpt: + /* empty */ + { + $$ = nil + } +| "ALGORITHM" eq NUM + { + tp := getUint64FromNUM($3) + if tp != 1 && tp != 2 { + yylex.AppendError(ErrSyntax) + return 1 + } + $$ = &ast.PartitionKeyAlgorithm{ + Type: tp, + } + } + +PartitionMethod: + SubPartitionMethod +| "RANGE" '(' BitExpr ')' + { + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeRange, + Expr: $3.(ast.ExprNode), + } + } +| "RANGE" FieldsOrColumns '(' ColumnNameList ')' + { + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeRange, + ColumnNames: $4.([]*ast.ColumnName), + } + } +| "LIST" '(' BitExpr ')' + { + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeList, + Expr: $3.(ast.ExprNode), + } + } +| "LIST" FieldsOrColumns '(' ColumnNameList ')' + { + $$ = &ast.PartitionMethod{ + Tp: ast.PartitionTypeList, + ColumnNames: $4.([]*ast.ColumnName), + } + } + +LinearOpt: + { + $$ = "" + } +| "LINEAR" + +SubPartitionOpt: + { + $$ = nil + } +| "SUBPARTITION" "BY" SubPartitionMethod SubPartitionNumOpt + { + method := $3.(*ast.PartitionMethod) + method.Num = $4.(uint64) + $$ = method + } + +SubPartitionNumOpt: + { + $$ = uint64(0) + } +| "SUBPARTITIONS" LengthNum + { + res := $2.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenByArgs("subpartitions")) + return 1 + } + $$ = res + } + +PartitionNumOpt: + { + $$ = uint64(0) + } +| "PARTITIONS" LengthNum + { + res := $2.(uint64) + if res == 0 { + yylex.AppendError(ast.ErrNoParts.GenByArgs("partitions")) + return 1 + } + $$ = res + } + +PartitionDefinitionListOpt: + /* empty */ %prec lowerThanCreateTableSelect + { + $$ = nil + } +| '(' PartitionDefinitionList ')' + { + $$ = $2.([]*ast.PartitionDefinition) + } + +PartitionDefinitionList: + PartitionDefinition + { + $$ = []*ast.PartitionDefinition{$1.(*ast.PartitionDefinition)} + } +| PartitionDefinitionList ',' PartitionDefinition + { + $$ = append($1.([]*ast.PartitionDefinition), $3.(*ast.PartitionDefinition)) + } + +PartitionDefinition: + "PARTITION" Identifier PartDefValuesOpt PartDefOptionList SubPartDefinitionListOpt + { + $$ = &ast.PartitionDefinition{ + Name: ast.NewCIStr($2), + Clause: $3.(ast.PartitionDefinitionClause), + Options: $4.([]*ast.TableOption), + Sub: $5.([]*ast.SubPartitionDefinition), + } + } + +SubPartDefinitionListOpt: + /*empty*/ + { + $$ = make([]*ast.SubPartitionDefinition, 0) + } +| '(' SubPartDefinitionList ')' + { + $$ = $2 + } + +SubPartDefinitionList: + SubPartDefinition + { + $$ = []*ast.SubPartitionDefinition{$1.(*ast.SubPartitionDefinition)} + } +| SubPartDefinitionList ',' SubPartDefinition + { + list := $1.([]*ast.SubPartitionDefinition) + $$ = append(list, $3.(*ast.SubPartitionDefinition)) + } + +SubPartDefinition: + "SUBPARTITION" Identifier PartDefOptionList + { + $$ = &ast.SubPartitionDefinition{ + Name: ast.NewCIStr($2), + Options: $3.([]*ast.TableOption), + } + } + +PartDefOptionList: + /*empty*/ + { + $$ = make([]*ast.TableOption, 0) + } +| PartDefOptionList PartDefOption + { + list := $1.([]*ast.TableOption) + $$ = append(list, $2.(*ast.TableOption)) + } + +PartDefOption: + "COMMENT" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: $3} + } +| "ENGINE" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: $3} + } +| "STORAGE" "ENGINE" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: $4} + } +| "ENGINE_ATTRIBUTE" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionEngineAttribute, StrValue: $3} + } +| "SECONDARY_ENGINE_ATTRIBUTE" EqOpt stringLit + { + $$ = &ast.TableOption{ + Tp: ast.TableOptionSecondaryEngineAttribute, + StrValue: $3, + } + } +| "INSERT_METHOD" EqOpt StringName + { + $$ = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: $3} + } +| "DATA" "DIRECTORY" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: $4} + } +| "INDEX" "DIRECTORY" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: $4} + } +| "MAX_ROWS" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: $3.(uint64)} + } +| "MIN_ROWS" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: $3.(uint64)} + } +| "TABLESPACE" EqOpt Identifier + { + $$ = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: $3} + } +| "NODEGROUP" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: $3.(uint64)} + } + +PartDefValuesOpt: + { + $$ = &ast.PartitionDefinitionClauseNone{} + } +| "VALUES" "LESS" "THAN" "MAXVALUE" + { + $$ = &ast.PartitionDefinitionClauseLessThan{ + Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, + } + } +| "VALUES" "LESS" "THAN" '(' MaxValueOrExpressionList ')' + { + $$ = &ast.PartitionDefinitionClauseLessThan{ + Exprs: $5.([]ast.ExprNode), + } + } +| "VALUES" "IN" '(' ExpressionList ')' + { + exprs := $4.([]ast.ExprNode) + values := make([][]ast.ExprNode, 0, len(exprs)) + for _, expr := range exprs { + if row, ok := expr.(*ast.RowExpr); ok { + values = append(values, row.Values) + } else { + values = append(values, []ast.ExprNode{expr}) + } + } + $$ = &ast.PartitionDefinitionClauseIn{Values: values} + } + +DuplicateOpt: + { + $$ = ast.OnDuplicateKeyHandlingError + } +| "IGNORE" + { + $$ = ast.OnDuplicateKeyHandlingIgnore + } +| "REPLACE" + { + $$ = ast.OnDuplicateKeyHandlingReplace + } + +AsOpt: + {} +| "AS" + {} + +CreateTableSelectOpt: + /* empty */ + { + $$ = &ast.CreateTableStmt{} + } +| SetOprStmt + { + $$ = &ast.CreateTableStmt{Select: $1.(ast.ResultSetNode)} + } +| SelectStmt + { + $$ = &ast.CreateTableStmt{Select: $1.(ast.ResultSetNode)} + } +| SelectStmtWithClause + { + $$ = &ast.CreateTableStmt{Select: $1.(ast.ResultSetNode)} + } +| SubSelect + { + var sel ast.ResultSetNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = &ast.CreateTableStmt{Select: sel} + } + +CreateViewSelectOpt: + SetOprStmt +| SelectStmt +| SelectStmtWithClause +| SubSelect + { + var sel ast.StmtNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = sel + } + +LikeTableWithOrWithoutParen: + "LIKE" TableName + { + $$ = $2 + } +| '(' "LIKE" TableName ')' + { + $$ = $3 + } + +/******************************************************************* + * + * Create View Statement + * + * Example: + * CREATE VIEW OR REPLACE ALGORITHM = MERGE DEFINER="root@localhost" SQL SECURITY = definer view_name (col1,col2) + * as select Col1,Col2 from table WITH LOCAL CHECK OPTION + *******************************************************************/ +CreateViewStmt: + "CREATE" OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity "VIEW" ViewName ViewFieldList "AS" CreateViewSelectOpt ViewCheckOption + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.yylval.offset + selStmt := $10.(ast.StmtNode) + x := &ast.CreateViewStmt{ + OrReplace: $2.(bool), + ViewName: $7.(*ast.TableName), + Select: selStmt, + Algorithm: $3.(ast.ViewAlgorithm), + Definer: $4.(*auth.UserIdentity), + Security: $5.(ast.ViewSecurity), + } + if $8 != nil { + x.Cols = $8.([]ast.CIStr) + } + if $11 != nil { + x.CheckOption = $11.(ast.ViewCheckOption) + endOffset = parser.startOffset(&yyS[yypt]) + } else { + x.CheckOption = ast.CheckOptionCascaded + } + parser.setNodeText(selStmt, strings.TrimSpace(parser.src[startOffset:endOffset])) + $$ = x + } + +/* See https://dev.mysql.com/doc/refman/8.4/en/alter-view.html */ +AlterViewStmt: + "ALTER" ViewAlgorithm ViewDefiner ViewSQLSecurity "VIEW" ViewName ViewFieldList "AS" CreateViewSelectOpt ViewCheckOption + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.yylval.offset + selStmt := $9.(ast.StmtNode) + x := &ast.AlterViewStmt{ + ViewName: $6.(*ast.TableName), + Select: selStmt, + Algorithm: $2.(ast.ViewAlgorithm), + Definer: $3.(*auth.UserIdentity), + Security: $4.(ast.ViewSecurity), + } + if $7 != nil { + x.Cols = $7.([]ast.CIStr) + } + if $10 != nil { + x.CheckOption = $10.(ast.ViewCheckOption) + endOffset = parser.startOffset(&yyS[yypt]) + } else { + x.CheckOption = ast.CheckOptionCascaded + } + parser.setNodeText(selStmt, strings.TrimSpace(parser.src[startOffset:endOffset])) + $$ = x + } + +OrReplace: + /* EMPTY */ + { + $$ = false + } +| "OR" "REPLACE" + { + $$ = true + } + +ViewAlgorithm: + /* EMPTY */ + { + $$ = ast.AlgorithmUndefined + } +| "ALGORITHM" "=" "UNDEFINED" + { + $$ = ast.AlgorithmUndefined + } +| "ALGORITHM" "=" "MERGE" + { + $$ = ast.AlgorithmMerge + } +| "ALGORITHM" "=" "TEMPTABLE" + { + $$ = ast.AlgorithmTemptable + } + +ViewDefiner: + /* EMPTY */ + { + $$ = &auth.UserIdentity{CurrentUser: true} + } +| "DEFINER" "=" Username + { + $$ = $3 + } + +ViewSQLSecurity: + /* EMPTY */ + { + $$ = ast.SecurityDefiner + } +| "SQL" "SECURITY" "DEFINER" + { + $$ = ast.SecurityDefiner + } +| "SQL" "SECURITY" "INVOKER" + { + $$ = ast.SecurityInvoker + } + +ViewName: + TableName + +ViewFieldList: + /* Empty */ + { + $$ = nil + } +| '(' ColumnList ')' + { + $$ = $2.([]ast.CIStr) + } + +ColumnList: + Identifier + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| ColumnList ',' Identifier + { + $$ = append($1.([]ast.CIStr), ast.NewCIStr($3)) + } + +ViewCheckOption: + /* EMPTY */ + { + $$ = nil + } +| "WITH" "CASCADED" "CHECK" "OPTION" + { + $$ = ast.CheckOptionCascaded + } +| "WITH" "LOCAL" "CHECK" "OPTION" + { + $$ = ast.CheckOptionLocal + } + +/****************************************************************** + * Do statement + * See https://dev.mysql.com/doc/refman/5.7/en/do.html + ******************************************************************/ +DoStmt: + "DO" ExpressionList + { + $$ = &ast.DoStmt{ + Exprs: $2.([]ast.ExprNode), + } + } + +/******************************************************************* + * + * Delete Statement + * + *******************************************************************/ +DeleteWithoutUsingStmt: + "DELETE" TableOptimizerHintsOpt PriorityOpt QuickOptional IgnoreOptional "FROM" TableName PartitionNameListOpt TableAsNameOpt IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause + { + // Single Table + tn := $7.(*ast.TableName) + tn.IndexHints = $10.([]*ast.IndexHint) + tn.PartitionNames = $8.([]ast.CIStr) + join := &ast.Join{Left: &ast.TableSource{Source: tn, AsName: $9.(ast.CIStr)}, Right: nil} + x := &ast.DeleteStmt{ + TableRefs: &ast.TableRefsClause{TableRefs: join}, + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $11 != nil { + x.Where = $11.(ast.ExprNode) + } + if $12 != nil { + x.Order = $12.(*ast.OrderByClause) + } + if $13 != nil { + x.Limit = $13.(*ast.Limit) + } + + $$ = x + } +| "DELETE" TableOptimizerHintsOpt PriorityOpt QuickOptional IgnoreOptional TableAliasRefList "FROM" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + BeforeFrom: true, + Tables: &ast.DeleteTableList{Tables: $6.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $8.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $9 != nil { + x.Where = $9.(ast.ExprNode) + } + $$ = x + } + +DeleteWithUsingStmt: + "DELETE" TableOptimizerHintsOpt PriorityOpt QuickOptional IgnoreOptional "FROM" TableAliasRefList "USING" TableRefs WhereClauseOptional + { + // Multiple Table + x := &ast.DeleteStmt{ + Priority: $3.(mysql.PriorityEnum), + Quick: $4.(bool), + IgnoreErr: $5.(bool), + IsMultiTable: true, + Tables: &ast.DeleteTableList{Tables: $7.([]*ast.TableName)}, + TableRefs: &ast.TableRefsClause{TableRefs: $9.(*ast.Join)}, + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $10 != nil { + x.Where = $10.(ast.ExprNode) + } + $$ = x + } + +DeleteFromStmt: + DeleteWithoutUsingStmt +| DeleteWithUsingStmt +| WithClause DeleteWithoutUsingStmt + { + d := $2.(*ast.DeleteStmt) + d.With = $1.(*ast.WithClause) + $$ = d + } +| WithClause DeleteWithUsingStmt + { + d := $2.(*ast.DeleteStmt) + d.With = $1.(*ast.WithClause) + $$ = d + } + +DatabaseSym: + "DATABASE" + +DropDatabaseStmt: + "DROP" DatabaseSym IfExists DBName + { + $$ = &ast.DropDatabaseStmt{IfExists: $3.(bool), Name: ast.NewCIStr($4)} + } + +/****************************************************************** + * Drop Index Statement + * See https://dev.mysql.com/doc/refman/8.0/en/drop-index.html + * + * DROP INDEX index_name ON tbl_name + * [algorithm_option | lock_option] ... + * + * algorithm_option: + * ALGORITHM [=] {DEFAULT|INPLACE|COPY} + * + * lock_option: + * LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE} + ******************************************************************/ +DropIndexStmt: + "DROP" "INDEX" Identifier "ON" TableName IndexLockAndAlgorithmOpt + { + var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm + if $6 != nil { + indexLockAndAlgorithm = $6.(*ast.IndexLockAndAlgorithm) + if indexLockAndAlgorithm.LockTp == ast.LockTypeDefault && indexLockAndAlgorithm.AlgorithmTp == ast.AlgorithmTypeDefault { + indexLockAndAlgorithm = nil + } + } + $$ = &ast.DropIndexStmt{IndexName: $3, Table: $5.(*ast.TableName), LockAlg: indexLockAndAlgorithm} + } + +DropTableStmt: + "DROP" OptTemporary TableOrTables IfExists TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: $4.(bool), Tables: $5.([]*ast.TableName), IsView: false, TemporaryKeyword: $2.(ast.TemporaryKeyword)} + } + +OptTemporary: + /* empty */ + { + $$ = ast.TemporaryNone + } +| "TEMPORARY" + { + $$ = ast.TemporaryLocal + } + +DropViewStmt: + "DROP" "VIEW" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{Tables: $3.([]*ast.TableName), IsView: true} + } +| "DROP" "VIEW" "IF" "EXISTS" TableNameList RestrictOrCascadeOpt + { + $$ = &ast.DropTableStmt{IfExists: true, Tables: $5.([]*ast.TableName), IsView: true} + } + +DropUserStmt: + "DROP" "USER" UsernameList + { + $$ = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: $3.([]*auth.UserIdentity)} + } +| "DROP" "USER" "IF" "EXISTS" UsernameList + { + $$ = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: $5.([]*auth.UserIdentity)} + } + +DropRoleStmt: + "DROP" "ROLE" RolenameList + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := $3.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + $$ = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} + } +| "DROP" "ROLE" "IF" "EXISTS" RolenameList + { + tmp := make([]*auth.UserIdentity, 0, 10) + roleList := $5.([]*auth.RoleIdentity) + for _, r := range roleList { + tmp = append(tmp, &auth.UserIdentity{Username: r.Username, Hostname: r.Hostname}) + } + $$ = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} + } + +RestrictOrCascadeOpt: + {} +| "RESTRICT" +| "CASCADE" + +TableOrTables: + "TABLE" +| "TABLES" + +EqOpt: + {} +| eq + +EmptyStmt: + /* EMPTY */ + { + $$ = nil + } + +ExplainSym: + "EXPLAIN" +| "DESCRIBE" +| "DESC" + +ExplainStmt: + ExplainSym "EXPLORE" SelectStmt + { + startOffset := parser.startOffset(&yyS[yypt]) + stmt := $3 + parser.setNodeText(stmt, strings.TrimSpace(parser.src[startOffset:])) + $$ = &ast.ExplainStmt{ + Stmt: stmt, + Explore: true, + } + } +| ExplainSym TableName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + }, + } + } +| ExplainSym TableName ColumnName + { + $$ = &ast.ExplainStmt{ + Stmt: &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $2.(*ast.TableName), + Column: $3.(*ast.ColumnName), + }, + } + } +| ExplainSym ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $2, + Format: "row", + } + } +| ExplainSym "FOR" "CONNECTION" NUM + { + $$ = &ast.ExplainForStmt{ + Format: "row", + ConnectionID: getUint64FromNUM($4), + } + } +| ExplainSym "FORMAT" "=" stringLit ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4, + } + } +| ExplainSym "FORMAT" "=" ExplainFormatType "FOR" "CONNECTION" NUM + { + $$ = &ast.ExplainForStmt{ + Format: $4, + ConnectionID: getUint64FromNUM($7), + } + } +| ExplainSym "FORMAT" "=" ExplainFormatType ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $5, + Format: $4, + } + } +| ExplainSym "ANALYZE" ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $3, + Format: "row", + Analyze: true, + } + } +| ExplainSym "ANALYZE" "FORMAT" "=" ExplainFormatType ExplainableStmt + { + $$ = &ast.ExplainStmt{ + Stmt: $6, + Format: $5, + Analyze: true, + } + } + +ExplainFormatType: + "TRADITIONAL" +| "JSON" + +SavepointStmt: + "SAVEPOINT" Identifier + { + $$ = &ast.SavepointStmt{Name: $2} + } + +ReleaseSavepointStmt: + "RELEASE" "SAVEPOINT" Identifier + { + $$ = &ast.ReleaseSavepointStmt{Name: $3} + } + +/******************************************************************* + * Backup / restore / import statements + * + * BACKUP DATABASE [ * | db1, db2, db3 ] TO 'scheme://location' [ options... ] + * BACKUP TABLE [ db1.tbl1, db2.tbl2 ] TO 'scheme://location' [ options... ] + * RESTORE DATABASE [ * | db1, db2, db3 ] FROM 'scheme://location' [ options... ] + * RESTORE TABLE [ db1.tbl1, db2.tbl2 ] FROM 'scheme://location' [ options... ] + */ +LengthNum: + NUM + { + $$ = getUint64FromNUM($1) + } + +Int64Num: + NUM + { + v, rangeErrMsg := getInt64FromNUM($1) + if len(rangeErrMsg) != 0 { + yylex.AppendError(yylex.Errorf("%s", rangeErrMsg)) + return 1 + } + $$ = v + } + +NUM: + intLit + +Expression: + singleAtIdentifier assignmentEq Expression %prec assignmentEq + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $3, + } + } +| Expression logOr Expression %prec pipes + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: $1, R: $3} + } +| Expression "XOR" Expression %prec xor + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: $1, R: $3} + } +| Expression logAnd Expression %prec andand + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: $1, R: $3} + } +| "NOT" Expression %prec not + { + expr, ok := $2.(*ast.ExistsSubqueryExpr) + if ok { + expr.Not = !expr.Not + $$ = $2 + } else { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not, V: $2} + } + } +| "MATCH" '(' ColumnNameList ')' "AGAINST" '(' BitExpr FulltextSearchModifierOpt ')' + { + $$ = &ast.MatchAgainst{ + ColumnNames: $3.([]*ast.ColumnName), + Against: $7, + Modifier: ast.FulltextSearchModifier($8.(int)), + } + } +| BoolPri IsOrNotOp trueKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr: $1, Not: !$2.(bool), True: int64(1)} + } +| BoolPri IsOrNotOp falseKwd %prec is + { + $$ = &ast.IsTruthExpr{Expr: $1, Not: !$2.(bool), True: int64(0)} + } +| BoolPri IsOrNotOp "UNKNOWN" %prec is + { + /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri + +MaxValueOrExpression: + "MAXVALUE" + { + $$ = &ast.MaxValueExpr{} + } +| BitExpr + +FulltextSearchModifierOpt: + /* empty */ + { + $$ = ast.FulltextSearchModifierNaturalLanguageMode + } +| "IN" "NATURAL" "LANGUAGE" "MODE" + { + $$ = ast.FulltextSearchModifierNaturalLanguageMode + } +| "IN" "NATURAL" "LANGUAGE" "MODE" "WITH" "QUERY" "EXPANSION" + { + $$ = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion + } +| "IN" "BOOLEAN" "MODE" + { + $$ = ast.FulltextSearchModifierBooleanMode + } +| "WITH" "QUERY" "EXPANSION" + { + $$ = ast.FulltextSearchModifierWithQueryExpansion + } + +logOr: + pipesAsOr +| "OR" + +logAnd: + "&&" +| "AND" + +ExpressionList: + Expression + { + $$ = []ast.ExprNode{$1} + } +| ExpressionList ',' Expression + { + $$ = append($1.([]ast.ExprNode), $3) + } + +MaxValueOrExpressionList: + MaxValueOrExpression + { + $$ = []ast.ExprNode{$1} + } +| MaxValueOrExpressionList ',' MaxValueOrExpression + { + $$ = append($1.([]ast.ExprNode), $3) + } + +ExpressionListOpt: + { + $$ = []ast.ExprNode{} + } +| ExpressionList + +FuncDatetimePrecListOpt: + { + $$ = []ast.ExprNode{} + } +| FuncDatetimePrecList + +FuncDatetimePrecList: + intLit + { + expr := ast.NewValueExpr($1, parser.charset, parser.collation) + $$ = []ast.ExprNode{expr} + } + +BoolPri: + BoolPri IsOrNotOp "NULL" %prec is + { + $$ = &ast.IsNullExpr{Expr: $1, Not: !$2.(bool)} + } +| BoolPri CompareOp PredicateExpr %prec eq + { + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: $3} + } +| BoolPri CompareOp AnyOrAll SubSelect %prec eq + { + sq := $4.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.CompareSubqueryExpr{Op: $2.(opcode.Op), L: $1, R: sq, All: $3.(bool)} + } +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr %prec assignmentEq + { + v := $3 + v = strings.TrimPrefix(v, "@") + variable := &ast.VariableExpr{ + Name: v, + IsGlobal: false, + IsSystem: false, + Value: $5, + } + $$ = &ast.BinaryOperationExpr{Op: $2.(opcode.Op), L: $1, R: variable} + } +| PredicateExpr + +CompareOp: + ">=" + { + $$ = opcode.GE + } +| '>' + { + $$ = opcode.GT + } +| "<=" + { + $$ = opcode.LE + } +| '<' + { + $$ = opcode.LT + } +| "!=" + { + $$ = opcode.NE + } +| "<>" + { + $$ = opcode.NE + } +| "=" + { + $$ = opcode.EQ + } +| "<=>" + { + $$ = opcode.NullEQ + } + +BetweenOrNotOp: + "BETWEEN" + { + $$ = true + } +| NotSym "BETWEEN" + { + $$ = false + } + +IsOrNotOp: + "IS" + { + $$ = true + } +| "IS" NotSym + { + $$ = false + } + +InOrNotOp: + "IN" + { + $$ = true + } +| NotSym "IN" + { + $$ = false + } + +LikeOrNotOp: + "LIKE" + { + $$ = true + } +| NotSym "LIKE" + { + $$ = false + } + +RegexpOrNotOp: + RegexpSym + { + $$ = true + } +| NotSym RegexpSym + { + $$ = false + } + +AnyOrAll: + "ANY" + { + $$ = false + } +| "SOME" + { + $$ = false + } +| "ALL" + { + $$ = true + } + +PredicateExpr: + BitExpr InOrNotOp '(' ExpressionList ')' + { + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), List: $4.([]ast.ExprNode)} + } +| BitExpr InOrNotOp SubSelect + { + sq := $3.(*ast.SubqueryExpr) + sq.MultiRows = true + $$ = &ast.PatternInExpr{Expr: $1, Not: !$2.(bool), Sel: sq} + } +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr + { + $$ = &ast.BetweenExpr{ + Expr: $1, + Left: $3, + Right: $5, + Not: !$2.(bool), + } + } +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt + { + escapeSpec := $4.(*likeEscapeSpec) + escape := escapeSpec.escape + explicit := escapeSpec.explicit + if len(escape) > 1 { + yylex.AppendError(ErrWrongArguments.GenByArgs("ESCAPE")) + return 1 + } + // When ESCAPE empty string is specified, escape is empty and explicit is true. + // This means no escape character should be used (Escape = 0). + var escapeChar byte + if len(escape) > 0 { + escapeChar = escape[0] + } + $$ = &ast.PatternLikeExpr{ + Expr: $1, + Pattern: $3, + Not: !$2.(bool), + Escape: escapeChar, + EscapeExplicit: explicit, + } + } +| BitExpr RegexpOrNotOp SimpleExpr + { + $$ = &ast.PatternRegexpExpr{Expr: $1, Pattern: $3, Not: !$2.(bool)} + } +| BitExpr memberof '(' SimpleExpr ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONMemberOf), Args: []ast.ExprNode{$1, $4}} + } +| BitExpr + +RegexpSym: + "REGEXP" +| "RLIKE" + +LikeEscapeOpt: + %prec empty + { + $$ = &likeEscapeSpec{escape: "\\", explicit: false} + } +| "ESCAPE" stringLit + { + $$ = &likeEscapeSpec{escape: $2, explicit: true} + } + +Field: + '*' %prec '*' + { + $$ = &ast.SelectField{WildCard: &ast.WildCardField{}} + } +| Identifier '.' '*' %prec '*' + { + wildCard := &ast.WildCardField{Table: ast.NewCIStr($1)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Identifier '.' Identifier '.' '*' %prec '*' + { + wildCard := &ast.WildCardField{Schema: ast.NewCIStr($1), Table: ast.NewCIStr($3)} + $$ = &ast.SelectField{WildCard: wildCard} + } +| Expression FieldAsNameOpt + { + expr := $1 + asName := $2 + $$ = &ast.SelectField{Expr: expr, AsName: ast.NewCIStr(asName)} + } + +FieldAsNameOpt: + /* EMPTY */ + { + $$ = "" + } +| FieldAsName + +FieldAsName: + Identifier +| "AS" Identifier + { + $$ = $2 + } +| stringLit +| "AS" stringLit + { + $$ = $2 + } + +FieldList: + Field + { + field := $1.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil { + endOffset := parser.yylval.offset + parser.setNodeText(field, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } + $$ = []*ast.SelectField{field} + } +| FieldList ',' Field + { + fl := $1.([]*ast.SelectField) + field := $3.(*ast.SelectField) + field.Offset = parser.startOffset(&yyS[yypt]) + if field.Expr != nil { + endOffset := parser.yylval.offset + parser.setNodeText(field, strings.TrimSpace(parser.src[field.Offset:endOffset])) + } + $$ = append(fl, field) + } + +WithRollupClause: + %prec lowerThanWith + { + $$ = false + } +| "WITH" "ROLLUP" + { + $$ = true + } + +GroupByClause: + "GROUP" "BY" ByList WithRollupClause + { + $$ = &ast.GroupByClause{Items: $3.([]*ast.ByItem), Rollup: $4.(bool)} + } + +HavingClause: + { + $$ = nil + } +| "HAVING" Expression + { + $$ = &ast.HavingClause{Expr: $2} + } + +IfExists: + { + $$ = false + } +| "IF" "EXISTS" + { + $$ = true + } + +IfNotExists: + { + $$ = false + } +| "IF" NotSym "EXISTS" + { + $$ = true + } + +IgnoreOptional: + { + $$ = false + } +| "IGNORE" + { + $$ = true + } + +IndexName: + { + $$ = &ast.NullString{ + String: "", + Empty: false, + } + } +| Identifier + { + $$ = &ast.NullString{ + String: $1, + Empty: len($1) == 0, + } + } + +IndexOptionList: + { + $$ = nil + } +| IndexOptionList IndexOption + { + // Merge the options + if $1 == nil { + $$ = $2 + } else { + opt1 := $1.(*ast.IndexOption) + opt2 := $2.(*ast.IndexOption) + if len(opt2.Comment) > 0 { + opt1.Comment = opt2.Comment + } else if opt2.Tp != 0 { + opt1.Tp = opt2.Tp + } else if opt2.KeyBlockSize > 0 { + opt1.KeyBlockSize = opt2.KeyBlockSize + } else if len(opt2.ParserName.O) > 0 { + opt1.ParserName = opt2.ParserName + } else if opt2.Visibility != ast.IndexVisibilityDefault { + opt1.Visibility = opt2.Visibility + } else if len(opt2.SecondaryEngineAttr) > 0 { + opt1.SecondaryEngineAttr = opt2.SecondaryEngineAttr + } + $$ = opt1 + } + } + +IndexOption: + "KEY_BLOCK_SIZE" EqOpt LengthNum + { + $$ = &ast.IndexOption{ + KeyBlockSize: $3.(uint64), + } + } +| IndexType + { + $$ = &ast.IndexOption{ + Tp: $1.(ast.IndexType), + } + } +| "WITH" "PARSER" Identifier + { + $$ = &ast.IndexOption{ + ParserName: ast.NewCIStr($3), + } + } +| "COMMENT" stringLit + { + $$ = &ast.IndexOption{ + Comment: $2, + } + } +| IndexInvisible + { + $$ = &ast.IndexOption{ + Visibility: $1.(ast.IndexVisibility), + } + } +| "SECONDARY_ENGINE_ATTRIBUTE" EqOpt stringLit + { + $$ = &ast.IndexOption{SecondaryEngineAttr: $3} + } + +IndexNameAndTypeOpt: + IndexName + { + $$ = []interface{}{$1, nil} + } +| IndexName "USING" IndexTypeName + { + $$ = []interface{}{$1, $3} + } +| Identifier "TYPE" IndexTypeName + { + $$ = []interface{}{&ast.NullString{String: $1, Empty: len($1) == 0}, $3} + } + +IndexTypeOpt: + { + $$ = nil + } +| IndexType + +IndexType: + "USING" IndexTypeName + { + $$ = $2 + } +| "TYPE" IndexTypeName + { + $$ = $2 + } + +IndexTypeName: + "BTREE" + { + $$ = ast.IndexTypeBtree + } +| "HASH" + { + $$ = ast.IndexTypeHash + } +| "RTREE" + { + $$ = ast.IndexTypeRtree + } + +IndexInvisible: + "VISIBLE" + { + $$ = ast.IndexVisibilityVisible + } +| "INVISIBLE" + { + $$ = ast.IndexVisibilityInvisible + } + +/**********************************Identifier********************************************/ +Identifier: + identifier +| UnReservedKeyword +| NotKeywordToken + +UnReservedKeyword: + "ACTION" +| "ASCII" +| "ATTRIBUTE" +| "AUTO_INCREMENT" +| "AFTER" +| "ALWAYS" +| "AVG" +| "BEGIN" +| "BIT" +| "BOOL" +| "BOOLEAN" +| "BTREE" +| "BUCKETS" +| "BYTE" +| "CHAIN" +| "CHARSET" +| "COLUMNS" +| "CONFIG" +| "SAN" +| "COMMIT" +| "COMPACT" +| "COMPRESSED" +| "CONSISTENT" +| "CURRENT" +| "DATA" +| "DATE" %prec lowerThanStringLitToken +| "DATETIME" +| "DAY" +| "DEALLOCATE" +| "DO" +| "DUPLICATE" +| "DYNAMIC" +| "ENCRYPTION" +| "END" +| "ENFORCED" +| "ENGINE" +| "ENGINES" +| "ENGINE_ATTRIBUTE" +| "SECONDARY_ENGINE_ATTRIBUTE" +| "ENUM" +| "ERROR" +| "ERRORS" +| "ESCAPE" +| "EXECUTE" +| "EXPLORE" +| "EXTENDED" +| "FIELDS" +| "FILE" +| "FIRST" +| "FIXED" +| "FLUSH" +| "FOLLOWING" +| "FORMAT" +| "FULL" +| "GENERAL" +| "GLOBAL" +| "HASH" +| "HOUR" +| "INSERT_METHOD" +| "LESS" +| "LOCAL" +| "LAST" +| "NAMES" +| "NVARCHAR" +| "OFFSET" +| "PACK_KEYS" +| "PARSER" +| "PASSWORD" %prec lowerThanEq +| "PREPARE" +| "PROXY" +| "QUICK" +| "REBUILD" +| "REDUNDANT" +| "REORGANIZE" +| "RESOURCE" +| "RESTART" +| "ROLE" +| "ROLLBACK" +| "ROLLUP" +| "SESSION" +| "SIGNED" +| "SHUTDOWN" +| "SNAPSHOT" +| "START" +| "STATUS" +| "OPEN" +| "POINT" +| "SUBPARTITIONS" +| "SUBPARTITION" +| "TABLES" +| "TABLESPACE" +| "TEXT" +| "THAN" +| "TIME" %prec lowerThanStringLitToken +| "TIMESTAMP" %prec lowerThanStringLitToken +| "TRANSACTION" +| "TRUNCATE" +| "UNBOUNDED" +| "UNKNOWN" +| "VALUE" %prec lowerThanValueKeyword +| "WARNINGS" +| "YEAR" +| "MODE" +| "WEEK" +| "WEIGHT_STRING" +| "ANY" +| "SOME" +| "USER" +| "IDENTIFIED" +| "COLLATION" +| "COMMENT" +| "AVG_ROW_LENGTH" +| "CONNECTION" +| "CHECKSUM" +| "COMPRESSION" +| "KEY_BLOCK_SIZE" +| "MASTER" +| "MAX_ROWS" +| "MIN_ROWS" +| "NATIONAL" +| "NCHAR" +| "ROW_FORMAT" +| "QUARTER" +| "GRANTS" +| "TRIGGERS" +| "DELAY_KEY_WRITE" +| "ISOLATION" +| "JSON" +| "REPEATABLE" +| "RESPECT" +| "COMMITTED" +| "UNCOMMITTED" +| "ONLY" +| "SERIAL" +| "SERIALIZABLE" +| "LEVEL" +| "VARIABLES" +| "SQL_CACHE" +| "INDEXES" +| "PROCESSLIST" +| "SQL_NO_CACHE" +| "DISABLE" +| "ENABLE" +| "REVERSE" +| "PRIVILEGES" +| "NO" +| "BINLOG" +| "FUNCTION" +| "VIEW" +| "MODIFY" +| "EVENTS" +| "PARTITIONS" +| "NONE" +| "NULLS" +| "SUPER" +| "STATS_PERSISTENT" +| "STATS_AUTO_RECALC" +| "ROW_COUNT" +| "COALESCE" +| "MONTH" +| "PROCESS" +| "PROFILE" +| "PROFILES" +| "MICROSECOND" +| "MINUTE" +| "PLUGINS" +| "PRECEDING" +| "QUERY" +| "SAVEPOINT" +| "SECOND" +| "SEPARATOR" +| "SHARE" +| "SLOW" +| "MAX_CONNECTIONS_PER_HOUR" +| "MAX_QUERIES_PER_HOUR" +| "MAX_UPDATES_PER_HOUR" +| "MAX_USER_CONNECTIONS" +| "REPLICATION" +| "CLIENT" +| "SLAVE" +| "RELOAD" +| "TEMPORARY" +| "ROUTINE" +| "EVENT" +| "ALGORITHM" +| "DEFINER" +| "INVOKER" +| "MERGE" +| "TEMPTABLE" +| "UNDEFINED" +| "SECURITY" +| "CASCADED" +| "CIPHER" +| "SUBJECT" +| "ISSUER" +| "X509" +| "NEVER" +| "EXPIRE" +| "ACCOUNT" +| "CPU" +| "MEMBER" +| "MEMORY" +| "BLOCK" +| "IO" +| "CONTEXT" +| "SWITCHES" +| "PAGE" +| "FAULTS" +| "IPC" +| "SWAPS" +| "SOURCE" +| "TRADITIONAL" +| "SQL_BUFFER_RESULT" +| "DIRECTORY" +| "HISTOGRAM" +| "HISTORY" +| "LIST" +| "NODEGROUP" +| "PARTIAL" +| "SIMPLE" +| "REMOVE" +| "PARTITIONING" +| "STORAGE" +| "DISK" +| "STATS_SAMPLE_PAGES" +| "SECONDARY_ENGINE" +| "SECONDARY_LOAD" +| "SECONDARY_UNLOAD" +| "VALIDATION" +| "WITHOUT" +| "RTREE" +| "EXCHANGE" +| "COLUMN_FORMAT" +| "REPAIR" +| "IMPORT" +| "DISCARD" +| "OLD" +| "RETAIN" +| "UNICODE" +| "SQL_TSI_DAY" +| "SQL_TSI_HOUR" +| "SQL_TSI_MINUTE" +| "SQL_TSI_MONTH" +| "SQL_TSI_QUARTER" +| "SQL_TSI_SECOND" +| "LANGUAGE" +| "SQL_TSI_WEEK" +| "SQL_TSI_YEAR" +| "INVISIBLE" +| "VISIBLE" +| "TYPE" +| "NOWAIT" +| "INSTANCE" +| "REPLICA" +| "LOGS" +| "HOSTS" +| "AGAINST" +| "EXPANSION" +| "NEXT" +| "WAIT" +| "SKIP" +| "LOCKED" +| "TOKEN_ISSUER" +| "FAILED_LOGIN_ATTEMPTS" +| "PASSWORD_LOCK_TIME" +| "REUSE" %prec lowerThanEq +| "FOUND" +| "AUTOEXTEND_SIZE" +| "GEOMETRY" +| "GEOMETRYCOLLECTION" +| "LINESTRING" +| "MULTILINESTRING" +| "MULTIPOINT" +| "MULTIPOLYGON" +| "POLYGON" +| "SRID" +| "ACTIVE" +| "AUTO" +| "CHANNEL" +| "DATAFILE" +| "DEFINITION" +| "DESCRIPTION" +| "EXPORT" +| "EXTENT_SIZE" +| "FILE_BLOCK_SIZE" +| "INACTIVE" +| "INITIAL_SIZE" +| "KEYRING" +| "LOGFILE" +| "MANUAL" +| "MAX_SIZE" +| "MIGRATE" +| "NAME" +| "ONE" +| "ORGANIZATION" +| "PHASE" +| "RECOVER" +| "REDO_BUFFER_SIZE" +| "NO_WAIT" +| "REFERENCE" +| "RELAY" +| "RESUME" +| "ROTATE" +| "SUSPEND" +| "UNDOFILE" +| "UNDO_BUFFER_SIZE" +| "USE_FRM" +| "USER_RESOURCES" +| "WORK" +| "XA" +| "XID" + +NotKeywordToken: + "ADDDATE" +| "COMPRESS" +| "COPY" +| "DEFINED" +| "GET_FORMAT" +| "INPLACE" +| "INSTANT" +| "LOG" +| "S3" +| "SUBDATE" +| "TIMESTAMPADD" +| "TIMESTAMPDIFF" +| "JSON_OBJECTAGG" +| "JSON_ARRAYAGG" +| "JSON_SUM_CRC32" +| "TLS" + +CallStmt: + "CALL" ProcedureCall + { + $$ = &ast.CallStmt{ + Procedure: $2.(*ast.FuncCallExpr), + } + } + +ProcedureCall: + identifier + { + $$ = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{}, + } + } +| Identifier '.' Identifier + { + $$ = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + Schema: ast.NewCIStr($1), + FnName: ast.NewCIStr($3), + Args: []ast.ExprNode{}, + } + } +| identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + FnName: ast.NewCIStr($1), + Args: $3.([]ast.ExprNode), + } + } +| Identifier '.' Identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{ + Tp: ast.FuncCallExprTypeGeneric, + Schema: ast.NewCIStr($1), + FnName: ast.NewCIStr($3), + Args: $5.([]ast.ExprNode), + } + } + +/************************************************************************************ + * + * Insert Statements + * + **********************************************************************************/ +InsertIntoStmt: + "INSERT" TableOptimizerHintsOpt PriorityOpt IgnoreOptional IntoOpt TableName PartitionNameListOpt InsertValues OnDuplicateKeyUpdate + { + x := $8.(*ast.InsertStmt) + x.Priority = $3.(mysql.PriorityEnum) + x.IgnoreErr = $4.(bool) + // Wraps many layers here so that it can be processed the same way as select statement. + ts := &ast.TableSource{Source: $6.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if $9 != nil { + x.OnDuplicate = $9.([]*ast.Assignment) + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + x.PartitionNames = $7.([]ast.CIStr) + $$ = x + } + +IntoOpt: + {} +| "INTO" + +InsertValues: + '(' ColumnNameListOpt ')' ValueSym ValuesList InsertRowAliasOpt + { + x := &ast.InsertStmt{ + Columns: $2.([]*ast.ColumnName), + Lists: $5.([][]ast.ExprNode), + } + if $6 != nil { + alias := $6.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + $$ = x + } +| '(' ColumnNameListOpt ')' SetOprStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(ast.ResultSetNode)} + } +| '(' ColumnNameListOpt ')' SelectStmt + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(ast.ResultSetNode)} + } +| '(' ColumnNameListOpt ')' SelectStmtWithClause + { + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: $4.(ast.ResultSetNode)} + } +| '(' ColumnNameListOpt ')' SubSelect + { + var sel ast.ResultSetNode + switch x := $4.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = &ast.InsertStmt{Columns: $2.([]*ast.ColumnName), Select: sel} + } +| ValueSym ValuesList InsertRowAliasOpt %prec insertValues + { + x := &ast.InsertStmt{Lists: $2.([][]ast.ExprNode)} + if $3 != nil { + alias := $3.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + $$ = x + } +| SetOprStmt + { + $$ = &ast.InsertStmt{Select: $1.(ast.ResultSetNode)} + } +| SelectStmt + { + $$ = &ast.InsertStmt{Select: $1.(ast.ResultSetNode)} + } +| SelectStmtWithClause + { + $$ = &ast.InsertStmt{Select: $1.(ast.ResultSetNode)} + } +| SubSelect + { + var sel ast.ResultSetNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = &ast.InsertStmt{Select: sel} + } +| "SET" ColumnSetValueList InsertRowAliasOpt + { + x := $2.(*ast.InsertStmt) + if $3 != nil { + alias := $3.(*insertRowAlias) + x.RowAlias = alias.rowAlias + x.ColumnAliases = alias.columnAliases + } + $$ = x + } + +ValueSym: + "VALUE" +| "VALUES" + +ValuesList: + RowValue + { + $$ = [][]ast.ExprNode{$1.([]ast.ExprNode)} + } +| ValuesList ',' RowValue + { + $$ = append($1.([][]ast.ExprNode), $3.([]ast.ExprNode)) + } + +RowValue: + '(' ValuesOpt ')' + { + $$ = $2 + } + +ValuesOpt: + { + $$ = []ast.ExprNode{} + } +| Values + +Values: + Values ',' ExprOrDefault + { + $$ = append($1.([]ast.ExprNode), $3) + } +| ExprOrDefault + { + $$ = []ast.ExprNode{$1} + } + +ExprOrDefault: + Expression +| "DEFAULT" + { + $$ = &ast.DefaultExpr{} + } + +ColumnSetValueList: + ColumnName EqOrAssignmentEq ExprOrDefault + { + $$ = &ast.InsertStmt{ + Columns: []*ast.ColumnName{$1.(*ast.ColumnName)}, + Lists: [][]ast.ExprNode{{$3.(ast.ExprNode)}}, + Setlist: true, + } + } +| ColumnSetValueList ',' ColumnName EqOrAssignmentEq ExprOrDefault + { + ins := $1.(*ast.InsertStmt) + ins.Columns = append(ins.Columns, $3.(*ast.ColumnName)) + ins.Lists[0] = append(ins.Lists[0], $5.(ast.ExprNode)) + $$ = ins + } + +/* + * Optional row alias for INSERT ... VALUES/SET (MySQL 8.0.19+). + * See https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html + */ +InsertRowAliasOpt: + /* empty */ %prec empty + { + $$ = nil + } +| "AS" Identifier + { + $$ = &insertRowAlias{rowAlias: ast.NewCIStr($2)} + } +| "AS" Identifier '(' IdentList ')' + { + $$ = &insertRowAlias{rowAlias: ast.NewCIStr($2), columnAliases: $4.([]ast.CIStr)} + } + +/* + * ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... + * See https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html + */ +OnDuplicateKeyUpdate: + { + $$ = nil + } +| "ON" "DUPLICATE" "KEY" "UPDATE" AssignmentList + { + $$ = $5 + } + +/************************************************************************************ + * Replace Statements + * See https://dev.mysql.com/doc/refman/5.7/en/replace.html + * + **********************************************************************************/ +ReplaceIntoStmt: + "REPLACE" TableOptimizerHintsOpt PriorityOpt IntoOpt TableName PartitionNameListOpt InsertValues + { + x := $7.(*ast.InsertStmt) + if x.RowAlias.O != "" || len(x.ColumnAliases) > 0 { + yylex.AppendError(ErrSyntax) + return 1 + } + if $2 != nil { + x.TableHints = $2.([]*ast.TableOptimizerHint) + } + x.IsReplace = true + x.Priority = $3.(mysql.PriorityEnum) + ts := &ast.TableSource{Source: $5.(*ast.TableName)} + x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + x.PartitionNames = $6.([]ast.CIStr) + $$ = x + } + +Literal: + "FALSE" + { + $$ = ast.NewValueExpr(false, parser.charset, parser.collation) + } +| "NULL" + { + $$ = ast.NewValueExpr(nil, parser.charset, parser.collation) + } +| "TRUE" + { + $$ = ast.NewValueExpr(true, parser.charset, parser.collation) + } +| floatLit + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| decLit + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| intLit + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| StringLiteral %prec lowerThanStringLitToken +| "UNDERSCORE_CHARSET" stringLit + { + // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html + co, err := charset.GetDefaultCollationLegacy($1) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", $1)) + return 1 + } + expr := ast.NewValueExpr($2, $1, co) + tp := expr.GetType() + tp.SetCharset($1) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = expr + } +| hexLit + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| bitLit + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| "UNDERSCORE_CHARSET" hexLit + { + co, err := charset.GetDefaultCollationLegacy($1) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", $1)) + return 1 + } + expr := ast.NewValueExpr($2, $1, co) + tp := expr.GetType() + tp.SetCharset($1) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = expr + } +| "UNDERSCORE_CHARSET" bitLit + { + co, err := charset.GetDefaultCollationLegacy($1) + if err != nil { + yylex.AppendError(ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", $1)) + return 1 + } + expr := ast.NewValueExpr($2, $1, co) + tp := expr.GetType() + tp.SetCharset($1) + tp.SetCollate(co) + tp.AddFlag(mysql.UnderScoreCharsetFlag) + if tp.GetCollate() == charset.CollationBin { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = expr + } + +StringLiteral: + stringLit + { + expr := ast.NewValueExpr($1, parser.charset, parser.collation) + $$ = expr + } +| StringLiteral stringLit + { + valExpr := $1.(*ast.ValueExpr) + strLit := valExpr.GetString() + expr := ast.NewValueExpr(strLit+$2, parser.charset, parser.collation) + // Fix #4239, use first string literal as projection name. + if valExpr.GetProjectionOffset() >= 0 { + expr.SetProjectionOffset(valExpr.GetProjectionOffset()) + } else { + expr.SetProjectionOffset(len(strLit)) + } + $$ = expr + } + +AlterOrderList: + AlterOrderItem + { + $$ = []*ast.AlterOrderItem{$1.(*ast.AlterOrderItem)} + } +| AlterOrderList ',' AlterOrderItem + { + $$ = append($1.([]*ast.AlterOrderItem), $3.(*ast.AlterOrderItem)) + } + +AlterOrderItem: + ColumnName OptOrder + { + $$ = &ast.AlterOrderItem{Column: $1.(*ast.ColumnName), Desc: $2.(bool)} + } + +OrderBy: + "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +ByList: + ByItem + { + $$ = []*ast.ByItem{$1.(*ast.ByItem)} + } +| ByList ',' ByItem + { + $$ = append($1.([]*ast.ByItem), $3.(*ast.ByItem)) + } + +ByItem: + Expression + { + expr := $1 + valueExpr, ok := expr.(*ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + $$ = &ast.ByItem{Expr: expr, NullOrder: true} + } +| Expression Order + { + expr := $1 + valueExpr, ok := expr.(*ast.ValueExpr) + if ok { + position, isPosition := valueExpr.GetValue().(int64) + if isPosition { + expr = &ast.PositionExpr{N: int(position)} + } + } + $$ = &ast.ByItem{Expr: expr, Desc: $2.(bool)} + } + +Order: + "ASC" + { + $$ = false + } +| "DESC" + { + $$ = true + } + +OptOrder: + /* EMPTY */ + { + $$ = false // ASC by default + } +| "ASC" + { + $$ = false + } +| "DESC" + { + $$ = true + } + +OrderByOptional: + { + $$ = nil + } +| OrderBy + +BitExpr: + BitExpr '|' BitExpr %prec '|' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Or, L: $1, R: $3} + } +| BitExpr '&' BitExpr %prec '&' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.And, L: $1, R: $3} + } +| BitExpr "<<" BitExpr %prec lsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: $1, R: $3} + } +| BitExpr ">>" BitExpr %prec rsh + { + $$ = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: $1, R: $3} + } +| BitExpr '+' BitExpr %prec '+' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Plus, L: $1, R: $3} + } +| BitExpr '-' BitExpr %prec '-' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Minus, L: $1, R: $3} + } +| BitExpr '+' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + $1, + $4, + &ast.TimeUnitExpr{Unit: $5.(ast.TimeUnitType)}, + }, + } + } +| BitExpr '-' "INTERVAL" Expression TimeUnit %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_SUB"), + Args: []ast.ExprNode{ + $1, + $4, + &ast.TimeUnitExpr{Unit: $5.(ast.TimeUnitType)}, + }, + } + } +| "INTERVAL" Expression TimeUnit '+' BitExpr %prec '+' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr("DATE_ADD"), + Args: []ast.ExprNode{ + $5, + $2, + &ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)}, + }, + } + } +| BitExpr '*' BitExpr %prec '*' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mul, L: $1, R: $3} + } +| BitExpr '/' BitExpr %prec '/' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Div, L: $1, R: $3} + } +| BitExpr '%' BitExpr %prec '%' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr "DIV" BitExpr %prec div + { + $$ = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: $1, R: $3} + } +| BitExpr "MOD" BitExpr %prec mod + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $1, R: $3} + } +| BitExpr '^' BitExpr + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Xor, L: $1, R: $3} + } +| SimpleExpr + +SimpleIdent: + Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Name: ast.NewCIStr($1), + }} + } +| Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Table: ast.NewCIStr($1), + Name: ast.NewCIStr($3), + }} + } +| Identifier '.' Identifier '.' Identifier + { + $$ = &ast.ColumnNameExpr{Name: &ast.ColumnName{ + Schema: ast.NewCIStr($1), + Table: ast.NewCIStr($3), + Name: ast.NewCIStr($5), + }} + } + +SimpleExpr: + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" CollationName + { + $$ = &ast.SetCollationExpr{Expr: $1, Collate: $3} + } +| WindowFuncCall +| Literal +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } +| Variable +| SumExpr +| '!' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not2, V: $2} + } +| '~' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: $2} + } +| '-' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Minus, V: $2} + } +| '+' SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Plus, V: $2} + } +| SimpleExpr pipes SimpleExpr + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.Concat), Args: []ast.ExprNode{$1, $3}} + } +| not2 SimpleExpr %prec neg + { + $$ = &ast.UnaryOperationExpr{Op: opcode.Not2, V: $2} + } +| SubSelect %prec neg +| '(' Expression ')' + { + startOffset := parser.startOffset(&yyS[yypt-1]) + endOffset := parser.endOffset(&yyS[yypt]) + expr := $2 + parser.setNodeText(expr, parser.src[startOffset:endOffset]) + $$ = &ast.ParenthesesExpr{Expr: expr} + } +| '(' ExpressionList ',' Expression ')' + { + values := append($2.([]ast.ExprNode), $4) + $$ = &ast.RowExpr{Values: values} + } +| "ROW" '(' ExpressionList ',' Expression ')' + { + values := append($3.([]ast.ExprNode), $5) + $$ = &ast.RowExpr{Values: values} + } +| "EXISTS" SubSelect + { + sq := $2.(*ast.SubqueryExpr) + sq.Exists = true + $$ = &ast.ExistsSubqueryExpr{Sel: sq} + } +| '{' Identifier Expression '}' + { + /* + * ODBC escape syntax. + * See https://dev.mysql.com/doc/refman/5.7/en/expressions.html + */ + tp := $3.GetType() + switch $2 { + case "d": + tp.SetCharset("") + tp.SetCollate("") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{$3}} + case "t": + tp.SetCharset("") + tp.SetCollate("") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{$3}} + case "ts": + tp.SetCharset("") + tp.SetCollate("") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{$3}} + default: + $$ = $3 + } + } +| "BINARY" SimpleExpr %prec neg + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = &ast.FuncCastExpr{ + Expr: $2, + Tp: tp, + FunctionType: ast.CastBinaryOperator, + } + } +| builtinCast '(' Expression "AS" CastType ArrayKwdOpt ')' + { + /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + isArray := $6.(bool) + tp.SetArray(isArray) + explicitCharset := parser.explicitCharset + if isArray && !explicitCharset && tp.GetCharset() != charset.CharsetBin { + tp.SetCharset(charset.CharsetUTF8MB4) + tp.SetCollate(charset.CollationUTF8MB4) + } + parser.explicitCharset = false + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastFunction, + ExplicitCharSet: explicitCharset, + } + } +| jsonSumCrc32 '(' Expression "AS" CastType "ARRAY" ')' + { + /* Copied from CAST function, except that ARRAY is enforced to be true */ + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + tp.SetArray(true) + explicitCharset := parser.explicitCharset + if !explicitCharset && tp.GetCharset() != charset.CharsetBin { + tp.SetCharset(charset.CharsetUTF8MB4) + tp.SetCollate(charset.CollationUTF8MB4) + } + parser.explicitCharset = false + $$ = &ast.JSONSumCrc32Expr{ + Expr: $3, + Tp: tp, + ExplicitCharSet: explicitCharset, + } + } +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" + { + x := &ast.CaseExpr{WhenClauses: $3.([]*ast.WhenClause)} + if $2 != nil { + x.Value = $2 + } + if $4 != nil { + x.ElseClause = $4.(ast.ExprNode) + } + $$ = x + } +| "CONVERT" '(' Expression ',' CastType ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + tp := $5.(*types.FieldType) + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(defaultFlen) + } + if tp.GetDecimal() == types.UnspecifiedLength { + tp.SetDecimal(defaultDecimal) + } + explicitCharset := parser.explicitCharset + parser.explicitCharset = false + $$ = &ast.FuncCastExpr{ + Expr: $3, + Tp: tp, + FunctionType: ast.CastConvertFunction, + ExplicitCharSet: explicitCharset, + } + } +| "CONVERT" '(' Expression "USING" CharsetName ')' + { + // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert + charset1 := ast.NewValueExpr($5, "", "") + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, charset1}, + } + } +| "DEFAULT" '(' SimpleIdent ')' + { + $$ = &ast.DefaultExpr{Name: $3.(*ast.ColumnNameExpr).Name} + } +| "VALUES" '(' SimpleIdent ')' %prec lowerThanInsertValues + { + $$ = &ast.ValuesExpr{Column: $3.(*ast.ColumnNameExpr)} + } +| SimpleIdent jss stringLit + { + expr := ast.NewValueExpr($3, parser.charset, parser.collation) + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + } +| SimpleIdent juss stringLit + { + expr := ast.NewValueExpr($3, parser.charset, parser.collation) + extract := &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{$1, expr}} + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.JSONUnquote), Args: []ast.ExprNode{extract}} + } + +ArrayKwdOpt: + { + $$ = false + } +| "ARRAY" + { + $$ = true + } + +DistinctKwd: + "DISTINCT" +| "DISTINCTROW" + +DistinctOpt: + "ALL" + { + $$ = false + } +| DistinctKwd + { + $$ = true + } + +DefaultFalseDistinctOpt: + { + $$ = false + } +| DistinctOpt + +DefaultTrueDistinctOpt: + { + $$ = true + } +| DistinctOpt + +BuggyDefaultFalseDistinctOpt: + DefaultFalseDistinctOpt +| DistinctKwd "ALL" + { + $$ = true + } + +FunctionNameConflict: + FunctionNameConflictNonNow +| builtinNow + +// FunctionNameConflictNonNow is split out so that BuiltinFunction (the +// DEFAULT-expression grammar) can accept keyword-named functions without +// swallowing NOW(), which DefaultValueExpr folds to CURRENT_TIMESTAMP via +// NowSymOptionFractionParentheses. +FunctionNameConflictNonNow: + "ASCII" +| "CHARSET" +| "COALESCE" +| "COLLATION" +| "DATE" +| "DATABASE" +| "DAY" +| "GEOMETRYCOLLECTION" +| "HOUR" +| "IF" +| "INTERVAL" +| "LINESTRING" +| "LOG" +| "FORMAT" +| "LEFT" +| "MICROSECOND" +| "MINUTE" +| "MONTH" +| "MULTILINESTRING" +| "MULTIPOINT" +| "MULTIPOLYGON" +| "POINT" +| "POLYGON" +| "QUARTER" +| "REPEAT" +| "REPLACE" +| "REVERSE" +| "RIGHT" +| "ROW_COUNT" +| "SECOND" +| "TIME" +| "TIMESTAMP" +| "TRUNCATE" +| "USER" +| "WEEK" +| "YEAR" + +OptionalBraces: + {} +| '(' ')' + {} + +FunctionNameOptionalBraces: + "CURRENT_USER" +| "CURRENT_DATE" +| "CURRENT_ROLE" +| "UTC_DATE" + +FunctionNameDatetimePrecision: + "CURRENT_TIME" +| "CURRENT_TIMESTAMP" +| "LOCALTIME" +| "LOCALTIMESTAMP" +| "UTC_TIME" +| "UTC_TIMESTAMP" + +FunctionCallKeyword: + FunctionNameConflict '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinUser '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameOptionalBraces OptionalBraces + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1)} + } +| builtinCurDate '(' ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1)} + } +| FunctionNameDatetimePrecision FuncDatetimePrec + { + args := []ast.ExprNode{} + if $2 != nil { + args = append(args, $2.(ast.ExprNode)) + } + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: args} + } +| "CHAR" '(' ExpressionList ')' + { + nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(ast.CharFunc), + Args: append(args, nilVal), + } + } +| "CHAR" '(' ExpressionList "USING" CharsetName ')' + { + charset1 := ast.NewValueExpr($5, "", "") + args := $3.([]ast.ExprNode) + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr(ast.CharFunc), + Args: append(args, charset1), + } + } +| "DATE" stringLit + { + expr := ast.NewValueExpr($2, "", "") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} + } +| "TIME" stringLit + { + expr := ast.NewValueExpr($2, "", "") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} + } +| "TIMESTAMP" stringLit + { + expr := ast.NewValueExpr($2, "", "") + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} + } +| "INSERT" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.InsertFunc), Args: $3.([]ast.ExprNode)} + } +| "MOD" '(' Expression ',' Expression ')' + { + $$ = &ast.BinaryOperationExpr{Op: opcode.Mod, L: $3, R: $5} + } +| "PASSWORD" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr(ast.PasswordFunc), Args: $3.([]ast.ExprNode)} + } + +FunctionCallNonKeyword: + builtinCurTime '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| builtinSysDate '(' FuncDatetimePrecListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } +| FunctionNameDateArithMultiForms '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $5, + &ast.TimeUnitExpr{Unit: ast.TimeUnitDay}, + }, + } + } +| FunctionNameDateArithMultiForms '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + &ast.TimeUnitExpr{Unit: $7.(ast.TimeUnitType)}, + }, + } + } +| FunctionNameDateArith '(' Expression ',' "INTERVAL" Expression TimeUnit ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{ + $3, + $6, + &ast.TimeUnitExpr{Unit: $7.(ast.TimeUnitType)}, + }, + } + } +| builtinExtract '(' TimeUnit "FROM" Expression ')' + { + timeUnit := &ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)} + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{timeUnit, $5}, + } + } +| "GET_FORMAT" '(' GetFormatSelector ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{ + &ast.GetFormatSelectorExpr{Selector: $3.(ast.GetFormatSelectorType)}, + $5, + }, + } + } +| builtinPosition '(' BitExpr "IN" Expression ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: []ast.ExprNode{$3, $5}} + } +| builtinSubstring '(' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, $5}, + } + } +| builtinSubstring '(' Expression ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| builtinSubstring '(' Expression "FROM" Expression "FOR" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| "TIMESTAMPADD" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)}, $5, $7}, + } + } +| "TIMESTAMPDIFF" '(' TimestampUnit ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: $3.(ast.TimeUnitType)}, $5, $7}, + } + } +| builtinTrim '(' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3}, + } + } +| builtinTrim '(' Expression "FROM" Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$5, $3}, + } + } +| builtinTrim '(' TrimDirection "FROM" Expression ')' + { + spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) + direction := &ast.TrimDirectionExpr{Direction: $3.(ast.TrimDirectionType)} + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$5, spaceVal, direction}, + } + } +| builtinTrim '(' TrimDirection Expression "FROM" Expression ')' + { + direction := &ast.TrimDirectionExpr{Direction: $3.(ast.TrimDirectionType)} + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$6, $4, direction}, + } + } +| weightString '(' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3}, + } + } +| weightString '(' Expression "AS" Char FieldLen ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, ast.NewValueExpr("CHAR", parser.charset, parser.collation), ast.NewValueExpr($6, parser.charset, parser.collation)}, + } + } +| weightString '(' Expression "AS" "BINARY" FieldLen ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, ast.NewValueExpr("BINARY", parser.charset, parser.collation), ast.NewValueExpr($6, parser.charset, parser.collation)}, + } + } +| builtinTranslate '(' Expression ',' Expression ',' Expression ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: []ast.ExprNode{$3, $5, $7}, + } + } +| "COMPRESS" '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{FnName: ast.NewCIStr($1), Args: $3.([]ast.ExprNode)} + } + +GetFormatSelector: + "DATE" + { + $$ = ast.GetFormatSelectorDate + } +| "DATETIME" + { + $$ = ast.GetFormatSelectorDatetime + } +| "TIME" + { + $$ = ast.GetFormatSelectorTime + } +| "TIMESTAMP" + { + $$ = ast.GetFormatSelectorDatetime + } + +FunctionNameDateArith: + builtinDateAdd +| builtinDateSub + +FunctionNameDateArithMultiForms: + addDate +| subDate + +TrimDirection: + "BOTH" + { + $$ = ast.TrimBoth + } +| "LEADING" + { + $$ = ast.TrimLeading + } +| "TRAILING" + { + $$ = ast.TrimTrailing + } + +SumExpr: + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinApproxCountDistinct '(' ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $3.([]ast.ExprNode), Distinct: false} + } +| builtinApproxPercentile '(' ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $3.([]ast.ExprNode)} + } +| builtinBitAnd '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } + } +| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } + } +| builtinBitOr '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } + } +| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } + } +| builtinBitXor '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } + } +| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } + } +| builtinCount '(' DistinctKwd ExpressionList ')' + { + $$ = &ast.AggregateFuncExpr{F: $1, Args: $4.([]ast.ExprNode), Distinct: true} + } +| builtinCount '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } + } +| builtinCount '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } + } +| builtinCount '(' '*' ')' OptWindowingClause + { + args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: args, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: args} + } + } +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' OptWindowingClause + { + args := $4.([]ast.ExprNode) + args = append(args, $6.(ast.ExprNode)) + if $8 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: args, Distinct: $3.(bool), Spec: *($8.(*ast.WindowSpec))} + } else { + agg := &ast.AggregateFuncExpr{F: $1, Args: args, Distinct: $3.(bool)} + if $5 != nil { + agg.Order = $5.(*ast.OrderByClause) + } + $$ = agg + } + } +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: ast.AggFuncStddevPop, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: ast.AggFuncVarPop, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool), Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}, Distinct: $3.(bool)} + } + } +| "JSON_ARRAYAGG" '(' Expression ')' OptWindowingClause + { + if $5 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: *($5.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3}} + } + } +| "JSON_ARRAYAGG" '(' "ALL" Expression ')' OptWindowingClause + { + if $6 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4}, Spec: *($6.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4}} + } + } +| "JSON_OBJECTAGG" '(' Expression ',' Expression ')' OptWindowingClause + { + if $7 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3, $5}, Spec: *($7.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3, $5}} + } + } +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' Expression ')' OptWindowingClause + { + if $8 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4, $6}, Spec: *($8.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4, $6}} + } + } +| "JSON_OBJECTAGG" '(' Expression ',' "ALL" Expression ')' OptWindowingClause + { + if $8 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3, $6}, Spec: *($8.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$3, $6}} + } + } +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' "ALL" Expression ')' OptWindowingClause + { + if $9 != nil { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$4, $7}, Spec: *($9.(*ast.WindowSpec))} + } else { + $$ = &ast.AggregateFuncExpr{F: $1, Args: []ast.ExprNode{$4, $7}} + } + } + +OptGConcatSeparator: + { + $$ = ast.NewValueExpr(",", parser.charset, parser.collation) + } +| "SEPARATOR" stringLit + { + $$ = ast.NewValueExpr($2, parser.charset, parser.collation) + } + +FunctionCallGeneric: + identifier '(' ExpressionListOpt ')' + { + $$ = &ast.FuncCallExpr{ + FnName: ast.NewCIStr($1), + Args: $3.([]ast.ExprNode), + } + } +| Identifier '.' Identifier '(' ExpressionListOpt ')' + { + var tp ast.FuncCallExprType + if isInTokenMap($3) { + tp = ast.FuncCallExprTypeKeyword + } else { + tp = ast.FuncCallExprTypeGeneric + } + $$ = &ast.FuncCallExpr{ + Tp: tp, + Schema: ast.NewCIStr($1), + FnName: ast.NewCIStr($3), + Args: $5.([]ast.ExprNode), + } + } + +FuncDatetimePrec: + { + $$ = nil + } +| '(' ')' + { + $$ = nil + } +| '(' intLit ')' + { + expr := ast.NewValueExpr($2, parser.charset, parser.collation) + $$ = expr + } + +TimeUnit: + TimestampUnit +| "SECOND_MICROSECOND" + { + $$ = ast.TimeUnitSecondMicrosecond + } +| "MINUTE_MICROSECOND" + { + $$ = ast.TimeUnitMinuteMicrosecond + } +| "MINUTE_SECOND" + { + $$ = ast.TimeUnitMinuteSecond + } +| "HOUR_MICROSECOND" + { + $$ = ast.TimeUnitHourMicrosecond + } +| "HOUR_SECOND" + { + $$ = ast.TimeUnitHourSecond + } +| "HOUR_MINUTE" + { + $$ = ast.TimeUnitHourMinute + } +| "DAY_MICROSECOND" + { + $$ = ast.TimeUnitDayMicrosecond + } +| "DAY_SECOND" + { + $$ = ast.TimeUnitDaySecond + } +| "DAY_MINUTE" + { + $$ = ast.TimeUnitDayMinute + } +| "DAY_HOUR" + { + $$ = ast.TimeUnitDayHour + } +| "YEAR_MONTH" + { + $$ = ast.TimeUnitYearMonth + } + +TimestampUnit: + "MICROSECOND" + { + $$ = ast.TimeUnitMicrosecond + } +| "SECOND" + { + $$ = ast.TimeUnitSecond + } +| "MINUTE" + { + $$ = ast.TimeUnitMinute + } +| "HOUR" + { + $$ = ast.TimeUnitHour + } +| "DAY" + { + $$ = ast.TimeUnitDay + } +| "WEEK" + { + $$ = ast.TimeUnitWeek + } +| "MONTH" + { + $$ = ast.TimeUnitMonth + } +| "QUARTER" + { + $$ = ast.TimeUnitQuarter + } +| "YEAR" + { + $$ = ast.TimeUnitYear + } +| "SQL_TSI_SECOND" + { + $$ = ast.TimeUnitSecond + } +| "SQL_TSI_MINUTE" + { + $$ = ast.TimeUnitMinute + } +| "SQL_TSI_HOUR" + { + $$ = ast.TimeUnitHour + } +| "SQL_TSI_DAY" + { + $$ = ast.TimeUnitDay + } +| "SQL_TSI_WEEK" + { + $$ = ast.TimeUnitWeek + } +| "SQL_TSI_MONTH" + { + $$ = ast.TimeUnitMonth + } +| "SQL_TSI_QUARTER" + { + $$ = ast.TimeUnitQuarter + } +| "SQL_TSI_YEAR" + { + $$ = ast.TimeUnitYear + } + +ExpressionOpt: + { + $$ = nil + } +| Expression + +WhenClauseList: + WhenClause + { + $$ = []*ast.WhenClause{$1.(*ast.WhenClause)} + } +| WhenClauseList WhenClause + { + $$ = append($1.([]*ast.WhenClause), $2.(*ast.WhenClause)) + } + +WhenClause: + "WHEN" Expression "THEN" Expression + { + $$ = &ast.WhenClause{ + Expr: $2, + Result: $4, + } + } + +ElseOpt: + /* empty */ + { + $$ = nil + } +| "ELSE" Expression + { + $$ = $2 + } + +CastType: + "BINARY" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeVarString) + tp.SetFlen($2.(int)) // TODO: Flen should be the flen of expression + if tp.GetFlen() != types.UnspecifiedLength { + tp.SetType(mysql.TypeString) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| Char OptFieldLen OptBinary + { + tp := types.NewFieldType(mysql.TypeVarString) + tp.SetFlen($2.(int)) // TODO: Flen should be the flen of expression + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + } else if tp.GetCharset() != "" { + co, err := charset.GetDefaultCollation(tp.GetCharset()) + if err != nil { + yylex.AppendError(yylex.Errorf("Get collation error for charset: %s", tp.GetCharset())) + return 1 + } + tp.SetCollate(co) + parser.explicitCharset = true + } else { + tp.SetCharset(parser.charset) + tp.SetCollate(parser.collation) + } + $$ = tp + } +| "DATE" + { + tp := types.NewFieldType(mysql.TypeDate) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "YEAR" + { + tp := types.NewFieldType(mysql.TypeYear) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "DATETIME" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeDatetime) + flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) + tp.SetFlen(flen) + tp.SetDecimal($2.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "DECIMAL" FloatOpt + { + fopt := $2.(*ast.FloatOpt) + tp := types.NewFieldType(mysql.TypeNewDecimal) + tp.SetFlen(fopt.Flen) + tp.SetDecimal(fopt.Decimal) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "TIME" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeDuration) + flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) + tp.SetFlen(flen) + tp.SetDecimal($2.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "SIGNED" OptInteger + { + tp := types.NewFieldType(mysql.TypeLonglong) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "UNSIGNED" OptInteger + { + tp := types.NewFieldType(mysql.TypeLonglong) + tp.AddFlag(mysql.UnsignedFlag | mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "JSON" + { + tp := types.NewFieldType(mysql.TypeJSON) + tp.AddFlag(mysql.BinaryFlag | mysql.ParseToJSONFlag) + tp.SetCharset(mysql.DefaultCharset) + tp.SetCollate(mysql.DefaultCollationName) + $$ = tp + } +| "DOUBLE" + { + tp := types.NewFieldType(mysql.TypeDouble) + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "FLOAT" FloatOpt + { + tp := types.NewFieldType(mysql.TypeFloat) + fopt := $2.(*ast.FloatOpt) + if fopt.Flen >= 54 { + yylex.AppendError(ErrTooBigPrecision.GenByArgs(fopt.Flen, "CAST", 53)) + } else if fopt.Flen >= 25 { + tp = types.NewFieldType(mysql.TypeDouble) + } + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "REAL" + { + var tp *types.FieldType + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + tp = types.NewFieldType(mysql.TypeFloat) + } else { + tp = types.NewFieldType(mysql.TypeDouble) + } + flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(tp.GetType()) + tp.SetFlen(flen) + tp.SetDecimal(decimal) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } + +Priority: + "LOW_PRIORITY" + { + $$ = mysql.LowPriority + } +| "HIGH_PRIORITY" + { + $$ = mysql.HighPriority + } +| "DELAYED" + { + $$ = mysql.DelayedPriority + } + +PriorityOpt: + { + $$ = mysql.NoPriority + } +| Priority + +TableName: + Identifier + { + $$ = &ast.TableName{Name: ast.NewCIStr($1)} + } +| Identifier '.' Identifier + { + schema := $1 + if isInCorrectIdentifierName(schema) { + yylex.AppendError(ErrWrongDBName.GenByArgs(schema)) + return 1 + } + $$ = &ast.TableName{Schema: ast.NewCIStr(schema), Name: ast.NewCIStr($3)} + } +| '*' '.' Identifier + { + $$ = &ast.TableName{Schema: ast.NewCIStr("*"), Name: ast.NewCIStr($3)} + } + +TableNameList: + TableName + { + tbl := []*ast.TableName{$1.(*ast.TableName)} + $$ = tbl + } +| TableNameList ',' TableName + { + $$ = append($1.([]*ast.TableName), $3.(*ast.TableName)) + } + +TableNameOptWild: + Identifier OptWild + { + $$ = &ast.TableName{Name: ast.NewCIStr($1)} + } +| Identifier '.' Identifier OptWild + { + $$ = &ast.TableName{Schema: ast.NewCIStr($1), Name: ast.NewCIStr($3)} + } + +TableAliasRefList: + TableNameOptWild + { + tbl := []*ast.TableName{$1.(*ast.TableName)} + $$ = tbl + } +| TableAliasRefList ',' TableNameOptWild + { + $$ = append($1.([]*ast.TableName), $3.(*ast.TableName)) + } + +OptWild: + %prec empty + {} +| '.' '*' + {} + +QuickOptional: + %prec empty + { + $$ = false + } +| "QUICK" + { + $$ = true + } + +/***************************Prepared Statement Start****************************** + * See https://dev.mysql.com/doc/refman/5.7/en/prepare.html + * Example: + * PREPARE stmt_name FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * OR + * SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; + * PREPARE stmt_name FROM @s; + */ +PreparedStmt: + "PREPARE" Identifier "FROM" PrepareSQL + { + var sqlText string + var sqlVar *ast.VariableExpr + switch x := $4.(type) { + case string: + sqlText = x + case *ast.VariableExpr: + sqlVar = x + } + $$ = &ast.PrepareStmt{ + Name: $2, + SQLText: sqlText, + SQLVar: sqlVar, + } + } + +PrepareSQL: + stringLit + { + $$ = $1 + } +| UserVariable + { + $$ = $1 + } + +/* + * See https://dev.mysql.com/doc/refman/5.7/en/execute.html + * Example: + * EXECUTE stmt1 USING @a, @b; + * OR + * EXECUTE stmt1; + */ +ExecuteStmt: + "EXECUTE" Identifier + { + $$ = &ast.ExecuteStmt{Name: $2} + } +| "EXECUTE" Identifier "USING" UserVariableList + { + $$ = &ast.ExecuteStmt{ + Name: $2, + UsingVars: $4.([]ast.ExprNode), + } + } + +UserVariableList: + UserVariable + { + $$ = []ast.ExprNode{$1} + } +| UserVariableList ',' UserVariable + { + $$ = append($1.([]ast.ExprNode), $3) + } + +DeallocateStmt: + DeallocateSym "PREPARE" Identifier + { + $$ = &ast.DeallocateStmt{Name: $3} + } + +DeallocateSym: + "DEALLOCATE" +| "DROP" + +RollbackStmt: + "ROLLBACK" WorkOpt + { + $$ = &ast.RollbackStmt{} + } +| "ROLLBACK" WorkOpt CompletionTypeWithinTransaction + { + $$ = &ast.RollbackStmt{CompletionType: $3.(ast.CompletionType)} + } +| "ROLLBACK" WorkOpt "TO" Identifier + { + $$ = &ast.RollbackStmt{SavepointName: $4} + } +| "ROLLBACK" WorkOpt "TO" "SAVEPOINT" Identifier + { + $$ = &ast.RollbackStmt{SavepointName: $5} + } + +CompletionTypeWithinTransaction: + "AND" "CHAIN" "NO" "RELEASE" + { + $$ = ast.CompletionTypeChain + } +| "AND" "NO" "CHAIN" "RELEASE" + { + $$ = ast.CompletionTypeRelease + } +| "AND" "NO" "CHAIN" "NO" "RELEASE" + { + $$ = ast.CompletionTypeDefault + } +| "AND" "CHAIN" + { + $$ = ast.CompletionTypeChain + } +| "AND" "NO" "CHAIN" + { + $$ = ast.CompletionTypeDefault + } +| "RELEASE" + { + $$ = ast.CompletionTypeRelease + } +| "NO" "RELEASE" + { + $$ = ast.CompletionTypeDefault + } + +ShutdownStmt: + "SHUTDOWN" + { + $$ = &ast.ShutdownStmt{} + } + +RestartStmt: + "RESTART" + { + $$ = &ast.RestartStmt{} + } + +SelectStmtBasic: + "SELECT" SelectStmtOpts SelectStmtFieldList HavingClause + { + st := &ast.SelectStmt{ + SelectStmtOpts: $2.(*ast.SelectStmtOpts), + Distinct: $2.(*ast.SelectStmtOpts).Distinct, + Fields: $3.(*ast.FieldList), + Kind: ast.SelectStmtKindSelect, + } + if st.SelectStmtOpts.TableHints != nil { + st.TableHints = st.SelectStmtOpts.TableHints + } + if $4 != nil { + st.Having = $4.(*ast.HavingClause) + } + $$ = st + } + +SelectStmtFromDualTable: + SelectStmtBasic FromDual WhereClauseOptional + { + st := $1.(*ast.SelectStmt) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := yyS[yypt-1].offset - 1 + parser.setNodeText(lastField, parser.src[lastField.Offset:lastEnd]) + } + if $3 != nil { + st.Where = $3.(ast.ExprNode) + } + } + +SelectStmtFromTable: + SelectStmtBasic "FROM" TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause WindowClauseOptional + { + st := $1.(*ast.SelectStmt) + st.From = $3.(*ast.TableRefsClause) + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Expr != nil && lastField.AsName.O == "" { + lastEnd := parser.endOffset(&yyS[yypt-5]) + parser.setNodeText(lastField, parser.src[lastField.Offset:lastEnd]) + } + if $4 != nil { + st.Where = $4.(ast.ExprNode) + } + if $5 != nil { + st.GroupBy = $5.(*ast.GroupByClause) + } + if $6 != nil { + st.Having = $6.(*ast.HavingClause) + } + if $7 != nil { + st.WindowSpecs = ($7.([]ast.WindowSpec)) + } + $$ = st + } + +SelectStmt: + SelectStmtBasic WhereClauseOptional SelectStmtGroup OrderByOptional SelectStmtLimitOpt SelectLockOpt SelectStmtIntoOption + { + st := $1.(*ast.SelectStmt) + if $6 != nil { + st.LockInfo = $6.(*ast.SelectLockInfo) + } + if $2 != nil { + st.Where = $2.(ast.ExprNode) + } + if $3 != nil { + st.GroupBy = $3.(*ast.GroupByClause) + } + if $4 != nil { + st.OrderBy = $4.(*ast.OrderByClause) + } + if $5 != nil { + st.Limit = $5.(*ast.Limit) + } + if $7 != nil { + st.SelectIntoOpt = $7.(*ast.SelectIntoOption) + } + $$ = st + } +| SelectStmtFromDualTable SelectStmtGroup OrderByOptional SelectStmtLimitOpt SelectLockOpt SelectStmtIntoOption + { + st := $1.(*ast.SelectStmt) + if $2 != nil { + st.GroupBy = $2.(*ast.GroupByClause) + } + if $3 != nil { + st.OrderBy = $3.(*ast.OrderByClause) + } + if $4 != nil { + st.Limit = $4.(*ast.Limit) + } + if $5 != nil { + st.LockInfo = $5.(*ast.SelectLockInfo) + } + if $6 != nil { + st.SelectIntoOpt = $6.(*ast.SelectIntoOption) + } + $$ = st + } +| SelectStmtFromTable OrderByOptional SelectStmtLimitOpt SelectLockOpt SelectStmtIntoOption + { + st := $1.(*ast.SelectStmt) + if $4 != nil { + st.LockInfo = $4.(*ast.SelectLockInfo) + } + if $2 != nil { + st.OrderBy = $2.(*ast.OrderByClause) + } + if $3 != nil { + st.Limit = $3.(*ast.Limit) + } + if $5 != nil { + st.SelectIntoOpt = $5.(*ast.SelectIntoOption) + } + $$ = st + } +| "TABLE" TableName OrderByOptional SelectStmtLimitOpt SelectLockOpt SelectStmtIntoOption + { + st := &ast.SelectStmt{ + Kind: ast.SelectStmtKindTable, + Fields: &ast.FieldList{Fields: []*ast.SelectField{{WildCard: &ast.WildCardField{}}}}, + } + ts := &ast.TableSource{Source: $2.(*ast.TableName)} + st.From = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} + if $3 != nil { + st.OrderBy = $3.(*ast.OrderByClause) + } + if $4 != nil { + st.Limit = $4.(*ast.Limit) + } + if $5 != nil { + st.LockInfo = $5.(*ast.SelectLockInfo) + } + if $6 != nil { + st.SelectIntoOpt = $6.(*ast.SelectIntoOption) + } + $$ = st + } +| "VALUES" ValuesStmtList OrderByOptional SelectStmtLimitOpt SelectLockOpt SelectStmtIntoOption + { + st := &ast.SelectStmt{ + Kind: ast.SelectStmtKindValues, + Fields: &ast.FieldList{Fields: []*ast.SelectField{{WildCard: &ast.WildCardField{}}}}, + Lists: $2.([]*ast.RowExpr), + } + if $3 != nil { + st.OrderBy = $3.(*ast.OrderByClause) + } + if $4 != nil { + st.Limit = $4.(*ast.Limit) + } + if $5 != nil { + st.LockInfo = $5.(*ast.SelectLockInfo) + } + if $6 != nil { + st.SelectIntoOpt = $6.(*ast.SelectIntoOption) + } + $$ = st + } + +SelectStmtWithClause: + WithClause SelectStmt + { + sel := $2.(*ast.SelectStmt) + sel.With = $1.(*ast.WithClause) + $$ = sel + } +| WithClause SubSelect + { + var sel ast.StmtNode + switch x := $2.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + x.WithBeforeBraces = true + x.With = $1.(*ast.WithClause) + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + x.With = $1.(*ast.WithClause) + sel = x + } + $$ = sel + } + +WithClause: + "WITH" WithList + { + $$ = $2 + } +| "WITH" recursive WithList + { + ws := $3.(*ast.WithClause) + ws.IsRecursive = true + for _, cte := range ws.CTEs { + cte.IsRecursive = true + } + $$ = ws + } + +WithList: + WithList ',' CommonTableExpr + { + ws := $1.(*ast.WithClause) + ws.CTEs = append(ws.CTEs, $3.(*ast.CommonTableExpression)) + $$ = ws + } +| CommonTableExpr + { + ws := &ast.WithClause{} + ws.CTEs = make([]*ast.CommonTableExpression, 0, 4) + ws.CTEs = append(ws.CTEs, $1.(*ast.CommonTableExpression)) + $$ = ws + } + +CommonTableExpr: + Identifier IdentListWithParenOpt "AS" SubSelect + { + cte := &ast.CommonTableExpression{} + cte.Name = ast.NewCIStr($1) + cte.ColNameList = $2.([]ast.CIStr) + cte.Query = $4.(*ast.SubqueryExpr) + $$ = cte + } + +FromDual: + "FROM" "DUAL" + +WindowClauseOptional: + { + $$ = nil + } +| "WINDOW" WindowDefinitionList + { + $$ = $2.([]ast.WindowSpec) + } + +WindowDefinitionList: + WindowDefinition + { + $$ = []ast.WindowSpec{$1.(ast.WindowSpec)} + } +| WindowDefinitionList ',' WindowDefinition + { + $$ = append($1.([]ast.WindowSpec), $3.(ast.WindowSpec)) + } + +WindowDefinition: + WindowName "AS" WindowSpec + { + var spec = $3.(ast.WindowSpec) + spec.Name = $1.(ast.CIStr) + $$ = spec + } + +WindowName: + Identifier + { + $$ = ast.NewCIStr($1) + } + +WindowSpec: + '(' WindowSpecDetails ')' + { + $$ = $2.(ast.WindowSpec) + } + +WindowSpecDetails: + OptExistingWindowName OptPartitionClause OptWindowOrderByClause OptWindowFrameClause + { + spec := ast.WindowSpec{Ref: $1.(ast.CIStr)} + if $2 != nil { + spec.PartitionBy = $2.(*ast.PartitionByClause) + } + if $3 != nil { + spec.OrderBy = $3.(*ast.OrderByClause) + } + if $4 != nil { + spec.Frame = $4.(*ast.FrameClause) + } + $$ = spec + } + +OptExistingWindowName: + { + $$ = ast.CIStr{} + } +| WindowName + +OptPartitionClause: + { + $$ = nil + } +| "PARTITION" "BY" ByList + { + $$ = &ast.PartitionByClause{Items: $3.([]*ast.ByItem)} + } + +OptWindowOrderByClause: + { + $$ = nil + } +| "ORDER" "BY" ByList + { + $$ = &ast.OrderByClause{Items: $3.([]*ast.ByItem)} + } + +OptWindowFrameClause: + { + $$ = nil + } +| WindowFrameUnits WindowFrameExtent + { + $$ = &ast.FrameClause{ + Type: $1.(ast.FrameType), + Extent: $2.(ast.FrameExtent), + } + } + +WindowFrameUnits: + "ROWS" + { + $$ = ast.FrameType(ast.Rows) + } +| "RANGE" + { + $$ = ast.FrameType(ast.Ranges) + } +| "GROUPS" + { + $$ = ast.FrameType(ast.Groups) + } + +WindowFrameExtent: + WindowFrameStart + { + $$ = ast.FrameExtent{ + Start: $1.(ast.FrameBound), + End: ast.FrameBound{Type: ast.CurrentRow}, + } + } +| WindowFrameBetween + +WindowFrameStart: + "UNBOUNDED" "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, UnBounded: true} + } +| NumLiteral "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr($1, parser.charset, parser.collation)} + } +| paramMarker "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } +| "INTERVAL" Expression TimeUnit "PRECEDING" + { + $$ = ast.FrameBound{Type: ast.Preceding, Expr: $2, Unit: $3.(ast.TimeUnitType)} + } +| "CURRENT" "ROW" + { + $$ = ast.FrameBound{Type: ast.CurrentRow} + } + +WindowFrameBetween: + "BETWEEN" WindowFrameBound "AND" WindowFrameBound + { + $$ = ast.FrameExtent{Start: $2.(ast.FrameBound), End: $4.(ast.FrameBound)} + } + +WindowFrameBound: + WindowFrameStart +| "UNBOUNDED" "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, UnBounded: true} + } +| NumLiteral "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr($1, parser.charset, parser.collation)} + } +| paramMarker "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} + } +| "INTERVAL" Expression TimeUnit "FOLLOWING" + { + $$ = ast.FrameBound{Type: ast.Following, Expr: $2, Unit: $3.(ast.TimeUnitType)} + } + +OptWindowingClause: + { + $$ = nil + } +| WindowingClause + { + spec := $1.(ast.WindowSpec) + $$ = &spec + } + +WindowingClause: + "OVER" WindowNameOrSpec + { + $$ = $2.(ast.WindowSpec) + } + +WindowNameOrSpec: + WindowName + { + $$ = ast.WindowSpec{Name: $1.(ast.CIStr), OnlyAlias: true} + } +| WindowSpec + +WindowFuncCall: + "ROW_NUMBER" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Spec: $4.(ast.WindowSpec)} + } +| "RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Spec: $4.(ast.WindowSpec)} + } +| "DENSE_RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Spec: $4.(ast.WindowSpec)} + } +| "CUME_DIST" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Spec: $4.(ast.WindowSpec)} + } +| "PERCENT_RANK" '(' ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Spec: $4.(ast.WindowSpec)} + } +| "NTILE" '(' SimpleExpr ')' WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, Spec: $5.(ast.WindowSpec)} + } +| "LEAD" '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause + { + args := []ast.ExprNode{$3} + if $4 != nil { + args = append(args, $4.([]ast.ExprNode)...) + } + $$ = &ast.WindowFuncExpr{Name: $1, Args: args, IgnoreNull: $6.(bool), Spec: $7.(ast.WindowSpec)} + } +| "LAG" '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause + { + args := []ast.ExprNode{$3} + if $4 != nil { + args = append(args, $4.([]ast.ExprNode)...) + } + $$ = &ast.WindowFuncExpr{Name: $1, Args: args, IgnoreNull: $6.(bool), Spec: $7.(ast.WindowSpec)} + } +| "FIRST_VALUE" '(' Expression ')' OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, IgnoreNull: $5.(bool), Spec: $6.(ast.WindowSpec)} + } +| "LAST_VALUE" '(' Expression ')' OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3}, IgnoreNull: $5.(bool), Spec: $6.(ast.WindowSpec)} + } +| "NTH_VALUE" '(' Expression ',' SimpleExpr ')' OptFromFirstLast OptNullTreatment WindowingClause + { + $$ = &ast.WindowFuncExpr{Name: $1, Args: []ast.ExprNode{$3, $5}, FromLast: $7.(bool), IgnoreNull: $8.(bool), Spec: $9.(ast.WindowSpec)} + } + +OptLeadLagInfo: + { + $$ = nil + } +| ',' NumLiteral OptLLDefault + { + args := []ast.ExprNode{ast.NewValueExpr($2, parser.charset, parser.collation)} + if $3 != nil { + args = append(args, $3.(ast.ExprNode)) + } + $$ = args + } +| ',' paramMarker OptLLDefault + { + args := []ast.ExprNode{ast.NewParamMarkerExpr(yyS[yypt-1].offset)} + if $3 != nil { + args = append(args, $3.(ast.ExprNode)) + } + $$ = args + } + +OptLLDefault: + { + $$ = nil + } +| ',' Expression + { + $$ = $2 + } + +OptNullTreatment: + { + $$ = false + } +| "RESPECT" "NULLS" + { + $$ = false + } +| "IGNORE" "NULLS" + { + $$ = true + } + +OptFromFirstLast: + { + $$ = false + } +| "FROM" "FIRST" + { + $$ = false + } +| "FROM" "LAST" + { + $$ = true + } + +TableRefsClause: + TableRefs + { + $$ = &ast.TableRefsClause{TableRefs: $1.(*ast.Join)} + } + +TableRefs: + EscapedTableRef + { + if j, ok := $1.(*ast.Join); ok { + // if $1 is Join, use it directly + $$ = j + } else { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: nil} + } + } +| TableRefs ',' EscapedTableRef + { + /* from a, b is default cross join */ + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin} + } + +EscapedTableRef: + TableRef %prec lowerThanSetKeyword +| '{' Identifier TableRef '}' + { + /* + * ODBC escape syntax for outer join is { OJ join_table } + * Use an Identifier for OJ + */ + $$ = $3 + } + +TableRef: + TableFactor +| JoinTable + +TableFactor: + TableName PartitionNameListOpt TableAsNameOpt IndexHintListOpt + { + tn := $1.(*ast.TableName) + tn.PartitionNames = $2.([]ast.CIStr) + tn.IndexHints = $4.([]*ast.IndexHint) + $$ = &ast.TableSource{Source: tn, AsName: $3.(ast.CIStr)} + } +| SubSelect TableAsNameOpt + { + resultNode := $1.(*ast.SubqueryExpr).Query + $$ = &ast.TableSource{Source: resultNode, AsName: $2.(ast.CIStr)} + } +| "LATERAL" SubSelect TableAsName IdentListWithParenOpt + { + resultNode := $2.(*ast.SubqueryExpr).Query + ts := &ast.TableSource{Source: resultNode, AsName: $3.(ast.CIStr)} + ts.Lateral = true + ts.ColumnNames = $4.([]ast.CIStr) + $$ = ts + } +| '(' TableRefs ')' + { + j := $2.(*ast.Join) + j.ExplicitParens = true + $$ = $2 + } + +PartitionNameListOpt: + /* empty */ + { + $$ = []ast.CIStr{} + } +| "PARTITION" '(' PartitionNameList ')' + { + $$ = $3 + } + +TableAsNameOpt: + %prec empty + { + $$ = ast.CIStr{} + } +| TableAsName + +TableAsName: + Identifier + { + $$ = ast.NewCIStr($1) + } +| "AS" Identifier + { + $$ = ast.NewCIStr($2) + } + +IndexHintType: + "USE" KeyOrIndex + { + $$ = ast.HintUse + } +| "IGNORE" KeyOrIndex + { + $$ = ast.HintIgnore + } +| "FORCE" KeyOrIndex + { + $$ = ast.HintForce + } + +IndexHintScope: + { + $$ = ast.HintForScan + } +| "FOR" "JOIN" + { + $$ = ast.HintForJoin + } +| "FOR" "ORDER" "BY" + { + $$ = ast.HintForOrderBy + } +| "FOR" "GROUP" "BY" + { + $$ = ast.HintForGroupBy + } + +IndexHint: + IndexHintType IndexHintScope '(' IndexNameList ')' + { + $$ = &ast.IndexHint{ + IndexNames: $4.([]ast.CIStr), + HintType: $1.(ast.IndexHintType), + HintScope: $2.(ast.IndexHintScope), + } + } + +IndexNameList: + { + var nameList []ast.CIStr + $$ = nameList + } +| Identifier + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| IndexNameList ',' Identifier + { + $$ = append($1.([]ast.CIStr), ast.NewCIStr($3)) + } +| "PRIMARY" + { + $$ = []ast.CIStr{ast.NewCIStr($1)} + } +| IndexNameList ',' "PRIMARY" + { + $$ = append($1.([]ast.CIStr), ast.NewCIStr($3)) + } + +IndexHintList: + IndexHint + { + $$ = []*ast.IndexHint{$1.(*ast.IndexHint)} + } +| IndexHintList IndexHint + { + $$ = append($1.([]*ast.IndexHint), $2.(*ast.IndexHint)) + } + +IndexHintListOpt: + { + $$ = []*ast.IndexHint{} + } +| IndexHintList + +JoinTable: + /* Use %prec to evaluate production TableRef before cross join */ + TableRef CrossOpt TableRef %prec tableRefPriority + { + $$ = ast.NewCrossJoin($1.(ast.ResultSetNode), $3.(ast.ResultSetNode)) + } +| TableRef CrossOpt TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} + } +| TableRef CrossOpt TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), Tp: ast.CrossJoin, Using: $6.([]*ast.ColumnName)} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $7} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), On: on} + } +| TableRef JoinType OuterOpt "JOIN" TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $5.(ast.ResultSetNode), Tp: $2.(ast.JoinType), Using: $8.([]*ast.ColumnName)} + } +| TableRef "NATURAL" "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $4.(ast.ResultSetNode), NaturalJoin: true} + } +| TableRef "NATURAL" JoinType OuterOpt "JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $6.(ast.ResultSetNode), Tp: $3.(ast.JoinType), NaturalJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true} + } +| TableRef "STRAIGHT_JOIN" TableRef "ON" Expression + { + on := &ast.OnCondition{Expr: $5} + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true, On: on} + } +| TableRef "STRAIGHT_JOIN" TableRef "USING" '(' ColumnNameList ')' + { + $$ = &ast.Join{Left: $1.(ast.ResultSetNode), Right: $3.(ast.ResultSetNode), StraightJoin: true, Using: $6.([]*ast.ColumnName)} + } + +JoinType: + "LEFT" + { + $$ = ast.LeftJoin + } +| "RIGHT" + { + $$ = ast.RightJoin + } + +OuterOpt: + {} +| "OUTER" + +CrossOpt: + "JOIN" +| "CROSS" "JOIN" +| "INNER" "JOIN" + +LimitClause: + { + $$ = nil + } +| "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(*ast.ValueExpr)} + } + +LimitOption: + LengthNum + { + $$ = ast.NewValueExpr($1, parser.charset, parser.collation) + } +| paramMarker + { + $$ = ast.NewParamMarkerExpr(yyS[yypt].offset) + } + +RowOrRows: + "ROW" +| "ROWS" + +FirstOrNext: + "FIRST" +| "NEXT" + +FetchFirstOpt: + { + $$ = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) + } +| LimitOption + +SelectStmtLimit: + "LIMIT" LimitOption + { + $$ = &ast.Limit{Count: $2.(ast.ExprNode)} + } +| "LIMIT" LimitOption ',' LimitOption + { + $$ = &ast.Limit{Offset: $2.(ast.ExprNode), Count: $4.(ast.ExprNode)} + } +| "LIMIT" LimitOption "OFFSET" LimitOption + { + $$ = &ast.Limit{Offset: $4.(ast.ExprNode), Count: $2.(ast.ExprNode)} + } +| "FETCH" FirstOrNext FetchFirstOpt RowOrRows "ONLY" + { + $$ = &ast.Limit{Count: $3.(ast.ExprNode)} + } + +SelectStmtLimitOpt: + { + $$ = nil + } +| SelectStmtLimit + +SelectStmtOpt: + TableOptimizerHints + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.TableHints = $1.([]*ast.TableOptimizerHint) + $$ = opt + } +| DistinctOpt + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + if $1.(bool) { + opt.Distinct = true + } else { + opt.Distinct = false + opt.ExplicitAll = true + } + $$ = opt + } +| Priority + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.Priority = $1.(mysql.PriorityEnum) + $$ = opt + } +| "SQL_SMALL_RESULT" + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLSmallResult = true + $$ = opt + } +| "SQL_BIG_RESULT" + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLBigResult = true + $$ = opt + } +| "SQL_BUFFER_RESULT" + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.SQLBufferResult = true + $$ = opt + } +| SelectStmtSQLCache + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = $1.(bool) + $$ = opt + } +| "SQL_CALC_FOUND_ROWS" + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.CalcFoundRows = true + $$ = opt + } +| "STRAIGHT_JOIN" + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + opt.StraightJoin = true + $$ = opt + } + +SelectStmtOpts: + %prec empty + { + opt := &ast.SelectStmtOpts{} + opt.SQLCache = true + $$ = opt + } +| SelectStmtOptsList %prec lowerThanSelectOpt + +SelectStmtOptsList: + SelectStmtOptsList SelectStmtOpt + { + opts := $1.(*ast.SelectStmtOpts) + opt := $2.(*ast.SelectStmtOpts) + + // Merge options. + // Always use the first hint. + if opt.TableHints != nil && opts.TableHints == nil { + opts.TableHints = opt.TableHints + } + if opt.Distinct { + opts.Distinct = true + } + if opt.Priority != mysql.NoPriority { + opts.Priority = opt.Priority + } + if opt.SQLSmallResult { + opts.SQLSmallResult = true + } + if opt.SQLBigResult { + opts.SQLBigResult = true + } + if opt.SQLBufferResult { + opts.SQLBufferResult = true + } + if !opt.SQLCache { + opts.SQLCache = false + } + if opt.CalcFoundRows { + opts.CalcFoundRows = true + } + if opt.StraightJoin { + opts.StraightJoin = true + } + if opt.ExplicitAll { + opts.ExplicitAll = true + } + + if opts.Distinct && opts.ExplicitAll { + yylex.AppendError(ErrWrongUsage.GenByArgs("ALL", "DISTINCT")) + return 1 + } + + $$ = opts + } +| SelectStmtOpt + +TableOptimizerHints: + hintComment + { + hints, warns := parser.parseHint($1) + for _, w := range warns { + yylex.AppendError(w) + parser.lastErrorAsWarn() + } + $$ = hints + } + +TableOptimizerHintsOpt: + /* empty */ + { + $$ = nil + } +| TableOptimizerHints + +SelectStmtSQLCache: + "SQL_CACHE" + { + $$ = true + } +| "SQL_NO_CACHE" + { + $$ = false + } + +SelectStmtFieldList: + FieldList + { + $$ = &ast.FieldList{Fields: $1.([]*ast.SelectField)} + } + +SelectStmtGroup: + /* EMPTY */ + { + $$ = nil + } +| GroupByClause + +SelectStmtIntoOption: + { + $$ = nil + } +| "INTO" "OUTFILE" stringLit Fields Lines + { + x := &ast.SelectIntoOption{ + Tp: ast.SelectIntoOutfile, + FileName: $3, + } + if $4 != nil { + x.FieldsInfo = $4.(*ast.FieldsClause) + } + if $5 != nil { + x.LinesInfo = $5.(*ast.LinesClause) + } + + $$ = x + } + +// See https://dev.mysql.com/doc/refman/5.7/en/subqueries.html +SubSelect: + '(' SelectStmt ')' + { + rs := $2.(*ast.SelectStmt) + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + // See the implementation of yyParse function + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } +| '(' SetOprStmt ')' + { + rs := $2.(*ast.SetOprStmt) + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } +| '(' SelectStmtWithClause ')' + { + switch rs := $2.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + // See the implementation of yyParse function + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } + } +| '(' SubSelect ')' + { + subQuery := $2.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + parser.setNodeText(rs, src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } + } + +// See https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html +SelectLockOpt: + /* empty */ + { + $$ = nil + } +| "FOR" "UPDATE" OfTablesOpt + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdate, + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "SHARE" OfTablesOpt + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShare, + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "UPDATE" OfTablesOpt "NOWAIT" + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateNoWait, + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "UPDATE" OfTablesOpt "WAIT" NUM + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateWaitN, + WaitSec: getUint64FromNUM($5), + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "SHARE" OfTablesOpt "NOWAIT" + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShareNoWait, + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "UPDATE" OfTablesOpt "SKIP" "LOCKED" + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForUpdateSkipLocked, + Tables: $3.([]*ast.TableName), + } + } +| "FOR" "SHARE" OfTablesOpt "SKIP" "LOCKED" + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShareSkipLocked, + Tables: $3.([]*ast.TableName), + } + } +| "LOCK" "IN" "SHARE" "MODE" + { + $$ = &ast.SelectLockInfo{ + LockType: ast.SelectLockForShare, + Tables: []*ast.TableName{}, + } + } + +OfTablesOpt: + /* empty */ + { + $$ = []*ast.TableName{} + } +| "OF" TableNameList + { + $$ = $2.([]*ast.TableName) + } + +SetOprStmt: + SetOprStmtWoutLimitOrderBy +| SetOprStmtWithLimitOrderBy +| WithClause SetOprStmtWithLimitOrderBy + { + setOpr := $2.(*ast.SetOprStmt) + setOpr.With = $1.(*ast.WithClause) + $$ = setOpr + } +| WithClause SetOprStmtWoutLimitOrderBy + { + setOpr := $2.(*ast.SetOprStmt) + setOpr.With = $1.(*ast.WithClause) + $$ = setOpr + } + +// See https://dev.mysql.com/doc/refman/5.7/en/union.html +// INTERSECT and EXCEPT are supported by MySQL 8.0.31+. +// See https://dev.mysql.com/doc/refman/8.0/en/set-operations.html +SetOprStmtWoutLimitOrderBy: + SetOprClauseList SetOpr SelectStmt + { + setOprList1 := $1.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: $1.([]ast.Node)}} + st := $3.(*ast.SelectStmt) + setOpr.Limit = st.Limit + setOpr.OrderBy = st.OrderBy + st.Limit = nil + st.OrderBy = nil + st.AfterSetOperator = $2.(*ast.SetOprType) + setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) + $$ = setOpr + } +| SetOprClauseList SetOpr SubSelect + { + setOprList1 := $1.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := $3.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + // child setOprStmt's limit and order should also make sense + // we should separate it out from other normal SetOprSelectList. + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + $$ = setOpr + } + +SetOprStmtWithLimitOrderBy: + SetOprClauseList SetOpr SubSelect OrderBy + { + setOprList1 := $1.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := $3.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = $4.(*ast.OrderByClause) + $$ = setOpr + } +| SetOprClauseList SetOpr SubSelect SelectStmtLimit + { + setOprList1 := $1.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-2]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := $3.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.Limit = $4.(*ast.Limit) + $$ = setOpr + } +| SetOprClauseList SetOpr SubSelect OrderBy SelectStmtLimit + { + setOprList1 := $1.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-3]) + parser.setLastSelectFieldText(sel, endOffset) + } + var setOprList2 []ast.Node + var with2 *ast.WithClause + var limit2 *ast.Limit + var orderBy2 *ast.OrderByClause + switch x := $3.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList2 = []ast.Node{x} + with2 = x.With + case *ast.SetOprStmt: + setOprList2 = x.SelectList.Selects + with2 = x.With + limit2 = x.Limit + orderBy2 = x.OrderBy + } + nextSetOprList := &ast.SetOprSelectList{Selects: setOprList2, With: with2, Limit: limit2, OrderBy: orderBy2} + nextSetOprList.AfterSetOperator = $2.(*ast.SetOprType) + setOprList := append(setOprList1, nextSetOprList) + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = $4.(*ast.OrderByClause) + setOpr.Limit = $5.(*ast.Limit) + $$ = setOpr + } +| SubSelect OrderBy + { + var setOprList []ast.Node + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = $2.(*ast.OrderByClause) + $$ = setOpr + } +| SubSelect SelectStmtLimit + { + var setOprList []ast.Node + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.Limit = $2.(*ast.Limit) + $$ = setOpr + } +| SubSelect OrderBy SelectStmtLimit + { + var setOprList []ast.Node + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}, With: x.With}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} + setOpr.OrderBy = $2.(*ast.OrderByClause) + setOpr.Limit = $3.(*ast.Limit) + $$ = setOpr + } + +SetOprClauseList: + SetOprClause +| SetOprClauseList SetOpr SetOprClause + { + setOprList1 := $1.([]ast.Node) + setOprList2 := $3.([]ast.Node) + if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { + endOffset := parser.endOffset(&yyS[yypt-1]) + parser.setLastSelectFieldText(sel, endOffset) + } + switch x := setOprList2[0].(type) { + case *ast.SelectStmt: + x.AfterSetOperator = $2.(*ast.SetOprType) + case *ast.SetOprSelectList: + x.AfterSetOperator = $2.(*ast.SetOprType) + } + $$ = append(setOprList1, setOprList2...) + } + +SetOprClause: + SelectStmt + { + $$ = []ast.Node{$1.(*ast.SelectStmt)} + } +| SubSelect + { + var setOprList []ast.Node + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: []ast.Node{x}}} + case *ast.SetOprStmt: + setOprList = []ast.Node{&ast.SetOprSelectList{Selects: x.SelectList.Selects, With: x.With, Limit: x.Limit, OrderBy: x.OrderBy}} + } + $$ = setOprList + } + +SetOpr: + "UNION" SetOprOpt + { + var tp ast.SetOprType + tp = ast.Union + if $2 == false { + tp = ast.UnionAll + } + $$ = &tp + } +| "EXCEPT" SetOprOpt + { + var tp ast.SetOprType + tp = ast.Except + if $2 == false { + tp = ast.ExceptAll + } + $$ = &tp + } +| "INTERSECT" SetOprOpt + { + var tp ast.SetOprType + tp = ast.Intersect + if $2 == false { + tp = ast.IntersectAll + } + $$ = &tp + } + +SetOprOpt: + DefaultTrueDistinctOpt + +/********************Set Statement*******************************/ +SetStmt: + "SET" VariableAssignmentList + { + $$ = &ast.SetStmt{Variables: $2.([]*ast.VariableAssignment)} + } +| "SET" "PASSWORD" EqOrAssignmentEq PasswordOpt + { + $$ = &ast.SetPwdStmt{Password: $4} + } +| "SET" "PASSWORD" EqOrAssignmentEq PasswordOpt "RETAIN" "CURRENT" "PASSWORD" + { + $$ = &ast.SetPwdStmt{Password: $4, RetainCurrentPassword: true} + } +| "SET" "PASSWORD" "FOR" Username EqOrAssignmentEq PasswordOpt + { + $$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6} + } +| "SET" "PASSWORD" "FOR" Username EqOrAssignmentEq PasswordOpt "RETAIN" "CURRENT" "PASSWORD" + { + $$ = &ast.SetPwdStmt{User: $4.(*auth.UserIdentity), Password: $6, RetainCurrentPassword: true} + } +| "SET" "GLOBAL" "TRANSACTION" TransactionChars + { + vars := $4.([]*ast.VariableAssignment) + for _, v := range vars { + v.IsGlobal = true + } + $$ = &ast.SetStmt{Variables: vars} + } +| "SET" "SESSION" "TRANSACTION" TransactionChars + { + $$ = &ast.SetStmt{Variables: $4.([]*ast.VariableAssignment)} + } +| "SET" "TRANSACTION" TransactionChars + { + assigns := $3.([]*ast.VariableAssignment) + for i := 0; i < len(assigns); i++ { + if assigns[i].Name == "tx_isolation" { + // A special session variable that make setting tx_isolation take effect one time. + assigns[i].Name = "tx_isolation_one_shot" + } + } + $$ = &ast.SetStmt{Variables: assigns} + } + +SetRoleStmt: + "SET" "ROLE" SetRoleOpt + { + $$ = $3.(*ast.SetRoleStmt) + } + +SetDefaultRoleStmt: + "SET" "DEFAULT" "ROLE" SetDefaultRoleOpt "TO" UsernameList + { + tmp := $4.(*ast.SetRoleStmt) + $$ = &ast.SetDefaultRoleStmt{ + SetRoleOpt: tmp.SetRoleOpt, + RoleList: tmp.RoleList, + UserList: $6.([]*auth.UserIdentity), + } + } + +SetDefaultRoleOpt: + "NONE" + { + $$ = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} + } +| "ALL" + { + $$ = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} + } +| RolenameList + { + $$ = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: $1.([]*auth.RoleIdentity)} + } + +SetRoleOpt: + "ALL" "EXCEPT" RolenameList + { + $$ = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: $3.([]*auth.RoleIdentity)} + } +| SetDefaultRoleOpt +| "DEFAULT" + { + $$ = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} + } + +TransactionChars: + TransactionChar + { + if $1 != nil { + $$ = $1 + } else { + $$ = []*ast.VariableAssignment{} + } + } +| TransactionChars ',' TransactionChar + { + if $3 != nil { + varAssigns := $3.([]*ast.VariableAssignment) + $$ = append($1.([]*ast.VariableAssignment), varAssigns...) + } else { + $$ = $1 + } + } + +TransactionChar: + "ISOLATION" "LEVEL" IsolationLevel + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr($3, parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) + $$ = varAssigns + } +| "READ" "WRITE" + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("0", parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + $$ = varAssigns + } +| "READ" "ONLY" + { + varAssigns := []*ast.VariableAssignment{} + expr := ast.NewValueExpr("1", parser.charset, parser.collation) + varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) + $$ = varAssigns + } + +IsolationLevel: + "REPEATABLE" "READ" + { + $$ = ast.RepeatableRead + } +| "READ" "COMMITTED" + { + $$ = ast.ReadCommitted + } +| "READ" "UNCOMMITTED" + { + $$ = ast.ReadUncommitted + } +| "SERIALIZABLE" + { + $$ = ast.Serializable + } + +SetExpr: + "ON" + { + $$ = ast.NewValueExpr("ON", parser.charset, parser.collation) + } +| "BINARY" + { + $$ = ast.NewValueExpr("BINARY", parser.charset, parser.collation) + } +| ExprOrDefault + +EqOrAssignmentEq: + eq +| assignmentEq + +VariableName: + Identifier +| Identifier '.' Identifier + { + $$ = $1 + "." + $3 + } + +VariableAssignment: + VariableName EqOrAssignmentEq SetExpr + { + $$ = &ast.VariableAssignment{Name: $1, Value: $3, IsSystem: true} + } +| "GLOBAL" VariableName EqOrAssignmentEq SetExpr + { + $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsGlobal: true, IsSystem: true} + } +| "INSTANCE" VariableName EqOrAssignmentEq SetExpr + { + $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsInstance: true, IsSystem: true} + } +| "SESSION" VariableName EqOrAssignmentEq SetExpr + { + $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsSystem: true} + } +| "LOCAL" VariableName EqOrAssignmentEq SetExpr + { + $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsSystem: true} + } +| doubleAtIdentifier EqOrAssignmentEq SetExpr + { + v := strings.ToLower($1) + var isGlobal bool + var isInstance bool + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@instance.") { + isInstance = true + v = strings.TrimPrefix(v, "@@instance.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v = strings.TrimPrefix(v, "@@") + } + $$ = &ast.VariableAssignment{Name: v, Value: $3, IsGlobal: isGlobal, IsInstance: isInstance, IsSystem: true} + } +| singleAtIdentifier EqOrAssignmentEq Expression + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableAssignment{Name: v, Value: $3} + } +| "NAMES" CharsetName + { + $$ = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr($2, "", ""), + } + } +| "NAMES" CharsetName "COLLATE" "DEFAULT" + { + $$ = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr($2, "", ""), + } + } +| "NAMES" CharsetName "COLLATE" StringName + { + $$ = &ast.VariableAssignment{ + Name: ast.SetNames, + Value: ast.NewValueExpr($2, "", ""), + ExtendValue: ast.NewValueExpr($4, "", ""), + } + } +| "NAMES" "DEFAULT" + { + v := &ast.DefaultExpr{} + $$ = &ast.VariableAssignment{Name: ast.SetNames, Value: v} + } +| CharsetKw CharsetNameOrDefault + { + $$ = &ast.VariableAssignment{Name: ast.SetCharset, Value: $2} + } + +CharsetNameOrDefault: + CharsetName + { + $$ = ast.NewValueExpr($1, "", "") + } +| "DEFAULT" + { + $$ = &ast.DefaultExpr{} + } + +CharsetName: + StringName + { + // Validate input charset name to keep the same behavior as parser of MySQL. + cs, err := charset.GetCharsetInfo($1) + if err != nil { + yylex.AppendError(ErrUnknownCharacterSet.GenByArgs($1)) + return 1 + } + // Use charset name returned from charset.GetCharsetInfo(), + // to keep lower case of input for generated column restore. + $$ = cs.Name + } +| binaryType + { + $$ = charset.CharsetBin + } + +CollationName: + StringName + { + info, err := charset.GetCollationByName($1) + if err != nil { + yylex.AppendError(err) + return 1 + } + $$ = info.Name + } +| binaryType + { + $$ = charset.CollationBin + } + +VariableAssignmentList: + VariableAssignment + { + $$ = []*ast.VariableAssignment{$1.(*ast.VariableAssignment)} + } +| VariableAssignmentList ',' VariableAssignment + { + $$ = append($1.([]*ast.VariableAssignment), $3.(*ast.VariableAssignment)) + } + +Variable: + SystemVariable +| UserVariable + +SystemVariable: + doubleAtIdentifier + { + v := strings.ToLower($1) + var isGlobal bool + var isInstance bool + explicitScope := true + if strings.HasPrefix(v, "@@global.") { + isGlobal = true + v = strings.TrimPrefix(v, "@@global.") + } else if strings.HasPrefix(v, "@@instance.") { + isInstance = true + v = strings.TrimPrefix(v, "@@instance.") + } else if strings.HasPrefix(v, "@@session.") { + v = strings.TrimPrefix(v, "@@session.") + } else if strings.HasPrefix(v, "@@local.") { + v = strings.TrimPrefix(v, "@@local.") + } else if strings.HasPrefix(v, "@@") { + v, explicitScope = strings.TrimPrefix(v, "@@"), false + } + $$ = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsInstance: isInstance, IsSystem: true, ExplicitScope: explicitScope} + } + +UserVariable: + singleAtIdentifier + { + v := $1 + v = strings.TrimPrefix(v, "@") + $$ = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} + } + +Username: + StringName + { + $$ = &auth.UserIdentity{Username: $1, Hostname: "%"} + } +| StringName '@' StringName + { + $$ = &auth.UserIdentity{Username: $1, Hostname: strings.ToLower($3)} + } +| StringName singleAtIdentifier + { + $$ = &auth.UserIdentity{Username: $1, Hostname: strings.ToLower(strings.TrimPrefix($2, "@"))} + } +| "CURRENT_USER" OptionalBraces + { + $$ = &auth.UserIdentity{CurrentUser: true} + } + +UsernameList: + Username + { + $$ = []*auth.UserIdentity{$1.(*auth.UserIdentity)} + } +| UsernameList ',' Username + { + $$ = append($1.([]*auth.UserIdentity), $3.(*auth.UserIdentity)) + } + +PasswordOpt: + stringLit +| "PASSWORD" '(' AuthString ')' + { + $$ = $3 + } + +AuthString: + stringLit + +RoleNameString: + stringLit +| identifier + +RolenameComposed: + StringName '@' StringName + { + $$ = &auth.RoleIdentity{Username: $1, Hostname: strings.ToLower($3)} + } +| StringName singleAtIdentifier + { + $$ = &auth.RoleIdentity{Username: $1, Hostname: strings.ToLower(strings.TrimPrefix($2, "@"))} + } + +RolenameWithoutIdent: + stringLit + { + $$ = &auth.RoleIdentity{Username: $1, Hostname: "%"} + } +| RolenameComposed + { + $$ = $1 + } + +Rolename: + RoleNameString + { + $$ = &auth.RoleIdentity{Username: $1, Hostname: "%"} + } +| RolenameComposed + { + $$ = $1 + } + +RolenameList: + Rolename + { + $$ = []*auth.RoleIdentity{$1.(*auth.RoleIdentity)} + } +| RolenameList ',' Rolename + { + $$ = append($1.([]*auth.RoleIdentity), $3.(*auth.RoleIdentity)) + } + +/****************************Admin Statement*******************************/ +ShowStmt: + "SHOW" ShowTargetFilterable ShowLikeOrWhereOpt + { + stmt := $2.(*ast.ShowStmt) + if $3 != nil { + if x, ok := $3.(*ast.PatternLikeExpr); ok && x.Expr == nil { + stmt.Pattern = x + } else { + stmt.Where = $3.(ast.ExprNode) + } + } + $$ = stmt + } +| "SHOW" "CREATE" "TABLE" TableName + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowCreateTable, + Table: $4.(*ast.TableName), + } + } +| "SHOW" "CREATE" "VIEW" TableName + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowCreateView, + Table: $4.(*ast.TableName), + } + } +| "SHOW" "CREATE" "DATABASE" IfNotExists DBName + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowCreateDatabase, + IfNotExists: $4.(bool), + DBName: $5, + } + } +| "SHOW" "CREATE" "USER" Username + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html + $$ = &ast.ShowStmt{ + Tp: ast.ShowCreateUser, + User: $4.(*auth.UserIdentity), + } + } +| "SHOW" "GRANTS" + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + $$ = &ast.ShowStmt{Tp: ast.ShowGrants} + } +| "SHOW" "GRANTS" "FOR" Username UsingRoles + { + // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html + if $5 != nil { + $$ = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: $4.(*auth.UserIdentity), + Roles: $5.([]*auth.RoleIdentity), + } + } else { + $$ = &ast.ShowStmt{ + Tp: ast.ShowGrants, + User: $4.(*auth.UserIdentity), + Roles: nil, + } + } + } +| "SHOW" "MASTER" "STATUS" + // "SHOW MASTER STATUS" was deprecated in MySQL 8.2.0 in favor of "SHOW BINARY LOG STATUS" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowMasterStatus, + } + } +| "SHOW" "BINARY" "LOG" "STATUS" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowBinlogStatus, + } + } +| "SHOW" Replica "STATUS" + // From MySQL 8.0.22, use SHOW REPLICA STATUS in place of SHOW SLAVE STATUS, + // which is deprecated from that release. In releases before MySQL 8.0.22, + // use SHOW SLAVE STATUS. + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowReplicaStatus, + } + } +| "SHOW" OptFull "PROCESSLIST" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowProcessList, + Full: $2.(bool), + } + } +| "SHOW" "PROFILES" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowProfiles, + } + } +| "SHOW" "PROFILE" ShowProfileTypesOpt ShowProfileArgsOpt SelectStmtLimitOpt + { + v := &ast.ShowStmt{ + Tp: ast.ShowProfile, + } + if $3 != nil { + v.ShowProfileTypes = $3.([]int) + } + if $4 != nil { + v.ShowProfileArgs = $4.(*int64) + } + if $5 != nil { + v.ShowProfileLimit = $5.(*ast.Limit) + } + $$ = v + } +| "SHOW" "PRIVILEGES" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowPrivileges, + } + } + +ShowProfileTypesOpt: + { + $$ = nil + } +| ShowProfileTypes + +ShowProfileTypes: + ShowProfileType + { + $$ = []int{$1.(int)} + } +| ShowProfileTypes ',' ShowProfileType + { + l := $1.([]int) + l = append(l, $3.(int)) + $$ = l + } + +ShowProfileType: + "CPU" + { + $$ = ast.ProfileTypeCPU + } +| "MEMORY" + { + $$ = ast.ProfileTypeMemory + } +| "BLOCK" "IO" + { + $$ = ast.ProfileTypeBlockIo + } +| "CONTEXT" "SWITCHES" + { + $$ = ast.ProfileTypeContextSwitch + } +| "PAGE" "FAULTS" + { + $$ = ast.ProfileTypePageFaults + } +| "IPC" + { + $$ = ast.ProfileTypeIpc + } +| "SWAPS" + { + $$ = ast.ProfileTypeSwaps + } +| "SOURCE" + { + $$ = ast.ProfileTypeSource + } +| "ALL" + { + $$ = ast.ProfileTypeAll + } + +ShowProfileArgsOpt: + { + $$ = nil + } +| "FOR" "QUERY" Int64Num + { + v := $3.(int64) + $$ = &v + } + +UsingRoles: + { + $$ = nil + } +| "USING" RolenameList + { + $$ = $2.([]*auth.RoleIdentity) + } + +ShowIndexKwd: + "INDEX" +| "INDEXES" +| "KEYS" + +FromOrIn: + "FROM" +| "IN" + +ShowTargetFilterable: + "ENGINES" + { + $$ = &ast.ShowStmt{Tp: ast.ShowEngines} + } +| "DATABASES" + { + $$ = &ast.ShowStmt{Tp: ast.ShowDatabases} + } +| CharsetKw + { + $$ = &ast.ShowStmt{Tp: ast.ShowCharset} + } +| OptFull "TABLES" ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowTables, + DBName: $3, + Full: $1.(bool), + } + } +| "OPEN" "TABLES" ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowOpenTables, + DBName: $3, + } + } +| "TABLE" "STATUS" ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowTableStatus, + DBName: $3, + } + } +| ShowIndexKwd FromOrIn TableName + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: $3.(*ast.TableName), + } + } +| ShowIndexKwd FromOrIn Identifier FromOrIn Identifier + { + show := &ast.ShowStmt{ + Tp: ast.ShowIndex, + Table: &ast.TableName{Name: ast.NewCIStr($3), Schema: ast.NewCIStr($5)}, + } + $$ = show + } +| OptFull FieldsOrColumns ShowTableAliasOpt ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $3.(*ast.TableName), + DBName: $4, + Full: $1.(bool), + } + } +| "EXTENDED" OptFull FieldsOrColumns ShowTableAliasOpt ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowColumns, + Table: $4.(*ast.TableName), + DBName: $5, + Full: $2.(bool), + Extended: true, + } + } +| builtinCount '(' '*' ')' "WARNINGS" + { + $$ = &ast.ShowStmt{Tp: ast.ShowWarnings, CountWarningsOrErrors: true} + } +| "WARNINGS" + { + $$ = &ast.ShowStmt{Tp: ast.ShowWarnings} + } +| builtinCount '(' '*' ')' "ERRORS" + { + $$ = &ast.ShowStmt{Tp: ast.ShowErrors, CountWarningsOrErrors: true} + } +| "ERRORS" + { + $$ = &ast.ShowStmt{Tp: ast.ShowErrors} + } +| GlobalScope "VARIABLES" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowVariables, + GlobalScope: $1.(bool), + } + } +| GlobalScope "STATUS" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowStatus, + GlobalScope: $1.(bool), + } + } +| "COLLATION" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowCollation, + } + } +| "TRIGGERS" ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowTriggers, + DBName: $2, + } + } +| "EVENTS" ShowDatabaseNameOpt + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowEvents, + DBName: $2, + } + } +| "PLUGINS" + { + $$ = &ast.ShowStmt{ + Tp: ast.ShowPlugins, + } + } + +ShowLikeOrWhereOpt: + { + $$ = nil + } +| "LIKE" SimpleExpr + { + $$ = &ast.PatternLikeExpr{ + Pattern: $2, + Escape: '\\', + EscapeExplicit: false, + } + } +| "WHERE" Expression + { + $$ = $2 + } + +GlobalScope: + { + $$ = false + } +| "GLOBAL" + { + $$ = true + } +| "SESSION" + { + $$ = false + } + +OptFull: + { + $$ = false + } +| "FULL" + { + $$ = true + } + +ShowDatabaseNameOpt: + { + $$ = "" + } +| FromOrIn DBName + { + $$ = $2 + } + +ShowTableAliasOpt: + FromOrIn TableName + { + $$ = $2.(*ast.TableName) + } + +Replica: + "REPLICA" +| "SLAVE" + +FlushStmt: + "FLUSH" NoWriteToBinLogAliasOpt FlushOption + { + tmp := $3.(*ast.FlushStmt) + tmp.NoWriteToBinLog = $2.(bool) + $$ = tmp + } + +FlushOption: + "PRIVILEGES" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushPrivileges, + } + } +| "STATUS" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushStatus, + } + } +| "HOSTS" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushHosts, + } + } +| "USER_RESOURCES" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushUserResources, + } + } +| "OPTIMIZER_COSTS" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushOptimizerCosts, + } + } +| LogTypeOpt "LOGS" + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushLogs, + LogType: $1.(ast.LogType), + } + } +| "RELAY" "LOGS" FlushRelayChannelOpt + { + $$ = &ast.FlushStmt{ + Tp: ast.FlushLogs, + LogType: ast.LogTypeRelay, + Channel: $3, + } + } +| TableOrTables TableNameListOpt WithReadLockOpt + { + stmt := &ast.FlushStmt{ + Tp: ast.FlushTables, + Tables: $2.([]*ast.TableName), + } + switch $3.(int) { + case 1: + stmt.ReadLock = true + case 2: + stmt.ForExport = true + } + $$ = stmt + } + +FlushRelayChannelOpt: + { + $$ = "" + } +| "FOR" "CHANNEL" stringLit + { + $$ = $3 + } + +LogTypeOpt: + /* empty */ + { + $$ = ast.LogTypeDefault + } +| "BINARY" + { + $$ = ast.LogTypeBinary + } +| "ENGINE" + { + $$ = ast.LogTypeEngine + } +| "ERROR" + { + $$ = ast.LogTypeError + } +| "GENERAL" + { + $$ = ast.LogTypeGeneral + } +| "SLOW" + { + $$ = ast.LogTypeSlow + } + +NoWriteToBinLogAliasOpt: + %prec lowerThanLocal + { + $$ = false + } +| "NO_WRITE_TO_BINLOG" + { + $$ = true + } +| "LOCAL" + { + $$ = true + } + +TableNameListOpt: + %prec empty + { + $$ = []*ast.TableName{} + } +| TableNameList + +WithReadLockOpt: + { + $$ = 0 + } +| "WITH" "READ" "LOCK" + { + $$ = 1 + } +| "FOR" "EXPORT" + { + $$ = 2 + } + +Statement: + EmptyStmt +| AlterDatabaseStmt +| AlterTableStmt +| AlterUserStmt +| AlterInstanceStmt +| AnalyzeTableStmt +| BeginTransactionStmt +| BinlogStmt +| CommitStmt +| DeallocateStmt +| DeleteFromStmt +| ExecuteStmt +| ExplainStmt +| CreateDatabaseStmt +| CreateIndexStmt +| CreateTableStmt +| CreateViewStmt +| CreateUserStmt +| CreateRoleStmt +| DoStmt +| DropDatabaseStmt +| DropIndexStmt +| DropTableStmt +| DropViewStmt +| DropUserStmt +| DropRoleStmt +| FlushStmt +| GrantStmt +| GrantProxyStmt +| GrantRoleStmt +| CallStmt +| InsertIntoStmt +| KillStmt +| LoadDataStmt +| PreparedStmt +| RollbackStmt +| RenameTableStmt +| RepairTableStmt +| AlterViewStmt +| XAStmt +| CreateSpatialRefSysStmt +| DropSpatialRefSysStmt +| CreateTablespaceStmt +| AlterTablespaceStmt +| DropTablespaceStmt +| CreateLogfileGroupStmt +| AlterLogfileGroupStmt +| DropLogfileGroupStmt +| RenameUserStmt +| ReplaceIntoStmt +| ReleaseSavepointStmt +| RevokeStmt +| RevokeRoleStmt +| SavepointStmt +| SetOprStmt +| SelectStmt +| SelectStmtWithClause +| SubSelect + { + var sel ast.StmtNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = sel + } +| SetStmt +| SetRoleStmt +| SetDefaultRoleStmt +| ShowStmt +| TruncateTableStmt +| UpdateStmt +| UseStmt +| UnlockTablesStmt +| LockTablesStmt +| ShutdownStmt +| RestartStmt +| OptimizeTableStmt + +ExplainableStmt: + DeleteFromStmt +| UpdateStmt +| InsertIntoStmt +| ReplaceIntoStmt +| SetOprStmt +| SelectStmt +| SelectStmtWithClause +| SubSelect + { + var sel ast.StmtNode + switch x := $1.(*ast.SubqueryExpr).Query.(type) { + case *ast.SelectStmt: + x.IsInBraces = true + sel = x + case *ast.SetOprStmt: + x.IsInBraces = true + sel = x + } + $$ = sel + } +| AlterTableStmt + +StatementList: + Statement + { + if $1 != nil { + s := $1 + if lexer, ok := yylex.(stmtTexter); ok { + parser.setNodeText(s, lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } +| StatementList ';' Statement + { + if $3 != nil { + s := $3 + if lexer, ok := yylex.(stmtTexter); ok { + parser.setNodeText(s, lexer.stmtText()) + } + parser.result = append(parser.result, s) + } + } + +Constraint: + ConstraintKeywordOpt ConstraintElem + { + cst := $2.(*ast.Constraint) + if $1 != nil { + cst.Name = $1.(string) + cst.IsEmptyIndex = len(cst.Name) == 0 + } + $$ = cst + } + +CheckConstraintKeyword: + "CHECK" +| "CONSTRAINT" + +TableElement: + ColumnDef +| Constraint + +TableElementList: + TableElement + { + if $1 != nil { + $$ = []interface{}{$1.(interface{})} + } else { + $$ = []interface{}{} + } + } +| TableElementList ',' TableElement + { + if $3 != nil { + $$ = append($1.([]interface{}), $3) + } else { + $$ = $1 + } + } + +TableElementListOpt: + /* empty */ %prec lowerThanCreateTableSelect + { + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + $$ = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } +| '(' TableElementList ')' + { + tes := $2.([]interface{}) + var columnDefs []*ast.ColumnDef + var constraints []*ast.Constraint + for _, te := range tes { + switch te := te.(type) { + case *ast.ColumnDef: + columnDefs = append(columnDefs, te) + case *ast.Constraint: + constraints = append(constraints, te) + } + } + $$ = &ast.CreateTableStmt{ + Cols: columnDefs, + Constraints: constraints, + } + } + +TableOption: + PartDefOption +| DefaultKwdOpt CharsetKw EqOpt CharsetName + { + $$ = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: $4, + UintValue: ast.TableOptionCharsetWithoutConvertTo} + } +| DefaultKwdOpt "COLLATE" EqOpt CollationName + { + $$ = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: $4, + UintValue: ast.TableOptionCharsetWithoutConvertTo} + } +| ForceOpt "AUTO_INCREMENT" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: $4.(uint64), BoolValue: $1.(bool)} + } +| "AVG_ROW_LENGTH" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: $3.(uint64)} + } +| "CONNECTION" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: $3} + } +| "CHECKSUM" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: $3.(uint64)} + } +| "PASSWORD" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: $3} + yylex.AppendError(yylex.Errorf("The PASSWORD option is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "COMPRESSION" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: $3} + } +| "KEY_BLOCK_SIZE" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: $3.(uint64)} + } +| "DELAY_KEY_WRITE" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: $3.(uint64)} + } +| RowFormat + { + $$ = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: $1.(uint64)} + } +| "STATS_PERSISTENT" EqOpt StatsPersistentVal + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} + } +| "STATS_AUTO_RECALC" EqOpt LengthNum + { + n := $3.(uint64) + if n != 0 && n != 1 { + yylex.AppendError(yylex.Errorf("The value of STATS_AUTO_RECALC must be one of [0|1|DEFAULT].")) + return 1 + } + $$ = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, UintValue: n} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "STATS_AUTO_RECALC" EqOpt "DEFAULT" + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, Default: true} + yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + } +| "STATS_SAMPLE_PAGES" EqOpt LengthNum + { + // Parse it but will ignore it. + // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 mysql.MaxFloatPrecisionLength { + tp.SetType(mysql.TypeDouble) + } + tp.SetFlen(types.UnspecifiedLength) + } + tp.SetDecimal(fopt.Decimal) + for _, o := range $3.([]*ast.TypeOpt) { + if o.IsUnsigned { + tp.AddFlag(mysql.UnsignedFlag) + } + if o.IsZerofill { + tp.AddFlag(mysql.ZerofillFlag) + } + } + $$ = tp + } +| BitValueType OptFieldLen + { + tp := types.NewFieldType($1.(byte)) + tp.SetFlen($2.(int)) + if tp.GetFlen() == types.UnspecifiedLength { + tp.SetFlen(1) + } + $$ = tp + } + +IntegerType: + "TINYINT" + { + $$ = mysql.TypeTiny + } +| "SMALLINT" + { + $$ = mysql.TypeShort + } +| "MEDIUMINT" + { + $$ = mysql.TypeInt24 + } +| "MIDDLEINT" + { + $$ = mysql.TypeInt24 + } +| "INT" + { + $$ = mysql.TypeLong + } +| "INT1" + { + $$ = mysql.TypeTiny + } +| "INT2" + { + $$ = mysql.TypeShort + } +| "INT3" + { + $$ = mysql.TypeInt24 + } +| "INT4" + { + $$ = mysql.TypeLong + } +| "INT8" + { + $$ = mysql.TypeLonglong + } +| "INTEGER" + { + $$ = mysql.TypeLong + } +| "BIGINT" + { + $$ = mysql.TypeLonglong + } + +BooleanType: + "BOOL" + { + $$ = mysql.TypeTiny + } +| "BOOLEAN" + { + $$ = mysql.TypeTiny + } + +OptInteger: + {} +| "INTEGER" +| "INT" + +FixedPointType: + "DECIMAL" + { + $$ = mysql.TypeNewDecimal + } +| "NUMERIC" + { + $$ = mysql.TypeNewDecimal + } +| "FIXED" + { + $$ = mysql.TypeNewDecimal + } + +FloatingPointType: + "FLOAT" + { + $$ = mysql.TypeFloat + } +| "REAL" + { + if parser.lexer.GetSQLMode().HasRealAsFloatMode() { + $$ = mysql.TypeFloat + } else { + $$ = mysql.TypeDouble + } + } +| "DOUBLE" + { + $$ = mysql.TypeDouble + } +| "DOUBLE" "PRECISION" + { + $$ = mysql.TypeDouble + } +| "FLOAT4" + { + $$ = mysql.TypeFloat + } +| "FLOAT8" + { + $$ = mysql.TypeDouble + } + +BitValueType: + "BIT" + { + $$ = mysql.TypeBit + } + +StringType: + Char FieldLen OptBinary + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen($2.(int)) + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| Char OptBinary + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| NChar FieldLen OptBinary + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen($2.(int)) + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| NChar OptBinary + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| Varchar FieldLen OptBinary + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen($2.(int)) + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| NVarchar FieldLen OptBinary + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen($2.(int)) + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "BINARY" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeString) + tp.SetFlen($2.(int)) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| "VARBINARY" FieldLen + { + tp := types.NewFieldType(mysql.TypeVarchar) + tp.SetFlen($2.(int)) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| BlobType + { + tp := $1.(*types.FieldType) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CharsetBin) + tp.AddFlag(mysql.BinaryFlag) + $$ = tp + } +| TextType OptCharsetWithOptBinary + { + tp := $1.(*types.FieldType) + tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if $2.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "ENUM" '(' TextStringList ')' OptCharsetWithOptBinary + { + tp := types.NewFieldType(mysql.TypeEnum) + elems := $3.([]*ast.TextString) + opt := $5.(*ast.OptBinary) + tp.SetElems(make([]string, len(elems))) + fieldLen := -1 // enum_flen = max(ele_flen) + for i, e := range elems { + trimmed := strings.TrimRight(e.Value, " ") + tp.SetElemWithIsBinaryLit(i, trimmed, e.IsBinaryLiteral) + if len(trimmed) > fieldLen { + fieldLen = len(trimmed) + } + } + tp.SetFlen(fieldLen) + tp.SetCharset(opt.Charset) + if opt.IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "SET" '(' TextStringList ')' OptCharsetWithOptBinary + { + tp := types.NewFieldType(mysql.TypeSet) + elems := $3.([]*ast.TextString) + opt := $5.(*ast.OptBinary) + tp.SetElems(make([]string, len(elems))) + fieldLen := len(elems) - 1 // set_flen = sum(ele_flen) + number_of_ele - 1 + for i, e := range elems { + trimmed := strings.TrimRight(e.Value, " ") + tp.SetElemWithIsBinaryLit(i, trimmed, e.IsBinaryLiteral) + fieldLen += len(trimmed) + } + tp.SetFlen(fieldLen) + tp.SetCharset(opt.Charset) + if opt.IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "JSON" + { + tp := types.NewFieldType(mysql.TypeJSON) + tp.SetDecimal(0) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "LONG" Varchar OptCharsetWithOptBinary + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if $3.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "LONG" OptCharsetWithOptBinary + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } + if $2.(*ast.OptBinary).IsBinary { + tp.AddFlag(mysql.BinaryFlag) + } + $$ = tp + } +| "GEOMETRY" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomGeometry) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "GEOMETRYCOLLECTION" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomGeometryCollection) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "LINESTRING" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomLineString) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "MULTILINESTRING" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiLineString) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "MULTIPOINT" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiPoint) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "MULTIPOLYGON" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomMultiPolygon) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "POINT" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomPoint) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } +| "POLYGON" + { + tp := types.NewFieldType(mysql.TypeGeometry) + tp.SetGeometryType(types.GeomPolygon) + tp.AddFlag(mysql.BinaryFlag) + tp.SetCharset(charset.CharsetBin) + tp.SetCollate(charset.CollationBin) + $$ = tp + } + +Char: + "CHARACTER" +| "CHAR" + +NChar: + "NCHAR" +| "NATIONAL" "CHARACTER" +| "NATIONAL" "CHAR" + +Varchar: + "CHARACTER" "VARYING" +| "CHAR" "VARYING" +| "VARCHAR" +| "VARCHARACTER" + +NVarchar: + "NATIONAL" "VARCHAR" +| "NATIONAL" "VARCHARACTER" +| "NVARCHAR" +| "NCHAR" "VARCHAR" +| "NCHAR" "VARCHARACTER" +| "NATIONAL" "CHARACTER" "VARYING" +| "NATIONAL" "CHAR" "VARYING" +| "NCHAR" "VARYING" + +Year: + "YEAR" +| "SQL_TSI_YEAR" + +BlobType: + "TINYBLOB" + { + tp := types.NewFieldType(mysql.TypeTinyBlob) + $$ = tp + } +| "BLOB" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeBlob) + tp.SetFlen($2.(int)) + $$ = tp + } +| "MEDIUMBLOB" + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + $$ = tp + } +| "LONGBLOB" + { + tp := types.NewFieldType(mysql.TypeLongBlob) + $$ = tp + } +| "LONG" "VARBINARY" + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + $$ = tp + } + +TextType: + "TINYTEXT" + { + tp := types.NewFieldType(mysql.TypeTinyBlob) + $$ = tp + } +| "TEXT" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeBlob) + tp.SetFlen($2.(int)) + $$ = tp + } +| "MEDIUMTEXT" + { + tp := types.NewFieldType(mysql.TypeMediumBlob) + $$ = tp + } +| "LONGTEXT" + { + tp := types.NewFieldType(mysql.TypeLongBlob) + $$ = tp + } + +OptCharsetWithOptBinary: + OptBinary +| "ASCII" + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: charset.CharsetLatin1, + } + } +| "UNICODE" + { + cs, err := charset.GetCharsetInfo("ucs2") + if err != nil { + yylex.AppendError(ErrUnknownCharacterSet.GenByArgs("ucs2")) + return 1 + } + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: cs.Name, + } + } +| "BYTE" + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: charset.CharsetBin, + } + } + +DateAndTimeType: + "DATE" + { + tp := types.NewFieldType(mysql.TypeDate) + $$ = tp + } +| "DATETIME" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeDatetime) + tp.SetFlen(mysql.MaxDatetimeWidthNoFsp) + tp.SetDecimal($2.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + $$ = tp + } +| "TIMESTAMP" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeTimestamp) + tp.SetFlen(mysql.MaxDatetimeWidthNoFsp) + tp.SetDecimal($2.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + $$ = tp + } +| "TIME" OptFieldLen + { + tp := types.NewFieldType(mysql.TypeDuration) + tp.SetFlen(mysql.MaxDurationWidthNoFsp) + tp.SetDecimal($2.(int)) + if tp.GetDecimal() > 0 { + tp.SetFlen(tp.GetFlen() + 1 + tp.GetDecimal()) + } + $$ = tp + } +| Year OptFieldLen FieldOpts + { + tp := types.NewFieldType(mysql.TypeYear) + tp.SetFlen($2.(int)) + if tp.GetFlen() != types.UnspecifiedLength && tp.GetFlen() != 4 { + yylex.AppendError(ErrInvalidYearColumnLength.GenByArgs()) + return -1 + } + $$ = tp + } + +FieldLen: + '(' LengthNum ')' + { + $$ = int($2.(uint64)) + } + +OptFieldLen: + { + $$ = types.UnspecifiedLength + } +| FieldLen + +FieldOpt: + "UNSIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: true} + } +| "SIGNED" + { + $$ = &ast.TypeOpt{IsUnsigned: false} + } +| "ZEROFILL" + { + $$ = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} + } + +FieldOpts: + { + $$ = []*ast.TypeOpt{} + } +| FieldOpts FieldOpt + { + $$ = append($1.([]*ast.TypeOpt), $2.(*ast.TypeOpt)) + } + +FloatOpt: + { + $$ = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} + } +| FieldLen + { + $$ = &ast.FloatOpt{Flen: $1.(int), Decimal: types.UnspecifiedLength} + } +| Precision + +Precision: + '(' LengthNum ',' LengthNum ')' + { + $$ = &ast.FloatOpt{Flen: int($2.(uint64)), Decimal: int($4.(uint64))} + } + +OptBinMod: + { + $$ = false + } +| "BINARY" + { + $$ = true + } + +OptBinary: + { + $$ = &ast.OptBinary{ + IsBinary: false, + Charset: "", + } + } +| "BINARY" OptCharset + { + $$ = &ast.OptBinary{ + IsBinary: true, + Charset: $2, + } + } +| CharsetKw CharsetName OptBinMod + { + $$ = &ast.OptBinary{ + IsBinary: $3.(bool), + Charset: $2, + } + } + +OptCharset: + { + $$ = "" + } +| CharsetKw CharsetName + { + $$ = $2 + } + +CharsetKw: + "CHARACTER" "SET" +| "CHARSET" +| "CHAR" "SET" + +OptCollate: + { + $$ = "" + } +| "COLLATE" CollationName + { + $$ = $2 + } + +TextString: + stringLit + { + $$ = &ast.TextString{Value: $1} + } +| hexLit + { + $$ = &ast.TextString{Value: $1.(ast.HexLiteral).ToString(), IsBinaryLiteral: true} + } +| bitLit + { + $$ = &ast.TextString{Value: $1.(ast.BitLiteral).ToString(), IsBinaryLiteral: true} + } + +TextStringList: + TextString + { + $$ = []*ast.TextString{$1.(*ast.TextString)} + } +| TextStringList ',' TextString + { + $$ = append($1.([]*ast.TextString), $3.(*ast.TextString)) + } + +/******************************************************************* + * XA transaction statements. spirit refuses XA workloads, but the + * parser must recognize them so pkg/change can do so cleanly. + * See https://dev.mysql.com/doc/refman/8.4/en/xa-statements.html + *******************************************************************/ +XAStmt: + "XA" BeginOrStartSym XAXid + { + $$ = &ast.XAStmt{Op: ast.XAOpStart, Xid: $3.(*ast.XAXid)} + } +| "XA" BeginOrStartSym XAXid "JOIN" + { + $$ = &ast.XAStmt{Op: ast.XAOpStart, Xid: $3.(*ast.XAXid), Join: true} + } +| "XA" BeginOrStartSym XAXid "RESUME" + { + $$ = &ast.XAStmt{Op: ast.XAOpStart, Xid: $3.(*ast.XAXid), Resume: true} + } +| "XA" "END" XAXid + { + $$ = &ast.XAStmt{Op: ast.XAOpEnd, Xid: $3.(*ast.XAXid)} + } +| "XA" "END" XAXid "SUSPEND" + { + $$ = &ast.XAStmt{Op: ast.XAOpEnd, Xid: $3.(*ast.XAXid), Suspend: true} + } +| "XA" "END" XAXid "SUSPEND" "FOR" "MIGRATE" + { + $$ = &ast.XAStmt{Op: ast.XAOpEnd, Xid: $3.(*ast.XAXid), Suspend: true, ForMigrate: true} + } +| "XA" "PREPARE" XAXid + { + $$ = &ast.XAStmt{Op: ast.XAOpPrepare, Xid: $3.(*ast.XAXid)} + } +| "XA" "COMMIT" XAXid + { + $$ = &ast.XAStmt{Op: ast.XAOpCommit, Xid: $3.(*ast.XAXid)} + } +| "XA" "COMMIT" XAXid "ONE" "PHASE" + { + $$ = &ast.XAStmt{Op: ast.XAOpCommit, Xid: $3.(*ast.XAXid), OnePhase: true} + } +| "XA" "ROLLBACK" XAXid + { + $$ = &ast.XAStmt{Op: ast.XAOpRollback, Xid: $3.(*ast.XAXid)} + } +| "XA" "RECOVER" + { + $$ = &ast.XAStmt{Op: ast.XAOpRecover} + } +| "XA" "RECOVER" "CONVERT" "XID" + { + $$ = &ast.XAStmt{Op: ast.XAOpRecover, ConvertXid: true} + } + +BeginOrStartSym: + "BEGIN" +| "START" + +XAXid: + TextString + { + $$ = &ast.XAXid{GTRID: $1.(*ast.TextString).Value, NParts: 1} + } +| TextString ',' TextString + { + $$ = &ast.XAXid{GTRID: $1.(*ast.TextString).Value, BQual: $3.(*ast.TextString).Value, NParts: 2} + } +| TextString ',' TextString ',' NUM + { + $$ = &ast.XAXid{GTRID: $1.(*ast.TextString).Value, BQual: $3.(*ast.TextString).Value, FormatID: getUint64FromNUM($5), NParts: 3} + } +| TextString ',' TextString ',' hexLit + { + // MySQL's ulong_num accepts a hex number (0xb) as the formatID. + var formatID uint64 + for _, b := range []byte($5.(ast.HexLiteral)) { + formatID = formatID<<8 | uint64(b) + } + $$ = &ast.XAXid{GTRID: $1.(*ast.TextString).Value, BQual: $3.(*ast.TextString).Value, FormatID: formatID, NParts: 3} + } + +/******************************************************************* + * Spatial reference system statements + * See https://dev.mysql.com/doc/refman/8.4/en/create-spatial-reference-system.html + *******************************************************************/ +CreateSpatialRefSysStmt: + "CREATE" "SPATIAL" "REFERENCE" "SYSTEM" IfNotExists NUM SRSAttributeListOpt + { + $$ = &ast.CreateSpatialRefSysStmt{ + IfNotExists: $5.(bool), + SRID: getUint64FromNUM($6), + Attributes: $7.([]*ast.SRSAttribute), + } + } +| "CREATE" "OR" "REPLACE" "SPATIAL" "REFERENCE" "SYSTEM" IfNotExists NUM SRSAttributeListOpt + { + $$ = &ast.CreateSpatialRefSysStmt{ + OrReplace: true, + IfNotExists: $7.(bool), + SRID: getUint64FromNUM($8), + Attributes: $9.([]*ast.SRSAttribute), + } + } + +DropSpatialRefSysStmt: + "DROP" "SPATIAL" "REFERENCE" "SYSTEM" IfExists NUM + { + $$ = &ast.DropSpatialRefSysStmt{ + IfExists: $5.(bool), + SRID: getUint64FromNUM($6), + } + } + +SRSAttributeListOpt: + { + $$ = []*ast.SRSAttribute{} + } +| SRSAttributeListOpt SRSAttribute + { + $$ = append($1.([]*ast.SRSAttribute), $2.(*ast.SRSAttribute)) + } + +SRSAttribute: + "NAME" stringLit + { + $$ = &ast.SRSAttribute{Tp: ast.SRSAttrName, Value: $2} + } +| "DEFINITION" stringLit + { + $$ = &ast.SRSAttribute{Tp: ast.SRSAttrDefinition, Value: $2} + } +| "ORGANIZATION" stringLit "IDENTIFIED" "BY" NUM + { + $$ = &ast.SRSAttribute{Tp: ast.SRSAttrOrganization, Value: $2, OrgID: getUint64FromNUM($5)} + } +| "DESCRIPTION" stringLit + { + $$ = &ast.SRSAttribute{Tp: ast.SRSAttrDescription, Value: $2} + } + +/******************************************************************* + * Tablespace and logfile group statements + * See https://dev.mysql.com/doc/refman/8.4/en/create-tablespace.html + *******************************************************************/ +CreateTablespaceStmt: + "CREATE" "TABLESPACE" Identifier TablespaceDataFileOpt TablespaceLogfileGroupOpt TablespaceOptionListOpt + { + stmt := &ast.CreateTablespaceStmt{ + Name: ast.NewCIStr($3), + LogfileGroup: ast.NewCIStr($5), + Options: $6.([]*ast.TablespaceOption), + } + if $4 != "" { + stmt.DataFile = $4 + stmt.HasDataFile = true + } + $$ = stmt + } +| "CREATE" "UNDO" "TABLESPACE" Identifier TablespaceDataFileOpt TablespaceOptionListOpt + { + stmt := &ast.CreateTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr($4), + Options: $6.([]*ast.TablespaceOption), + } + if $5 != "" { + stmt.DataFile = $5 + stmt.HasDataFile = true + } + $$ = stmt + } + +TablespaceDataFileOpt: + { + $$ = "" + } +| "ADD" "DATAFILE" stringLit + { + $$ = $3 + } + +TablespaceLogfileGroupOpt: + { + $$ = "" + } +| "USE" "LOGFILE" "GROUP" Identifier + { + $$ = $4 + } + +AlterTablespaceStmt: + "ALTER" "TABLESPACE" Identifier "ADD" "DATAFILE" stringLit TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Action: ast.AlterTablespaceAddDataFile, + DataFile: $6, + Options: $7.([]*ast.TablespaceOption), + } + } +| "ALTER" "TABLESPACE" Identifier "DROP" "DATAFILE" stringLit TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Action: ast.AlterTablespaceDropDataFile, + DataFile: $6, + Options: $7.([]*ast.TablespaceOption), + } + } +| "ALTER" "TABLESPACE" Identifier "RENAME" "TO" Identifier + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Action: ast.AlterTablespaceRenameTo, + NewName: ast.NewCIStr($6), + Options: []*ast.TablespaceOption{}, + } + } +| "ALTER" "TABLESPACE" Identifier TablespaceOptionList + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Options: $4.([]*ast.TablespaceOption), + } + } +| "ALTER" "TABLESPACE" Identifier "SET" "ACTIVE" TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Action: ast.AlterTablespaceSetActive, + Options: $6.([]*ast.TablespaceOption), + } + } +| "ALTER" "TABLESPACE" Identifier "SET" "INACTIVE" TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Name: ast.NewCIStr($3), + Action: ast.AlterTablespaceSetInactive, + Options: $6.([]*ast.TablespaceOption), + } + } +| "ALTER" "UNDO" "TABLESPACE" Identifier "SET" "ACTIVE" TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr($4), + Action: ast.AlterTablespaceSetActive, + Options: $7.([]*ast.TablespaceOption), + } + } +| "ALTER" "UNDO" "TABLESPACE" Identifier "SET" "INACTIVE" TablespaceOptionListOpt + { + $$ = &ast.AlterTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr($4), + Action: ast.AlterTablespaceSetInactive, + Options: $7.([]*ast.TablespaceOption), + } + } + +DropTablespaceStmt: + "DROP" "TABLESPACE" Identifier TablespaceOptionListOpt + { + $$ = &ast.DropTablespaceStmt{ + Name: ast.NewCIStr($3), + Options: $4.([]*ast.TablespaceOption), + } + } +| "DROP" "UNDO" "TABLESPACE" Identifier TablespaceOptionListOpt + { + $$ = &ast.DropTablespaceStmt{ + Undo: true, + Name: ast.NewCIStr($4), + Options: $5.([]*ast.TablespaceOption), + } + } + +CreateLogfileGroupStmt: + "CREATE" "LOGFILE" "GROUP" Identifier "ADD" "UNDOFILE" stringLit TablespaceOptionListOpt + { + $$ = &ast.CreateLogfileGroupStmt{ + Name: ast.NewCIStr($4), + UndoFile: $7, + Options: $8.([]*ast.TablespaceOption), + } + } + +AlterLogfileGroupStmt: + "ALTER" "LOGFILE" "GROUP" Identifier "ADD" "UNDOFILE" stringLit TablespaceOptionListOpt + { + $$ = &ast.AlterLogfileGroupStmt{ + Name: ast.NewCIStr($4), + UndoFile: $7, + Options: $8.([]*ast.TablespaceOption), + } + } + +DropLogfileGroupStmt: + "DROP" "LOGFILE" "GROUP" Identifier TablespaceOptionListOpt + { + $$ = &ast.DropLogfileGroupStmt{ + Name: ast.NewCIStr($4), + Options: $5.([]*ast.TablespaceOption), + } + } + +TablespaceOptionListOpt: + { + $$ = []*ast.TablespaceOption{} + } +| TablespaceOptionList + +TablespaceOptionList: + TablespaceOption + { + $$ = []*ast.TablespaceOption{$1.(*ast.TablespaceOption)} + } +| TablespaceOptionList TablespaceOption + { + $$ = append($1.([]*ast.TablespaceOption), $2.(*ast.TablespaceOption)) + } +| TablespaceOptionList ',' TablespaceOption + { + $$ = append($1.([]*ast.TablespaceOption), $3.(*ast.TablespaceOption)) + } + +TablespaceOption: + "INITIAL_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptInitialSize + $$ = opt + } +| "MAX_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptMaxSize + $$ = opt + } +| "EXTENT_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptExtentSize + $$ = opt + } +| "AUTOEXTEND_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptAutoextendSize + $$ = opt + } +| "FILE_BLOCK_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptFileBlockSize + $$ = opt + } +| "UNDO_BUFFER_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptUndoBufferSize + $$ = opt + } +| "REDO_BUFFER_SIZE" EqOpt TablespaceSizeValue + { + opt := $3.(*ast.TablespaceOption) + opt.Tp = ast.TablespaceOptRedoBufferSize + $$ = opt + } +| "NODEGROUP" EqOpt NUM + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptNodegroup, UintValue: getUint64FromNUM($3)} + } +| "WAIT" + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptWait} + } +| "NO_WAIT" + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptNoWait} + } +| "COMMENT" EqOpt stringLit + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptComment, StrValue: $3} + } +| "ENCRYPTION" EqOpt stringLit + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptEncryption, StrValue: $3} + } +| "ENGINE" EqOpt StringName + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptEngine, StrValue: $3} + } +| "ENGINE_ATTRIBUTE" EqOpt stringLit + { + $$ = &ast.TablespaceOption{Tp: ast.TablespaceOptEngineAttribute, StrValue: $3} + } + +TablespaceSizeValue: + NUM + { + $$ = &ast.TablespaceOption{UintValue: getUint64FromNUM($1)} + } +| Identifier + { + $$ = &ast.TablespaceOption{StrValue: $1} + } + +StringName: + stringLit +| Identifier + +UpdateStmt: + UpdateStmtNoWith +| WithClause UpdateStmtNoWith + { + u := $2.(*ast.UpdateStmt) + u.With = $1.(*ast.WithClause) + $$ = u + } + +UpdateStmtNoWith: + "UPDATE" TableOptimizerHintsOpt PriorityOpt IgnoreOptional TableRef "SET" AssignmentList WhereClauseOptional OrderByOptional LimitClause + { + var refs *ast.Join + if x, ok := $5.(*ast.Join); ok { + refs = x + } else { + refs = &ast.Join{Left: $5.(ast.ResultSetNode)} + } + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: refs}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + if $9 != nil { + st.Order = $9.(*ast.OrderByClause) + } + if $10 != nil { + st.Limit = $10.(*ast.Limit) + } + $$ = st + } +| "UPDATE" TableOptimizerHintsOpt PriorityOpt IgnoreOptional TableRefs "SET" AssignmentList WhereClauseOptional + { + st := &ast.UpdateStmt{ + Priority: $3.(mysql.PriorityEnum), + TableRefs: &ast.TableRefsClause{TableRefs: $5.(*ast.Join)}, + List: $7.([]*ast.Assignment), + IgnoreErr: $4.(bool), + } + if $2 != nil { + st.TableHints = $2.([]*ast.TableOptimizerHint) + } + if $8 != nil { + st.Where = $8.(ast.ExprNode) + } + $$ = st + } + +UseStmt: + "USE" DBName + { + $$ = &ast.UseStmt{DBName: $2} + } + +WhereClause: + "WHERE" Expression + { + $$ = $2 + } + +WhereClauseOptional: + { + $$ = nil + } +| WhereClause + +/************************************************************************************ + * Account Management Statements + * https://dev.mysql.com/doc/refman/5.7/en/account-management-sql.html + ************************************************************************************/ +CreateUserStmt: + "CREATE" "USER" IfNotExists UserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions CommentOrAttributeOption ResourceGroupNameOption + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-user.html + ret := &ast.CreateUserStmt{ + IsCreateRole: false, + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + AuthTokenOrTLSOptions: $5.([]*ast.AuthTokenOrTLSOption), + ResourceOptions: $6.([]*ast.ResourceOption), + PasswordOrLockOptions: $7.([]*ast.PasswordOrLockOption), + } + if $8 != nil { + ret.CommentOrAttributeOption = $8.(*ast.CommentOrAttributeOption) + } + if $9 != nil { + ret.ResourceGroupNameOption = $9.(*ast.ResourceGroupNameOption) + } + $$ = ret + } + +CreateRoleStmt: + "CREATE" "ROLE" IfNotExists RoleSpecList + { + // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html + $$ = &ast.CreateUserStmt{ + IsCreateRole: true, + IfNotExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + } + } + +/* See http://dev.mysql.com/doc/refman/8.0/en/alter-user.html */ +AlterUserStmt: + "ALTER" "USER" IfExists AlterUserSpecList RequireClauseOpt ConnectionOptions PasswordOrLockOptions CommentOrAttributeOption ResourceGroupNameOption + { + ret := &ast.AlterUserStmt{ + IfExists: $3.(bool), + Specs: $4.([]*ast.UserSpec), + AuthTokenOrTLSOptions: $5.([]*ast.AuthTokenOrTLSOption), + ResourceOptions: $6.([]*ast.ResourceOption), + PasswordOrLockOptions: $7.([]*ast.PasswordOrLockOption), + } + if $8 != nil { + ret.CommentOrAttributeOption = $8.(*ast.CommentOrAttributeOption) + } + if $9 != nil { + ret.ResourceGroupNameOption = $9.(*ast.ResourceGroupNameOption) + } + $$ = ret + } +| "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString + { + auth := &ast.AuthOption{ + AuthString: $9, + ByAuthString: true, + } + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentAuth: auth, + } + } +| "ALTER" "USER" IfExists "USER" '(' ')' "IDENTIFIED" "BY" AuthString "RETAIN" "CURRENT" "PASSWORD" + { + // MySQL 8.0 user_func_auth_option allows RETAIN CURRENT PASSWORD on + // the current-user form. + auth := &ast.AuthOption{ + AuthString: $9, + ByAuthString: true, + } + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentAuth: auth, + CurrentDualPasswordOption: ast.DualPasswordRetainCurrent, + } + } +| "ALTER" "USER" IfExists "USER" '(' ')' "DISCARD" "OLD" "PASSWORD" + { + // MySQL 8.0 user_func_auth_option allows DISCARD OLD PASSWORD as a + // standalone clause on the current-user form (no IDENTIFIED BY). + $$ = &ast.AlterUserStmt{ + IfExists: $3.(bool), + CurrentDualPasswordOption: ast.DualPasswordDiscardOld, + } + } + +/* See https://dev.mysql.com/doc/refman/8.0/en/alter-instance.html */ +AlterInstanceStmt: + "ALTER" "INSTANCE" InstanceOption + { + $$ = $3.(*ast.AlterInstanceStmt) + } + +InstanceOption: + "RELOAD" "TLS" TLSChannelOpt NoRollbackOnErrorOpt + { + $$ = &ast.AlterInstanceStmt{ + ReloadTLS: true, + TLSChannel: $3, + NoRollbackOnError: $4.(bool), + } + } +| "RELOAD" "KEYRING" + { + $$ = &ast.AlterInstanceStmt{ + ReloadKeyring: true, + } + } +| "ROTATE" Identifier "MASTER" "KEY" + { + engine := strings.ToUpper($2) + if engine != "INNODB" && engine != "BINLOG" { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE ROTATE %s MASTER KEY is not supported", $2)) + return 1 + } + $$ = &ast.AlterInstanceStmt{ + RotateMasterKey: engine, + } + } +| "ENABLE" Identifier Identifier + { + if !strings.EqualFold($2, "INNODB") || !strings.EqualFold($3, "REDO_LOG") { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE ENABLE %s %s is not supported", $2, $3)) + return 1 + } + $$ = &ast.AlterInstanceStmt{ + RedoLog: ast.RedoLogActionEnable, + } + } +| "DISABLE" Identifier Identifier + { + if !strings.EqualFold($2, "INNODB") || !strings.EqualFold($3, "REDO_LOG") { + yylex.AppendError(yylex.Errorf("ALTER INSTANCE DISABLE %s %s is not supported", $2, $3)) + return 1 + } + $$ = &ast.AlterInstanceStmt{ + RedoLog: ast.RedoLogActionDisable, + } + } + +TLSChannelOpt: + { + $$ = "" + } +| "FOR" "CHANNEL" Identifier + { + $$ = $3 + } + +NoRollbackOnErrorOpt: + { + $$ = false + } +| "NO" "ROLLBACK" "ON" "ERROR" + { + $$ = true + } + +UserSpec: + Username AuthOption + { + userSpec := &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + } + if $2 != nil { + userSpec.AuthOpt = $2.(*ast.AuthOption) + } + $$ = userSpec + } + +UserSpecList: + UserSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| UserSpecList ',' UserSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +/* + * AlterUserSpec is the per-user spec for ALTER USER. It permits the MySQL 8.0 + * dual-password clauses (RETAIN CURRENT PASSWORD / DISCARD OLD PASSWORD) + * alongside an auth option, with grammar-level enforcement of MySQL's + * restrictions: + * - RETAIN attaches only to BY-form auth options (IDENTIFIED BY 'plain' + * or IDENTIFIED WITH plugin BY 'plain'). The hashed AS-form and the + * bare-plugin form are NOT accepted with RETAIN. + * - DISCARD OLD PASSWORD is a standalone clause; no auth option may + * accompany it on the same spec. + * - RETAIN / DISCARD are NOT exposed via UserSpec, so CREATE USER + * continues to reject them at parse time (matching MySQL). + */ +AlterUserSpec: + Username AuthOption + { + userSpec := &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + } + if $2 != nil { + userSpec.AuthOpt = $2.(*ast.AuthOption) + } + $$ = userSpec + } +| Username AuthOptionWithPassword "RETAIN" "CURRENT" "PASSWORD" + { + $$ = &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + AuthOpt: $2.(*ast.AuthOption), + DualPasswordOption: ast.DualPasswordRetainCurrent, + } + } +| Username "DISCARD" "OLD" "PASSWORD" + { + $$ = &ast.UserSpec{ + User: $1.(*auth.UserIdentity), + DualPasswordOption: ast.DualPasswordDiscardOld, + } + } + +AlterUserSpecList: + AlterUserSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| AlterUserSpecList ',' AlterUserSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +/* + * AuthOptionWithPassword is the subset of AuthOption that carries an explicit + * cleartext password, i.e. the BY forms. RETAIN CURRENT PASSWORD is only + * valid after one of these per MySQL 8.0 semantics (not with the WITH plugin + * AS '' form, the bare IDENTIFIED WITH plugin form, or with no auth + * option at all). + */ +AuthOptionWithPassword: + "IDENTIFIED" "BY" AuthString + { + $$ = &ast.AuthOption{ + AuthString: $3, + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" AuthPlugin "BY" AuthString + { + $$ = &ast.AuthOption{ + AuthPlugin: $3, + AuthString: $5, + ByAuthString: true, + } + } + +ConnectionOptions: + { + l := []*ast.ResourceOption{} + $$ = l + } +| "WITH" ConnectionOptionList + { + $$ = $2 + } + +ConnectionOptionList: + ConnectionOption + { + $$ = []*ast.ResourceOption{$1.(*ast.ResourceOption)} + } +| ConnectionOptionList ConnectionOption + { + l := $1.([]*ast.ResourceOption) + l = append(l, $2.(*ast.ResourceOption)) + $$ = l + } + +ConnectionOption: + "MAX_QUERIES_PER_HOUR" Int64Num + { + $$ = &ast.ResourceOption{ + Type: ast.MaxQueriesPerHour, + Count: $2.(int64), + } + } +| "MAX_UPDATES_PER_HOUR" Int64Num + { + $$ = &ast.ResourceOption{ + Type: ast.MaxUpdatesPerHour, + Count: $2.(int64), + } + } +| "MAX_CONNECTIONS_PER_HOUR" Int64Num + { + $$ = &ast.ResourceOption{ + Type: ast.MaxConnectionsPerHour, + Count: $2.(int64), + } + } +| "MAX_USER_CONNECTIONS" Int64Num + { + $$ = &ast.ResourceOption{ + Type: ast.MaxUserConnections, + Count: $2.(int64), + } + } + +RequireClauseOpt: + { + $$ = []*ast.AuthTokenOrTLSOption{} + } +| RequireClause + +RequireClause: + "REQUIRE" "NONE" + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.TlsNone, + } + $$ = []*ast.AuthTokenOrTLSOption{t} + } +| "REQUIRE" "SSL" + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.Ssl, + } + $$ = []*ast.AuthTokenOrTLSOption{t} + } +| "REQUIRE" "X509" + { + t := &ast.AuthTokenOrTLSOption{ + Type: ast.X509, + } + $$ = []*ast.AuthTokenOrTLSOption{t} + } +| "REQUIRE" RequireList + { + $$ = $2 + } + +RequireList: + RequireListElement + { + $$ = []*ast.AuthTokenOrTLSOption{$1.(*ast.AuthTokenOrTLSOption)} + } +| RequireList "AND" RequireListElement + { + l := $1.([]*ast.AuthTokenOrTLSOption) + l = append(l, $3.(*ast.AuthTokenOrTLSOption)) + $$ = l + } +| RequireList RequireListElement + { + l := $1.([]*ast.AuthTokenOrTLSOption) + l = append(l, $2.(*ast.AuthTokenOrTLSOption)) + $$ = l + } + +RequireListElement: + "ISSUER" stringLit + { + $$ = &ast.AuthTokenOrTLSOption{ + Type: ast.Issuer, + Value: $2, + } + } +| "SUBJECT" stringLit + { + $$ = &ast.AuthTokenOrTLSOption{ + Type: ast.Subject, + Value: $2, + } + } +| "CIPHER" stringLit + { + $$ = &ast.AuthTokenOrTLSOption{ + Type: ast.Cipher, + Value: $2, + } + } +| "SAN" stringLit + { + $$ = &ast.AuthTokenOrTLSOption{ + Type: ast.SAN, + Value: $2, + } + } +| "TOKEN_ISSUER" stringLit + { + $$ = &ast.AuthTokenOrTLSOption{ + Type: ast.TokenIssuer, + Value: $2, + } + } + +CommentOrAttributeOption: + { + $$ = nil + } +| "COMMENT" stringLit + { + $$ = &ast.CommentOrAttributeOption{Type: ast.UserCommentType, Value: $2} + } +| "ATTRIBUTE" stringLit + { + $$ = &ast.CommentOrAttributeOption{Type: ast.UserAttributeType, Value: $2} + } + +ResourceGroupNameOption: + { + $$ = nil + } +| "RESOURCE" "GROUP" ResourceGroupName + { + $$ = &ast.ResourceGroupNameOption{Value: $3} + } + +PasswordOrLockOptions: + { + $$ = []*ast.PasswordOrLockOption{} + } +| PasswordOrLockOptionList + { + $$ = $1 + } + +PasswordOrLockOptionList: + PasswordOrLockOption + { + $$ = []*ast.PasswordOrLockOption{$1.(*ast.PasswordOrLockOption)} + } +| PasswordOrLockOptionList PasswordOrLockOption + { + l := $1.([]*ast.PasswordOrLockOption) + l = append(l, $2.(*ast.PasswordOrLockOption)) + $$ = l + } + +PasswordOrLockOption: + "ACCOUNT" "UNLOCK" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.Unlock, + } + } +| "ACCOUNT" "LOCK" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.Lock, + } + } +| "PASSWORD" "HISTORY" "DEFAULT" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordHistoryDefault, + } + } +| "PASSWORD" "HISTORY" NUM + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordHistory, + Count: $3.(int64), + } + } +| "PASSWORD" "REUSE" "INTERVAL" "DEFAULT" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordReuseDefault, + } + } +| "PASSWORD" "REUSE" "INTERVAL" NUM "DAY" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordReuseInterval, + Count: $4.(int64), + } + } +| "PASSWORD" "EXPIRE" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpire, + } + } +| "PASSWORD" "EXPIRE" "INTERVAL" Int64Num "DAY" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireInterval, + Count: $4.(int64), + } + } +| "PASSWORD" "EXPIRE" "NEVER" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireNever, + } + } +| "PASSWORD" "EXPIRE" "DEFAULT" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordExpireDefault, + } + } +| "FAILED_LOGIN_ATTEMPTS" Int64Num + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.FailedLoginAttempts, + Count: $2.(int64), + } + } +| "PASSWORD_LOCK_TIME" Int64Num + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTime, + Count: $2.(int64), + } + } +| "PASSWORD_LOCK_TIME" "UNBOUNDED" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordLockTimeUnbounded, + } + } +| "PASSWORD" "REQUIRE" "CURRENT" "DEFAULT" + { + $$ = &ast.PasswordOrLockOption{ + Type: ast.PasswordRequireCurrentDefault, + } + } + +AuthOption: + { + $$ = nil + } +| "IDENTIFIED" "BY" AuthString + { + $$ = &ast.AuthOption{ + AuthString: $3, + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" AuthPlugin + { + $$ = &ast.AuthOption{ + AuthPlugin: $3, + } + } +| "IDENTIFIED" "WITH" AuthPlugin "BY" AuthString + { + $$ = &ast.AuthOption{ + AuthPlugin: $3, + AuthString: $5, + ByAuthString: true, + } + } +| "IDENTIFIED" "WITH" AuthPlugin "AS" HashString + { + $$ = &ast.AuthOption{ + AuthPlugin: $3, + HashString: $5, + ByHashString: true, + } + } +| "IDENTIFIED" "BY" "PASSWORD" HashString + { + $$ = &ast.AuthOption{ + AuthPlugin: mysql.AuthNativePassword, + HashString: $4, + ByHashString: true, + } + } + +AuthPlugin: + StringName + +HashString: + stringLit +| hexLit + { + $$ = $1.(ast.HexLiteral).ToString() + } + +RoleSpec: + Rolename + { + role := $1.(*auth.RoleIdentity) + roleSpec := &ast.UserSpec{ + User: &auth.UserIdentity{ + Username: role.Username, + Hostname: role.Hostname, + }, + IsRole: true, + } + $$ = roleSpec + } + +RoleSpecList: + RoleSpec + { + $$ = []*ast.UserSpec{$1.(*ast.UserSpec)} + } +| RoleSpecList ',' RoleSpec + { + $$ = append($1.([]*ast.UserSpec), $3.(*ast.UserSpec)) + } + +GrantStmt: + "GRANT" RoleOrPrivElemList "ON" ObjectType PrivLevel "TO" UserSpecList RequireClauseOpt WithGrantOptionOpt + { + p, err := convertToPriv($2.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + $$ = &ast.GrantStmt{ + Privs: p, + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + AuthTokenOrTLSOptions: $8.([]*ast.AuthTokenOrTLSOption), + WithGrant: $9.(bool), + } + } + +GrantProxyStmt: + "GRANT" "PROXY" "ON" Username "TO" UsernameList WithGrantOptionOpt + { + $$ = &ast.GrantProxyStmt{ + LocalUser: $4.(*auth.UserIdentity), + ExternalUsers: $6.([]*auth.UserIdentity), + WithGrant: $7.(bool), + } + } + +GrantRoleStmt: + "GRANT" RoleOrPrivElemList "TO" UsernameList + { + r, err := convertToRole($2.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + $$ = &ast.GrantRoleStmt{ + Roles: r, + Users: $4.([]*auth.UserIdentity), + } + } + +WithGrantOptionOpt: + { + $$ = false + } +| "WITH" "GRANT" "OPTION" + { + $$ = true + } +| "WITH" "MAX_QUERIES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_UPDATES_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_CONNECTIONS_PER_HOUR" NUM + { + $$ = false + } +| "WITH" "MAX_USER_CONNECTIONS" NUM + { + $$ = false + } + +ExtendedPriv: + identifier + { + $$ = []string{$1} + } +| ExtendedPriv identifier + { + $$ = append($1.([]string), $2) + } + +RoleOrPrivElem: + PrivElem + { + $$ = &ast.RoleOrPriv{ + Node: $1, + } + } +| RolenameWithoutIdent + { + $$ = &ast.RoleOrPriv{ + Node: $1, + } + } +| ExtendedPriv + { + $$ = &ast.RoleOrPriv{ + Symbols: strings.Join($1.([]string), " "), + } + } +| "LOAD" "FROM" "S3" + { + $$ = &ast.RoleOrPriv{ + Symbols: "LOAD FROM S3", + } + } +| "SELECT" "INTO" "S3" + { + $$ = &ast.RoleOrPriv{ + Symbols: "SELECT INTO S3", + } + } + +RoleOrPrivElemList: + RoleOrPrivElem + { + $$ = []*ast.RoleOrPriv{$1.(*ast.RoleOrPriv)} + } +| RoleOrPrivElemList ',' RoleOrPrivElem + { + $$ = append($1.([]*ast.RoleOrPriv), $3.(*ast.RoleOrPriv)) + } + +PrivElem: + PrivType + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + } + } +| PrivType '(' ColumnNameList ')' + { + $$ = &ast.PrivElem{ + Priv: $1.(mysql.PrivilegeType), + Cols: $3.([]*ast.ColumnName), + } + } + +PrivType: + "ALL" + { + $$ = mysql.AllPriv + } +| "ALL" "PRIVILEGES" + { + $$ = mysql.AllPriv + } +| "ALTER" + { + $$ = mysql.AlterPriv + } +| "CREATE" + { + $$ = mysql.CreatePriv + } +| "CREATE" "USER" + { + $$ = mysql.CreateUserPriv + } +| "CREATE" "TABLESPACE" + { + $$ = mysql.CreateTablespacePriv + } +| "TRIGGER" + { + $$ = mysql.TriggerPriv + } +| "DELETE" + { + $$ = mysql.DeletePriv + } +| "DROP" + { + $$ = mysql.DropPriv + } +| "PROCESS" + { + $$ = mysql.ProcessPriv + } +| "EXECUTE" + { + $$ = mysql.ExecutePriv + } +| "INDEX" + { + $$ = mysql.IndexPriv + } +| "INSERT" + { + $$ = mysql.InsertPriv + } +| "SELECT" + { + $$ = mysql.SelectPriv + } +| "SUPER" + { + $$ = mysql.SuperPriv + } +| "SHOW" "DATABASES" + { + $$ = mysql.ShowDBPriv + } +| "UPDATE" + { + $$ = mysql.UpdatePriv + } +| "GRANT" "OPTION" + { + $$ = mysql.GrantPriv + } +| "REFERENCES" + { + $$ = mysql.ReferencesPriv + } +| "REPLICATION" "SLAVE" + { + $$ = mysql.ReplicationSlavePriv + } +| "REPLICATION" "CLIENT" + { + $$ = mysql.ReplicationClientPriv + } +| "USAGE" + { + $$ = mysql.UsagePriv + } +| "RELOAD" + { + $$ = mysql.ReloadPriv + } +| "FILE" + { + $$ = mysql.FilePriv + } +| "CONFIG" + { + $$ = mysql.ConfigPriv + } +| "CREATE" "TEMPORARY" "TABLES" + { + $$ = mysql.CreateTMPTablePriv + } +| "LOCK" "TABLES" + { + $$ = mysql.LockTablesPriv + } +| "CREATE" "VIEW" + { + $$ = mysql.CreateViewPriv + } +| "SHOW" "VIEW" + { + $$ = mysql.ShowViewPriv + } +| "CREATE" "ROLE" + { + $$ = mysql.CreateRolePriv + } +| "DROP" "ROLE" + { + $$ = mysql.DropRolePriv + } +| "CREATE" "ROUTINE" + { + $$ = mysql.CreateRoutinePriv + } +| "ALTER" "ROUTINE" + { + $$ = mysql.AlterRoutinePriv + } +| "EVENT" + { + $$ = mysql.EventPriv + } +| "SHUTDOWN" + { + $$ = mysql.ShutdownPriv + } + +ObjectType: + %prec lowerThanFunction + { + $$ = ast.ObjectTypeNone + } +| "TABLE" + { + $$ = ast.ObjectTypeTable + } +| "FUNCTION" + { + $$ = ast.ObjectTypeFunction + } +| "PROCEDURE" + { + $$ = ast.ObjectTypeProcedure + } + +PrivLevel: + '*' + { + $$ = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + } + } +| '*' '.' '*' + { + $$ = &ast.GrantLevel{ + Level: ast.GrantLevelGlobal, + } + } +| Identifier '.' '*' + { + $$ = &ast.GrantLevel{ + Level: ast.GrantLevelDB, + DBName: $1, + } + } +| Identifier '.' Identifier + { + $$ = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + DBName: $1, + TableName: $3, + } + } +| Identifier + { + $$ = &ast.GrantLevel{ + Level: ast.GrantLevelTable, + TableName: $1, + } + } + +/**************************************RevokeStmt******************************************* + * See https://dev.mysql.com/doc/refman/5.7/en/revoke.html + *******************************************************************************************/ +RevokeStmt: + "REVOKE" RoleOrPrivElemList "ON" ObjectType PrivLevel "FROM" UserSpecList + { + p, err := convertToPriv($2.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + $$ = &ast.RevokeStmt{ + Privs: p, + ObjectType: $4.(ast.ObjectTypeType), + Level: $5.(*ast.GrantLevel), + Users: $7.([]*ast.UserSpec), + } + } + +RevokeRoleStmt: + "REVOKE" RoleOrPrivElemList "FROM" UsernameList + { + // MySQL has special syntax for REVOKE ALL [PRIVILEGES], GRANT OPTION + // which uses the RevokeRoleStmt syntax but is of type RevokeStmt. + // It is documented at https://dev.mysql.com/doc/refman/5.7/en/revoke.html + // as the "second syntax" for REVOKE. It is only valid if *both* + // ALL PRIVILEGES + GRANT OPTION are specified in that order. + if isRevokeAllGrant($2.([]*ast.RoleOrPriv)) { + var users []*ast.UserSpec + for _, u := range $4.([]*auth.UserIdentity) { + users = append(users, &ast.UserSpec{ + User: u, + }) + } + $$ = &ast.RevokeStmt{ + Privs: []*ast.PrivElem{{Priv: mysql.AllPriv}, {Priv: mysql.GrantPriv}}, + ObjectType: ast.ObjectTypeNone, + Level: &ast.GrantLevel{Level: ast.GrantLevelGlobal}, + Users: users, + } + } else { + r, err := convertToRole($2.([]*ast.RoleOrPriv)) + if err != nil { + yylex.AppendError(err) + return 1 + } + $$ = &ast.RevokeRoleStmt{ + Roles: r, + Users: $4.([]*auth.UserIdentity), + } + } + } + +/**************************************LoadDataStmt***************************************** + * See https://dev.mysql.com/doc/refman/5.7/en/load-data.html + *******************************************************************************************/ +LoadDataStmt: + "LOAD" "DATA" LowPriorityOpt LocalOpt "INFILE" stringLit DuplicateOpt "INTO" "TABLE" TableName CharsetOpt Fields Lines IgnoreLines ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt + { + x := &ast.LoadDataStmt{ + LowPriority: $3.(bool), + FileLocRef: ast.FileLocServer, + Path: $6, + OnDuplicate: $7.(ast.OnDuplicateKeyHandlingType), + Table: $10.(*ast.TableName), + Charset: $11.(*string), + FieldsInfo: $12.(*ast.FieldsClause), + LinesInfo: $13.(*ast.LinesClause), + IgnoreLines: $14.(*uint64), + ColumnsAndUserVars: $15.([]*ast.ColumnNameOrUserVar), + ColumnAssignments: $16.([]*ast.Assignment), + } + if $4 != nil { + x.FileLocRef = ast.FileLocClient + // See https://dev.mysql.com/doc/refman/5.7/en/load-data.html#load-data-duplicate-key-handling + // If you do not specify IGNORE or REPLACE modifier , then we set default behavior to IGNORE when LOCAL modifier is specified + if x.OnDuplicate == ast.OnDuplicateKeyHandlingError { + x.OnDuplicate = ast.OnDuplicateKeyHandlingIgnore + } + } + columns := []*ast.ColumnName{} + for _, v := range x.ColumnsAndUserVars { + if v.ColumnName != nil { + columns = append(columns, v.ColumnName) + } + } + x.Columns = columns + + $$ = x + } + +LowPriorityOpt: + { + $$ = false + } +| "LOW_PRIORITY" + { + $$ = true + } + +IgnoreLines: + { + $$ = (*uint64)(nil) + } +| "IGNORE" NUM "LINES" + { + v := getUint64FromNUM($2) + $$ = &v + } + +CharsetOpt: + { + $$ = (*string)(nil) + } +| "CHARACTER" "SET" CharsetName + { + v := $3 + $$ = &v + } + +LocalOpt: + { + $$ = nil + } +| "LOCAL" + { + $$ = $1 + } + +Fields: + { + $$ = (*ast.FieldsClause)(nil) + } +| FieldsOrColumns FieldItemList + { + fieldsClause := &ast.FieldsClause{} + fieldItems := $2.([]*ast.FieldItem) + for _, item := range fieldItems { + switch item.Type { + case ast.Terminated: + fieldsClause.Terminated = &item.Value + case ast.Enclosed: + fieldsClause.Enclosed = &item.Value + fieldsClause.OptEnclosed = item.OptEnclosed + case ast.Escaped: + fieldsClause.Escaped = &item.Value + case ast.DefinedNullBy: + fieldsClause.DefinedNullBy = &item.Value + fieldsClause.NullValueOptEnclosed = item.OptEnclosed + } + } + $$ = fieldsClause + } + +FieldsOrColumns: + "FIELDS" +| "COLUMNS" + +FieldItemList: + FieldItemList FieldItem + { + fieldItems := $1.([]*ast.FieldItem) + $$ = append(fieldItems, $2.(*ast.FieldItem)) + } +| FieldItem + { + fieldItems := make([]*ast.FieldItem, 1, 1) + fieldItems[0] = $1.(*ast.FieldItem) + $$ = fieldItems + } + +FieldItem: + "TERMINATED" "BY" FieldTerminator + { + $$ = &ast.FieldItem{ + Type: ast.Terminated, + Value: $3, + } + } +| optionallyEnclosedBy FieldTerminator + { + str := $2 + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + OptEnclosed: true, + } + } +| "ENCLOSED" "BY" FieldTerminator + { + str := $3 + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Enclosed, + Value: str, + } + } +| "ESCAPED" "BY" FieldTerminator + { + str := $3 + if str != "\\" && len(str) > 1 { + yylex.AppendError(ErrWrongFieldTerminators.GenByArgs()) + return 1 + } + $$ = &ast.FieldItem{ + Type: ast.Escaped, + Value: str, + } + } +| "DEFINED" "NULL" "BY" TextString + { + $$ = &ast.FieldItem{ + Type: ast.DefinedNullBy, + Value: $4.(*ast.TextString).Value, + } + } +| "DEFINED" "NULL" "BY" TextString "OPTIONALLY" "ENCLOSED" + { + $$ = &ast.FieldItem{ + Type: ast.DefinedNullBy, + Value: $4.(*ast.TextString).Value, + OptEnclosed: true, + } + } + +FieldTerminator: + stringLit +| hexLit + { + $$ = $1.(ast.HexLiteral).ToString() + } +| bitLit + { + $$ = $1.(ast.BitLiteral).ToString() + } + +Lines: + { + $$ = (*ast.LinesClause)(nil) + } +| "LINES" Starting LinesTerminated + { + $$ = &ast.LinesClause{Starting: $2.(*string), Terminated: $3.(*string)} + } + +Starting: + { + $$ = (*string)(nil) + } +| "STARTING" "BY" FieldTerminator + { + s := $3 + $$ = &s + } + +LinesTerminated: + { + $$ = (*string)(nil) + } +| "TERMINATED" "BY" FieldTerminator + { + s := $3 + $$ = &s + } + +LoadDataSetSpecOpt: + { + $$ = ([]*ast.Assignment)(nil) + } +| "SET" LoadDataSetList + { + $$ = $2 + } + +LoadDataSetList: + LoadDataSetList ',' LoadDataSetItem + { + l := $1.([]*ast.Assignment) + $$ = append(l, $3.(*ast.Assignment)) + } +| LoadDataSetItem + { + $$ = []*ast.Assignment{$1.(*ast.Assignment)} + } + +LoadDataSetItem: + SimpleIdent "=" ExprOrDefault + { + $$ = &ast.Assignment{ + Column: $1.(*ast.ColumnNameExpr).Name, + Expr: $3, + } + } + +UnlockTablesStmt: + "UNLOCK" TablesTerminalSym + { + $$ = &ast.UnlockTablesStmt{} + } + +LockTablesStmt: + "LOCK" TablesTerminalSym TableLockList + { + $$ = &ast.LockTablesStmt{ + TableLocks: $3.([]ast.TableLock), + } + } + +TablesTerminalSym: + "TABLES" +| "TABLE" + +TableLock: + TableName LockType + { + $$ = ast.TableLock{ + Table: $1.(*ast.TableName), + Type: $2.(ast.TableLockType), + } + } + +LockType: + "READ" + { + $$ = ast.TableLockRead + } +| "READ" "LOCAL" + { + $$ = ast.TableLockReadLocal + } +| "WRITE" + { + $$ = ast.TableLockWrite + } +| "WRITE" "LOCAL" + { + $$ = ast.TableLockWriteLocal + } + +TableLockList: + TableLock + { + $$ = []ast.TableLock{$1.(ast.TableLock)} + } +| TableLockList ',' TableLock + { + $$ = append($1.([]ast.TableLock), $3.(ast.TableLock)) + } + +/******************************************************************** + * Non-transactional Delete Statement + * Split a SQL on a column. Used for bulk delete that doesn't need ACID. + *******************************************************************/ +RepairTableStmt: + "REPAIR" NoWriteToBinLogAliasOpt TableOrTables TableNameList RepairTypeListOpt + { + stmt := $5.(*ast.RepairTableStmt) + stmt.NoWriteToBinLog = $2.(bool) + stmt.Tables = $4.([]*ast.TableName) + $$ = stmt + } + +RepairTypeListOpt: + { + $$ = &ast.RepairTableStmt{} + } +| RepairTypeListOpt "QUICK" + { + stmt := $1.(*ast.RepairTableStmt) + stmt.Quick = true + $$ = stmt + } +| RepairTypeListOpt "EXTENDED" + { + stmt := $1.(*ast.RepairTableStmt) + stmt.Extended = true + $$ = stmt + } +| RepairTypeListOpt "USE_FRM" + { + stmt := $1.(*ast.RepairTableStmt) + stmt.UseFrm = true + $$ = stmt + } + +OptimizeTableStmt: + "OPTIMIZE" NoWriteToBinLogAliasOpt TableOrTables TableNameList + { + $$ = &ast.OptimizeTableStmt{ + Tables: $4.([]*ast.TableName), + NoWriteToBinLog: $2.(bool), + } + } + +/******************************************************************** + * Kill Statement + * See https://dev.mysql.com/doc/refman/5.7/en/kill.html + *******************************************************************/ +KillStmt: + "KILL" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($2), + } + } +| "KILL" "CONNECTION" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + } + } +| "KILL" "QUERY" NUM + { + $$ = &ast.KillStmt{ + ConnectionID: getUint64FromNUM($3), + Query: true, + } + } +| "KILL" BuiltinFunction + { + $$ = &ast.KillStmt{ + Expr: $2, + } + } + +SignedNum: + Int64Num +| '+' Int64Num + { + $$ = $2 + } +| '-' NUM + { + unsigned_num := getUint64FromNUM($2) + if unsigned_num > 9223372036854775808 { + yylex.AppendError(yylex.Errorf("the Signed Value should be at the range of [-9223372036854775808, 9223372036854775807].")) + return 1 + } else if unsigned_num == 9223372036854775808 { + signed_one := int64(1) + $$ = signed_one << 63 + } else { + $$ = -int64(unsigned_num) + } + } + +EncryptionOpt: + stringLit + { + // Parse it but will ignore it + switch $1 { + case "Y", "y": + yylex.AppendError(yylex.Errorf("The ENCRYPTION clause is parsed but ignored by all storage engines.")) + parser.lastErrorAsWarn() + case "N", "n": + break + default: + yylex.AppendError(ErrWrongValue.GenByArgs("argument (should be Y or N)", $1)) + return 1 + } + $$ = $1 + } + +ValuesStmtList: + RowStmt + { + $$ = append([]*ast.RowExpr{}, $1.(*ast.RowExpr)) + } +| ValuesStmtList ',' RowStmt + { + $$ = append($1.([]*ast.RowExpr), $3.(*ast.RowExpr)) + } + +RowStmt: + "ROW" RowValue + { + $$ = &ast.RowExpr{Values: $2.([]ast.ExprNode)} + } +%% diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go new file mode 100644 index 000000000..0ab0226ca --- /dev/null +++ b/pkg/parser/parser_test.go @@ -0,0 +1,1667 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "errors" + "fmt" + "runtime" + "slices" + "strings" + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/charset" + . "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/opcode" + "github.com/stretchr/testify/require" +) + +func TestSpecialComments(t *testing.T) { + p := parser.New() + + // 1. Make sure /*! ... */ respects the same SQL mode. + _, err := p.ParseOneStmt(`SELECT /*! '\' */;`, "", "") + require.Error(t, err) + + p.SetSQLMode(mysql.ModeNoBackslashEscapes) + st, err := p.ParseOneStmt(`SELECT /*! '\' */;`, "", "") + require.NoError(t, err) + require.IsType(t, &ast.SelectStmt{}, st) + + // 2. Make sure multiple statements inside /*! ... */ will not crash + // (this is issue #330) + stmts, _, err := p.Parse("/*! SET x = 1; SELECT 2 */", "", "") + require.NoError(t, err) + require.Len(t, stmts, 2) + require.IsType(t, &ast.SetStmt{}, stmts[0]) + require.Equal(t, "/*! SET x = 1;", stmts[0].Text()) + require.IsType(t, &ast.SelectStmt{}, stmts[1]) + require.Equal(t, " SELECT 2 */", stmts[1].Text()) + // ^ not sure if correct approach; having multiple statements in MySQL is a syntax error. + + // 3. Make sure invalid text won't cause infinite loop + // (this is issue #336) + st, err = p.ParseOneStmt("SELECT /*+ 😅 */ SLEEP(1);", "", "") + require.NoError(t, err) + sel, ok := st.(*ast.SelectStmt) + require.True(t, ok) + require.Empty(t, sel.TableHints) +} + +type testCase struct { + src string + ok bool + restore string +} + +type testErrMsgCase struct { + src string + err error +} + +func RunTest(t *testing.T, table []testCase, enableWindowFunc bool) { + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + if !tbl.ok { + require.Errorf(t, err, "source %v, error %v", tbl.src, err) + continue + } + require.NoErrorf(t, err, "source:\n%v\nerror:\n%v", tbl.src, err) + // restore correctness test + if tbl.ok { + RunRestoreTest(t, tbl.src, tbl.restore, enableWindowFunc) + } + } +} + +func RunRestoreTest(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFunc bool) { + var sb strings.Builder + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + comment := fmt.Sprintf("source %v", sourceSQLs) + stmts, _, err := p.Parse(sourceSQLs, "", "") + require.NoErrorf(t, err, "source %v", sourceSQLs) + restoreSQLs := "" + for _, stmt := range stmts { + sb.Reset() + err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) + require.NoError(t, err, comment) + restoreSQL := sb.String() + comment = fmt.Sprintf("source %v; restore %v", sourceSQLs, restoreSQL) + restoreStmt, err := p.ParseOneStmt(restoreSQL, "", "") + require.NoError(t, err, comment) + CleanNodeText(stmt) + CleanNodeText(restoreStmt) + require.Equal(t, stmt, restoreStmt, comment) + if restoreSQLs != "" { + restoreSQLs += "; " + } + restoreSQLs += restoreSQL + } + require.Equalf(t, expectSQLs, restoreSQLs, "restore %v; expect %v", restoreSQLs, expectSQLs) +} + +// errorsEqual reports whether two errors match, either via errors.Is or by +// rendering to the same message. +func errorsEqual(err1, err2 error) bool { + if errors.Is(err1, err2) { + return true + } + if err1 == nil || err2 == nil { + return false + } + return err1.Error() == err2.Error() +} + +func RunErrMsgTest(t *testing.T, table []testErrMsgCase) { + p := parser.New() + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if tbl.err != nil { + require.True(t, errorsEqual(err, tbl.err), comment) + } else { + require.NoError(t, err, comment) + } + } +} + +func TestSetVariable(t *testing.T) { + table := []struct { + Input string + Name string + IsGlobal bool + IsInstance bool + IsSystem bool + }{ + + // Set system variable xx.xx, although xx.xx isn't a system variable, the parser should accept it. + {"set xx.xx = 666", "xx.xx", false, false, true}, + // Set session system variable xx.xx + {"set session xx.xx = 666", "xx.xx", false, false, true}, + {"set local xx.xx = 666", "xx.xx", false, false, true}, + {"set global xx.xx = 666", "xx.xx", true, false, true}, + {"set instance xx.xx = 666", "xx.xx", false, true, true}, + + {"set @@xx.xx = 666", "xx.xx", false, false, true}, + {"set @@session.xx.xx = 666", "xx.xx", false, false, true}, + {"set @@local.xx.xx = 666", "xx.xx", false, false, true}, + {"set @@global.xx.xx = 666", "xx.xx", true, false, true}, + {"set @@instance.xx.xx = 666", "xx.xx", false, true, true}, + + // Set user defined variable xx.xx + {"set @xx.xx = 666", "xx.xx", false, false, false}, + } + + p := parser.New() + for _, tbl := range table { + stmt, err := p.ParseOneStmt(tbl.Input, "", "") + require.NoError(t, err) + + setStmt, ok := stmt.(*ast.SetStmt) + require.True(t, ok) + require.Len(t, setStmt.Variables, 1) + + v := setStmt.Variables[0] + require.Equal(t, tbl.Name, v.Name) + require.Equal(t, tbl.IsGlobal, v.IsGlobal) + require.Equal(t, tbl.IsInstance, v.IsInstance) + require.Equal(t, tbl.IsSystem, v.IsSystem) + } + + _, err := p.ParseOneStmt("set xx.xx.xx = 666", "", "") + require.Error(t, err) +} + +func TestFlushTable(t *testing.T) { + p := parser.New() + stmt, _, err := p.Parse("flush local tables tbl1,tbl2 with read lock", "", "") + require.NoError(t, err) + flushTable := stmt[0].(*ast.FlushStmt) + require.Equal(t, ast.FlushTables, flushTable.Tp) + require.Equal(t, "tbl1", flushTable.Tables[0].Name.L) + require.Equal(t, "tbl2", flushTable.Tables[1].Name.L) + require.True(t, flushTable.NoWriteToBinLog) + require.True(t, flushTable.ReadLock) +} + +func TestFlushPrivileges(t *testing.T) { + p := parser.New() + stmt, _, err := p.Parse("flush privileges", "", "") + require.NoError(t, err) + flushPrivilege := stmt[0].(*ast.FlushStmt) + require.Equal(t, ast.FlushPrivileges, flushPrivilege.Tp) +} + +func TestHintError(t *testing.T) { + p := parser.New() + stmt, warns, err := p.Parse("select /*+ unknown_hint(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + require.Len(t, warns, 1) + require.Equal(t, `[parser:8061]Optimizer hint unknown_hint is not supported and is ignored`, warns[0].Error()) + require.Empty(t, stmt[0].(*ast.SelectStmt).TableHints) + stmt, warns, err = p.Parse("select /*+ HASH_JOIN(t1, T2) unknown_hint(T1,t2, 1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 1) + require.NoError(t, err) + require.Len(t, warns, 1) + require.Equal(t, `[parser:8061]Optimizer hint unknown_hint is not supported and is ignored`, warns[0].Error()) + _, _, err = p.Parse("select c1, c2 from /*+ unknown_hint(T1,t2) */ t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) // Hints are ignored after the "FROM" keyword! + _, _, err = p.Parse("select1 /*+ HASH_JOIN(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.EqualError(t, err, "line 1 column 7 near \"select1 /*+ HASH_JOIN(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") + _, _, err = p.Parse("select /*+ HASH_JOIN(t1, T2) */ c1, c2 fromt t1, t2 where t1.c1 = t2.c1", "", "") + require.EqualError(t, err, "line 1 column 47 near \"t1, t2 where t1.c1 = t2.c1\" ") + _, _, err = p.Parse("SELECT 1 FROM DUAL WHERE 1 IN (SELECT /*+ DEBUG_HINT3 */ 1)", "", "") + require.NoError(t, err) + stmt, _, err = p.Parse("insert into t select /*+ MAX_EXECUTION_TIME(1000) */ * from t;", "", "") + require.NoError(t, err) + require.Empty(t, stmt[0].(*ast.InsertStmt).TableHints) + require.Len(t, stmt[0].(*ast.InsertStmt).Select.(*ast.SelectStmt).TableHints, 1) + stmt, _, err = p.Parse("insert /*+ MAX_EXECUTION_TIME(1000) */ into t select * from t;", "", "") + require.NoError(t, err) + require.Len(t, stmt[0].(*ast.InsertStmt).TableHints, 1) + + _, warns, err = p.Parse("SELECT id FROM tbl WHERE id = 0 FOR UPDATE /*+ xyz */", "", "") + require.NoError(t, err) + require.Len(t, warns, 1) + require.Regexp(t, `near '/\*\+' at line 1$`, warns[0].Error()) + +} + +// TestDefaultValueParenthesesRoundTrip verifies that the parenthesized form +// of a default value survives a parse/restore round trip. MySQL 8.0.13+ +// distinguishes literal defaults (DEFAULT '{}') from expression defaults +// (DEFAULT ('{}')); BLOB/TEXT/JSON/GEOMETRY columns only accept the +// parenthesized form, so dropping the parentheses produces DDL that MySQL +// rejects with Error 1101 (block/spirit#542). +func TestDefaultValueParenthesesRoundTrip(t *testing.T) { + p := parser.New() + testCases := []struct { + sql string + expected string + }{ + // The exact statement from issue #542. + { + "alter table t1 add column j json default ('{}')", + "ALTER TABLE `t1` ADD COLUMN `j` JSON DEFAULT ('{}')", + }, + // Parenthesized literals keep their parentheses... + { + "create table t2 (j json default ('{}'))", + "CREATE TABLE `t2` (`j` JSON DEFAULT ('{}'))", + }, + { + "create table t2 (b blob default ('abc'))", + "CREATE TABLE `t2` (`b` BLOB DEFAULT ('abc'))", + }, + { + "create table t2 (i int default (1))", + "CREATE TABLE `t2` (`i` INT DEFAULT (1))", + }, + { + "create table t2 (d date default (null))", + "CREATE TABLE `t2` (`d` DATE DEFAULT (NULL))", + }, + // ...while bare literals stay bare. + { + "create table t2 (v varchar(10) default '{}')", + "CREATE TABLE `t2` (`v` VARCHAR(10) DEFAULT '{}')", + }, + { + "create table t2 (i int default 1)", + "CREATE TABLE `t2` (`i` INT DEFAULT 1)", + }, + // ALTER ... SET DEFAULT keeps the same distinction. + { + "alter table t1 alter column j set default ('{}')", + "ALTER TABLE `t1` ALTER COLUMN `j` SET DEFAULT ('{}')", + }, + { + "alter table t1 alter column i set default 5", + "ALTER TABLE `t1` ALTER COLUMN `i` SET DEFAULT 5", + }, + { + "alter table t1 alter column u set default (uuid())", + "ALTER TABLE `t1` ALTER COLUMN `u` SET DEFAULT (UUID())", + }, + // Parenthesized function defaults are unchanged: the parentheses + // come back from ColumnOption.Restore, not a ParenthesesExpr. + { + "create table t2 (u varchar(36) default (uuid()))", + "CREATE TABLE `t2` (`u` VARCHAR(36) DEFAULT (UUID()))", + }, + } + + for _, tc := range testCases { + stmt, err := p.ParseOneStmt(tc.sql, "", "") + require.NoError(t, err, tc.sql) + var sb strings.Builder + err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags|RestoreStringWithoutCharset, &sb)) + require.NoError(t, err, tc.sql) + require.Equal(t, tc.expected, sb.String(), tc.sql) + + // The restored SQL must re-parse and restore to the same text + // (no parentheses gained or lost on further round trips). + stmt2, err := p.ParseOneStmt(sb.String(), "", "") + require.NoError(t, err, sb.String()) + var sb2 strings.Builder + err = stmt2.Restore(NewRestoreCtx(DefaultRestoreFlags|RestoreStringWithoutCharset, &sb2)) + require.NoError(t, err, sb.String()) + require.Equal(t, sb.String(), sb2.String(), tc.sql) + } +} + +// TestKeywordFunctionCalls covers functions whose names lex as keyword +// tokens rather than plain identifiers (block/spirit#1128). The spatial +// constructors are keywords because they double as column types, so +// without dedicated grammar productions they were unparsable as function +// calls anywhere; the remaining FunctionNameConflict members were +// unparsable specifically in DEFAULT expressions. MySQL accepts all of +// these forms and SHOW CREATE TABLE emits them. +func TestKeywordFunctionCalls(t *testing.T) { + p := parser.New() + testCases := []struct { + sql string + expected string + }{ + // DEFAULT (Point(0,0)) is the MySQL manual's own example of an + // expression default. + { + "create table t (g geometry default (point(0,0)))", + "CREATE TABLE `t` (`g` GEOMETRY DEFAULT (POINT(0, 0)))", + }, + { + "alter table t add column g point default (point(0,0))", + "ALTER TABLE `t` ADD COLUMN `g` POINT DEFAULT (POINT(0, 0))", + }, + { + "create table t (g geometry default (linestring(point(0,0), point(1,1))))", + "CREATE TABLE `t` (`g` GEOMETRY DEFAULT (LINESTRING(POINT(0, 0), POINT(1, 1))))", + }, + // Non-spatial FunctionNameConflict members in DEFAULT: upstream + // special-cased only REPLACE, missing the rest of the class. + { + "create table t (v varchar(10) default (repeat('a',3)))", + "CREATE TABLE `t` (`v` VARCHAR(10) DEFAULT (REPEAT('a', 3)))", + }, + { + "create table t (v varchar(10) default (left('abc',2)))", + "CREATE TABLE `t` (`v` VARCHAR(10) DEFAULT (LEFT('abc', 2)))", + }, + // Spatial constructors in ordinary expression contexts: broken + // before because only POINT was in FunctionNameConflict. + { + "select linestring(point(0,0), point(1,1))", + "SELECT LINESTRING(POINT(0, 0), POINT(1, 1))", + }, + { + "select multipoint(point(0,0)), multilinestring(linestring(point(0,0), point(1,1)))", + "SELECT MULTIPOINT(POINT(0, 0)),MULTILINESTRING(LINESTRING(POINT(0, 0), POINT(1, 1)))", + }, + { + "select geometrycollection(point(0,0), multipolygon(polygon(linestring(point(0,0), point(1,1), point(0,1), point(0,0)))))", + "SELECT GEOMETRYCOLLECTION(POINT(0, 0), MULTIPOLYGON(POLYGON(LINESTRING(POINT(0, 0), POINT(1, 1), POINT(0, 1), POINT(0, 0)))))", + }, + { + "create table t (p point, q point, g geometry generated always as (linestring(p, q)) stored)", + "CREATE TABLE `t` (`p` POINT,`q` POINT,`g` GEOMETRY GENERATED ALWAYS AS(LINESTRING(`p`, `q`)) STORED)", + }, + { + "alter table t add constraint c check (st_length(linestring(p, q)) > 0)", + "ALTER TABLE `t` ADD CONSTRAINT `c` CHECK(ST_LENGTH(LINESTRING(`p`, `q`))>0) ENFORCED", + }, + // NOW is deliberately excluded from the DEFAULT-context rule: + // DEFAULT (now()) must keep folding to CURRENT_TIMESTAMP. + { + "create table t (ts datetime default (now()))", + "CREATE TABLE `t` (`ts` DATETIME DEFAULT CURRENT_TIMESTAMP())", + }, + // Keyword function names still work as plain identifiers. + { + "create table t (point int)", + "CREATE TABLE `t` (`point` INT)", + }, + { + "select point from t", + "SELECT `point` FROM `t`", + }, + } + + for _, tc := range testCases { + stmt, err := p.ParseOneStmt(tc.sql, "", "") + require.NoError(t, err, tc.sql) + var sb strings.Builder + err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags|RestoreStringWithoutCharset, &sb)) + require.NoError(t, err, tc.sql) + require.Equal(t, tc.expected, sb.String(), tc.sql) + + // The restored SQL must re-parse and restore to the same text. + stmt2, err := p.ParseOneStmt(sb.String(), "", "") + require.NoError(t, err, sb.String()) + var sb2 strings.Builder + err = stmt2.Restore(NewRestoreCtx(DefaultRestoreFlags|RestoreStringWithoutCharset, &sb2)) + require.NoError(t, err, sb.String()) + require.Equal(t, sb.String(), sb2.String(), tc.sql) + } +} + +func TestGroupConcatSeparatorCharsetCollation(t *testing.T) { + p := parser.New() + testCases := []struct { + sql string + charset string + collate string + sep string + }{ + { + sql: "select group_concat('x')", + charset: charset.CharsetLatin1, + collate: charset.CollationLatin1, + sep: ",", + }, + { + sql: "select group_concat('x' separator ';')", + charset: charset.CharsetLatin1, + collate: charset.CollationLatin1, + sep: ";", + }, + { + sql: "select group_concat('x')", + charset: mysql.DefaultCharset, + collate: mysql.DefaultCollationName, + sep: ",", + }, + } + + for _, tc := range testCases { + stmt, err := p.ParseOneStmt(tc.sql, tc.charset, tc.collate) + require.NoError(t, err) + + sel, ok := stmt.(*ast.SelectStmt) + require.True(t, ok) + require.Len(t, sel.Fields.Fields, 1) + + agg, ok := sel.Fields.Fields[0].Expr.(*ast.AggregateFuncExpr) + require.True(t, ok) + require.Equal(t, ast.AggFuncGroupConcat, agg.F) + require.GreaterOrEqual(t, len(agg.Args), 2) + + separator, ok := agg.Args[len(agg.Args)-1].(*ast.ValueExpr) + require.True(t, ok) + require.Equal(t, tc.sep, separator.GetString()) + require.Equal(t, tc.charset, separator.GetType().GetCharset()) + require.Equal(t, tc.collate, separator.GetType().GetCollate()) + + // The separator must restore as a plain string literal (no charset + // introducer): the grammar only accepts `SEPARATOR stringLit`. + var sb strings.Builder + require.NoError(t, agg.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb))) + require.Contains(t, sb.String(), "SEPARATOR '"+tc.sep+"'") + _, err = p.ParseOneStmt("select "+sb.String(), tc.charset, tc.collate) + require.NoError(t, err) + } +} + +func TestErrorMsg(t *testing.T) { + p := parser.New() + _, _, err := p.Parse("select1 1", "", "") + require.EqualError(t, err, "line 1 column 7 near \"select1 1\" ") + _, _, err = p.Parse("select 1 from1 dual", "", "") + require.EqualError(t, err, "line 1 column 19 near \"dual\" ") + _, _, err = p.Parse("select * from t1 join t2 from t1.a = t2.a;", "", "") + require.EqualError(t, err, "line 1 column 29 near \"from t1.a = t2.a;\" ") + _, _, err = p.Parse("select * from t1 join t2 one t1.a = t2.a;", "", "") + require.EqualError(t, err, "line 1 column 31 near \"t1.a = t2.a;\" ") + _, _, err = p.Parse("select * from t1 join t2 on t1.a >>> t2.a;", "", "") + require.EqualError(t, err, "line 1 column 36 near \"> t2.a;\" ") + + _, _, err = p.Parse("create table t(f_year year(5))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;", "", "") + require.EqualError(t, err, "[parser:1818]Supports only YEAR or YEAR(4) column") + + _, _, err = p.Parse("create table ``.t (id int);", "", "") + require.EqualError(t, err, "[parser:1102]Incorrect database name ''") + + _, _, err = p.Parse("create table ` `.t (id int);", "", "") + require.EqualError(t, err, "[parser:1102]Incorrect database name ' '") + + _, _, err = p.Parse("select ifnull(a,0) & ifnull(a,0) like '55' ESCAPE '\\\\a' from t;", "", "") + require.EqualError(t, err, "[parser:1210]Incorrect arguments to ESCAPE") + + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b';", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") + + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Escaped by '\\\\b';", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") + + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b' Escaped by '\\\\b' ;", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") + + _, _, err = p.Parse("ALTER DATABASE `` CHARACTER SET = ''", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: ''") + + _, _, err = p.Parse("ALTER DATABASE t CHARACTER SET = ''", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: ''") + + _, _, err = p.Parse("ALTER SCHEMA t CHARACTER SET = 'SOME_INVALID_CHARSET'", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'SOME_INVALID_CHARSET'") + + _, _, err = p.Parse("ALTER DATABASE t COLLATE = ''", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: ''") + + _, _, err = p.Parse("ALTER SCHEMA t COLLATE = 'SOME_INVALID_COLLATION'", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'SOME_INVALID_COLLATION'") + + _, _, err = p.Parse("ALTER DATABASE CHARSET = 'utf8mb4' COLLATE = 'utf8_bin'", "", "") + require.EqualError(t, err, "line 1 column 24 near \"= 'utf8mb4' COLLATE = 'utf8_bin'\" ") + + _, _, err = p.Parse("ALTER DATABASE t ENCRYPTION = ''", "", "") + require.EqualError(t, err, "[parser:1525]Incorrect argument (should be Y or N) value: ''") + + _, _, err = p.Parse("ALTER DATABASE", "", "") + require.EqualError(t, err, "line 1 column 14 near \"\" ") + + _, _, err = p.Parse("ALTER SCHEMA `ANY_DB_NAME`", "", "") + require.EqualError(t, err, "line 1 column 26 near \"\" ") + + _, _, err = p.Parse("alter table t partition by range FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For RANGE partitions each partition must be defined") + + _, _, err = p.Parse("alter table t partition by list FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") + + _, _, err = p.Parse("alter table t partition by list FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") + + _, _, err = p.Parse("alter table t partition by list FIELDS(a,b,c)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") + + _, _, err = p.Parse("alter table t lock = first", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'first'") + + _, _, err = p.Parse("alter table t lock = start", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'start'") + + _, _, err = p.Parse("alter table t lock = commit", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'commit'") + + _, _, err = p.Parse("alter table t lock = binlog", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'binlog'") + + _, _, err = p.Parse("alter table t lock = randomStr123", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'randomStr123'") + + _, _, err = p.Parse("create table t (a longtext unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") + + _, _, err = p.Parse("create table t (a long byte, b text unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") + + _, _, err = p.Parse("create table t (a long ascii, b long unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") + + _, _, err = p.Parse("create table t (a text unicode, b mediumtext ascii, c int)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") + + _, _, err = p.Parse("select 1 collate some_unknown_collation", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'some_unknown_collation'") +} + +func TestOptimizerHints(t *testing.T) { + p := parser.New() + // Test ORDER_INDEX + stmt, _, err := p.Parse("select /*+ ORDER_INDEX(T1,T2), order_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt := stmt[0].(*ast.SelectStmt) + + hints := selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "order_index", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "t2", hints[0].Indexes[0].L) + + require.Equal(t, "order_index", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "t4", hints[1].Indexes[0].L) + + // Test NO_ORDER_INDEX and RESOURCE_GROUP + stmt, _, err = p.Parse("select /*+ NO_ORDER_INDEX(T1,T2), no_order_index(t3,t4) RESOURCE_GROUP(rg1)*/ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 3) + require.Equal(t, "no_order_index", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "t2", hints[0].Indexes[0].L) + + require.Equal(t, "no_order_index", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "t4", hints[1].Indexes[0].L) + + require.Equal(t, "resource_group", hints[2].HintName.L) + require.Equal(t, "rg1", hints[2].HintData) + + // Test HASH_JOIN and NO_HASH_JOIN + stmt, _, err = p.Parse("select /*+ HASH_JOIN(t1, T2), no_hash_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "hash_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) + + require.Equal(t, "no_hash_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) + + // Test MERGE + stmt, _, err = p.Parse("select /*+ MERGE(), merge(@qb1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "merge", hints[0].HintName.L) + require.Equal(t, "merge", hints[1].HintName.L) + require.Equal(t, "qb1", hints[1].QBName.L) + + // Test NO_INDEX_MERGE + stmt, _, err = p.Parse("select /*+ NO_INDEX_MERGE(), no_index_merge() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "no_index_merge", hints[0].HintName.L) + require.Equal(t, "no_index_merge", hints[1].HintName.L) + + // Test MAX_EXECUTION_TIME + queries := []string{ + "SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 where t1.c1 = t2.c1", + "SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1", + "SELECT /*+ MAX_EXECUTION_TIME(1000) */ SLEEP(20)", + "SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM DUAL", + } + for i, query := range queries { + stmt, _, err = p.Parse(query, "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + require.Lenf(t, hints, 1, "case %d", i) + require.Equal(t, "max_execution_time", hints[0].HintName.L) + require.Equal(t, uint64(1000), hints[0].HintData.(uint64)) + } + + // Test QB_NAME + stmt, _, err = p.Parse("select /*+ QB_NAME(qb1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + require.Len(t, hints, 1) + require.Equal(t, "qb_name", hints[0].HintName.L) + require.Equal(t, "qb1", hints[0].QBName.L) + + // Test SET_VAR + stmt, _, err = p.Parse("select /*+ SET_VAR(sql_mode = 'ANSI') */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + hints = selectStmt.TableHints + require.Len(t, hints, 1) + require.Equal(t, "set_var", hints[0].HintName.L) + require.Equal(t, ast.HintSetVar{VarName: "sql_mode", Value: "ANSI"}, hints[0].HintData) + + // MySQL hints that the parser recognizes but does not model produce a + // warning and are dropped from the AST. + stmt, warns, err := p.Parse("select /*+ BKA(t1), NO_BNL(t2), JOIN_ORDER(t3, t4), MRR(t5 idx1), SEMIJOIN(FIRSTMATCH) */ c1 from t1", "", "") + require.NoError(t, err) + require.Len(t, warns, 5) + selectStmt = stmt[0].(*ast.SelectStmt) + require.Empty(t, selectStmt.TableHints) + + // TiDB-only hint names are unknown identifiers now, and also warn. + stmt, warns, err = p.Parse("select /*+ INL_JOIN(t1, t2), HASH_AGG(), READ_FROM_STORAGE(TIFLASH[t1]) */ c1 from t1", "", "") + require.NoError(t, err) + require.NotEmpty(t, warns) + selectStmt = stmt[0].(*ast.SelectStmt) + require.Empty(t, selectStmt.TableHints) +} + +func TestParserErrMsg(t *testing.T) { + commentMsgCases := []testErrMsgCase{ + {"delete from t where a = 7 or 1=1/*' and b = 'p'", errors.New("near '/*' and b = 'p'' at line 1")}, + {"delete from t where a = 7 or\n 1=1/*' and b = 'p'", errors.New("near '/*' and b = 'p'' at line 2")}, + {"select 1/*", errors.New("near '/*' at line 1")}, + {"select 1/* comment */", nil}, + } + funcCallMsgCases := []testErrMsgCase{ + {"select a.b()", nil}, + {"SELECT foo.bar('baz');", nil}, + } + RunErrMsgTest(t, commentMsgCases) + RunErrMsgTest(t, funcCallMsgCases) +} + +func checkOrderBy(t *testing.T, s ast.Node, hasOrderBy []bool, i int) int { + switch x := s.(type) { + case *ast.SelectStmt: + require.Equal(t, hasOrderBy[i], x.OrderBy != nil) + return i + 1 + case *ast.SetOprSelectList: + for _, sel := range x.Selects { + i = checkOrderBy(t, sel, hasOrderBy, i) + } + return i + } + return i +} + +func TestUnionOrderBy(t *testing.T) { + p := parser.New() + p.EnableWindowFunc(false) + + tests := []struct { + src string + hasOrderBy []bool + }{ + {"select 2 as a from dual union select 1 as b from dual order by a", []bool{false, false, true}}, + {"select 2 as a from dual union (select 1 as b from dual order by a)", []bool{false, true, false}}, + {"(select 2 as a from dual order by a) union select 1 as b from dual order by a", []bool{true, false, true}}, + {"select 1 a, 2 b from dual order by a", []bool{true}}, + {"select 1 a, 2 b from dual", []bool{false}}, + } + + for _, tbl := range tests { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) + us, ok := stmt[0].(*ast.SetOprStmt) + if ok { + var i int + for _, s := range us.SelectList.Selects { + i = checkOrderBy(t, s, tbl.hasOrderBy, i) + } + require.Equal(t, tbl.hasOrderBy[i], us.OrderBy != nil) + } + ss, ok := stmt[0].(*ast.SelectStmt) + if ok { + require.Equal(t, tbl.hasOrderBy[0], ss.OrderBy != nil) + } + } +} + +func TestSQLNoCache(t *testing.T) { + table := []testCase{ + {`select SQL_NO_CACHE * from t`, false, ""}, + {`select SQL_CACHE * from t`, true, "SELECT * FROM `t`"}, + {`select * from t`, true, "SELECT * FROM `t`"}, + } + + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) + + sel := stmt[0].(*ast.SelectStmt) + require.Equal(t, tbl.ok, sel.SQLCache) + } +} + +func TestFuncCallExprOffset(t *testing.T) { + // Test case for offset field on func call expr. + p := parser.New() + stmt, _, err := p.Parse("SELECT s.a(), b();", "", "") + require.NoError(t, err) + ss := stmt[0].(*ast.SelectStmt) + fields := ss.Fields.Fields + require.Len(t, fields, 2) + + { + // s.a() + expr := fields[0].Expr + f, ok := expr.(*ast.FuncCallExpr) + require.True(t, ok) + require.Equal(t, 7, f.OriginTextPosition()) + } + + { + // b() + expr := fields[1].Expr + f, ok := expr.(*ast.FuncCallExpr) + require.True(t, ok) + require.Equal(t, 14, f.OriginTextPosition()) + } +} + +func TestSQLModeANSIQuotes(t *testing.T) { + p := parser.New() + p.SetSQLMode(mysql.ModeANSIQuotes) + tests := []string{ + `CREATE TABLE "table" ("id" int)`, + `select * from t "tt"`, + } + for _, test := range tests { + _, _, err := p.Parse(test, "", "") + require.NoError(t, err) + } +} + +func TestDDLStatements(t *testing.T) { + p := parser.New() + // Tests that whatever the charset it is define, we always assign utf8 charset and utf8_bin collate. + createTableStr := `CREATE TABLE t ( + a varchar(64) binary, + b char(10) charset utf8 collate utf8_general_ci, + c text charset latin1) ENGINE=innoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin` + stmts, _, err := p.Parse(createTableStr, "", "") + require.NoError(t, err) + stmt := stmts[0].(*ast.CreateTableStmt) + require.True(t, mysql.HasBinaryFlag(stmt.Cols[0].Tp.GetFlag())) + for _, colDef := range stmt.Cols[1:] { + require.False(t, mysql.HasBinaryFlag(colDef.Tp.GetFlag())) + } + for _, tblOpt := range stmt.Options { + switch tblOpt.Tp { //nolint:exhaustive + case ast.TableOptionCharset: + require.Equal(t, "utf8", tblOpt.StrValue) + case ast.TableOptionCollate: + require.Equal(t, "utf8_bin", tblOpt.StrValue) + } + } + createTableStr = `CREATE TABLE t ( + a varbinary(64), + b binary(10), + c blob)` + stmts, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) + stmt = stmts[0].(*ast.CreateTableStmt) + for _, colDef := range stmt.Cols { + require.Equal(t, charset.CharsetBin, colDef.Tp.GetCharset()) + require.Equal(t, charset.CollationBin, colDef.Tp.GetCollate()) + require.True(t, mysql.HasBinaryFlag(colDef.Tp.GetFlag())) + } + // Test set collate for all column types + createTableStr = `CREATE TABLE t ( + c_int int collate utf8_bin, + c_real real collate utf8_bin, + c_float float collate utf8_bin, + c_bool bool collate utf8_bin, + c_char char collate utf8_bin, + c_binary binary collate utf8_bin, + c_varchar varchar(2) collate utf8_bin, + c_year year collate utf8_bin, + c_date date collate utf8_bin, + c_time time collate utf8_bin, + c_datetime datetime collate utf8_bin, + c_timestamp timestamp collate utf8_bin, + c_tinyblob tinyblob collate utf8_bin, + c_blob blob collate utf8_bin, + c_mediumblob mediumblob collate utf8_bin, + c_longblob longblob collate utf8_bin, + c_bit bit collate utf8_bin, + c_long_varchar long varchar collate utf8_bin, + c_tinytext tinytext collate utf8_bin, + c_text text collate utf8_bin, + c_mediumtext mediumtext collate utf8_bin, + c_longtext longtext collate utf8_bin, + c_decimal decimal collate utf8_bin, + c_numeric numeric collate utf8_bin, + c_enum enum('1') collate utf8_bin, + c_set set('1') collate utf8_bin, + c_json json collate utf8_bin)` + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) + + createTableStr = `CREATE TABLE t (c_double double(10))` + _, _, err = p.Parse(createTableStr, "", "") + require.EqualError(t, err, "[parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use") + p.SetStrictDoubleTypeCheck(false) + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) + p.SetStrictDoubleTypeCheck(true) + + createTableStr = `CREATE TABLE t (c_double double(10, 2))` + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) + + // GLOBAL TEMPORARY tables are a TiDB extension and no longer parse. + createTableStr = `create global temporary table t010(local_01 int, local_03 varchar(20)) on commit preserve rows` + _, _, err = p.Parse(createTableStr, "", "") + require.Error(t, err) +} + +func TestGeneratedColumn(t *testing.T) { + tests := []struct { + input string + ok bool + expr string + }{ + {"create table t (c int, d int generated always as (c + 1) virtual)", true, "c + 1"}, + {"create table t (c int, d int as ( c + 1 ) virtual)", true, "c + 1"}, + {"create table t (c int, d int as (1 + 1) stored)", true, "1 + 1"}, + } + p := parser.New() + for _, tbl := range tests { + stmtNodes, _, err := p.Parse(tbl.input, "", "") + if tbl.ok { + require.NoError(t, err) + stmtNode := stmtNodes[0] + for _, col := range stmtNode.(*ast.CreateTableStmt).Cols { + for _, opt := range col.Options { + if opt.Tp == ast.ColumnOptionGenerated { + require.Equal(t, tbl.expr, opt.Expr.Text()) + } + } + } + } else { + require.Error(t, err) + } + } + + _, _, err := p.Parse("create table t1 (a int, b int as (a + 1) default 10);", "", "") + require.EqualError(t, err, "[ddl:1221]Incorrect usage of DEFAULT and generated column") + _, _, err = p.Parse("create table t1 (a int, b int as (a + 1) on update now());", "", "") + require.EqualError(t, err, "[ddl:1221]Incorrect usage of ON UPDATE and generated column") + _, _, err = p.Parse("create table t1 (a int, b int as (a + 1) auto_increment);", "", "") + require.EqualError(t, err, "[ddl:1221]Incorrect usage of AUTO_INCREMENT and generated column") +} + +func TestSideEffect(t *testing.T) { + // This test cover a bug that parse an error SQL doesn't leave the parser in a + // clean state, cause the following SQL parse fail. + p := parser.New() + _, err := p.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") + require.Error(t, err) + + _, err = p.ParseOneStmt("show tables;", "", "") + require.NoError(t, err) +} + +func TestTablePartitionNameList(t *testing.T) { + table := []testCase{ + {`select * from t partition (p0,p1)`, true, ""}, + } + + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) + + sel := stmt[0].(*ast.SelectStmt) + source, ok := sel.From.TableRefs.Left.(*ast.TableSource) + require.True(t, ok) + tableName, ok := source.Source.(*ast.TableName) + require.True(t, ok) + require.Len(t, tableName.PartitionNames, 2) + require.Equal(t, ast.CIStr{O: "p0", L: "p0"}, tableName.PartitionNames[0]) + require.Equal(t, ast.CIStr{O: "p1", L: "p1"}, tableName.PartitionNames[1]) + } +} + +func TestNotExistsSubquery(t *testing.T) { + table := []testCase{ + {`select * from t1 where not exists (select * from t2 where t1.a = t2.a)`, true, ""}, + } + + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) + + sel := stmt[0].(*ast.SelectStmt) + exists, ok := sel.Where.(*ast.ExistsSubqueryExpr) + require.True(t, ok) + require.Equal(t, tbl.ok, exists.Not) + } +} + +// For issue #51 +// See https://github.com/pingcap/parser/pull/51 for details +func TestFieldText(t *testing.T) { + p := parser.New() + stmts, _, err := p.Parse("select a from t", "", "") + require.NoError(t, err) + tmp := stmts[0].(*ast.SelectStmt) + require.Equal(t, "a", tmp.Fields.Fields[0].Text()) + +} + +// See https://github.com/pingcap/parser/issue/94 +func TestQuotedSystemVariables(t *testing.T) { + p := parser.New() + + st, err := p.ParseOneStmt( + "select @@Sql_Mode, @@`SQL_MODE`, @@session.`sql_mode`, @@global.`s ql``mode`, @@session.'sql\\nmode', @@local.\"sql\\\"mode\", @@instance.sql_mode;", + "", + "", + ) + require.NoError(t, err) + ss := st.(*ast.SelectStmt) + expected := []*ast.VariableExpr{ + { + Name: "sql_mode", + IsGlobal: false, + IsSystem: true, + ExplicitScope: false, + }, + { + Name: "sql_mode", + IsGlobal: false, + IsSystem: true, + ExplicitScope: false, + }, + { + Name: "sql_mode", + IsGlobal: false, + IsSystem: true, + ExplicitScope: true, + }, + { + Name: "s ql`mode", + IsGlobal: true, + IsSystem: true, + ExplicitScope: true, + }, + { + Name: "sql\nmode", + IsGlobal: false, + IsSystem: true, + ExplicitScope: true, + }, + { + Name: `sql"mode`, + IsGlobal: false, + IsSystem: true, + ExplicitScope: true, + }, + { + Name: "sql_mode", + IsGlobal: false, + IsSystem: true, + IsInstance: true, + ExplicitScope: true, + }, + } + + require.Len(t, ss.Fields.Fields, len(expected)) + for i, field := range ss.Fields.Fields { + ve := field.Expr.(*ast.VariableExpr) + comment := fmt.Sprintf("field %d, ve = %v", i, ve) + require.Equal(t, expected[i].Name, ve.Name, comment) + require.Equal(t, expected[i].IsGlobal, ve.IsGlobal, comment) + require.Equal(t, expected[i].IsInstance, ve.IsInstance, comment) + require.Equal(t, expected[i].IsSystem, ve.IsSystem, comment) + require.Equal(t, expected[i].ExplicitScope, ve.ExplicitScope, comment) + } +} + +// See https://github.com/pingcap/parser/issue/95 +func TestQuotedVariableColumnName(t *testing.T) { + p := parser.New() + + st, err := p.ParseOneStmt( + "select @abc, @`abc`, @'aBc', @\"AbC\", @6, @`6`, @'6', @\"6\", @@sql_mode, @@`sql_mode`, @;", + "", + "", + ) + require.NoError(t, err) + ss := st.(*ast.SelectStmt) + expected := []string{ + "@abc", + "@`abc`", + "@'aBc'", + `@"AbC"`, + "@6", + "@`6`", + "@'6'", + `@"6"`, + "@@sql_mode", + "@@`sql_mode`", + "@", + } + + require.Len(t, ss.Fields.Fields, len(expected)) + for i, field := range ss.Fields.Fields { + require.Equal(t, expected[i], field.Text()) + } +} + +func TestCharset(t *testing.T) { + p := parser.New() + + st, err := p.ParseOneStmt("ALTER SCHEMA GLOBAL DEFAULT CHAR SET utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) + st, err = p.ParseOneStmt("ALTER DATABASE CHAR SET = utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) + st, err = p.ParseOneStmt("ALTER DATABASE DEFAULT CHAR SET = utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) +} + +func TestUnderscoreCharset(t *testing.T) { + p := parser.New() + tests := []struct { + cs string + parseFail bool + unSupport bool + }{ + {"utf8", false, false}, + {"gbk", false, true}, + {"ujis", false, true}, + {"gbk1", true, true}, + {"ujisx", true, true}, + } + for _, tt := range tests { + sql := fmt.Sprintf("select hex(_%s '3F')", tt.cs) + _, err := p.ParseOneStmt(sql, "", "") + switch { + case tt.parseFail: + require.EqualError(t, err, fmt.Sprintf("line 1 column %d near \"'3F')\" ", len(tt.cs)+17)) + case tt.unSupport: + require.EqualError(t, err, ast.ErrUnknownCharacterSet.GenByFormat("Unsupported character introducer: '%-.64s'", tt.cs).Error()) + default: + require.NoError(t, err) + } + } +} + +func TestFulltextSearch(t *testing.T) { + p := parser.New() + + st, err := p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search')", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH() AGAINST('search')", "", "") + require.Error(t, err) + require.Nil(t, st) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST()", "", "") + require.Error(t, err) + require.Nil(t, st) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN)", "", "") + require.Error(t, err) + require.Nil(t, st) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN BOOLEAN MODE WITH QUERY EXPANSION)", "", "") + require.Error(t, err) + require.Nil(t, st) + + restoreWhere := func(st ast.StmtNode) string { + var sb strings.Builder + require.NoError(t, st.(*ast.SelectStmt).Where.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb))) + return sb.String() + } + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN NATURAL LANGUAGE MODE)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) + require.Equal(t, "MATCH (`title`,`content`) AGAINST (_UTF8MB4'search')", restoreWhere(st)) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN BOOLEAN MODE)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) + require.Equal(t, "MATCH (`title`,`content`) AGAINST (_UTF8MB4'search' IN BOOLEAN MODE)", restoreWhere(st)) + + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' WITH QUERY EXPANSION)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) + require.Equal(t, "MATCH (`title`,`content`) AGAINST (_UTF8MB4'search' WITH QUERY EXPANSION)", restoreWhere(st)) +} + +func TestSignedInt64OutOfRange(t *testing.T) { + p := parser.New() + cases := []string{ + "create user abc@def with max_queries_per_hour 18446744073709551612", + } + + for _, s := range cases { + _, err := p.ParseOneStmt(s, "", "") + require.Error(t, err) + require.Contains(t, err.Error(), "out of range") + } +} + +// CleanNodeText set the text of node and all child node empty. +// For test only. +type nodeTextCleaner struct { +} + +// Enter implements Visitor interface. +func (checker *nodeTextCleaner) Enter(in ast.Node) (out ast.Node, skipChildren bool) { + in.SetText(nil, "") + in.SetOriginTextPosition(0) + if v, ok := in.(*ast.ValueExpr); ok && v != nil { + tpFlag := v.GetType().GetFlag() + if tpFlag&mysql.UnderScoreCharsetFlag != 0 { + // ignore underscore charset flag to let `'abc' = _utf8'abc'` pass + tpFlag ^= mysql.UnderScoreCharsetFlag + v.GetType().SetFlag(tpFlag) + } + if v.Kind() == ast.KindMysqlDecimal { + _ = v.GetMysqlDecimal().FromString(v.GetMysqlDecimal().ToString()) + } + } + + switch node := in.(type) { + case *ast.PatternLikeExpr: + if node.Escape == '\\' { + node.EscapeExplicit = false + } + case *ast.CreateTableStmt: + for _, opt := range node.Options { + switch opt.Tp { //nolint:exhaustive + case ast.TableOptionCharset: + opt.StrValue = strings.ToUpper(opt.StrValue) + case ast.TableOptionCollate: + opt.StrValue = strings.ToUpper(opt.StrValue) + } + } + for _, col := range node.Cols { + col.Tp.SetCharset(strings.ToUpper(col.Tp.GetCharset())) + col.Tp.SetCollate(strings.ToUpper(col.Tp.GetCollate())) + + for i, option := range col.Options { + if option.Tp == 0 && option.Expr == nil && !option.Stored && option.Refer == nil { + col.Options = slices.Delete(col.Options, i, i+1) + } + } + } + case *ast.DeleteStmt: + for _, tableHint := range node.TableHints { + tableHint.HintName.O = "" + } + case *ast.UpdateStmt: + for _, tableHint := range node.TableHints { + tableHint.HintName.O = "" + } + case *ast.Constraint: + if node.Option != nil { + if node.Option.KeyBlockSize == 0x0 && node.Option.Tp == 0 && node.Option.Comment == "" { + node.Option = nil + } + } + case *ast.FuncCallExpr: + node.FnName.O = strings.ToLower(node.FnName.O) + node.SetOriginTextPosition(0) + case *ast.AggregateFuncExpr: + node.F = strings.ToLower(node.F) + case *ast.SelectField: + node.Offset = 0 + case *ast.GrantStmt: + var privs []*ast.PrivElem + for _, v := range node.Privs { + if v.Priv != 0 { + privs = append(privs, v) + } + } + node.Privs = privs + case *ast.AlterTableStmt: + var specs []*ast.AlterTableSpec + for _, v := range node.Specs { + if v.Tp != 0 && (v.Tp != ast.AlterTableOption || len(v.Options) != 0) { + specs = append(specs, v) + } + } + node.Specs = specs + case *ast.Join: + node.ExplicitParens = false + case *ast.ColumnDef: + node.Tp.CleanElemIsBinaryLit() + } + return in, false +} + +// CleanNodeText set the text of node and all child node empty. +func CleanNodeText(node ast.Node) { + var cleaner nodeTextCleaner + node.Accept(&cleaner) +} + +func (checker *nodeTextCleaner) Leave(in ast.Node) (out ast.Node, ok bool) { + return in, true +} + +// For BRIE +func TestHighNotPrecedenceMode(t *testing.T) { + p := parser.New() + var sb strings.Builder + + sms, _, err := p.Parse("SELECT NOT 1 BETWEEN -5 AND 5", "", "") + require.NoError(t, err) + v, ok := sms[0].(*ast.SelectStmt) + require.True(t, ok) + v1, ok := v.Fields.Fields[0].Expr.(*ast.UnaryOperationExpr) + require.True(t, ok) + require.Equal(t, opcode.Not, v1.Op) + err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) + require.NoError(t, err) + restoreSQL := sb.String() + require.Equal(t, "SELECT NOT 1 BETWEEN -5 AND 5", restoreSQL) + sb.Reset() + + sms, _, err = p.Parse("SELECT !1 BETWEEN -5 AND 5", "", "") + require.NoError(t, err) + v, ok = sms[0].(*ast.SelectStmt) + require.True(t, ok) + _, ok = v.Fields.Fields[0].Expr.(*ast.BetweenExpr) + require.True(t, ok) + err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) + require.NoError(t, err) + restoreSQL = sb.String() + require.Equal(t, "SELECT !1 BETWEEN -5 AND 5", restoreSQL) + sb.Reset() + + p = parser.New() + p.SetSQLMode(mysql.ModeHighNotPrecedence) + sms, _, err = p.Parse("SELECT NOT 1 BETWEEN -5 AND 5", "", "") + require.NoError(t, err) + v, ok = sms[0].(*ast.SelectStmt) + require.True(t, ok) + _, ok = v.Fields.Fields[0].Expr.(*ast.BetweenExpr) + require.True(t, ok) + err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) + require.NoError(t, err) + restoreSQL = sb.String() + require.Equal(t, "SELECT !1 BETWEEN -5 AND 5", restoreSQL) +} + +// For CTE +func TestWithoutCharsetFlags(t *testing.T) { + type testCaseWithFlag struct { + src string + ok bool + restore string + flag RestoreFlags + } + + flag := RestoreStringSingleQuotes | RestoreSpacesAroundBinaryOperation | RestoreBracketAroundBinaryOperation | RestoreNameBackQuotes + cases := []testCaseWithFlag{ + {"select 'a'", true, "SELECT 'a'", flag | RestoreStringWithoutCharset}, + {"select _utf8'a'", true, "SELECT 'a'", flag | RestoreStringWithoutCharset}, + {"select _utf8mb4'a'", true, "SELECT 'a'", flag | RestoreStringWithoutCharset}, + {"select _utf8 X'D0B1'", true, "SELECT x'd0b1'", flag | RestoreStringWithoutCharset}, + + {"select _utf8mb4'a'", true, "SELECT 'a'", flag | RestoreStringWithoutDefaultCharset}, + {"select _utf8'a'", true, "SELECT _utf8'a'", flag | RestoreStringWithoutDefaultCharset}, + {"select _utf8'a'", true, "SELECT _utf8'a'", flag | RestoreStringWithoutDefaultCharset}, + {"select _utf8 X'D0B1'", true, "SELECT _utf8 x'd0b1'", flag | RestoreStringWithoutDefaultCharset}, + } + + p := parser.New() + p.EnableWindowFunc(false) + for _, tbl := range cases { + stmts, _, err := p.Parse(tbl.src, "", "") + if !tbl.ok { + require.Error(t, err) + continue + } + require.NoError(t, err) + // restore correctness test + var sb strings.Builder + restoreSQLs := "" + for _, stmt := range stmts { + sb.Reset() + ctx := NewRestoreCtx(tbl.flag, &sb) + ctx.DefaultDB = "test" + err = stmt.Restore(ctx) + require.NoError(t, err) + restoreSQL := sb.String() + if restoreSQLs != "" { + restoreSQLs += "; " + } + restoreSQLs += restoreSQL + } + require.Equal(t, tbl.restore, restoreSQLs) + } +} + +func TestRestoreBinOpWithBrackets(t *testing.T) { + cases := []testCase{ + {"select mod(a+b, 4)+1", true, "SELECT (((`a` + `b`) % 4) + 1)"}, + {"SELECT MOD(10, 2 BETWEEN 0 and 5)", true, "SELECT (10 % (2 BETWEEN 0 AND 5))"}, // issue #59000 + {"select mod( year(a) - abs(weekday(a) + dayofweek(a)), 4) + 1", true, "SELECT (((year(`a`) - abs((weekday(`a`) + dayofweek(`a`)))) % 4) + 1)"}, + } + + p := parser.New() + p.EnableWindowFunc(false) + for _, tbl := range cases { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if !tbl.ok { + require.Error(t, err, comment) + continue + } + require.NoError(t, err, comment) + // restore correctness test + if tbl.ok { + var sb strings.Builder + comment := fmt.Sprintf("source %v", tbl.src) + stmts, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err, comment) + restoreSQLs := "" + for _, stmt := range stmts { + sb.Reset() + ctx := NewRestoreCtx(RestoreStringSingleQuotes|RestoreSpacesAroundBinaryOperation|RestoreBracketAroundBinaryOperation|RestoreStringWithoutCharset|RestoreNameBackQuotes, &sb) + ctx.DefaultDB = "test" + err = stmt.Restore(ctx) + require.NoError(t, err, comment) + restoreSQL := sb.String() + comment = fmt.Sprintf("source %v; restore %v", tbl.src, restoreSQL) + if restoreSQLs != "" { + restoreSQLs += "; " + } + restoreSQLs += restoreSQL + } + comment = fmt.Sprintf("restore %v; expect %v", restoreSQLs, tbl.restore) + require.Equal(t, tbl.restore, restoreSQLs, comment) + } + } +} + +// For CTE bindings. +func TestCTEBindings(t *testing.T) { + table := []testCase{ + {"WITH `cte` AS (SELECT * from t) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT * FROM `test`.`t`) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` (col1, col2) AS (SELECT * from t UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT * FROM `test`.`t` UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` AS (SELECT * from t), cte2 as (select * from cte) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT * FROM `test`.`t`), `cte2` AS (SELECT * FROM `cte`) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH RECURSIVE cte (n) AS ( SELECT * from t UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;", true, "WITH RECURSIVE `cte` (`n`) AS (SELECT * FROM `test`.`t` UNION ALL SELECT `n` + 1 FROM `cte` WHERE `n` < 5) SELECT * FROM `cte`"}, + {"with cte(a) as (select * from t) update t, cte set t.a=1 where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT * FROM `test`.`t`) UPDATE (`test`.`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a` = `cte`.`a`"}, + {"with cte(a) as (select * from t) delete t from t, cte where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT * FROM `test`.`t`) DELETE `test`.`t` FROM (`test`.`t`) JOIN `cte` WHERE `t`.`a` = `cte`.`a`"}, + {"WITH cte1 AS (SELECT * from t) SELECT * FROM (WITH cte2 AS (SELECT * from cte1) SELECT * FROM cte2 JOIN cte1) AS dt;", true, "WITH `cte1` AS (SELECT * FROM `test`.`t`) SELECT * FROM (WITH `cte2` AS (SELECT * FROM `cte1`) SELECT * FROM `cte2` JOIN `cte1`) AS `dt`"}, + {"WITH cte AS (SELECT * from t) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte;", true, "WITH `cte` AS (SELECT * FROM `test`.`t`) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte`"}, + {"with cte as (table t) table cte;", true, "WITH `cte` AS (TABLE `test`.`t`) TABLE `cte`"}, + {"with cte as (select * from t) select 1 union with cte as (select * from t) select * from cte;", false, ""}, + {"with cte as (select * from t) (select * from t);", true, "WITH `cte` AS (SELECT * FROM `test`.`t`) (SELECT * FROM `test`.`t`)"}, + {"with cte as (select 1) (select 1 union select * from t)", true, "WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT * FROM `test`.`t`)"}, + {"select * from (with cte as (select * from t) select 1 union select * from t) qn", true, "SELECT * FROM (WITH `cte` AS (SELECT * FROM `test`.`t`) SELECT 1 UNION SELECT * FROM `test`.`t`) AS `qn`"}, + {"select * from t where 1 > (with cte as (select * from t) select * from cte)", true, "SELECT * FROM `test`.`t` WHERE 1 > (WITH `cte` AS (SELECT * FROM `test`.`t`) SELECT * FROM `cte`)"}, + {"( with cte(n) as ( select * from t ) select n+1 from cte union select n+2 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT * FROM `test`.`t`) SELECT `n` + 1 FROM `cte` UNION SELECT `n` + 2 FROM `cte`) UNION SELECT 1"}, + {"( with cte(n) as ( select * from t ) select n+1 from cte) union select * from t", true, "(WITH `cte` (`n`) AS (SELECT * FROM `test`.`t`) SELECT `n` + 1 FROM `cte`) UNION SELECT * FROM `test`.`t`"}, + {"with cte as (select * from t union select * from cte) select * from cte", true, "WITH `cte` AS (SELECT * FROM `test`.`t` UNION SELECT * FROM `test`.`cte`) SELECT * FROM `cte`"}, + } + + p := parser.New() + p.EnableWindowFunc(false) + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if !tbl.ok { + require.Error(t, err, comment) + continue + } + require.NoError(t, err, comment) + // restore correctness test + if tbl.ok { + var sb strings.Builder + comment := fmt.Sprintf("source %v", tbl.src) + stmts, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err, comment) + restoreSQLs := "" + for _, stmt := range stmts { + sb.Reset() + ctx := NewRestoreCtx(RestoreStringSingleQuotes|RestoreSpacesAroundBinaryOperation|RestoreStringWithoutCharset|RestoreNameBackQuotes, &sb) + ctx.DefaultDB = "test" + err = stmt.Restore(ctx) + require.NoError(t, err, comment) + restoreSQL := sb.String() + comment = fmt.Sprintf("source %v; restore %v", tbl.src, restoreSQL) + if restoreSQLs != "" { + restoreSQLs += "; " + } + restoreSQLs += restoreSQL + } + comment = fmt.Sprintf("restore %v; expect %v", restoreSQLs, tbl.restore) + require.Equal(t, tbl.restore, restoreSQLs, comment) + } + } +} + +func TestInsertStatementMemoryAllocation(t *testing.T) { + sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) + var oldStats, newStats runtime.MemStats + runtime.ReadMemStats(&oldStats) + _, err := parser.New().ParseOneStmt(sql, "", "") + require.NoError(t, err) + runtime.ReadMemStats(&newStats) + require.Less(t, int(newStats.TotalAlloc-oldStats.TotalAlloc), 1024*500) +} + +func TestCharsetIntroducer(t *testing.T) { + p := parser.New() + // `_gbk` is a valid character set name, but introducers are restricted + // to the charsets with a default legacy collation (see + // charset.GetDefaultCollationLegacy). + _, _, err := p.Parse("select _gbk 'a';", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") + _, _, err = p.Parse("select _gbk 0x1234;", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") + _, _, err = p.Parse("select _gbk 0b101001;", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") +} + +func TestIssue45898(t *testing.T) { + p := parser.New() + _, _, _ = p.ParseSQL("a.") // intentionally invalid; must not poison the next parse + stmts, _, err := p.ParseSQL("select count(1) from t") + require.NoError(t, err) + var sb strings.Builder + restoreCtx := NewRestoreCtx(DefaultRestoreFlags, &sb) + sb.Reset() + require.NoError(t, stmts[0].Restore(restoreCtx)) + require.Equal(t, "SELECT COUNT(1) FROM `t`", sb.String()) +} + +func TestMultiStmt(t *testing.T) { + p := parser.New() + stmts, _, err := p.Parse("SELECT 'foo'; SELECT 'foo;bar','baz'; select 'foo' , 'bar' , 'baz' ;select 1", "", "") + require.NoError(t, err) + require.Len(t, stmts, 4) + stmt1 := stmts[0].(*ast.SelectStmt) + stmt2 := stmts[1].(*ast.SelectStmt) + stmt3 := stmts[2].(*ast.SelectStmt) + stmt4 := stmts[3].(*ast.SelectStmt) + require.Equal(t, "'foo'", stmt1.Fields.Fields[0].Text()) + require.Equal(t, "'foo;bar'", stmt2.Fields.Fields[0].Text()) + require.Equal(t, "'baz'", stmt2.Fields.Fields[1].Text()) + require.Equal(t, "'foo'", stmt3.Fields.Fields[0].Text()) + require.Equal(t, "'bar'", stmt3.Fields.Fields[1].Text()) + require.Equal(t, "'baz'", stmt3.Fields.Fields[2].Text()) + require.Equal(t, "1", stmt4.Fields.Fields[0].Text()) +} + +// https://dev.mysql.com/doc/refman/8.1/en/other-vendor-data-types.html + +func TestMaxParenthesesDepth(t *testing.T) { + p := parser.New() + nestedExpr := func(depth int) string { + return "select " + strings.Repeat("(", depth) + "1" + strings.Repeat(")", depth) + } + nestedFuncExpr := func(depth int) string { + return "select " + strings.Repeat("f(", depth) + "1" + strings.Repeat(")", depth) + } + nestedParenHint := func(depth int) string { + return "select /*+ HASH_JOIN(" + strings.Repeat("(", depth) + "t" + strings.Repeat(")", depth) + ") */ * from t" + } + + _, err := p.ParseOneStmt(nestedExpr(10000), "", "") + require.NoError(t, err) + + _, err = p.ParseOneStmt(nestedExpr(10001), "", "") + require.Error(t, err) + require.Contains(t, err.Error(), "parentheses nesting depth exceeds maximum 10000") + + _, err = p.ParseOneStmt(nestedFuncExpr(10001), "", "") + require.Error(t, err) + require.Contains(t, err.Error(), "parentheses nesting depth exceeds maximum 10000") + + // An over-nested optimizer hint is not valid hint syntax; it is dropped + // with a warning and the statement itself still parses. + _, err = p.ParseOneStmt(nestedParenHint(10000), "", "") + require.NoError(t, err) +} + +func TestMaxASTDepth(t *testing.T) { + p := parser.New() + nestedCaseExpr := func(depth int) string { + return "select " + strings.Repeat("case when true then ", depth) + "1" + strings.Repeat(" else 0 end", depth) + } + for _, tc := range []struct { + name string + sql string + }{ + { + name: "binary operation chain", + sql: "select " + strings.Repeat("1+", 11000) + "1", + }, + { + name: "unary operation chain", + sql: "select " + strings.Repeat("!", 11000) + "1", + }, + { + name: "case expression chain", + sql: nestedCaseExpr(11000), + }, + } { + _, err := p.ParseOneStmt(tc.sql, "", "") + require.Error(t, err, tc.name) + require.Contains(t, err.Error(), "AST nesting depth exceeds maximum", tc.name) + } +} + +// TestInsertRowAlias covers the MySQL 8.0.19+ row alias syntax for +// INSERT ... ON DUPLICATE KEY UPDATE. +func TestInsertRowAlias(t *testing.T) { + table := []testCase{ + {"INSERT INTO t (a,b,c) VALUES (1,2,3) AS new ON DUPLICATE KEY UPDATE c=new.a+new.b;", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3) AS `new` ON DUPLICATE KEY UPDATE `c`=`new`.`a`+`new`.`b`"}, + {"INSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p) ON DUPLICATE KEY UPDATE c=m+n;", true, "INSERT INTO `t` (`a`,`b`,`c`) VALUES (1,2,3),(4,5,6) AS `new`(`m`, `n`, `p`) ON DUPLICATE KEY UPDATE `c`=`m`+`n`"}, + {"INSERT INTO t VALUES (1,2) AS new ON DUPLICATE KEY UPDATE b=new.b;", true, "INSERT INTO `t` VALUES (1,2) AS `new` ON DUPLICATE KEY UPDATE `b`=`new`.`b`"}, + {"INSERT INTO t SET a=1,b=2 AS new ON DUPLICATE KEY UPDATE b=new.a+new.b;", true, "INSERT INTO `t` SET `a`=1,`b`=2 AS `new` ON DUPLICATE KEY UPDATE `b`=`new`.`a`+`new`.`b`"}, + {"INSERT INTO t SET a=1,b=2 AS new(m,n) ON DUPLICATE KEY UPDATE b=m+n;", true, "INSERT INTO `t` SET `a`=1,`b`=2 AS `new`(`m`, `n`) ON DUPLICATE KEY UPDATE `b`=`m`+`n`"}, + // row alias without ON DUPLICATE KEY UPDATE + {"INSERT INTO t VALUES (1,2) AS new;", true, "INSERT INTO `t` VALUES (1,2) AS `new`"}, + {"INSERT INTO t VALUES (1,2) AS new(a,b);", true, "INSERT INTO `t` VALUES (1,2) AS `new`(`a`, `b`)"}, + // row alias is not supported for REPLACE + {"REPLACE INTO t VALUES (1,2) AS new;", false, ""}, + {"REPLACE INTO t SET a=1,b=2 AS new;", false, ""}, + } + RunTest(t, table, false) +} + +func TestDualPassword(t *testing.T) { + table := []testCase{ + // MySQL 8.0.14+ dual passwords: RETAIN CURRENT PASSWORD / DISCARD OLD PASSWORD. + {"ALTER USER 'u1'@'%' IDENTIFIED BY 'new' RETAIN CURRENT PASSWORD", true, "ALTER USER `u1`@`%` IDENTIFIED BY 'new' RETAIN CURRENT PASSWORD"}, + {"ALTER USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'new' RETAIN CURRENT PASSWORD", true, "ALTER USER `u1`@`%` IDENTIFIED WITH 'mysql_native_password' BY 'new' RETAIN CURRENT PASSWORD"}, + {"ALTER USER 'u1'@'%' IDENTIFIED BY 'p2', 'u2'@'%' IDENTIFIED BY 'q2' RETAIN CURRENT PASSWORD", true, "ALTER USER `u1`@`%` IDENTIFIED BY 'p2', `u2`@`%` IDENTIFIED BY 'q2' RETAIN CURRENT PASSWORD"}, + {"ALTER USER 'u1'@'%' IDENTIFIED BY 'p2' RETAIN CURRENT PASSWORD, 'u2'@'%' IDENTIFIED BY 'q2'", true, "ALTER USER `u1`@`%` IDENTIFIED BY 'p2' RETAIN CURRENT PASSWORD, `u2`@`%` IDENTIFIED BY 'q2'"}, + {"ALTER USER 'u1'@'%' DISCARD OLD PASSWORD", true, "ALTER USER `u1`@`%` DISCARD OLD PASSWORD"}, + {"ALTER USER 'u1'@'%' DISCARD OLD PASSWORD, 'u2'@'%'", true, "ALTER USER `u1`@`%` DISCARD OLD PASSWORD, `u2`@`%`"}, + {"SET PASSWORD = 'new' RETAIN CURRENT PASSWORD", true, "SET PASSWORD='new' RETAIN CURRENT PASSWORD"}, + {"SET PASSWORD FOR 'u1'@'%' = 'new' RETAIN CURRENT PASSWORD", true, "SET PASSWORD FOR `u1`@`%`='new' RETAIN CURRENT PASSWORD"}, + // The current-user (USER()) form accepts both clauses. + {"ALTER USER USER() IDENTIFIED BY 'p1' RETAIN CURRENT PASSWORD", true, "ALTER USER USER() IDENTIFIED BY 'p1' RETAIN CURRENT PASSWORD"}, + {"ALTER USER USER() DISCARD OLD PASSWORD", true, "ALTER USER USER() DISCARD OLD PASSWORD"}, + {"ALTER USER IF EXISTS USER() IDENTIFIED BY 'p1' RETAIN CURRENT PASSWORD", true, "ALTER USER IF EXISTS USER() IDENTIFIED BY 'p1' RETAIN CURRENT PASSWORD"}, + // Negative: RETAIN needs a cleartext password to promote, so the hashed + // AS-form, the bare plugin form, and the no-auth form are all rejected. + {"ALTER USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*B50FBDB37F1256824274912F2A1CE648082C3F1F' RETAIN CURRENT PASSWORD", false, ""}, + {"ALTER USER 'u1'@'%' IDENTIFIED WITH 'mysql_native_password' RETAIN CURRENT PASSWORD", false, ""}, + {"ALTER USER 'u1'@'%' RETAIN CURRENT PASSWORD", false, ""}, + // Negative: CREATE USER does not accept either clause per MySQL grammar. + {"CREATE USER 'u1'@'%' IDENTIFIED BY 'p1' RETAIN CURRENT PASSWORD", false, ""}, + {"CREATE USER 'u1'@'%' DISCARD OLD PASSWORD", false, ""}, + // Negative: DISCARD coexisting with an auth option is invalid. + {"ALTER USER 'u1'@'%' IDENTIFIED BY 'p1' DISCARD OLD PASSWORD", false, ""}, + } + RunTest(t, table, false) +} diff --git a/pkg/parser/reserved_words_test.go b/pkg/parser/reserved_words_test.go new file mode 100644 index 000000000..596ba20e5 --- /dev/null +++ b/pkg/parser/reserved_words_test.go @@ -0,0 +1,114 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build reserved_words_test +// +build reserved_words_test + +// This file ensures that the set of reserved keywords is the same as that of +// MySQL. To run: +// +// 1. Set up a MySQL server listening at 127.0.0.1:3306 using root and no password +// 2. Run this test with: +// +// go test -tags reserved_words_test -run '^TestCompareReservedWordsWithMySQL$' + +package parser + +import ( + // needed to connect to MySQL + dbsql "database/sql" + gio "io" + "os" + "testing" + + "github.com/block/spirit/pkg/parser/ast" + _ "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/require" +) + +func TestCompareReservedWordsWithMySQL(t *testing.T) { + parserFilename := "parser.y" + parserFile, err := os.Open(parserFilename) + require.NoError(t, err) + data, err := gio.ReadAll(parserFile) + require.NoError(t, err) + content := string(data) + + reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */" + unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */" + notKeywordTokenStartMarker := "\t/* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */" + identTokenEndMarker := "%token\t" + + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, identTokenEndMarker) + + p := New() + dsn := os.Getenv("MYSQL_DSN") + if dsn == "" { + dsn = "root@tcp(127.0.0.1:3306)/" + } + db, err := dbsql.Open("mysql", dsn) + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + for _, kw := range reservedKeywords { + switch kw { + case "CURRENT_ROLE", // reserved here, not reserved in MySQL + "ARRAY": // added in 8.0.17 (reserved); became nonreserved in 8.0.19 + // special cases: we do reserve these words but MySQL didn't, + // and unreserving them causes legit parser conflicts. + continue + } + + query := "do (select 1 as " + kw + ")" + errRegexp := ".*" + kw + ".*" + + var err error + + if _, ok := windowFuncTokenMap[kw]; !ok { + // window function tokens parse in this position despite being reserved. + _, _, err = p.Parse(query, "", "") + require.Error(t, err) + require.Regexp(t, errRegexp, err.Error()) + } + _, err = db.Exec(query) + require.Error(t, err, query) + require.Regexp(t, errRegexp, err.Error(), "MySQL suggests that '%s' should *not* be reserved!", kw) + } + + for _, kws := range [][]string{unreservedKeywords, notKeywordTokens} { + for _, kw := range kws { + switch kw { + case "FUNCTION", // Reserved in MySQL 8.0.1 + "PURGE", // Reserved in MySQL + "SYSTEM", // Reserved in MySQL 8.0.3 + "SEPARATOR", // Reserved in MySQL + "DECLARE": // Reserved in MySQL + continue + } + + query := "do (select 1 as " + kw + ")" + + stmts, _, err := p.Parse(query, "", "") + require.NoError(t, err) + require.Len(t, stmts, 1) + require.IsType(t, &ast.DoStmt{}, stmts[0]) + + _, err = db.Exec(query) + require.NoErrorf(t, err, "MySQL suggests that '%s' should be reserved!", kw) + } + } +} diff --git a/pkg/parser/types/etc.go b/pkg/parser/types/etc.go new file mode 100644 index 000000000..0cd61f1e2 --- /dev/null +++ b/pkg/parser/types/etc.go @@ -0,0 +1,167 @@ +// Copyright 2014 The ql Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSES/QL-LICENSE file. + +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "strings" + + "github.com/block/spirit/pkg/parser/mysql" +) + +// IsTypeBlob returns a boolean indicating whether the tp is a blob type. +func IsTypeBlob(tp byte) bool { + switch tp { + case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob: + return true + default: + return false + } +} + +// IsTypeChar returns a boolean indicating +// whether the tp is the char type like a string type or a varchar type. +func IsTypeChar(tp byte) bool { + return tp == mysql.TypeString || tp == mysql.TypeVarchar +} + +var type2Str = map[byte]string{ + mysql.TypeBit: "bit", + mysql.TypeBlob: "text", + mysql.TypeDate: "date", + mysql.TypeDatetime: "datetime", + mysql.TypeUnspecified: "unspecified", + mysql.TypeNewDecimal: "decimal", + mysql.TypeDouble: "double", + mysql.TypeEnum: "enum", + mysql.TypeFloat: "float", + mysql.TypeGeometry: "geometry", + mysql.TypeInt24: "mediumint", + mysql.TypeJSON: "json", + mysql.TypeLong: "int", + mysql.TypeLonglong: "bigint", + mysql.TypeLongBlob: "longtext", + mysql.TypeMediumBlob: "mediumtext", + mysql.TypeNull: "null", + mysql.TypeSet: "set", + mysql.TypeShort: "smallint", + mysql.TypeString: "char", + mysql.TypeDuration: "time", + mysql.TypeTimestamp: "timestamp", + mysql.TypeTiny: "tinyint", + mysql.TypeTinyBlob: "tinytext", + mysql.TypeVarchar: "varchar", + mysql.TypeVarString: "var_string", + mysql.TypeYear: "year", +} + +var str2Type = map[string]byte{ + "bit": mysql.TypeBit, + "text": mysql.TypeBlob, + "date": mysql.TypeDate, + "datetime": mysql.TypeDatetime, + "unspecified": mysql.TypeUnspecified, + "decimal": mysql.TypeNewDecimal, + "double": mysql.TypeDouble, + "enum": mysql.TypeEnum, + "float": mysql.TypeFloat, + "geometry": mysql.TypeGeometry, + "mediumint": mysql.TypeInt24, + "json": mysql.TypeJSON, + "int": mysql.TypeLong, + "bigint": mysql.TypeLonglong, + "longtext": mysql.TypeLongBlob, + "mediumtext": mysql.TypeMediumBlob, + "null": mysql.TypeNull, + "set": mysql.TypeSet, + "smallint": mysql.TypeShort, + "char": mysql.TypeString, + "time": mysql.TypeDuration, + "timestamp": mysql.TypeTimestamp, + "tinyint": mysql.TypeTiny, + "tinytext": mysql.TypeTinyBlob, + "varchar": mysql.TypeVarchar, + "var_string": mysql.TypeVarString, + "year": mysql.TypeYear, +} + +// TypeStr converts tp to a string. +func TypeStr(tp byte) (r string) { + return type2Str[tp] +} + +// TypeToStr converts a field to a string. +// It is used for converting Text to Blob, +// or converting Char to Binary. +// Args: +// +// tp: type enum +// cs: charset +func TypeToStr(tp byte, cs string, geo GeometryType) (r string) { + ts := type2Str[tp] + if tp == mysql.TypeGeometry { + ts = geo.String() + } + if cs != "binary" { + return ts + } + switch { + case IsTypeBlob(tp): + ts = strings.Replace(ts, "text", "blob", 1) + case IsTypeChar(tp): + ts = strings.Replace(ts, "char", "binary", 1) + case tp == mysql.TypeNull: + ts = "binary" + } + return ts +} + +// StrToType convert a string to type enum. +// Args: +// +// ts: type string +func StrToType(ts string) (tp byte) { + ts = strings.Replace(ts, "blob", "text", 1) + ts = strings.Replace(ts, "binary", "char", 1) + if tp, ok := str2Type[ts]; ok { + return tp + } + + return mysql.TypeUnspecified +} + +var ( + dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} +) + +// constant values. +const ( + digitsPerWord = 9 // A word holds 9 digits. + wordSize = 4 // A word is 4 bytes int32. +) + +var ( + // ErrInvalidDefault is returned when meet a invalid default value. + ErrInvalidDefault = mysql.NewStdErr("types", mysql.ErrInvalidDefault) + // ErrDataOutOfRange is returned when meet a value out of range. + ErrDataOutOfRange = mysql.NewStdErr("types", mysql.ErrDataOutOfRange) + // ErrTruncatedWrongValue is returned when meet a value bigger than + // 99999999999999999999999999999999999999999999999999999999999999999 during parsing. + ErrTruncatedWrongValue = mysql.NewStdErr("types", mysql.ErrTruncatedWrongValue) + // ErrIllegalValueForType is returned when strconv.ParseFloat meet strconv.ErrRange during parsing. + ErrIllegalValueForType = mysql.NewStdErr("types", mysql.ErrIllegalValueForType) +) diff --git a/pkg/parser/types/etc_test.go b/pkg/parser/types/etc_test.go new file mode 100644 index 000000000..1a0352734 --- /dev/null +++ b/pkg/parser/types/etc_test.go @@ -0,0 +1,34 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "testing" + + "github.com/block/spirit/pkg/parser/mysql" + "github.com/stretchr/testify/require" +) + +func TestStrToType(t *testing.T) { + for tp, str := range type2Str { + a := StrToType(str) + require.Equal(t, tp, a) + } + + tp := StrToType("blob") + require.Equal(t, mysql.TypeBlob, tp) + + tp = StrToType("binary") + require.Equal(t, mysql.TypeString, tp) +} diff --git a/pkg/parser/types/eval_type.go b/pkg/parser/types/eval_type.go new file mode 100644 index 000000000..9418bd5ca --- /dev/null +++ b/pkg/parser/types/eval_type.go @@ -0,0 +1,68 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import "fmt" + +// EvalType indicates the specified types that arguments and result of a built-in function should be. +type EvalType byte + +const ( + // ETInt represents type INT in evaluation. + ETInt EvalType = iota + // ETReal represents type REAL in evaluation. + ETReal + // ETDecimal represents type DECIMAL in evaluation. + ETDecimal + // ETString represents type STRING in evaluation. + ETString + // ETDatetime represents type DATETIME in evaluation. + ETDatetime + // ETTimestamp represents type TIMESTAMP in evaluation. + ETTimestamp + // ETDuration represents type DURATION in evaluation. + ETDuration + // ETJson represents type JSON in evaluation. + ETJson +) + +// IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes. +func (et EvalType) IsStringKind() bool { + return et == ETString || et == ETDatetime || + et == ETTimestamp || et == ETDuration || et == ETJson +} + +// String implements fmt.Stringer interface. +func (et EvalType) String() string { + switch et { + case ETInt: + return "Int" + case ETReal: + return "Real" + case ETDecimal: + return "Decimal" + case ETString: + return "String" + case ETDatetime: + return "Datetime" + case ETTimestamp: + return "Timestamp" + case ETDuration: + return "Time" + case ETJson: + return "Json" + default: + panic(fmt.Sprintf("invalid EvalType %d", et)) + } +} diff --git a/pkg/parser/types/field_type.go b/pkg/parser/types/field_type.go new file mode 100644 index 000000000..8f2afec18 --- /dev/null +++ b/pkg/parser/types/field_type.go @@ -0,0 +1,737 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types + +import ( + "encoding/json" + "fmt" + "io" + "slices" + "strings" + "unsafe" + + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" +) + +// UnspecifiedLength is unspecified length. +const ( + UnspecifiedLength = -1 +) + +// GeometryType is storing the geometry subtype for TypeGeometry +type GeometryType uint8 + +const ( + // GeomGeometry is GEOMETRY + GeomGeometry GeometryType = iota + + // GeomPoint is POINT + GeomPoint + + // GeomLineString is LINESTRING + GeomLineString + + // GeomPolygon is POLYGON + GeomPolygon + + // GeomMultiPoint is MULTIPOINT + GeomMultiPoint + + // GeomMultiLineString is MULTILINESTRING + GeomMultiLineString + + // GeomMultiPolygon is MULTIPOLYGON + GeomMultiPolygon + + // GeomGeometryCollection is GEOMETRYCOLLECTION + GeomGeometryCollection +) + +var geo2Str = map[GeometryType]string{ + GeomGeometry: "geometry", + GeomPoint: "point", + GeomLineString: "linestring", + GeomPolygon: "polygon", + GeomMultiPoint: "multipoint", + GeomMultiLineString: "multilinestring", + GeomMultiPolygon: "multipolygon", + GeomGeometryCollection: "geometrycollection", +} + +func (geo *GeometryType) String() string { + return geo2Str[*geo] +} + +// FieldType records field type information. +type FieldType struct { + // tp is type of the field + tp byte + // flag represent NotNull, Unsigned, PriKey flags etc. + flag uint + // flen represent size of bytes of the field + flen int + // decimal represent decimal length of the field + decimal int + // charset represent character set + charset string + // collate represent collate rules of the charset + collate string + // elems is the element list for enum and set type. + elems []string + elemsIsBinaryLit []bool + array bool + geo GeometryType + // Please keep in mind that jsonFieldType should be updated if you add a new field here. +} + +// DeepCopy returns a deep copy of the FieldType. +func (ft *FieldType) DeepCopy() *FieldType { + if ft == nil { + return nil + } + ret := &FieldType{ + tp: ft.tp, + flag: ft.flag, + flen: ft.flen, + decimal: ft.decimal, + charset: ft.charset, + collate: ft.collate, + array: ft.array, + geo: ft.geo, + } + if len(ft.elems) > 0 { + ret.elems = make([]string, len(ft.elems)) + copy(ret.elems, ft.elems) + } + if len(ft.elemsIsBinaryLit) > 0 { + ret.elemsIsBinaryLit = make([]bool, len(ft.elemsIsBinaryLit)) + copy(ret.elemsIsBinaryLit, ft.elemsIsBinaryLit) + } + return ret +} + +// NewFieldType returns a FieldType, +// with a type and other information about field type. +func NewFieldType(tp byte) *FieldType { + return &FieldType{ + tp: tp, + flen: UnspecifiedLength, + decimal: UnspecifiedLength, + } +} + +// IsDecimalValid checks whether the decimal is valid. +func (ft *FieldType) IsDecimalValid() bool { + if ft.GetType() == mysql.TypeNewDecimal && (ft.decimal < 0 || ft.decimal > mysql.MaxDecimalScale || ft.flen <= 0 || ft.flen > mysql.MaxDecimalWidth || ft.flen < ft.decimal) { + return false + } + return true +} + +// IsVarLengthType Determine whether the column type is a variable-length type +func (ft *FieldType) IsVarLengthType() bool { + switch ft.GetType() { + case mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeJSON, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, mysql.TypeGeometry: + return true + default: + return false + } +} + +// GetType returns the type of the FieldType. +func (ft *FieldType) GetType() byte { + if ft.array { + return mysql.TypeJSON + } + return ft.tp +} + +// GetFlag returns the flag of the FieldType. +func (ft *FieldType) GetFlag() uint { + return ft.flag +} + +// GetFlen returns the length of the field. +func (ft *FieldType) GetFlen() int { + return ft.flen +} + +// GetDecimal returns the decimal of the FieldType. +func (ft *FieldType) GetDecimal() int { + return ft.decimal +} + +// GetCharset returns the field's charset +func (ft *FieldType) GetCharset() string { + return ft.charset +} + +// GetCollate returns the collation of the field. +func (ft *FieldType) GetCollate() string { + return ft.collate +} + +// GetElems returns the elements of the FieldType. +func (ft *FieldType) GetElems() []string { + return ft.elems +} + +// SetType sets the type of the FieldType. +func (ft *FieldType) SetType(tp byte) { + ft.tp = tp + ft.array = false + ft.geo = GeomGeometry +} + +// SetFlag sets the flag of the FieldType. +func (ft *FieldType) SetFlag(flag uint) { + ft.flag = flag +} + +// AddFlag adds a flag to the FieldType. +func (ft *FieldType) AddFlag(flag uint) { + ft.flag |= flag +} + +// AndFlag and the flag of the FieldType. +func (ft *FieldType) AndFlag(flag uint) { + ft.flag &= flag +} + +// ToggleFlag toggle the flag of the FieldType. +func (ft *FieldType) ToggleFlag(flag uint) { + ft.flag ^= flag +} + +// DelFlag delete the flag of the FieldType. +func (ft *FieldType) DelFlag(flag uint) { + ft.flag &= ^flag +} + +// SetFlen sets the length of the field. +func (ft *FieldType) SetFlen(flen int) { + ft.flen = flen +} + +// SetFlenUnderLimit sets the length of the field to the value of the argument +func (ft *FieldType) SetFlenUnderLimit(flen int) { + if ft.GetType() == mysql.TypeNewDecimal { + ft.flen = min(flen, mysql.MaxDecimalWidth) + } else { + ft.flen = flen + } +} + +// SetDecimal sets the decimal of the FieldType. +func (ft *FieldType) SetDecimal(decimal int) { + ft.decimal = decimal +} + +// SetDecimalUnderLimit sets the decimal of the field to the value of the argument +func (ft *FieldType) SetDecimalUnderLimit(decimal int) { + if ft.GetType() == mysql.TypeNewDecimal { + ft.decimal = min(decimal, mysql.MaxDecimalScale) + } else { + ft.decimal = decimal + } +} + +// UpdateFlenAndDecimalUnderLimit updates the length and decimal to the value of the argument +func (ft *FieldType) UpdateFlenAndDecimalUnderLimit(old *FieldType, deltaDecimal int, deltaFlen int) { + if ft.GetType() != mysql.TypeNewDecimal { + return + } + if old.decimal < 0 { + deltaFlen += mysql.MaxDecimalScale + ft.decimal = mysql.MaxDecimalScale + } else { + ft.SetDecimal(old.decimal + deltaDecimal) + } + if old.flen < 0 { + ft.flen = mysql.MaxDecimalWidth + } else { + ft.SetFlenUnderLimit(old.flen + deltaFlen) + } +} + +// SetCharset sets the charset of the FieldType. +func (ft *FieldType) SetCharset(charset string) { + ft.charset = charset +} + +// SetCollate sets the collation of the FieldType. +func (ft *FieldType) SetCollate(collate string) { + ft.collate = collate +} + +// SetElems sets the elements of the FieldType. +func (ft *FieldType) SetElems(elems []string) { + ft.elems = elems +} + +// SetElem sets the element of the FieldType. +func (ft *FieldType) SetElem(idx int, element string) { + ft.elems[idx] = element +} + +// SetArray sets the array field of the FieldType. +func (ft *FieldType) SetArray(array bool) { + ft.array = array +} + +// IsArray return true if the filed type is array. +func (ft *FieldType) IsArray() bool { + return ft.array +} + +// ArrayType return the type of the array. +func (ft *FieldType) ArrayType() *FieldType { + if !ft.array { + return ft + } + clone := ft.Clone() + clone.SetArray(false) + return clone +} + +// SetGeometryType sets the GeometryType of the FieldType. +func (ft *FieldType) SetGeometryType(geo GeometryType) { + ft.geo = geo +} + +// GetGeometryType returns the GeometryType of the FieldType. +func (ft *FieldType) GetGeometryType() GeometryType { + return ft.geo +} + +// SetElemWithIsBinaryLit sets the element of the FieldType. +func (ft *FieldType) SetElemWithIsBinaryLit(idx int, element string, isBinaryLit bool) { + ft.elems[idx] = element + if isBinaryLit { + // Create the binary literal flags lazily. + if ft.elemsIsBinaryLit == nil { + ft.elemsIsBinaryLit = make([]bool, len(ft.elems)) + } + ft.elemsIsBinaryLit[idx] = true + } +} + +// GetElem returns the element of the FieldType. +func (ft *FieldType) GetElem(idx int) string { + return ft.elems[idx] +} + +// GetElemIsBinaryLit returns the binary literal flag of the element at index idx. +func (ft *FieldType) GetElemIsBinaryLit(idx int) bool { + if len(ft.elemsIsBinaryLit) == 0 { + return false + } + return ft.elemsIsBinaryLit[idx] +} + +// CleanElemIsBinaryLit cleans the binary literal flag of the element at index idx. +func (ft *FieldType) CleanElemIsBinaryLit() { + if ft != nil && ft.elemsIsBinaryLit != nil { + ft.elemsIsBinaryLit = nil + } +} + +// Clone returns a copy of itself. +func (ft *FieldType) Clone() *FieldType { + ret := *ft + return &ret +} + +// Equal checks whether two FieldType objects are equal. +func (ft *FieldType) Equal(other *FieldType) bool { + // We do not need to compare whole `ft.flag == other.flag` when wrapping cast upon an Expression. + // but need compare unsigned_flag of ft.flag. + // When tp is float or double with decimal unspecified, do not check whether flen is equal, + // because flen for them is useless. + // The decimal field can be ignored if the type is int or string. + tpEqual := (ft.GetType() == other.GetType()) || (ft.GetType() == mysql.TypeVarchar && other.GetType() == mysql.TypeVarString) || (ft.GetType() == mysql.TypeVarString && other.GetType() == mysql.TypeVarchar) + flenEqual := ft.flen == other.flen || (ft.EvalType() == ETReal && ft.decimal == UnspecifiedLength) || ft.EvalType() == ETJson + ignoreDecimal := ft.EvalType() == ETInt || ft.EvalType() == ETString + partialEqual := tpEqual && + (ignoreDecimal || ft.decimal == other.decimal) && + ft.charset == other.charset && + ft.collate == other.collate && + ft.geo == other.geo && + flenEqual && + mysql.HasUnsignedFlag(ft.flag) == mysql.HasUnsignedFlag(other.flag) + if !partialEqual { + return false + } + return slices.Equal(ft.elems, other.elems) +} + +// EvalType gets the type in evaluation. +func (ft *FieldType) EvalType() EvalType { + switch ft.GetType() { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, + mysql.TypeBit, mysql.TypeYear: + return ETInt + case mysql.TypeFloat, mysql.TypeDouble: + return ETReal + case mysql.TypeNewDecimal: + return ETDecimal + case mysql.TypeDate, mysql.TypeDatetime: + return ETDatetime + case mysql.TypeTimestamp: + return ETTimestamp + case mysql.TypeDuration: + return ETDuration + case mysql.TypeJSON: + return ETJson + case mysql.TypeEnum, mysql.TypeSet: + if ft.flag&mysql.EnumSetAsIntFlag > 0 { + return ETInt + } + } + return ETString +} + +// Hybrid checks whether a type is a hybrid type, which can represent different types of value in specific context. +func (ft *FieldType) Hybrid() bool { + return ft.GetType() == mysql.TypeEnum || ft.GetType() == mysql.TypeBit || ft.GetType() == mysql.TypeSet +} + +// Init initializes the FieldType data. +func (ft *FieldType) Init(tp byte) { + ft.tp = tp + ft.flen = UnspecifiedLength + ft.decimal = UnspecifiedLength +} + +// CompactStr only considers tp/CharsetBin/flen/Deimal. +// This is used for showing column type in infoschema. +func (ft *FieldType) CompactStr() string { + ts := TypeToStr(ft.GetType(), ft.charset, ft.geo) + suffix := "" + + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(ft.GetType()) + isDecimalNotDefault := ft.decimal != defaultDecimal && ft.decimal != 0 && ft.decimal != UnspecifiedLength + + // displayFlen and displayDecimal are flen and decimal values with `-1` substituted with default value. + displayFlen, displayDecimal := ft.flen, ft.decimal + if displayFlen == UnspecifiedLength { + displayFlen = defaultFlen + } + if displayDecimal == UnspecifiedLength { + displayDecimal = defaultDecimal + } + + switch ft.GetType() { + case mysql.TypeEnum, mysql.TypeSet: + // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') + es := make([]string, 0, len(ft.elems)) + for _, e := range ft.elems { + e = format.OutputFormat(e) + es = append(es, e) + } + suffix = fmt.Sprintf("('%s')", strings.Join(es, "','")) + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d)", displayDecimal) + } + case mysql.TypeDouble, mysql.TypeFloat: + // 1. flen Not Default, decimal Not Default -> Valid + // 2. flen Not Default, decimal Default (-1) -> Invalid + // 3. flen Default, decimal Not Default -> Valid + // 4. flen Default, decimal Default -> Valid (hide) + if isDecimalNotDefault { + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + } + case mysql.TypeNewDecimal: + suffix = fmt.Sprintf("(%d,%d)", displayFlen, displayDecimal) + case mysql.TypeBit, mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString: + suffix = fmt.Sprintf("(%d)", displayFlen) + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + // Integer display widths are deprecated in MySQL 8.0 but still + // round-trip through SHOW CREATE TABLE, so keep them when set. + suffix = fmt.Sprintf("(%d)", displayFlen) + case mysql.TypeYear: + suffix = fmt.Sprintf("(%d)", ft.flen) + case mysql.TypeNull: + suffix = "(0)" + } + return ts + suffix +} + +// InfoSchemaStr joins the CompactStr with unsigned flag and +// returns a string. +func (ft *FieldType) InfoSchemaStr() string { + suffix := "" + if mysql.HasUnsignedFlag(ft.flag) && + ft.GetType() != mysql.TypeBit && + ft.GetType() != mysql.TypeYear { + suffix = " unsigned" + } + return ft.CompactStr() + suffix +} + +// String joins the information of FieldType and returns a string. +// Note: when flen or decimal is unspecified, this function will use the default value instead of -1. +func (ft *FieldType) String() string { + strs := []string{ft.CompactStr()} + if mysql.HasUnsignedFlag(ft.flag) { + strs = append(strs, "UNSIGNED") + } + if mysql.HasZerofillFlag(ft.flag) { + strs = append(strs, "ZEROFILL") + } + if mysql.HasBinaryFlag(ft.flag) && ft.GetType() != mysql.TypeString { + strs = append(strs, "BINARY") + } + + if IsTypeChar(ft.GetType()) || IsTypeBlob(ft.GetType()) { + if ft.charset != "" && ft.charset != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.charset)) + } + if ft.collate != "" && ft.collate != charset.CharsetBin { + strs = append(strs, fmt.Sprintf("COLLATE %s", ft.collate)) + } + } + + return strings.Join(strs, " ") +} + +// Restore implements Node interface. +func (ft *FieldType) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord(TypeToStr(ft.GetType(), ft.charset, ft.geo)) + + precision := UnspecifiedLength + scale := UnspecifiedLength + + switch ft.GetType() { + case mysql.TypeEnum, mysql.TypeSet: + ctx.WritePlain("(") + for i, e := range ft.elems { + if i != 0 { + ctx.WritePlain(",") + } + ctx.WriteString(e) + } + ctx.WritePlain(")") + case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDuration: + precision = ft.decimal + case mysql.TypeUnspecified, mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal: + precision = ft.flen + scale = ft.decimal + default: + precision = ft.flen + } + + if precision != UnspecifiedLength { + ctx.WritePlainf("(%d", precision) + if scale != UnspecifiedLength { + ctx.WritePlainf(",%d", scale) + } + ctx.WritePlain(")") + } + + if mysql.HasUnsignedFlag(ft.flag) { + ctx.WriteKeyWord(" UNSIGNED") + } + if mysql.HasZerofillFlag(ft.flag) { + ctx.WriteKeyWord(" ZEROFILL") + } + if mysql.HasBinaryFlag(ft.flag) && ft.charset != charset.CharsetBin { + ctx.WriteKeyWord(" BINARY") + } + + if IsTypeChar(ft.GetType()) || IsTypeBlob(ft.GetType()) { + if ft.charset != "" && ft.charset != charset.CharsetBin { + ctx.WriteKeyWord(" CHARACTER SET " + ft.charset) + } + if ft.collate != "" && ft.collate != charset.CharsetBin { + ctx.WriteKeyWord(" COLLATE ") + ctx.WritePlain(ft.collate) + } + } + + return nil +} + +// RestoreAsCastType is used for write AST back to string. +func (ft *FieldType) RestoreAsCastType(ctx *format.RestoreCtx, explicitCharset bool) { + switch ft.tp { + case mysql.TypeVarString, mysql.TypeString: + skipWriteBinary := false + if ft.charset == charset.CharsetBin && ft.collate == charset.CollationBin { + ctx.WriteKeyWord("BINARY") + skipWriteBinary = true + } else { + ctx.WriteKeyWord("CHAR") + } + if ft.flen != UnspecifiedLength { + ctx.WritePlainf("(%d)", ft.flen) + } + if !explicitCharset { + break + } + if !skipWriteBinary && ft.flag&mysql.BinaryFlag != 0 { + ctx.WriteKeyWord(" BINARY") + } + if ft.charset != charset.CharsetBin && ft.charset != mysql.DefaultCharset { + ctx.WriteKeyWord(" CHARSET ") + ctx.WriteKeyWord(ft.charset) + } + case mysql.TypeDate: + ctx.WriteKeyWord("DATE") + case mysql.TypeDatetime: + ctx.WriteKeyWord("DATETIME") + if ft.decimal > 0 { + ctx.WritePlainf("(%d)", ft.decimal) + } + case mysql.TypeNewDecimal: + ctx.WriteKeyWord("DECIMAL") + if ft.flen > 0 && ft.decimal > 0 { + ctx.WritePlainf("(%d, %d)", ft.flen, ft.decimal) + } else if ft.flen > 0 { + ctx.WritePlainf("(%d)", ft.flen) + } + case mysql.TypeDuration: + ctx.WriteKeyWord("TIME") + if ft.decimal > 0 { + ctx.WritePlainf("(%d)", ft.decimal) + } + case mysql.TypeLonglong: + if ft.flag&mysql.UnsignedFlag != 0 { + ctx.WriteKeyWord("UNSIGNED") + } else { + ctx.WriteKeyWord("SIGNED") + } + case mysql.TypeJSON: + ctx.WriteKeyWord("JSON") + case mysql.TypeDouble: + ctx.WriteKeyWord("DOUBLE") + case mysql.TypeFloat: + ctx.WriteKeyWord("FLOAT") + case mysql.TypeYear: + ctx.WriteKeyWord("YEAR") + } + if ft.array { + ctx.WritePlain(" ") + ctx.WriteKeyWord("ARRAY") + } +} + +// FormatAsCastType is used for write AST back to string. +func (ft *FieldType) FormatAsCastType(w io.Writer, explicitCharset bool) { + var sb strings.Builder + restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb) + ft.RestoreAsCastType(restoreCtx, explicitCharset) + _, _ = fmt.Fprint(w, sb.String()) +} + +// VarStorageLen indicates this column is a variable length column. +const VarStorageLen = -1 + +// StorageLength is the length of stored value for the type. +func (ft *FieldType) StorageLength() int { + switch ft.GetType() { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, + mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeFloat, mysql.TypeYear, mysql.TypeDuration, + mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp, mysql.TypeEnum, mysql.TypeSet, + mysql.TypeBit: + // This may not be the accurate length, because we may encode them as varint. + return 8 + case mysql.TypeNewDecimal: + precision, frac := ft.flen-ft.decimal, ft.decimal + return precision/digitsPerWord*wordSize + dig2bytes[precision%digitsPerWord] + frac/digitsPerWord*wordSize + dig2bytes[frac%digitsPerWord] + default: + return VarStorageLen + } +} + +// HasCharset indicates if a COLUMN has an associated charset. Returning false here prevents some information +// statements(like `SHOW CREATE TABLE`) from attaching a CHARACTER SET clause to the column. +func HasCharset(ft *FieldType) bool { + switch ft.GetType() { + case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, mysql.TypeBlob, + mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: + return !mysql.HasBinaryFlag(ft.flag) + case mysql.TypeEnum, mysql.TypeSet: + return true + } + return false +} + +// for json +type jsonFieldType struct { + Tp byte + Flag uint + Flen int + Decimal int + Charset string + Collate string + Elems []string + ElemsIsBinaryLit []bool + Array bool + Geo GeometryType +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ft *FieldType) UnmarshalJSON(data []byte) error { + var r jsonFieldType + err := json.Unmarshal(data, &r) + if err == nil { + ft.tp = r.Tp + ft.flag = r.Flag + ft.flen = r.Flen + ft.decimal = r.Decimal + ft.charset = r.Charset + ft.collate = r.Collate + ft.elems = r.Elems + ft.elemsIsBinaryLit = r.ElemsIsBinaryLit + ft.array = r.Array + ft.geo = r.Geo + } + return err +} + +// MarshalJSON marshals the FieldType to JSON. +func (ft *FieldType) MarshalJSON() ([]byte, error) { + var r jsonFieldType + r.Tp = ft.tp + r.Flag = ft.flag + r.Flen = ft.flen + r.Decimal = ft.decimal + r.Charset = ft.charset + r.Collate = ft.collate + r.Elems = ft.elems + r.ElemsIsBinaryLit = ft.elemsIsBinaryLit + r.Array = ft.array + r.Geo = ft.geo + return json.Marshal(r) +} + +const emptyFieldTypeSize = int64(unsafe.Sizeof(FieldType{})) + +// MemoryUsage return the memory usage of FieldType +func (ft *FieldType) MemoryUsage() (sum int64) { + if ft == nil { + return + } + sum = emptyFieldTypeSize + int64(len(ft.charset)+len(ft.collate)) + int64(cap(ft.elems))*int64(unsafe.Sizeof("")) + + int64(cap(ft.elemsIsBinaryLit))*int64(unsafe.Sizeof(false)) + + for _, s := range ft.elems { + sum += int64(len(s)) + } + return +} diff --git a/pkg/parser/types/field_type_test.go b/pkg/parser/types/field_type_test.go new file mode 100644 index 000000000..25b07ec47 --- /dev/null +++ b/pkg/parser/types/field_type_test.go @@ -0,0 +1,345 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package types_test + +import ( + "fmt" + "testing" + + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/mysql" + + // import parser_driver + . "github.com/block/spirit/pkg/parser/types" + "github.com/stretchr/testify/require" +) + +func TestFieldType(t *testing.T) { + ft := NewFieldType(mysql.TypeDuration) + require.Equal(t, UnspecifiedLength, ft.GetFlen()) + require.Equal(t, UnspecifiedLength, ft.GetDecimal()) + ft.SetDecimal(5) + require.Equal(t, "time(5)", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeLong) + ft.SetFlen(5) + ft.SetFlag(mysql.UnsignedFlag | mysql.ZerofillFlag) + require.Equal(t, "int(5) UNSIGNED ZEROFILL", ft.String()) + require.Equal(t, "int(5) unsigned", ft.InfoSchemaStr()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeFloat) + ft.SetFlen(12) // Default + ft.SetDecimal(3) // Not Default + require.Equal(t, "float(12,3)", ft.String()) + ft = NewFieldType(mysql.TypeFloat) + ft.SetFlen(12) // Default + ft.SetDecimal(-1) // Default + require.Equal(t, "float", ft.String()) + ft = NewFieldType(mysql.TypeFloat) + ft.SetFlen(5) // Not Default + ft.SetDecimal(-1) // Default + require.Equal(t, "float", ft.String()) + ft = NewFieldType(mysql.TypeFloat) + ft.SetFlen(7) // Not Default + ft.SetDecimal(3) // Not Default + require.Equal(t, "float(7,3)", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeDouble) + ft.SetFlen(22) // Default + ft.SetDecimal(3) // Not Default + require.Equal(t, "double(22,3)", ft.String()) + ft = NewFieldType(mysql.TypeDouble) + ft.SetFlen(22) // Default + ft.SetDecimal(-1) // Default + require.Equal(t, "double", ft.String()) + ft = NewFieldType(mysql.TypeDouble) + ft.SetFlen(5) // Not Default + ft.SetDecimal(-1) // Default + require.Equal(t, "double", ft.String()) + ft = NewFieldType(mysql.TypeDouble) + ft.SetFlen(7) // Not Default + ft.SetDecimal(3) // Not Default + require.Equal(t, "double(7,3)", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeBlob) + ft.SetFlen(10) + ft.SetCharset("UTF8") + ft.SetCollate("UTF8_UNICODE_GI") + require.Equal(t, "text CHARACTER SET UTF8 COLLATE UTF8_UNICODE_GI", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeVarchar) + ft.SetFlen(10) + ft.AddFlag(mysql.BinaryFlag) + require.Equal(t, "varchar(10) BINARY", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeString) + ft.SetCharset(charset.CharsetBin) + ft.AddFlag(mysql.BinaryFlag) + require.Equal(t, "binary(1)", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeEnum) + ft.SetElems([]string{"a", "b"}) + require.Equal(t, "enum('a','b')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeEnum) + ft.SetElems([]string{"'a'", "'b'"}) + require.Equal(t, "enum('''a''','''b''')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeEnum) + ft.SetElems([]string{"a\nb", "a\tb", "a\rb"}) + require.Equal(t, "enum('a\\nb','a\tb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeEnum) + ft.SetElems([]string{"a\nb", "a'\t\r\nb", "a\rb"}) + require.Equal(t, "enum('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeSet) + ft.SetElems([]string{"a", "b"}) + require.Equal(t, "set('a','b')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeSet) + ft.SetElems([]string{"'a'", "'b'"}) + require.Equal(t, "set('''a''','''b''')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeSet) + ft.SetElems([]string{"a\nb", "a'\t\r\nb", "a\rb"}) + require.Equal(t, "set('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeSet) + ft.SetElems([]string{"a'\nb", "a'b\tc"}) + require.Equal(t, "set('a''\\nb','a''b c')", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeTimestamp) + ft.SetFlen(8) + ft.SetDecimal(2) + require.Equal(t, "timestamp(2)", ft.String()) + require.False(t, HasCharset(ft)) + ft = NewFieldType(mysql.TypeTimestamp) + ft.SetFlen(8) + ft.SetDecimal(0) + require.Equal(t, "timestamp", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeDatetime) + ft.SetFlen(8) + ft.SetDecimal(2) + require.Equal(t, "datetime(2)", ft.String()) + require.False(t, HasCharset(ft)) + ft = NewFieldType(mysql.TypeDatetime) + ft.SetFlen(8) + ft.SetDecimal(0) + require.Equal(t, "datetime", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeDate) + ft.SetFlen(8) + ft.SetDecimal(2) + require.Equal(t, "date", ft.String()) + require.False(t, HasCharset(ft)) + ft = NewFieldType(mysql.TypeDate) + ft.SetFlen(8) + ft.SetDecimal(0) + require.Equal(t, "date", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeYear) + ft.SetFlen(4) + ft.SetDecimal(0) + require.Equal(t, "year(4)", ft.String()) + require.False(t, HasCharset(ft)) + ft = NewFieldType(mysql.TypeYear) + ft.SetFlen(2) + ft.SetDecimal(2) + require.Equal(t, "year(2)", ft.String()) + require.False(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeVarchar) + ft.SetFlen(0) + ft.SetDecimal(0) + require.Equal(t, "varchar(0)", ft.String()) + require.True(t, HasCharset(ft)) + + ft = NewFieldType(mysql.TypeString) + ft.SetFlen(0) + ft.SetDecimal(0) + require.Equal(t, "char(0)", ft.String()) + require.True(t, HasCharset(ft)) +} + +func TestHasCharsetFromStmt(t *testing.T) { + template := "CREATE TABLE t(a %s)" + + types := []struct { + strType string + hasCharset bool + }{ + {"int", false}, + {"real", false}, + {"float", false}, + {"bit", false}, + {"bool", false}, + {"char(1)", true}, + {"national char(1)", true}, + {"binary", false}, + {"varchar(1)", true}, + {"national varchar(1)", true}, + {"varbinary(1)", false}, + {"year", false}, + {"date", false}, + {"time", false}, + {"datetime", false}, + {"timestamp", false}, + {"blob", false}, + {"tinyblob", false}, + {"mediumblob", false}, + {"longblob", false}, + {"bit", false}, + {"text", true}, + {"tinytext", true}, + {"mediumtext", true}, + {"longtext", true}, + {"json", false}, + {"enum('1')", true}, + {"set('1')", true}, + } + + p := parser.New() + for _, typ := range types { + sql := fmt.Sprintf(template, typ.strType) + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + + col := stmt.(*ast.CreateTableStmt).Cols[0] + require.Equal(t, typ.hasCharset, HasCharset(col.Tp)) + } +} + +func TestEnumSetFlen(t *testing.T) { + p := parser.New() + cases := []struct { + sql string + ex int + }{ + {"enum('a')", 1}, + {"enum('a', 'b')", 1}, + {"enum('a', 'bb')", 2}, + {"enum('a', 'b', 'c')", 1}, + {"enum('a', 'bb', 'c')", 2}, + {"enum('a', 'bb', 'c')", 2}, + {"enum('')", 0}, + {"enum('a', '')", 1}, + {"set('a')", 1}, + {"set('a', 'b')", 3}, + {"set('a', 'bb')", 4}, + {"set('a', 'b', 'c')", 5}, + {"set('a', 'bb', 'c')", 6}, + {"set('')", 0}, + {"set('a', '')", 2}, + } + + for _, ca := range cases { + stmt, err := p.ParseOneStmt(fmt.Sprintf("create table t (e %v)", ca.sql), "", "") + require.NoError(t, err) + col := stmt.(*ast.CreateTableStmt).Cols[0] + require.Equal(t, ca.ex, col.Tp.GetFlen()) + } +} + +func TestFieldTypeEqual(t *testing.T) { + // tp not equal + ft1 := NewFieldType(mysql.TypeDouble) + ft2 := NewFieldType(mysql.TypeFloat) + require.False(t, ft1.Equal(ft2)) + + // decimal not equal + ft2 = NewFieldType(mysql.TypeDouble) + ft2.SetDecimal(5) + require.False(t, ft1.Equal(ft2)) + + // flen not equal and decimal not -1 + ft1.SetDecimal(5) + ft1.SetFlen(22) + require.False(t, ft1.Equal(ft2)) + + // flen equal + ft2.SetFlen(22) + require.True(t, ft1.Equal(ft2)) + + // decimal is -1 + ft1.SetDecimal(-1) + ft2.SetDecimal(-1) + ft1.SetFlen(23) + require.True(t, ft1.Equal(ft2)) +} + +func TestCompactStr(t *testing.T) { + cases := []struct { + t byte // Field Type + flen int // Field Length + flags uint // Field Flags, e.g. ZEROFILL + e string // Expected CompactStr output + }{ + // Integer display widths always round-trip when explicitly set. + {mysql.TypeTiny, 1, 0, `tinyint(1)`}, + {mysql.TypeTiny, 2, 0, `tinyint(2)`}, + {mysql.TypeLong, 10, 0, `int(10)`}, + {mysql.TypeLong, 10, mysql.ZerofillFlag, `int(10)`}, + } + for _, cc := range cases { + ft := NewFieldType(cc.t) + ft.SetFlen(cc.flen) + ft.SetFlag(cc.flags) + require.Equal(t, cc.e, ft.CompactStr()) + } +} + +func TestGeometryType(t *testing.T) { + ft1 := NewFieldType(mysql.TypeFloat) + require.Equal(t, GeomGeometry, ft1.GetGeometryType()) + + ft2 := NewFieldType(mysql.TypeGeometry) + require.Equal(t, GeomGeometry, ft2.GetGeometryType()) + + ft2.SetGeometryType(GeomPoint) + require.Equal(t, GeomPoint, ft2.GetGeometryType()) + + ft2.SetType(mysql.TypeDouble) + require.Equal(t, GeomGeometry, ft2.GetGeometryType()) +} + +func TestGeometryType_String(t *testing.T) { + p := GeomPoint + require.Equal(t, "point", p.String()) + x := GeometryType(99) + require.Empty(t, x.String()) + var n GeometryType + require.Equal(t, "geometry", n.String()) +} diff --git a/pkg/parser/util/escape.go b/pkg/parser/util/escape.go new file mode 100644 index 000000000..5e6041c75 --- /dev/null +++ b/pkg/parser/util/escape.go @@ -0,0 +1,45 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +// UnescapeChar returns the unescaped byte(s) for a MySQL backslash escape +// sequence. Given the byte after the backslash, it returns the replacement +// byte(s). For most escapes this is a single byte; for \% and \_ both the +// backslash and the character are preserved. +// +// See https://dev.mysql.com/doc/refman/8.0/en/string-literals.html +// +// \" \' \\ \n \0 \b \Z \r \t ==> escape to one char +// \% \_ ==> preserve both chars +// other ==> remove backslash +func UnescapeChar(b byte) []byte { + switch b { + case 'n': + return []byte{'\n'} + case '0': + return []byte{0} + case 'b': + return []byte{8} + case 'Z': + return []byte{26} + case 'r': + return []byte{'\r'} + case 't': + return []byte{'\t'} + case '%', '_': + return []byte{'\\', b} + default: + return []byte{b} + } +} diff --git a/pkg/parser/util/escape_test.go b/pkg/parser/util/escape_test.go new file mode 100644 index 000000000..599c4d038 --- /dev/null +++ b/pkg/parser/util/escape_test.go @@ -0,0 +1,54 @@ +// Copyright 2025 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestUnescapeChar(t *testing.T) { + tests := []struct { + input byte + want []byte + }{ + // Standard single-byte escapes + {'n', []byte{'\n'}}, + {'0', []byte{0}}, + {'b', []byte{8}}, + {'Z', []byte{26}}, + {'r', []byte{'\r'}}, + {'t', []byte{'\t'}}, + + // Preserve both backslash and character + {'%', []byte{'\\', '%'}}, + {'_', []byte{'\\', '_'}}, + + // Self-escaping characters (backslash removed) + {'\\', []byte{'\\'}}, + {'\'', []byte{'\''}}, + {'"', []byte{'"'}}, + + // Any other character just returns itself (backslash removed) + {'a', []byte{'a'}}, + {'z', []byte{'z'}}, + {'1', []byte{'1'}}, + {' ', []byte{' '}}, + } + for _, tt := range tests { + got := UnescapeChar(tt.input) + require.Equal(t, tt.want, got, "UnescapeChar(%q)", tt.input) + } +} diff --git a/pkg/parser/yy_parser.go b/pkg/parser/yy_parser.go new file mode 100644 index 000000000..9b75d370f --- /dev/null +++ b/pkg/parser/yy_parser.go @@ -0,0 +1,488 @@ +// Copyright 2015 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser + +import ( + "errors" + "fmt" + "math" + "slices" + "strconv" + "unicode" + + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/auth" + "github.com/block/spirit/pkg/parser/charset" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/types" +) + +var ( + // ErrSyntax returns for sql syntax error. + ErrSyntax = mysql.NewStdErr("parser", mysql.ErrSyntax) + // ErrParse returns for sql parse error. + ErrParse = mysql.NewStdErr("parser", mysql.ErrParse) + // ErrUnknownCharacterSet returns for no character set found error. + ErrUnknownCharacterSet = mysql.NewStdErr("parser", mysql.ErrUnknownCharacterSet) + // ErrInvalidYearColumnLength returns for illegal column length for year type. + ErrInvalidYearColumnLength = mysql.NewStdErr("parser", mysql.ErrInvalidYearColumnLength) + // ErrWrongArguments returns for illegal argument. + ErrWrongArguments = mysql.NewStdErr("parser", mysql.ErrWrongArguments) + // ErrWrongFieldTerminators returns for illegal field terminators. + ErrWrongFieldTerminators = mysql.NewStdErr("parser", mysql.ErrWrongFieldTerminators) + // ErrTooBigDisplayWidth returns for data display width exceed limit . + ErrTooBigDisplayWidth = mysql.NewStdErr("parser", mysql.ErrTooBigDisplaywidth) + // ErrTooBigPrecision returns for data precision exceed limit. + ErrTooBigPrecision = mysql.NewStdErr("parser", mysql.ErrTooBigPrecision) + // ErrUnknownAlterLock returns for no alter lock type found error. + ErrUnknownAlterLock = mysql.NewStdErr("parser", mysql.ErrUnknownAlterLock) + // ErrUnknownAlterAlgorithm returns for no alter algorithm found error. + ErrUnknownAlterAlgorithm = mysql.NewStdErr("parser", mysql.ErrUnknownAlterAlgorithm) + // ErrWrongValue returns for wrong value + ErrWrongValue = mysql.NewStdErr("parser", mysql.ErrWrongValue) + // ErrWarnDeprecatedSyntax return when the syntax was deprecated + ErrWarnDeprecatedSyntax = mysql.NewStdErr("parser", mysql.ErrWarnDeprecatedSyntax) + // ErrWarnDeprecatedSyntaxNoReplacement return when the syntax was deprecated and there is no replacement. + ErrWarnDeprecatedSyntaxNoReplacement = mysql.NewStdErr("parser", mysql.ErrWarnDeprecatedSyntaxNoReplacement) + // ErrWrongUsage returns for incorrect usages. + ErrWrongUsage = mysql.NewStdErr("parser", mysql.ErrWrongUsage) + // ErrWrongDBName returns for incorrect DB name. + ErrWrongDBName = mysql.NewStdErr("parser", mysql.ErrWrongDBName) + // ErrDataOutOfRange returns for incorrect range. + ErrDataOutOfRange = mysql.NewStdErr("parser", mysql.ErrDataOutOfRange) +) + +//revive:disable:exported + +// ParserConfig is the parser config. +type ParserConfig struct { + EnableWindowFunction bool + EnableStrictDoubleTypeCheck bool + SkipPositionRecording bool +} + +const ( + // maxASTDepthStmtOverhead leaves room for statement wrapper nodes on the + // visitor path, for example SelectStmt -> FieldList -> SelectField. + maxASTDepthStmtOverhead = 64 + // maxASTDepth bounds user-controlled AST nesting before recursive visitors run. + maxASTDepth = maxParenthesesDepth + maxASTDepthStmtOverhead +) + +//revive:enable:exported + +// Parser represents a parser instance. Some temporary objects are stored in it to reduce object allocation during Parse function. +type Parser struct { + charset string + collation string + result []ast.StmtNode + src string + lexer Scanner + hintParser *hintParser + + explicitCharset bool + strictDoubleFieldType bool + + // the following fields are used by yyParse to reduce allocation. + cache []yySymType + yylval yySymType + yyVAL *yySymType +} + +// setNodeText sets the raw text on a parsed AST node and propagates the +// NO_BACKSLASH_ESCAPES SQL mode so that Text() can correctly handle +// backslash escapes when converting binary string literals to hex. +func (parser *Parser) setNodeText(n interface { + SetText(charset.Encoding, string) +}, text string) { + n.SetText(parser.lexer.client, text) + if setter, ok := n.(interface{ SetNoBackslashEscapes(bool) }); ok { + setter.SetNoBackslashEscapes(parser.lexer.sqlMode.HasNoBackslashEscapesMode()) + } +} + +func yySetOffset(yyVAL *yySymType, offset int) { + if yyVAL.expr != nil { + yyVAL.expr.SetOriginTextPosition(offset) + } +} + +func yyhintSetOffset(_ *yyhintSymType, _ int) { +} + +type stmtTexter interface { + stmtText() string +} + +// New returns a Parser object with default SQL mode. +func New() *Parser { + p := &Parser{ + cache: make([]yySymType, 200), + } + p.reset() + return p +} + +// Reset resets the parser. +func (parser *Parser) Reset() { + clear(parser.cache) + parser.reset() +} + +func (parser *Parser) reset() { + parser.explicitCharset = false + parser.strictDoubleFieldType = false + parser.EnableWindowFunc(true) + parser.SetStrictDoubleTypeCheck(true) + mode, _ := mysql.GetSQLMode(mysql.DefaultSQLMode) + parser.SetSQLMode(mode) +} + +// SetStrictDoubleTypeCheck enables/disables strict double type check. +func (parser *Parser) SetStrictDoubleTypeCheck(val bool) { + parser.strictDoubleFieldType = val +} + +// SetParserConfig sets the parser config. +func (parser *Parser) SetParserConfig(config ParserConfig) { + parser.EnableWindowFunc(config.EnableWindowFunction) + parser.SetStrictDoubleTypeCheck(config.EnableStrictDoubleTypeCheck) + parser.lexer.skipPositionRecording = config.SkipPositionRecording +} + +// ParseSQL parses a query string to raw ast.StmtNode. +func (parser *Parser) ParseSQL(sql string, params ...ParseParam) (stmt []ast.StmtNode, warns []error, err error) { + resetParams(parser) + parser.lexer.reset(sql) + for _, p := range params { + if err := p.ApplyOn(parser); err != nil { + return nil, nil, err + } + } + parser.src = sql + parser.result = parser.result[:0] + + var l yyLexer = &parser.lexer + yyParse(l, parser) + + warns, errs := l.Errors() + if len(warns) > 0 { + warns = slices.Clone(warns) + } else { + warns = nil + } + if len(errs) != 0 { + return nil, warns, errs[0] + } + for _, stmt := range parser.result { + if err := checkASTDepth(stmt); err != nil { + return nil, warns, err + } + } + return parser.result, warns, nil +} + +// Parse parses a query string to raw ast.StmtNode. +// If charset or collation is "", default charset and collation will be used. +func (parser *Parser) Parse(sql, charset, collation string) (stmt []ast.StmtNode, warns []error, err error) { + return parser.ParseSQL(sql, CharsetConnection(charset), CollationConnection(collation)) +} + +func (parser *Parser) lastErrorAsWarn() { + parser.lexer.lastErrorAsWarn() +} + +func checkASTDepth(stmt ast.StmtNode) error { + checker := astDepthChecker{} + _, _ = stmt.Accept(&checker) + if checker.exceeded { + return ErrParse.GenByArgs("AST nesting depth exceeds maximum", strconv.Itoa(maxASTDepth)) + } + return nil +} + +type astDepthChecker struct { + depth int + exceeded bool +} + +func (c *astDepthChecker) Enter(in ast.Node) (ast.Node, bool) { + c.depth++ + if c.depth > maxASTDepth { + c.exceeded = true + return in, true + } + return in, false +} + +func (c *astDepthChecker) Leave(in ast.Node) (ast.Node, bool) { + c.depth-- + return in, !c.exceeded +} + +// ParseOneStmt parses a query and returns an ast.StmtNode. +// The query must have one statement, otherwise ErrSyntax is returned. +func (parser *Parser) ParseOneStmt(sql, charset, collation string) (ast.StmtNode, error) { + stmts, _, err := parser.ParseSQL(sql, CharsetConnection(charset), CollationConnection(collation)) + if err != nil { + return nil, err + } + if len(stmts) != 1 { + return nil, ErrSyntax + } + return stmts[0], nil +} + +// SetSQLMode sets the SQL mode for parser. +func (parser *Parser) SetSQLMode(mode mysql.SQLMode) { + parser.lexer.SetSQLMode(mode) +} + +// EnableWindowFunc controls whether the parser to parse syntax related with window function. +func (parser *Parser) EnableWindowFunc(val bool) { + parser.lexer.EnableWindowFunc(val) +} + +// ParseErrorWith returns "You have a syntax error near..." error message compatible with mysql. +func ParseErrorWith(errstr string, lineno int) error { + if len(errstr) > mysql.ErrTextLength { + errstr = errstr[:mysql.ErrTextLength] + } + return fmt.Errorf("near '%-.80s' at line %d", errstr, lineno) +} + +// The select statement is not at the end of the whole statement, if the last +// field text was set from its offset to the end of the src string, update +// the last field text. +func (parser *Parser) setLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { + if st.Kind != ast.SelectStmtKindSelect { + return + } + lastField := st.Fields.Fields[len(st.Fields.Fields)-1] + if lastField.Offset+len(lastField.OriginalText()) >= len(parser.src)-1 { + lastField.SetText(parser.lexer.client, parser.src[lastField.Offset:lastEnd]) + } +} + +func (*Parser) startOffset(v *yySymType) int { + return v.offset +} + +func (parser *Parser) endOffset(v *yySymType) int { + offset := v.offset + for offset > 0 && unicode.IsSpace(rune(parser.src[offset-1])) { + offset-- + } + return offset +} + +func (parser *Parser) parseHint(input string) ([]*ast.TableOptimizerHint, []error) { + if parser.hintParser == nil { + parser.hintParser = newHintParser() + } + return parser.hintParser.parse(input, parser.lexer.GetSQLMode(), parser.lexer.lastHintPos) +} + +func toInt(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseUint(str, 10, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + // TODO: toDecimal maybe out of range still. + // This kind of error should be throw to higher level, because truncated data maybe legal. + // For example, this SQL returns error: + // create table test (id decimal(30, 0)); + // insert into test values(123456789012345678901234567890123094839045793405723406801943850); + // While this SQL: + // select 1234567890123456789012345678901230948390457934057234068019438509023041874359081325875128590860234789847359871045943057; + // get value 99999999999999999999999999999999999999999999999999999999999999999 + return toDecimal(l, lval, str) + } + l.AppendError(l.Errorf("integer literal: %v", err)) + return invalid + } + + switch { + case n <= math.MaxInt64: + lval.item = int64(n) + default: + lval.item = n + } + return intLit +} + +func toDecimal(l yyLexer, lval *yySymType, str string) int { + dec, err := ast.NewDecimal(str) + if err != nil { + switch { + case errors.Is(err, types.ErrDataOutOfRange): + // Integer part exceeds the 65-digit maximum: MySQL clamps the + // literal to the maximum decimal value with a truncation warning. + l.AppendWarn(types.ErrTruncatedWrongValue.GenByArgs("DECIMAL", dec)) + dec, _ = ast.NewDecimal(mysql.DefaultDecimal) + case errors.Is(err, types.ErrTruncatedWrongValue): + // Fractional part was too long and got truncated; keep the + // truncated value like MySQL does. + l.AppendWarn(types.ErrTruncatedWrongValue.GenByArgs("DECIMAL", dec)) + default: + l.AppendError(l.Errorf("decimal literal: %v", err)) + } + } + lval.item = dec + return decLit +} + +func toFloat(l yyLexer, lval *yySymType, str string) int { + n, err := strconv.ParseFloat(str, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + l.AppendError(types.ErrIllegalValueForType.GenByArgs("double", str)) + return invalid + } + l.AppendError(l.Errorf("float literal: %v", err)) + return invalid + } + + lval.item = n + return floatLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html +func toHex(l yyLexer, lval *yySymType, str string) int { + h, err := ast.NewHexLiteral(str) + if err != nil { + l.AppendError(l.Errorf("hex literal: %v", err)) + return invalid + } + lval.item = h + return hexLit +} + +// See https://dev.mysql.com/doc/refman/5.7/en/bit-type.html +func toBit(l yyLexer, lval *yySymType, str string) int { + b, err := ast.NewBitLiteral(str) + if err != nil { + l.AppendError(l.Errorf("bit literal: %v", err)) + return invalid + } + lval.item = b + return bitLit +} + +func getUint64FromNUM(num interface{}) uint64 { + switch v := num.(type) { + case int64: + return uint64(v) + case uint64: + return v + } + return 0 +} + +func getInt64FromNUM(num interface{}) (val int64, errMsg string) { + switch v := num.(type) { + case int64: + return v, "" + default: + return -1, fmt.Sprintf("%d is out of range [–9223372036854775808,9223372036854775807]", num) + } +} + +func isRevokeAllGrant(roleOrPrivList []*ast.RoleOrPriv) bool { + if len(roleOrPrivList) != 2 { + return false + } + priv, err := roleOrPrivList[0].ToPriv() + if err != nil { + return false + } + if priv.Priv != mysql.AllPriv { + return false + } + priv, err = roleOrPrivList[1].ToPriv() + if err != nil { + return false + } + if priv.Priv != mysql.GrantPriv { + return false + } + return true +} + +// convertToRole tries to convert elements of roleOrPrivList to RoleIdentity +func convertToRole(roleOrPrivList []*ast.RoleOrPriv) ([]*auth.RoleIdentity, error) { + var roles []*auth.RoleIdentity + for _, elem := range roleOrPrivList { + role, err := elem.ToRole() + if err != nil { + return nil, err + } + roles = append(roles, role) + } + return roles, nil +} + +// convertToPriv tries to convert elements of roleOrPrivList to PrivElem +func convertToPriv(roleOrPrivList []*ast.RoleOrPriv) ([]*ast.PrivElem, error) { + var privileges []*ast.PrivElem + for _, elem := range roleOrPrivList { + priv, err := elem.ToPriv() + if err != nil { + return nil, err + } + privileges = append(privileges, priv) + } + return privileges, nil +} + +var ( + _ ParseParam = CharsetConnection("") + _ ParseParam = CollationConnection("") +) + +func resetParams(p *Parser) { + p.charset = mysql.DefaultCharset + p.collation = mysql.DefaultCollationName +} + +// ParseParam represents the parameter of parsing. +type ParseParam interface { + ApplyOn(*Parser) error +} + +// CharsetConnection is used for literals specified without a character set. +type CharsetConnection string + +// ApplyOn implements ParseParam interface. +func (c CharsetConnection) ApplyOn(p *Parser) error { + if c == "" { + p.charset = mysql.DefaultCharset + } else { + p.charset = string(c) + } + p.lexer.connection = charset.FindEncoding(string(c)) + return nil +} + +// CollationConnection is used for literals specified without a collation. +type CollationConnection string + +// ApplyOn implements ParseParam interface. +func (c CollationConnection) ApplyOn(p *Parser) error { + if c == "" { + p.collation = mysql.DefaultCollationName + } else { + p.collation = string(c) + } + return nil +} diff --git a/pkg/statement/README.md b/pkg/statement/README.md index c55cde0a3..3161361c8 100644 --- a/pkg/statement/README.md +++ b/pkg/statement/README.md @@ -1,6 +1,6 @@ # Statement -The statement package provides SQL statement parsing and analysis capabilities for Spirit. It wraps the [TiDB parser](https://github.com/pingcap/tidb/tree/master/pkg/parser) to extract structured information from DDL statements and determine their safety characteristics for online schema changes. +The statement package provides SQL statement parsing and analysis capabilities for Spirit. It wraps [pkg/parser](../parser/README.md) (Spirit's MySQL-only fork of the TiDB parser) to extract structured information from DDL statements and determine their safety characteristics for online schema changes. ## Design Philosophy @@ -12,7 +12,7 @@ Spirit needs to understand DDL statements to: 5. **Parse** CREATE TABLE statements into structured data for comparison 6. **Normalize** parsed CREATE TABLE definitions to MySQL's canonical form so equivalent schemas compare equal (see [Normalization](#normalization)) -Rather than implementing a custom parser, Spirit leverages the TiDB parser, which provides: +Rather than implementing a parser from scratch, Spirit maintains a fork of the TiDB parser (see [pkg/parser](../parser/README.md)), which provides: - Battle-tested SQL parsing compatible with MySQL syntax - AST (Abstract Syntax Tree) representation of statements - Ability to restore modified ASTs back to SQL @@ -335,7 +335,7 @@ MySQL rewrites many constructs when it stores a table definition, so the form a Two layers of canonicalization apply: -1. **The TiDB parser** already folds most type *aliases* before Spirit sees them: `BOOL`/`BOOLEAN` → `tinyint(1)`, `SERIAL` → `bigint unsigned NOT NULL AUTO_INCREMENT UNIQUE`, `INTEGER` → `int`, `NVARCHAR` → `varchar`, `DEC` → `decimal`. Nothing in Spirit is needed for these. +1. **The parser** already folds most type *aliases* before Spirit sees them: `BOOL`/`BOOLEAN` → `tinyint(1)`, `SERIAL` → `bigint unsigned NOT NULL AUTO_INCREMENT UNIQUE`, `INTEGER` → `int`, `NVARCHAR` → `varchar`, `DEC` → `decimal`. Nothing in Spirit is needed for these. 2. **Spirit's normalization rules** handle the canonicalizations the parser does *not* — each mirrors something MySQL does when storing the table: | Rule (`normalize_*.go`) | Canonicalization | @@ -553,7 +553,7 @@ if alterStmt != "" { 1. **Functional Indexes**: `CREATE INDEX` with functional expressions cannot be converted to `ALTER TABLE` 2. **Single Schema**: Multi-table operations must use the same schema 3. **SPATIAL Indexes**: Not fully supported in some helper functions -4. **Statements must be parseable by the TiDB parser**: When encountered, we typically contribute fixes upstream. The most commonly occurring scenarios tend to be complex DEFAULT or CHECK expressions. +4. **Statements must be parseable by pkg/parser**: unparseable DDL cannot be migrated. The most commonly occurring scenarios tend to be complex DEFAULT or CHECK expressions; since the parser is part of this repo, fixes land here directly. ## Best Practices @@ -562,7 +562,7 @@ if alterStmt != "" { ## See Also -- [TiDB Parser Documentation](https://github.com/pingcap/tidb/tree/master/pkg/parser) +- [pkg/parser](../parser/README.md) - Spirit's SQL parser (MySQL-only fork of the TiDB parser) - [MySQL 8.0 Online DDL Operations](https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html) - [pkg/table](../table/README.md) - Uses statement parsing for table metadata - [pkg/migration](../migration/README.md) - Uses safety analysis to determine migration strategy diff --git a/pkg/statement/check_paren_roundtrip_test.go b/pkg/statement/check_paren_roundtrip_test.go index f2c3078e1..ccee91fe8 100644 --- a/pkg/statement/check_paren_roundtrip_test.go +++ b/pkg/statement/check_paren_roundtrip_test.go @@ -73,6 +73,95 @@ func TestRoundTrip_AddCheckConstraintParens(t *testing.T) { "CREATE TABLE rt_chk_add (id INT PRIMARY KEY, kind enum('x','y') NOT NULL, ref_x INT, ref_y INT, CONSTRAINT chk_add_kind_ref CHECK ((kind = 'x' AND ref_x IS NOT NULL) OR (kind = 'y' AND ref_y IS NOT NULL)))") } +// TestRoundTrip_ExpressionParenShapes walks a range of expression shapes +// through both directions of the CHECK-constraint round trip: +// +// - the "stored" direction asserts that the shape as a person writes it +// converges with the form MySQL stores for it, so no diff is emitted; +// - the "emitted" direction adds the same constraint to a table that lacks +// it, so the canonical text reaches MySQL as DDL, and asserts that +// re-reading it converges. +// +// Together they check the one thing the canonicalizer cannot check by itself: +// that its notion of MySQL operator precedence — which decides whether a pair +// of parentheses may be dropped — agrees with MySQL's. A mismatch shows up as +// a shape that never converges, or (in the emitted direction) as MySQL storing +// a different expression than the one we meant to write. +func TestRoundTrip_ExpressionParenShapes(t *testing.T) { + const columns = "id INT PRIMARY KEY, a INT, b INT, c INT, s VARCHAR(20), j JSON" + + shapes := []struct { + name string + expr string + }{ + // Precedence between the logical operators, and between arithmetic + // and comparison. + {"OrAndPrecedence", "a = 1 OR b = 2 AND c = 3"}, + {"OrAndParens", "(a = 1 OR b = 2) AND c = 3"}, + {"XorPrecedence", "a = 1 XOR b = 2 AND c = 3"}, + {"NestedLogical", "a > 0 AND (b > 0 OR (c > 0 AND a < 10))"}, + // MySQL rewrites most NOT expressions when it stores them (NOT (a > 0) + // comes back as a <= 0, NOT (a IN (1,2)) as a NOT IN (1,2)), which no + // textual canonicalization can undo. LIKE is one of the operands it + // leaves as a NOT. + {"NotLike", "NOT (s LIKE 'x%')"}, + {"ArithmeticPrecedence", "a + b * c > 10"}, + {"ArithmeticParens", "(a + b) * c > 10"}, + {"ArithmeticNested", "((a + b) * (c - 1)) / 2 > a"}, + // Non-associative arithmetic, where the parentheses must survive. + {"MinusRightNested", "a - (b - c) > 0"}, + {"DivideRightNested", "a / (b / c) > 0"}, + {"ModuloRightNested", "a % (b % c) = 0"}, + {"PlusRightNested", "a + (b + c) > 0"}, + // Bitwise operators, which sit between comparison and arithmetic. + {"BitwiseAndOr", "a & 3 | b = 0"}, + {"BitwiseParens", "a & (3 | b) = 0"}, + {"BitwiseXor", "a ^ b = 0"}, + {"ShiftPrecedence", "(a << 1) + b > 0"}, + // Comparison-level constructs. + {"BetweenWithAnd", "a BETWEEN 1 AND 10 AND b > 0"}, + {"BetweenOperands", "a BETWEEN b + 1 AND c * 2"}, + {"IsNullOrIsNotNull", "a IS NULL OR b IS NOT NULL"}, + {"IsTruth", "(a > 0) IS TRUE"}, + {"InAndNotIn", "a IN (1,2,3) AND b NOT IN (4,5)"}, + // Spelled REGEXP_LIKE because MySQL stores the REGEXP operator as a call + // to it, and the stored form is what has to converge. + {"LikeOrRegexp", "s LIKE 'x%' OR REGEXP_LIKE(s, '^y')"}, + {"MemberOf", "1 MEMBER OF (j) OR a > 0"}, + {"Collate", "s COLLATE utf8mb4_bin = 'x' AND a > 0"}, + // Unary operators and function calls, whose operands are the + // conservative cases in the canonicalizer. + {"UnaryMinus", "-a < b"}, + {"UnaryMinusExpr", "-(a + b) < c"}, + {"FunctionArgExpr", "CHAR_LENGTH(s) * 2 > a + 1"}, + {"NestedFunctionArgExpr", "GREATEST(a + b, c * 2) > 0"}, + // A function argument under a tighter-binding operator is one of the + // positions where parentheses are kept conservatively; both spellings + // still have to converge on the same text. + {"FunctionArgKeepsParens", "a * GREATEST(b + c, 1) > 0"}, + {"FunctionArgWrittenParens", "a * GREATEST((b + c), 1) > 0"}, + {"CaseExpression", "CASE WHEN a > 0 THEN b ELSE -b END > 0"}, + } + + for _, shape := range shapes { + t.Run(shape.name, func(t *testing.T) { + t.Run("stored", func(t *testing.T) { + table := "rt_shape_" + shape.name + stmts := createAndDiffAgainstLive(t, table, + "CREATE TABLE "+table+" ("+columns+", CHECK ("+shape.expr+"))") + require.Empty(t, stmts, "table just created from the file must produce an empty diff") + }) + + t.Run("emitted", func(t *testing.T) { + table := "rt_shape_add_" + shape.name + applyAndConverge(t, openScratch(t), table, + "CREATE TABLE "+table+" ("+columns+")", + "CREATE TABLE "+table+" ("+columns+", CHECK ("+shape.expr+"))") + }) + }) + } +} + // TestRoundTrip_GeneratedColumnParens verifies the same convergence for // generated-column expressions, which MySQL canonicalizes the same way as // CHECK expressions (interior precedence parentheses are made explicit in @@ -83,3 +172,35 @@ func TestRoundTrip_GeneratedColumnParens(t *testing.T) { stmts := createAndDiffAgainstLive(t, "rt_gen", fileSQL) require.Empty(t, stmts, "table just created from the file must produce an empty diff") } + +// TestRoundTrip_GeneratedColumnParenShapes is the generated-column half of +// TestRoundTrip_ExpressionParenShapes: the same canonicalization runs on the +// AS (...) expression, against MySQL's stored form of it. +func TestRoundTrip_GeneratedColumnParenShapes(t *testing.T) { + shapes := []struct { + name string + expr string + }{ + {"ArithmeticPrecedence", "a + b * 2"}, + {"ArithmeticParens", "(a + b) * 2"}, + {"MinusRightNested", "a - (b - 1)"}, + {"ArithmeticNested", "((a + b) * (a - 1)) / 2"}, + {"BitwiseAndOr", "a & 3 | b"}, + {"ShiftPrecedence", "(a << 1) + b"}, + {"Comparison", "a + 1 > b * 2"}, + {"LogicalOperators", "a > 0 AND (b > 0 OR a < 10)"}, + {"UnaryMinus", "-a + b"}, + {"FunctionArgExpr", "GREATEST(a + b, 1) * 2"}, + {"CaseExpression", "CASE WHEN a > 0 THEN b ELSE -b END"}, + } + + for _, shape := range shapes { + t.Run(shape.name, func(t *testing.T) { + table := "rt_genshape_" + shape.name + stmts := createAndDiffAgainstLive(t, table, + "CREATE TABLE "+table+" (id INT PRIMARY KEY, a INT, b INT, "+ + "g INT GENERATED ALWAYS AS ("+shape.expr+") STORED)") + require.Empty(t, stmts, "table just created from the file must produce an empty diff") + }) + } +} diff --git a/pkg/statement/classify.go b/pkg/statement/classify.go index 5ce62ccb4..7fcab222a 100644 --- a/pkg/statement/classify.go +++ b/pkg/statement/classify.go @@ -1,8 +1,8 @@ package statement import ( - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" ) // StatementType represents the type of a SQL statement. diff --git a/pkg/statement/create_table.go b/pkg/statement/create_table.go index dcafcb884..483b6d38a 100644 --- a/pkg/statement/create_table.go +++ b/pkg/statement/create_table.go @@ -8,11 +8,11 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" - "github.com/pingcap/tidb/pkg/parser/mysql" - "github.com/pingcap/tidb/pkg/parser/types" + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" + "github.com/block/spirit/pkg/parser/types" ) // CreateTable represents a parsed CREATE TABLE statement with structured data @@ -131,7 +131,7 @@ type TableOptions struct { // PartitionOptions represents table partitioning configuration type PartitionOptions struct { - Type string `json:"type"` // RANGE, LIST, HASH, KEY, SYSTEM_TIME + Type string `json:"type"` // RANGE, LIST, HASH, KEY Expression *string `json:"expression,omitempty"` // For HASH and RANGE Columns []string `json:"columns,omitempty"` // For KEY, RANGE COLUMNS, LIST COLUMNS Linear bool `json:"linear,omitempty"` // For LINEAR HASH/KEY @@ -502,7 +502,13 @@ func (ct *CreateTable) parseColumn(col *ast.ColumnDef) Column { // We track this so we can reproduce the correct syntax when generating ALTERs. column.DefaultIsExpr = isExpressionDefault(opt.Expr) - if literal, isStr := stringLiteralValue(opt.Expr); isStr { + // The parenthesized/bare distinction is captured above; + // extract the value from inside any parentheses so emission + // (which re-adds parens from DefaultIsExpr) doesn't double + // them, e.g. DEFAULT ('{}') stores the string {}. + defaultExpr := unwrapParenExpr(opt.Expr) + + if literal, isStr := stringLiteralValue(defaultExpr); isStr { // Quoted string literal default. Store the true, raw // (fully-unescaped) value off the AST and remember it // was a string so we re-quote it on emission — even if @@ -513,7 +519,7 @@ func (ct *CreateTable) parseColumn(col *ast.ColumnDef) Column { } else { // Non-string defaults (numeric, functions, expressions): // keep the Restored text representation. - defaultRaw := fmt.Sprintf("%v", ct.parseExpression(opt.Expr)) + defaultRaw := fmt.Sprintf("%v", ct.parseExpression(defaultExpr)) column.Default = &defaultRaw } } @@ -879,8 +885,6 @@ func (ct *CreateTable) parsePartitionOptions(partition *ast.PartitionOptions) *P partOpts.Type = "KEY" case ast.PartitionTypeList: partOpts.Type = "LIST" - case ast.PartitionTypeSystemTime: - partOpts.Type = "SYSTEM_TIME" default: partOpts.Type = fmt.Sprintf("UNKNOWN_%d", partition.Tp) } @@ -1008,12 +1012,6 @@ func (ct *CreateTable) parsePartitionClause(clause ast.PartitionDefinitionClause } return values - case *ast.PartitionDefinitionClauseHistory: - if c.Current { - return &PartitionValues{Type: "CURRENT", Values: []any{}} - } else { - return &PartitionValues{Type: "HISTORY", Values: []any{}} - } default: return nil } diff --git a/pkg/statement/create_table_test.go b/pkg/statement/create_table_test.go index 59664c237..bf3f6833d 100644 --- a/pkg/statement/create_table_test.go +++ b/pkg/statement/create_table_test.go @@ -1436,6 +1436,20 @@ func TestExpressionDefaultParsing(t *testing.T) { expectedDefault: "uuid()", expectedIsExpr: true, }, + { + name: "parenthesized string literal is an expression default", + sql: "CREATE TABLE t1 (id INT PRIMARY KEY, j JSON DEFAULT ('{}'))", + columnName: "j", + expectedDefault: "{}", + expectedIsExpr: true, + }, + { + name: "parenthesized numeric literal is an expression default", + sql: "CREATE TABLE t1 (id INT PRIMARY KEY, n INT DEFAULT (1))", + columnName: "n", + expectedDefault: "1", + expectedIsExpr: true, + }, } for _, tc := range testCases { @@ -1452,6 +1466,56 @@ func TestExpressionDefaultParsing(t *testing.T) { } } +// TestParenthesizedLiteralDefaultRoundTrip covers the declarative side of +// https://github.com/block/spirit/issues/542: DEFAULT ('{}') must extract as +// a string-valued expression default and emit back with exactly one set of +// parentheses and quotes. It must also compare different from the bare +// literal form DEFAULT '{}' (they are different DDL: BLOB/TEXT/JSON columns +// only accept the parenthesized one). +func TestParenthesizedLiteralDefaultRoundTrip(t *testing.T) { + ct, err := ParseCreateTable("CREATE TABLE t1 (id INT PRIMARY KEY, j JSON DEFAULT ('{}'))") + require.NoError(t, err) + col := ct.Columns.ByName("j") + require.NotNil(t, col) + require.NotNil(t, col.Default) + require.Equal(t, "{}", *col.Default) + require.True(t, col.DefaultIsExpr) + require.True(t, col.DefaultIsString) + require.Contains(t, formatColumnDefinition(col), "DEFAULT ('{}')") + + // MySQL's SHOW CREATE TABLE renders the same default with a charset + // introducer; both forms must extract identically so the desired and + // live definitions converge. + ctLive, err := ParseCreateTable("CREATE TABLE t1 (id INT PRIMARY KEY, j JSON DEFAULT (_utf8mb4'{}'))") + require.NoError(t, err) + colLive := ctLive.Columns.ByName("j") + require.NotNil(t, colLive) + require.NotNil(t, colLive.Default) + require.Equal(t, "{}", *colLive.Default) + require.True(t, colLive.DefaultIsExpr) + require.True(t, colLive.DefaultIsString) + + // The bare and parenthesized forms of the same literal are different + // defaults and must not compare equal. + ctBare, err := ParseCreateTable("CREATE TABLE t1 (id INT PRIMARY KEY, v VARCHAR(10) DEFAULT 'x')") + require.NoError(t, err) + ctParen, err := ParseCreateTable("CREATE TABLE t1 (id INT PRIMARY KEY, v VARCHAR(10) DEFAULT ('x'))") + require.NoError(t, err) + bare := ctBare.Columns.ByName("v") + paren := ctParen.Columns.ByName("v") + require.False(t, bare.DefaultIsExpr) + require.True(t, paren.DefaultIsExpr) + require.Equal(t, "DEFAULT 'x'", lastDefaultClause(t, formatColumnDefinition(bare))) + require.Equal(t, "DEFAULT ('x')", lastDefaultClause(t, formatColumnDefinition(paren))) +} + +func lastDefaultClause(t *testing.T, columnDef string) string { + t.Helper() + idx := strings.Index(columnDef, "DEFAULT ") + require.GreaterOrEqual(t, idx, 0, "no DEFAULT clause in %q", columnDef) + return columnDef[idx:] +} + // TestBinaryTypeDetection tests that binary types are correctly detected and converted // from their text equivalents when the binary flag is set func TestBinaryTypeDetection(t *testing.T) { diff --git a/pkg/statement/declarative.go b/pkg/statement/declarative.go index c1bbb1c85..5d64f9688 100644 --- a/pkg/statement/declarative.go +++ b/pkg/statement/declarative.go @@ -7,8 +7,8 @@ import ( "strings" "github.com/block/spirit/pkg/dbconn/sqlescape" + "github.com/block/spirit/pkg/parser/format" "github.com/block/spirit/pkg/table" - "github.com/pingcap/tidb/pkg/parser/format" ) // DeclarativeToImperative compares current and desired schemas and returns the diff --git a/pkg/statement/diff.go b/pkg/statement/diff.go index 66c69e69f..75d86b995 100644 --- a/pkg/statement/diff.go +++ b/pkg/statement/diff.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/block/spirit/pkg/dbconn/sqlescape" - "github.com/pingcap/tidb/pkg/parser" + "github.com/block/spirit/pkg/parser" ) // DiffOptions controls the behavior of the Diff operation. diff --git a/pkg/statement/diff_test.go b/pkg/statement/diff_test.go index 1dc53ac02..506996cda 100644 --- a/pkg/statement/diff_test.go +++ b/pkg/statement/diff_test.go @@ -564,7 +564,7 @@ func TestDiff(t *testing.T) { name: "CheckConstraintMovedParensStillDiffs", source: "CREATE TABLE t1 (id INT PRIMARY KEY, a INT, b INT, c INT, CONSTRAINT chk_expr CHECK ((a = 1 OR b = 2) AND c = 3))", target: "CREATE TABLE t1 (id INT PRIMARY KEY, a INT, b INT, c INT, CONSTRAINT chk_expr CHECK (a = 1 OR b = 2 AND c = 3))", - expected: "ALTER TABLE `t1` DROP CHECK `chk_expr`, ADD CONSTRAINT `chk_expr` CHECK ((`a`=1) OR ((`b`=2) AND (`c`=3)))", + expected: "ALTER TABLE `t1` DROP CHECK `chk_expr`, ADD CONSTRAINT `chk_expr` CHECK (`a`=1 OR `b`=2 AND `c`=3)", }, { // Same distinctness for non-binary operators: NOT and IS NULL diff --git a/pkg/statement/format.go b/pkg/statement/format.go index 68f73cd3a..da7224832 100644 --- a/pkg/statement/format.go +++ b/pkg/statement/format.go @@ -123,6 +123,12 @@ func formatColumnDefinition(col *Column) string { if col.Default != nil && col.GeneratedExpr == nil { defaultVal := *col.Default switch { + case col.DefaultIsExpr && col.DefaultIsString: + // Expression default whose expression is a string literal, + // e.g. DEFAULT ('{}') — the only default form MySQL accepts on + // BLOB/TEXT/JSON/GEOMETRY columns. The stored value is raw, so + // quote+escape it inside the parentheses. + parts = append(parts, fmt.Sprintf("DEFAULT ('%s')", sqlescape.EscapeString(defaultVal))) case col.DefaultIsExpr: // Expression defaults must be wrapped in parentheses, e.g. DEFAULT (json_object()) parts = append(parts, fmt.Sprintf("DEFAULT (%s)", defaultVal)) diff --git a/pkg/statement/normalize_binary_attribute.go b/pkg/statement/normalize_binary_attribute.go index b4863efb6..b7d7893be 100644 --- a/pkg/statement/normalize_binary_attribute.go +++ b/pkg/statement/normalize_binary_attribute.go @@ -1,6 +1,6 @@ package statement -import "github.com/pingcap/tidb/pkg/parser/mysql" +import "github.com/block/spirit/pkg/parser/mysql" func init() { registerNormalizer(binaryAttributeNormalizer{}) } diff --git a/pkg/statement/normalize_column_checks.go b/pkg/statement/normalize_column_checks.go index c70ab6a51..20f7bad16 100644 --- a/pkg/statement/normalize_column_checks.go +++ b/pkg/statement/normalize_column_checks.go @@ -3,7 +3,7 @@ package statement import ( "fmt" - "github.com/pingcap/tidb/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/ast" ) func init() { registerNormalizer(columnCheckNormalizer{}) } diff --git a/pkg/statement/normalize_expression_parens.go b/pkg/statement/normalize_expression_parens.go index 2be3b4b88..25a173a56 100644 --- a/pkg/statement/normalize_expression_parens.go +++ b/pkg/statement/normalize_expression_parens.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" ) func init() { registerNormalizer(expressionParenNormalizer{}) } @@ -23,20 +23,37 @@ func init() { registerNormalizer(expressionParenNormalizer{}) } // renames them and diffConstraints pairs constraints by expression), which // makes the definition text the only thing that can converge. // -// The canonical form: every user-written (or MySQL-added) parenthesis is -// dropped, and every operator expression — binary, unary, IS NULL, IS TRUE, -// BETWEEN, IN, LIKE, REGEXP — is re-wrapped in exactly one set. The rewrite -// is semantics-preserving (parentheses only move to positions the parse tree -// already encodes) and idempotent, so the rendered string is a bijective -// encoding of the expression's structure: two expressions render identically -// if and only if they parse to the same tree. +// Canonicalization runs in two passes over the parsed expression: // -// Stripping parentheses without re-wrapping would not be safe: the parser's -// Restore does not regenerate precedence parentheses from tree structure, so -// (a OR b) AND c and a OR b AND c — different trees — would both render as -// a OR b AND c. Wrapping every operator node keeps distinct trees distinct, -// including for operators that render without connecting parens -// ((NOT a) IS NULL vs NOT (a IS NULL)). +// 1. Every user-written (or MySQL-added) parenthesis is dropped, and every +// operator expression — binary, unary, IS NULL, IS TRUE, BETWEEN, IN, +// LIKE, REGEXP — is re-wrapped in exactly one set. This erases the input's +// parenthesization entirely: what remains is a function of the parse tree +// alone, so two texts that parse the same way now hold the same tree. +// 2. The tree is rendered with format.RestoreSkipRedundantParentheses, which +// drops each pair of parentheses that MySQL's precedence and associativity +// rules make unnecessary in its position — a + (b * c) renders as +// a + b * c, while (a + b) * c and a - (b - c) keep their parentheses. +// +// The first pass is what makes the result canonical; the second only decides +// how much of the (already canonical) structure has to be spelled out, and +// leaves a form close to what a person would write. The rendering is a fixed +// point of the whole rewrite, so re-normalizing an emitted definition is a +// no-op. +// +// Pass 1 cannot be dropped in favour of pass 2 alone. Restore never invents +// parentheses, so -(a) and -a, or f((a + b)) and f(a + b), would each render +// two ways where pass 2 keeps parentheses conservatively — and MySQL does emit +// the first of each pair. Nor can pass 2 be dropped in favour of pass 1 alone +// and left fully parenthesized; that also converges, but emits DDL no human +// wrote. What pass 2 must never do is drop a parenthesis that distinguishes +// two trees, which is why it reasons about precedence rather than shape (see +// ast.canRestoreWithoutParentheses). +// +// One deliberate exception: an associative operator's parentheses are dropped +// even when regrouping changes the tree, so a AND (b AND c) and (a AND b) AND c +// converge on a AND b AND c. They evaluate identically, so collapsing them +// removes a spurious diff rather than hiding a real one. type expressionParenNormalizer struct{} func (expressionParenNormalizer) Name() string { return "expression-parens" } @@ -63,9 +80,16 @@ func (expressionParenNormalizer) Normalize(ct *CreateTable) *CreateTable { return ct } -// parenCanonicalizer is the ast.Visitor behind canonicalizeExprParens: it -// removes every ParenthesesExpr and wraps every operator expression in +// parenCanonicalizer is the ast.Visitor behind pass 1 of canonicalizeExprParens: +// it removes every ParenthesesExpr and wraps every operator expression in // exactly one ParenthesesExpr on the way back up the tree. +// +// The wrapped set has to cover every node whose parentheses pass 2 reasons +// about, or an expression can be rendered as text that parses back to a +// different tree. `a = (1 MEMBER OF (j))` is the sharp edge: MEMBER OF sits at +// comparison precedence, so with its parentheses stripped and not restored the +// text renders as `a = 1 MEMBER OF (j)`, which reads left to right as the +// different `(a = 1) MEMBER OF (j)`. type parenCanonicalizer struct{} func (parenCanonicalizer) Enter(n ast.Node) (ast.Node, bool) { return n, false } @@ -74,8 +98,15 @@ func (parenCanonicalizer) Leave(n ast.Node) (ast.Node, bool) { switch e := n.(type) { case *ast.ParenthesesExpr: return e.Expr, true + case *ast.FuncCallExpr: + // A function call is self-delimiting, except for MEMBER OF, which the + // parser models as a call but restores as an infix operator. + if e.FnName.L == ast.JSONMemberOf { + return &ast.ParenthesesExpr{Expr: e}, true + } case *ast.BinaryOperationExpr, *ast.UnaryOperationExpr, *ast.IsNullExpr, *ast.IsTruthExpr, - *ast.BetweenExpr, *ast.PatternInExpr, *ast.PatternLikeOrIlikeExpr, *ast.PatternRegexpExpr: + *ast.BetweenExpr, *ast.PatternInExpr, *ast.PatternLikeExpr, *ast.PatternRegexpExpr, + *ast.CompareSubqueryExpr, *ast.SetCollationExpr: return &ast.ParenthesesExpr{Expr: n.(ast.ExprNode)}, true } return n, true @@ -106,12 +137,13 @@ func canonicalizeExprParens(p *parser.Parser, text *string) { } expr := node.(ast.ExprNode) // The outermost parentheses carry no information — the expression is - // already delimited by its surrounding CHECK (...) / AS (...) syntax. - if paren, isParen := expr.(*ast.ParenthesesExpr); isParen { - expr = paren.Expr - } + // already delimited by its surrounding CHECK (...) / AS (...) syntax — and + // RestoreSkipRedundantParentheses drops them for that reason: at the top + // level there is no enclosing operator to reason about. var sb strings.Builder - rCtx := format.NewRestoreCtx(format.DefaultRestoreFlags|format.RestoreStringWithoutCharset, &sb) + rCtx := format.NewRestoreCtx( + format.DefaultRestoreFlags|format.RestoreStringWithoutCharset|format.RestoreSkipRedundantParentheses, + &sb) if err := expr.Restore(rCtx); err != nil { return } diff --git a/pkg/statement/normalize_expression_parens_test.go b/pkg/statement/normalize_expression_parens_test.go new file mode 100644 index 000000000..a9ac8449b --- /dev/null +++ b/pkg/statement/normalize_expression_parens_test.go @@ -0,0 +1,95 @@ +package statement + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// canonicalCheck parses a CHECK constraint holding expr and returns the +// canonical definition the normalizer produced for it. +func canonicalCheck(t *testing.T, expr string) string { + t.Helper() + ct, err := ParseCreateTable( + "CREATE TABLE t (id INT PRIMARY KEY, a INT, b INT, c INT, s VARCHAR(20), j JSON, " + + "CONSTRAINT chk CHECK (" + expr + "))") + require.NoError(t, err, "expr %q", expr) + require.Len(t, ct.Constraints, 1) + require.NotNil(t, ct.Constraints[0].Definition) + return *ct.Constraints[0].Definition +} + +// TestCanonicalExprParensIsFixedPoint checks that feeding a canonical +// expression back through the normalizer returns it unchanged. Because the +// normalizer re-parses the text it is given, a text that is not a fixed point +// is a text that parses back to a different expression than the one it was +// rendered from — which would mean the emitted DDL says something other than +// what was asked for. +func TestCanonicalExprParensIsFixedPoint(t *testing.T) { + exprs := []string{ + "a = 1 OR b = 2 AND c = 3", + "(a = 1 OR b = 2) AND c = 3", + "a + b * c > 10", + "(a + b) * c > 10", + "a - (b - c) > 0", + "a % (b % c) = 0", + "((a + b) * (c - 1)) / 2 > a", + "a & 3 | b = 0", + "a & (3 | b) = 0", + "(a << 1) + b > 0", + "a BETWEEN 1 AND 10 AND b > 0", + "a = (b BETWEEN 1 AND 10)", + "a IS NULL OR b IS NOT NULL", + "NOT (a IS NULL)", + "(NOT a) IS NULL", + "(a > 0) IS TRUE", + "a IN (1,2,3) AND b NOT IN (4,5)", + "s LIKE 'x%' OR REGEXP_LIKE(s, '^y')", + "s COLLATE utf8mb4_bin = 'x'", + "a = (b COLLATE utf8mb4_bin)", + "1 MEMBER OF (j) OR a > 0", + "a = (1 MEMBER OF (j))", + "-a < b", + "-(a + b) < c", + "a * GREATEST(b + c, 1) > 0", + "CASE WHEN a > 0 THEN b ELSE -b END > 0", + } + + for _, expr := range exprs { + t.Run(expr, func(t *testing.T) { + canonical := canonicalCheck(t, expr) + // Strip the CHECK (...) wrapper to feed the expression back in. + inner := canonical[len("CHECK (") : len(canonical)-1] + require.Equal(t, canonical, canonicalCheck(t, inner)) + }) + } +} + +// TestCanonicalExprParensKeepsDistinctExpressionsDistinct checks the property +// that makes the canonical form usable for comparison: expressions that differ +// in what they compute must not collapse to the same text, or a declarative +// diff would treat a real change as a no-op and silently skip it. +// +// The MEMBER OF and quantified-comparison pairs are the regression cases: both +// sit at comparison precedence, so dropping their parentheses in the right +// operand of a comparison rebinds the expression. +func TestCanonicalExprParensKeepsDistinctExpressionsDistinct(t *testing.T) { + pairs := [][2]string{ + {"a = (1 MEMBER OF (j))", "(a = 1) MEMBER OF (j)"}, + {"a = (b > ANY (SELECT 1))", "(a = b) > ANY (SELECT 1)"}, + {"a = (b COLLATE utf8mb4_bin)", "(a = b) COLLATE utf8mb4_bin"}, + {"(a = 1 OR b = 2) AND c = 3", "a = 1 OR b = 2 AND c = 3"}, + {"NOT (a IS NULL)", "(NOT a) IS NULL"}, + {"a - (b - c) > 0", "(a - b) - c > 0"}, + {"a / (b / c) > 0", "a / b / c > 0"}, + {"a & (3 | b) = 0", "a & 3 | b = 0"}, + {"a = (b BETWEEN 1 AND 10)", "(a = b) BETWEEN 1 AND 10"}, + {"-(a + b) < c", "-a + b < c"}, + } + + for _, pair := range pairs { + t.Run(pair[0]+" vs "+pair[1], func(t *testing.T) { + require.NotEqual(t, canonicalCheck(t, pair[0]), canonicalCheck(t, pair[1])) + }) + } +} diff --git a/pkg/statement/parse_helpers.go b/pkg/statement/parse_helpers.go index 5eddc0366..f0f1ba830 100644 --- a/pkg/statement/parse_helpers.go +++ b/pkg/statement/parse_helpers.go @@ -4,9 +4,8 @@ import ( "fmt" "strings" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" - driver "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" ) // This file holds low-level, stateless parsing helpers used by the CreateTable @@ -31,7 +30,7 @@ import ( // also accepts; the doubled and backslash forms are equivalent in the // default sql_mode. func stringLiteralValue(expr ast.ExprNode) (string, bool) { - if v, ok := expr.(*driver.ValueExpr); ok && v.Kind() == driver.KindString { + if v, ok := expr.(*ast.ValueExpr); ok && v.Kind() == ast.KindString { return v.GetString(), true } return "", false @@ -47,6 +46,11 @@ func isExpressionDefault(expr ast.ExprNode) bool { return false } switch e := expr.(type) { + case *ast.ParenthesesExpr: + // The parser preserves the parentheses of DEFAULT ('{}') — MySQL's + // expression-default form, required on BLOB/TEXT/JSON/GEOMETRY + // columns — as a ParenthesesExpr wrapper. + return true case *ast.FuncCallExpr: // CURRENT_TIMESTAMP (and aliases NOW, LOCALTIME, etc.) are literal-style defaults // that don't need parens. Everything else is an expression default. @@ -62,6 +66,20 @@ func isExpressionDefault(expr ast.ExprNode) bool { } } +// unwrapParenExpr removes any ParenthesesExpr wrappers, returning the +// innermost expression. Used where the parenthesized/bare distinction has +// already been captured (e.g. in DefaultIsExpr) and only the value inside +// the parentheses is needed. +func unwrapParenExpr(expr ast.ExprNode) ast.ExprNode { + for { + paren, ok := expr.(*ast.ParenthesesExpr) + if !ok { + return expr + } + expr = paren.Expr + } +} + // restoreExpressionText restores an expression AST node to its SQL text, // stripping redundant outer parentheses. MySQL's SHOW CREATE TABLE wraps // generated-column and CHECK expressions in an extra set of parentheses diff --git a/pkg/statement/secondary_indexes.go b/pkg/statement/secondary_indexes.go index 5f7b73130..297247e26 100644 --- a/pkg/statement/secondary_indexes.go +++ b/pkg/statement/secondary_indexes.go @@ -5,8 +5,8 @@ import ( "strings" "github.com/block/spirit/pkg/dbconn/sqlescape" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" ) // This file holds the free functions that rewrite a CREATE TABLE statement's diff --git a/pkg/statement/statement.go b/pkg/statement/statement.go index a57222ebd..2c6fbc341 100644 --- a/pkg/statement/statement.go +++ b/pkg/statement/statement.go @@ -7,11 +7,10 @@ import ( "strings" "github.com/block/spirit/pkg/dbconn/sqlescape" - "github.com/pingcap/tidb/pkg/parser" - "github.com/pingcap/tidb/pkg/parser/ast" - "github.com/pingcap/tidb/pkg/parser/format" - "github.com/pingcap/tidb/pkg/parser/mysql" - _ "github.com/pingcap/tidb/pkg/parser/test_driver" + "github.com/block/spirit/pkg/parser" + "github.com/block/spirit/pkg/parser/ast" + "github.com/block/spirit/pkg/parser/format" + "github.com/block/spirit/pkg/parser/mysql" ) type AbstractStatement struct { diff --git a/pkg/statement/statement_test.go b/pkg/statement/statement_test.go index e3b63df57..d13c148c8 100644 --- a/pkg/statement/statement_test.go +++ b/pkg/statement/statement_test.go @@ -166,6 +166,30 @@ func TestExtractFromStatement(t *testing.T) { require.ErrorIs(t, err, ErrMultipleSchemas) } +// TestExtractFromStatementPreservesDefaultParens is a regression test for +// https://github.com/block/spirit/issues/542: the --statement path restores +// the parsed ALTER, and the restored text must keep the parentheses of an +// expression default. Without them, MySQL rejects the DDL on +// BLOB/TEXT/JSON/GEOMETRY columns with Error 1101. +func TestExtractFromStatementPreservesDefaultParens(t *testing.T) { + // The exact statement from the issue. The restored form carries a + // charset introducer inside the parens, matching how MySQL itself + // renders expression defaults in SHOW CREATE TABLE. + abstractStmt, err := New("alter table t1 add column j json default ('{}')") + require.NoError(t, err) + require.Equal(t, "ADD COLUMN `j` JSON DEFAULT (_UTF8MB4'{}')", abstractStmt[0].Alter) + + // A bare literal default must stay bare. + abstractStmt, err = New("alter table t1 add column v varchar(10) default '{}'") + require.NoError(t, err) + require.Equal(t, "ADD COLUMN `v` VARCHAR(10) DEFAULT _UTF8MB4'{}'", abstractStmt[0].Alter) + + // SET DEFAULT keeps the same distinction. + abstractStmt, err = New("alter table t1 alter column j set default ('{}')") + require.NoError(t, err) + require.Equal(t, "ALTER COLUMN `j` SET DEFAULT (_UTF8MB4'{}')", abstractStmt[0].Alter) +} + func TestAlgorithmInplaceConsideredSafe(t *testing.T) { var test = func(stmt string) error { return MustNew("ALTER TABLE `t1` " + stmt)[0].AlgorithmInplaceConsideredSafe()